Skip to content

Commit 0489ac8

Browse files
authored
Merge pull request #12 from NDDev-OpenNetwork/fix/ruleset-initial-creation
fix(governance): plan initial ruleset creation
2 parents f8bcbdd + dff4b09 commit 0489ac8

4 files changed

Lines changed: 37 additions & 16 deletions

File tree

‎.gds/bundle.lock.yaml‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ bundle:
55
version: "0.4.0-dev"
66
release_sequence: 0
77
channel: "development"
8-
source_tree_digest: "sha256:ef10b91ed03c562d05495a6375f444879ca08017eb7bab4f40fe2a6fc3bc3e86"
9-
digest: "sha256:8d5aa5c36a0e59ea9c64408423934224bdf3880ed0a861585dbc6e5f30d31306"
8+
source_tree_digest: "sha256:a236bcc5c7527d3a0a3c6230e20ebe9c48796c0a5d41392b47a22da934ff49fa"
9+
digest: "sha256:977eaefa91e2e04f211495101ffde77fcb56aaff13972acf63d9a276d25fd97d"
1010

1111
projection:
12-
input_digest: "sha256:47efcfb0b381f7398a08a5a176d7ca63a671fcf53045bb5e09e70f943becbc9f"
13-
output_digest: "sha256:a2c3f18837f79a45a19ea7aafa3f3100d2d63ad6eaa6deed156f0f7b2092563f"
12+
input_digest: "sha256:7b88ac05c2c898a1ac7e96d88846fe99b719ba2312751a661b1b02eaf0eadbbd"
13+
output_digest: "sha256:498a0c7407167e63ce51f8e853b1f91b66e4ac9acba5484892c44efb2aab61fb"
1414
files:
1515
- path: ".gds/compiled-policy.json"
1616
digest: "sha256:78d09606bb4168d74bce1f50ab62b46a7ded34652c6b23af1badfd26dd060e94"
1717
- path: ".github/workflows/gds-ci.yml"
18-
digest: "sha256:0929cc3bbed80e0c315703ee2860439cbc3ceeeefbe78e6376dda7393fb883b7"
18+
digest: "sha256:8f198d373f786d2d2c88e1910851c1039c6200359ee95cca11af0ab3cb5d326c"

‎.github/workflows/gds-ci.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# GENERATED FILE - DO NOT EDIT DIRECTLY
22
# generator: gds
33
# bundle: 0.4.0-dev
4-
# source-tree-digest: sha256:ef10b91ed03c562d05495a6375f444879ca08017eb7bab4f40fe2a6fc3bc3e86
5-
# input-digest: sha256:47efcfb0b381f7398a08a5a176d7ca63a671fcf53045bb5e09e70f943becbc9f
4+
# source-tree-digest: sha256:a236bcc5c7527d3a0a3c6230e20ebe9c48796c0a5d41392b47a22da934ff49fa
5+
# input-digest: sha256:7b88ac05c2c898a1ac7e96d88846fe99b719ba2312751a661b1b02eaf0eadbbd
66
# output-digest: sha256:8f61a9ffd6949238099d4523a037d57199eb575f187cc8ac52baa4b5b832e79f
77
# edit-source:
88
# - .gds/repository.yaml

‎core/app/github_ruleset_external_test.go‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,18 @@ func TestDesiredRulesetCarriesDeclaredExternalContexts(t *testing.T) {
8383
}
8484
}
8585

86+
func TestMissingRulesetPlansCreationWithoutInventingObservedIdentity(t *testing.T) {
87+
t.Parallel()
88+
if expected := rulesetPlanExpected(githubRulesetOperationContext{exists: false}); expected != nil {
89+
t.Fatalf("missing ruleset produced observed precondition: %#v", expected)
90+
}
91+
observed := githubprovider.RepositoryRulesetState{ID: 9, Name: "Protect main", SourceType: "Repository", Source: "example/repository"}
92+
expected := rulesetPlanExpected(githubRulesetOperationContext{exists: true, observed: observed})
93+
if expected == nil || expected.ID != 9 {
94+
t.Fatalf("existing ruleset lost observed identity: %#v", expected)
95+
}
96+
}
97+
8698
func TestDesiredRulesetIsUnchangedWithoutADeclaration(t *testing.T) {
8799
root := t.TempDir()
88100
writeRuleset(t, root, []string{"CI / build"}, "")

‎core/app/github_ruleset_operations.go‎

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ func (services *Services) PlanGitHubRuleset(
8484
}
8585
// Apply compares the stored expectation against the visible form of what it
8686
// re-observes, so the plan must record exactly that form.
87-
observed := githubruleset.VisibleState(current.observed)
87+
expected := rulesetPlanExpected(current)
8888
plan, err := operations.NewPlan(planID, now, now.Add(projectionPlanLifetime), operations.PlanInput{
8989
Operation: githubRulesetOperation,
9090
Actor: operations.Actor{Type: "agent-session", SessionID: options.SessionID},
@@ -112,7 +112,7 @@ func (services *Services) PlanGitHubRuleset(
112112
ProviderRepositoryID: current.providerRepositoryID,
113113
Owner: options.Owner, Name: options.Repository,
114114
},
115-
Expected: &observed,
115+
Expected: expected,
116116
Desired: current.desired,
117117
}),
118118
}},
@@ -135,6 +135,14 @@ func (services *Services) PlanGitHubRuleset(
135135
return result
136136
}
137137

138+
func rulesetPlanExpected(current githubRulesetOperationContext) *githubprovider.RepositoryRulesetState {
139+
if !current.exists {
140+
return nil
141+
}
142+
observed := githubruleset.VisibleState(current.observed)
143+
return &observed
144+
}
145+
138146
// ApplyGitHubRuleset applies one approved ruleset plan through the bound
139147
// mutation capability.
140148
func (services *Services) ApplyGitHubRuleset(
@@ -272,6 +280,7 @@ type githubRulesetOperationContext struct {
272280
observed githubprovider.RepositoryRulesetState
273281
visible githubprovider.RepositoryRulesetState
274282
desired githubprovider.RepositoryRuleset
283+
exists bool
275284
inSync bool
276285
providerRepositoryID int64
277286
mutationCapabilityID string
@@ -353,13 +362,12 @@ func (services *Services) githubRulesetContext(
353362
}
354363
}
355364
if rulesetID == 0 {
356-
failure := domain.NewEnvelope(command, domain.ExitNotProven, nil, domain.Finding{
357-
Code: "GDS_GITHUB_RULESET_NOT_ADOPTED", Severity: domain.SeverityHigh,
358-
Message: fmt.Sprintf(
359-
"No repository ruleset named %q exists; adopt it before reconciling.", desired.Name,
360-
),
361-
})
362-
return githubRulesetOperationContext{}, &failure
365+
return githubRulesetOperationContext{
366+
governance: governanceContext, privileged: privileged,
367+
desired: desired, exists: false, inSync: false,
368+
providerRepositoryID: providerRepositoryID,
369+
mutationCapabilityID: capability.Mutation.ID,
370+
}, nil
363371
}
364372
observed, _, err := privileged.GetRepositoryRuleset(ctx, rulesetID)
365373
if err != nil {
@@ -371,6 +379,7 @@ func (services *Services) githubRulesetContext(
371379
return githubRulesetOperationContext{
372380
governance: governanceContext, privileged: privileged,
373381
observed: observed, visible: visible, desired: desired,
382+
exists: true,
374383
inSync: rulesetOwnedStateMatches(observed, desired),
375384
providerRepositoryID: providerRepositoryID,
376385
mutationCapabilityID: capability.Mutation.ID,

0 commit comments

Comments
 (0)