Skip to content

Commit 2b7390c

Browse files
dhaiducekopenshift-merge-robot
authored andcommitted
Separate PolicySet placement generation
Allow setting of a `PolicySetDefaults` placement name for placement consolidation. The caveat here is consolidation will default to any Policy placement that had previously been consolidated. Signed-off-by: Dale Haiducek <[email protected]>
1 parent d4383ba commit 2b7390c

File tree

3 files changed

+188
-31
lines changed

3 files changed

+188
-31
lines changed

docs/policygenerator-reference.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,8 @@ policyDefaults:
161161
# policySets array.
162162
policySetDefaults:
163163
# Optional. The placement configuration for the policy sets. This defaults to a placement configuration that matches
164-
# all clusters. (See policyDefaults.placement for description.)
164+
# all clusters. If a placement.name is not provided here for placement consolidation, it will fall back to
165+
# policyDefaults.placement.name, if provided there. (See policyDefaults.placement for description.)
165166
placement: {}
166167
# Optional. Whether to generate placement manifests for policy sets. This defaults to "true".
167168
generatePolicySetPlacement: true

internal/plugin.go

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ func (p *Plugin) Generate() ([]byte, error) {
147147
// or policy is not part of any policy sets
148148
if p.Policies[i].GeneratePlacementWhenInSet ||
149149
(p.Policies[i].GeneratePolicyPlacement && len(p.Policies[i].PolicySets) == 0) {
150-
plcName, err := p.createPlacement(&p.Policies[i].Placement, p.Policies[i].Name)
150+
plcName, err := p.createPolicyPlacement(p.Policies[i].Placement, p.Policies[i].Name)
151151
if err != nil {
152152
return nil, err
153153
}
@@ -163,7 +163,7 @@ func (p *Plugin) Generate() ([]byte, error) {
163163
for i := range p.PolicySets {
164164
// only generate placement when GeneratePolicySetPlacement equals to true
165165
if p.PolicySets[i].GeneratePolicySetPlacement {
166-
plcName, err := p.createPlacement(&p.PolicySets[i].Placement, p.PolicySets[i].Name)
166+
plcName, err := p.createPolicySetPlacement(p.PolicySets[i].Placement, p.PolicySets[i].Name)
167167
if err != nil {
168168
return nil, err
169169
}
@@ -1432,17 +1432,26 @@ func (p *Plugin) getPlcFromPath(plcPath string) (string, map[string]interface{},
14321432

14331433
// getCsKey generates the key for the policy's cluster/label selectors to be used in
14341434
// Policies.csToPlc.
1435-
func getCsKey(placementConfig *types.PlacementConfig) string {
1435+
func getCsKey(placementConfig types.PlacementConfig) string {
14361436
return fmt.Sprintf("%#v", placementConfig.ClusterSelectors)
14371437
}
14381438

14391439
// getPlcName will generate a placement name for the policy. If the placement has
14401440
// previously been generated, skip will be true.
1441-
func (p *Plugin) getPlcName(placementConfig *types.PlacementConfig, nameDefault string) (string, bool) {
1441+
func (p *Plugin) getPlcName(
1442+
defaultPlacementConfig types.PlacementConfig,
1443+
placementConfig types.PlacementConfig,
1444+
nameDefault string,
1445+
) (string, bool) {
14421446
if placementConfig.Name != "" {
14431447
// If the policy explicitly specifies a placement name, use it
14441448
return placementConfig.Name, false
1445-
} else if p.PolicyDefaults.Placement.Name != "" {
1449+
} else if defaultPlacementConfig.Name != "" || p.PolicyDefaults.Placement.Name != "" {
1450+
// Prioritize the provided default but fall back to policyDefaults
1451+
defaultPlacementName := p.PolicyDefaults.Placement.Name
1452+
if defaultPlacementConfig.Name != "" {
1453+
defaultPlacementName = defaultPlacementConfig.Name
1454+
}
14461455
// If the policy doesn't explicitly specify a placement name, and there is a
14471456
// default placement name set, check if one has already been generated for these
14481457
// cluster/label selectors
@@ -1455,20 +1464,35 @@ func (p *Plugin) getPlcName(placementConfig *types.PlacementConfig, nameDefault
14551464
// default placement name, use that
14561465
if len(p.csToPlc) == 0 {
14571466
// If this is the first generated placement, just use it as is
1458-
return p.PolicyDefaults.Placement.Name, false
1467+
return defaultPlacementName, false
14591468
}
14601469
// If there is already one or more generated placements, increment the name
1461-
return fmt.Sprintf("%s%d", p.PolicyDefaults.Placement.Name, len(p.csToPlc)+1), false
1470+
return fmt.Sprintf("%s%d", defaultPlacementName, len(p.csToPlc)+1), false
14621471
}
14631472
// Default to a placement per policy
14641473
return "placement-" + nameDefault, false
14651474
}
14661475

1476+
func (p *Plugin) createPolicyPlacement(placementConfig types.PlacementConfig, nameDefault string) (
1477+
name string, err error,
1478+
) {
1479+
return p.createPlacement(p.PolicyDefaults.Placement, placementConfig, nameDefault)
1480+
}
1481+
1482+
func (p *Plugin) createPolicySetPlacement(placementConfig types.PlacementConfig, nameDefault string) (
1483+
name string, err error,
1484+
) {
1485+
return p.createPlacement(p.PolicySetDefaults.Placement, placementConfig, nameDefault)
1486+
}
1487+
14671488
// createPlacement creates a placement for the input placement config and default name by writing it to
14681489
// the policy generator's output buffer. The name of the placement or an error is returned.
14691490
// If the placement has already been generated, it will be reused and not added to the
14701491
// policy generator's output buffer. An error is returned if the placement cannot be created.
1471-
func (p *Plugin) createPlacement(placementConfig *types.PlacementConfig, nameDefault string) (
1492+
func (p *Plugin) createPlacement(
1493+
defaultPlacementConfig types.PlacementConfig,
1494+
placementConfig types.PlacementConfig,
1495+
nameDefault string) (
14721496
name string, err error,
14731497
) {
14741498
// If a placementName or placementRuleName is defined just return it
@@ -1511,7 +1535,7 @@ func (p *Plugin) createPlacement(placementConfig *types.PlacementConfig, nameDef
15111535
p.processedPlcs[name] = true
15121536
} else {
15131537
var skip bool
1514-
name, skip = p.getPlcName(placementConfig, nameDefault)
1538+
name, skip = p.getPlcName(defaultPlacementConfig, placementConfig, nameDefault)
15151539
if skip {
15161540
return
15171541
}

0 commit comments

Comments
 (0)