Skip to content

Commit 5bc8261

Browse files
JustinKuliopenshift-merge-robot
authored andcommitted
Refactor policyTemplates type
It was map[string]map[string]interface{}, but now it is relaxed to map[string]interface{}. Previously the only field under the template was the `objectDefinition`, but it can soon have `ignorePending` and `extraDependencies` which are not map[string]interface{}s. Refs: - stolostron/backlog#26183 Signed-off-by: Justin Kulikauskas <[email protected]>
1 parent 8f2769a commit 5bc8261

File tree

7 files changed

+48
-44
lines changed

7 files changed

+48
-44
lines changed

internal/expanders/expanders.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ type Expander interface {
2020
// Enabled determines if the policy configuration allows a policy to be expanded.
2121
Enabled(policyConf *types.PolicyConfig) bool
2222
// Expand will generate additional policy templates for the policy for auditing purposes.
23-
Expand(manifest map[string]interface{}, severity string) []map[string]map[string]interface{}
23+
Expand(manifest map[string]interface{}, severity string) []map[string]interface{}
2424
}
2525

2626
// Common constants for the expanders.

internal/expanders/gatekeeper.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,15 @@ func (g GatekeeperPolicyExpander) Enabled(policyConf *types.PolicyConfig) bool {
4747
// method.
4848
func (g GatekeeperPolicyExpander) Expand(
4949
manifest map[string]interface{}, severity string,
50-
) []map[string]map[string]interface{} {
51-
templates := []map[string]map[string]interface{}{}
50+
) []map[string]interface{} {
51+
templates := []map[string]interface{}{}
5252
// These were previously validated in the CanHandle method.
5353
constraintName, _, _ := unstructured.NestedString(manifest, "metadata", "name")
5454
constraintKind, _, _ := unstructured.NestedString(manifest, "kind")
5555

5656
auditConfigPolicyName := fmt.Sprintf("inform-gatekeeper-audit-%s", constraintName)
57-
auditConfigurationPolicy := map[string]map[string]interface{}{
58-
"objectDefinition": {
57+
auditConfigurationPolicy := map[string]interface{}{
58+
"objectDefinition": map[string]interface{}{
5959
"apiVersion": configPolicyAPIVersion,
6060
"kind": configPolicyKind,
6161
"metadata": map[string]interface{}{"name": auditConfigPolicyName},
@@ -87,8 +87,8 @@ func (g GatekeeperPolicyExpander) Expand(
8787
// Further improvements here could be made by having the user specify the Gatekeeper namespace and
8888
// targeting the events for the constraint kind to just that namespace.
8989
admissionConfigPolicyName := fmt.Sprintf("inform-gatekeeper-admission-%s", constraintName)
90-
admissionConfigurationPolicy := map[string]map[string]interface{}{
91-
"objectDefinition": {
90+
admissionConfigurationPolicy := map[string]interface{}{
91+
"objectDefinition": map[string]interface{}{
9292
"apiVersion": configPolicyAPIVersion,
9393
"kind": configPolicyKind,
9494
"metadata": map[string]interface{}{"name": admissionConfigPolicyName},

internal/expanders/gatekeeper_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,9 @@ func TestGatekeeperExpand(t *testing.T) {
9292
},
9393
}
9494

95-
expected := []map[string]map[string]interface{}{
95+
expected := []map[string]interface{}{
9696
{
97-
"objectDefinition": {
97+
"objectDefinition": map[string]interface{}{
9898
"apiVersion": configPolicyAPIVersion,
9999
"kind": configPolicyKind,
100100
"metadata": map[string]interface{}{"name": "inform-gatekeeper-audit-my-awesome-constraint"},
@@ -124,7 +124,7 @@ func TestGatekeeperExpand(t *testing.T) {
124124
},
125125
},
126126
{
127-
"objectDefinition": {
127+
"objectDefinition": map[string]interface{}{
128128
"apiVersion": configPolicyAPIVersion,
129129
"kind": configPolicyKind,
130130
"metadata": map[string]interface{}{"name": "inform-gatekeeper-admission-my-awesome-constraint"},

internal/expanders/kyverno.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,14 @@ func (k KyvernoPolicyExpander) Enabled(policyConf *types.PolicyConfig) bool {
4444
// through Open Cluster Management. This should be run after the CanHandle method.
4545
func (k KyvernoPolicyExpander) Expand(
4646
manifest map[string]interface{}, severity string,
47-
) []map[string]map[string]interface{} {
48-
templates := []map[string]map[string]interface{}{}
47+
) []map[string]interface{} {
48+
templates := []map[string]interface{}{}
4949
// This was previously validated in the CanHandle method.
5050
policyName, _, _ := unstructured.NestedString(manifest, "metadata", "name")
5151

5252
configPolicyName := fmt.Sprintf("inform-kyverno-%s", policyName)
53-
configurationPolicy := map[string]map[string]interface{}{
54-
"objectDefinition": {
53+
configurationPolicy := map[string]interface{}{
54+
"objectDefinition": map[string]interface{}{
5555
"apiVersion": configPolicyAPIVersion,
5656
"kind": configPolicyKind,
5757
"metadata": map[string]interface{}{"name": configPolicyName},

internal/expanders/kyverno_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,9 @@ func TestKyvernoExpand(t *testing.T) {
9595
},
9696
}
9797

98-
expected := []map[string]map[string]interface{}{
98+
expected := []map[string]interface{}{
9999
{
100-
"objectDefinition": {
100+
"objectDefinition": map[string]interface{}{
101101
"apiVersion": configPolicyAPIVersion,
102102
"kind": configPolicyKind,
103103
"metadata": map[string]interface{}{"name": "inform-kyverno-my-awesome-policy"},

internal/utils.go

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ func getManifests(policyConf *types.PolicyConfig) ([][]map[string]interface{}, e
150150
// policyConf.ConsolidateManifests = false will generate a policy templates slice
151151
// that each template includes a single manifest specified in policyConf.
152152
// An error is returned if one or more manifests cannot be read or are invalid.
153-
func getPolicyTemplates(policyConf *types.PolicyConfig) ([]map[string]map[string]interface{}, error) {
153+
func getPolicyTemplates(policyConf *types.PolicyConfig) ([]map[string]interface{}, error) {
154154
manifestGroups, err := getManifests(policyConf)
155155
if err != nil {
156156
return nil, err
@@ -165,7 +165,7 @@ func getPolicyTemplates(policyConf *types.PolicyConfig) ([]map[string]map[string
165165
}
166166

167167
objectTemplates := make([]map[string]interface{}, 0, objectTemplatesLength)
168-
policyTemplates := make([]map[string]map[string]interface{}, 0, policyTemplatesLength)
168+
policyTemplates := make([]map[string]interface{}, 0, policyTemplatesLength)
169169

170170
for i, manifestGroup := range manifestGroups {
171171
complianceType := policyConf.Manifests[i].ComplianceType
@@ -182,7 +182,8 @@ func getPolicyTemplates(policyConf *types.PolicyConfig) ([]map[string]map[string
182182
}
183183

184184
if isPolicyTypeManifest {
185-
policyTemplate := map[string]map[string]interface{}{"objectDefinition": manifest}
185+
policyTemplate := map[string]interface{}{"objectDefinition": manifest}
186+
186187
policyTemplates = append(policyTemplates, policyTemplate)
187188

188189
continue
@@ -275,14 +276,15 @@ func isPolicyTypeManifest(manifest map[string]interface{}) (bool, error) {
275276
// setNamespaceSelector sets the namespace selector, if set, on the input policy template.
276277
func setNamespaceSelector(
277278
policyConf *types.ConfigurationPolicyOptions,
278-
policyTemplate map[string]map[string]interface{},
279+
policyTemplate map[string]interface{},
279280
) {
280281
selector := policyConf.NamespaceSelector
281282
if selector.Exclude != nil ||
282283
selector.Include != nil ||
283284
selector.MatchLabels != nil ||
284285
selector.MatchExpressions != nil {
285-
spec := policyTemplate["objectDefinition"]["spec"].(map[string]interface{})
286+
objDef := policyTemplate["objectDefinition"].(map[string]interface{})
287+
spec := objDef["spec"].(map[string]interface{})
286288
spec["namespaceSelector"] = selector
287289
}
288290
}
@@ -317,16 +319,16 @@ func buildPolicyTemplate(
317319
policyNum int,
318320
objectTemplates []map[string]interface{},
319321
configPolicyOptionsOverrides *types.ConfigurationPolicyOptions,
320-
) map[string]map[string]interface{} {
322+
) map[string]interface{} {
321323
var name string
322324
if policyNum > 1 {
323325
name = fmt.Sprintf("%s%d", policyConf.Name, policyNum)
324326
} else {
325327
name = policyConf.Name
326328
}
327329

328-
policyTemplate := map[string]map[string]interface{}{
329-
"objectDefinition": {
330+
policyTemplate := map[string]interface{}{
331+
"objectDefinition": map[string]interface{}{
330332
"apiVersion": policyAPIVersion,
331333
"kind": configPolicyKind,
332334
"metadata": map[string]interface{}{
@@ -344,11 +346,13 @@ func buildPolicyTemplate(
344346
setNamespaceSelector(&policyConf.ConfigurationPolicyOptions, policyTemplate)
345347

346348
if len(policyConf.ConfigurationPolicyAnnotations) > 0 {
347-
metadata := policyTemplate["objectDefinition"]["metadata"].(map[string]interface{})
349+
objDef := policyTemplate["objectDefinition"].(map[string]interface{})
350+
metadata := objDef["metadata"].(map[string]interface{})
348351
metadata["annotations"] = policyConf.ConfigurationPolicyAnnotations
349352
}
350353

351-
configSpec := policyTemplate["objectDefinition"]["spec"].(map[string]interface{})
354+
objDef := policyTemplate["objectDefinition"].(map[string]interface{})
355+
configSpec := objDef["spec"].(map[string]interface{})
352356

353357
// Set EvaluationInterval with manifest overrides
354358
evaluationInterval := configPolicyOptionsOverrides.EvaluationInterval
@@ -389,10 +393,8 @@ func buildPolicyTemplate(
389393

390394
// handleExpanders will go through all the enabled expanders and generate additional
391395
// policy templates to include in the policy.
392-
func handleExpanders(
393-
manifests []map[string]interface{}, policyConf types.PolicyConfig,
394-
) []map[string]map[string]interface{} {
395-
policyTemplates := []map[string]map[string]interface{}{}
396+
func handleExpanders(manifests []map[string]interface{}, policyConf types.PolicyConfig) []map[string]interface{} {
397+
policyTemplates := []map[string]interface{}{}
396398

397399
for _, expander := range expanders.GetExpanders() {
398400
for _, m := range manifests {
@@ -499,11 +501,12 @@ func verifyManifestPath(baseDirectory string, manifestPath string) error {
499501
}
500502

501503
// Check policy-templates to see if all the remediation actions match, if so return the root policy remediation action
502-
func getRootRemediationAction(policyTemplates []map[string]map[string]interface{}) string {
504+
func getRootRemediationAction(policyTemplates []map[string]interface{}) string {
503505
var action string
504506

505507
for _, value := range policyTemplates {
506-
if spec, ok := value["objectDefinition"]["spec"].(map[string]interface{}); ok {
508+
objDef := value["objectDefinition"].(map[string]interface{})
509+
if spec, ok := objDef["spec"].(map[string]interface{}); ok {
507510
if _, ok = spec["remediationAction"].(string); ok {
508511
if action == "" {
509512
action = spec["remediationAction"].(string)

internal/utils_test.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ data:
215215
assertEqual(t, len(policyTemplates), 1)
216216

217217
policyTemplate := policyTemplates[0]
218-
objdef := policyTemplate["objectDefinition"]
218+
objdef := policyTemplate["objectDefinition"].(map[string]interface{})
219219

220220
assertEqual(t, objdef["metadata"].(map[string]interface{})["name"].(string), "policy-app-config")
221221

@@ -383,7 +383,7 @@ resources:
383383
assertEqual(t, len(policyTemplates), 1)
384384

385385
policyTemplate := policyTemplates[0]
386-
objdef := policyTemplate["objectDefinition"]
386+
objdef := policyTemplate["objectDefinition"].(map[string]interface{})
387387

388388
assertEqual(t, objdef["metadata"].(map[string]interface{})["name"].(string), "policy-kustomize")
389389

@@ -517,7 +517,7 @@ data:
517517

518518
for i := 0; i < len(policyTemplates); i++ {
519519
policyTemplate := policyTemplates[i]
520-
objdef := policyTemplate["objectDefinition"]
520+
objdef := policyTemplate["objectDefinition"].(map[string]interface{})
521521
name := "policy-app-config"
522522

523523
if i > 0 {
@@ -705,7 +705,7 @@ func TestGetPolicyTemplateFromPolicyTypeManifest(t *testing.T) {
705705
assertEqual(t, len(policyTemplates), 1)
706706

707707
IamPolicyTemplate := policyTemplates[0]
708-
IamObjdef := IamPolicyTemplate["objectDefinition"]
708+
IamObjdef := IamPolicyTemplate["objectDefinition"].(map[string]interface{})
709709
assertEqual(t, IamObjdef["apiVersion"], "policy.open-cluster-management.io/v1")
710710
// kind will not be overridden by "ConfigurationPolicy".
711711
assertEqual(t, IamObjdef["kind"], "IamPolicy")
@@ -778,7 +778,7 @@ data:
778778
assertEqual(t, len(policyTemplates), 1)
779779

780780
policyTemplate := policyTemplates[0]
781-
objdef := policyTemplate["objectDefinition"]
781+
objdef := policyTemplate["objectDefinition"].(map[string]interface{})
782782
assertEqual(t, objdef["metadata"].(map[string]interface{})["name"].(string), "policy-app-config")
783783

784784
spec, ok := objdef["spec"].(map[string]interface{})
@@ -866,7 +866,7 @@ data:
866866
assertEqual(t, len(policyTemplates), 1)
867867

868868
policyTemplate := policyTemplates[0]
869-
objdef := policyTemplate["objectDefinition"]
869+
objdef := policyTemplate["objectDefinition"].(map[string]interface{})
870870

871871
assertEqual(t, objdef["metadata"].(map[string]interface{})["name"].(string), "policy-app-config")
872872

@@ -1009,7 +1009,7 @@ metadata:
10091009
// This is not an in-depth test since the Kyverno expansion is tested elsewhere. This is to
10101010
// to test that glue code is working as expected.
10111011
expandedPolicyTemplate := policyTemplates[1]
1012-
objdef := expandedPolicyTemplate["objectDefinition"]
1012+
objdef := expandedPolicyTemplate["objectDefinition"].(map[string]interface{})
10131013

10141014
spec, ok := objdef["spec"].(map[string]interface{})
10151015
if !ok {
@@ -1469,8 +1469,8 @@ data:
14691469
func TestGetRootRemediationAction(t *testing.T) {
14701470
t.Parallel()
14711471

1472-
policyTemplates := []map[string]map[string]interface{}{
1473-
{"objectDefinition": {
1472+
policyTemplates := []map[string]interface{}{{
1473+
"objectDefinition": map[string]interface{}{
14741474
"apiVersion": policyAPIVersion,
14751475
"kind": configPolicyKind,
14761476
"metadata": map[string]interface{}{
@@ -1480,13 +1480,14 @@ func TestGetRootRemediationAction(t *testing.T) {
14801480
"remediationAction": "inform",
14811481
"severity": "low",
14821482
},
1483-
}},
1484-
}
1483+
},
1484+
}}
14851485

14861486
expected := getRootRemediationAction(policyTemplates)
14871487
assertEqual(t, "inform", expected)
14881488

1489-
policyTemplates[0]["objectDefinition"]["spec"].(map[string]interface{})["remediationAction"] = "enforce"
1489+
objDef := policyTemplates[0]["objectDefinition"].(map[string]interface{})
1490+
objDef["spec"].(map[string]interface{})["remediationAction"] = "enforce"
14901491
expected = getRootRemediationAction(policyTemplates)
14911492
assertEqual(t, "enforce", expected)
14921493
}

0 commit comments

Comments
 (0)