Skip to content

Commit 2d7a140

Browse files
committed
Add PolicyOptions / ConfigurationPolicyOptions
These are consolidated structs that increase maintainability by having keys in a single location Signed-off-by: Dale Haiducek <[email protected]>
1 parent a09fc99 commit 2d7a140

File tree

6 files changed

+214
-153
lines changed

6 files changed

+214
-153
lines changed

internal/expanders/gatekeeper_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ func TestGatekeeperEnabled(t *testing.T) {
7474
}{{true, true}, {false, false}}
7575

7676
for _, test := range tests {
77-
policyConf := types.PolicyConfig{InformGatekeeperPolicies: test.Enabled}
77+
var policyConf types.PolicyConfig
78+
policyConf.InformGatekeeperPolicies = test.Enabled
7879
assertEqual(t, g.Enabled(&policyConf), test.Expected)
7980
}
8081
}

internal/expanders/kyverno_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ func TestKyvernoEnabled(t *testing.T) {
7777
}{{true, true}, {false, false}}
7878

7979
for _, test := range tests {
80-
policyConf := types.PolicyConfig{InformKyvernoPolicies: test.Enabled}
80+
var policyConf types.PolicyConfig
81+
policyConf.InformKyvernoPolicies = test.Enabled
8182
assertEqual(t, k.Enabled(&policyConf), test.Expected)
8283
}
8384
}

internal/plugin.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,16 @@ type Plugin struct {
6464
}
6565

6666
var defaults = types.PolicyDefaults{
67-
Categories: []string{"CM Configuration Management"},
68-
ComplianceType: "musthave",
69-
Controls: []string{"CM-2 Baseline Configuration"},
70-
RemediationAction: "inform",
71-
Severity: "low",
72-
Standards: []string{"NIST SP 800-53"},
67+
PolicyOptions: types.PolicyOptions{
68+
Categories: []string{"CM Configuration Management"},
69+
Controls: []string{"CM-2 Baseline Configuration"},
70+
Standards: []string{"NIST SP 800-53"},
71+
},
72+
ConfigurationPolicyOptions: types.ConfigurationPolicyOptions{
73+
ComplianceType: "musthave",
74+
RemediationAction: "inform",
75+
Severity: "low",
76+
},
7377
}
7478

7579
// Config validates the input PolicyGenerator configuration, applies any missing defaults, and

internal/plugin_test.go

Lines changed: 61 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,10 @@ func TestGenerate(t *testing.T) {
4848
},
4949
}
5050
policyConf := types.PolicyConfig{
51-
Name: "policy-app-config",
52-
PruneObjectBehavior: "None",
51+
Name: "policy-app-config",
52+
ConfigurationPolicyOptions: types.ConfigurationPolicyOptions{
53+
PruneObjectBehavior: "None",
54+
},
5355
Manifests: []types.Manifest{
5456
{
5557
Path: path.Join(tmpDir, "configmap.yaml"),
@@ -61,8 +63,10 @@ func TestGenerate(t *testing.T) {
6163
Name: "policy-app-config2",
6264
Manifests: []types.Manifest{
6365
{
64-
MetadataComplianceType: "mustonlyhave",
65-
Path: path.Join(tmpDir, "configmap.yaml"),
66+
ConfigurationPolicyOptions: types.ConfigurationPolicyOptions{
67+
MetadataComplianceType: "mustonlyhave",
68+
},
69+
Path: path.Join(tmpDir, "configmap.yaml"),
6670
},
6771
},
6872
}
@@ -782,10 +786,12 @@ func TestCreatePolicyFromIamPolicyTypeManifest(t *testing.T) {
782786
p := Plugin{}
783787
p.PolicyDefaults.Namespace = "Iam-policies"
784788
policyConf := types.PolicyConfig{
785-
Categories: []string{"AC Access Control"},
786-
Controls: []string{"AC-3 Access Enforcement"},
787-
Standards: []string{"NIST SP 800-53"},
788-
Name: "policy-limitclusteradmin",
789+
PolicyOptions: types.PolicyOptions{
790+
Categories: []string{"AC Access Control"},
791+
Controls: []string{"AC-3 Access Enforcement"},
792+
Standards: []string{"NIST SP 800-53"},
793+
},
794+
Name: "policy-limitclusteradmin",
789795
Manifests: []types.Manifest{
790796
{Path: path.Join(tmpDir, "iamKindManifestPluginTest.yaml")},
791797
},
@@ -845,9 +851,11 @@ func TestCreatePolicyDir(t *testing.T) {
845851
p := Plugin{}
846852
p.PolicyDefaults.Namespace = "my-policies"
847853
policyConf := types.PolicyConfig{
848-
Name: "policy-app-config",
849-
Manifests: []types.Manifest{{Path: tmpDir}},
850-
NamespaceSelector: types.NamespaceSelector{Include: []string{"default"}},
854+
Name: "policy-app-config",
855+
Manifests: []types.Manifest{{Path: tmpDir}},
856+
ConfigurationPolicyOptions: types.ConfigurationPolicyOptions{
857+
NamespaceSelector: types.NamespaceSelector{Include: []string{"default"}},
858+
},
851859
}
852860
p.Policies = append(p.Policies, policyConf)
853861
p.applyDefaults(map[string]interface{}{})
@@ -1156,15 +1164,19 @@ func TestCreatePlacementDuplicateName(t *testing.T) {
11561164
p.PolicyDefaults.Namespace = "my-policies"
11571165
policyConf := types.PolicyConfig{
11581166
Name: "policy-app-config",
1159-
Placement: types.PlacementConfig{
1160-
Name: "my-placement",
1167+
PolicyOptions: types.PolicyOptions{
1168+
Placement: types.PlacementConfig{
1169+
Name: "my-placement",
1170+
},
11611171
},
11621172
}
11631173
policyConf2 := types.PolicyConfig{
11641174
Name: "policy-app-config2",
1165-
Placement: types.PlacementConfig{
1166-
ClusterSelectors: map[string]string{"my": "app"},
1167-
Name: "my-placement",
1175+
PolicyOptions: types.PolicyOptions{
1176+
Placement: types.PlacementConfig{
1177+
ClusterSelectors: map[string]string{"my": "app"},
1178+
Name: "my-placement",
1179+
},
11681180
},
11691181
}
11701182

@@ -1676,7 +1688,9 @@ func TestGeneratePolicySets(t *testing.T) {
16761688
Path: path.Join(tmpDir, "configmap.yaml"),
16771689
},
16781690
},
1679-
PolicySets: []string{"policyset0"},
1691+
PolicyOptions: types.PolicyOptions{
1692+
PolicySets: []string{"policyset0"},
1693+
},
16801694
}
16811695
},
16821696
expectedPolicySetConfigInPolicy: [][]string{
@@ -1710,7 +1724,9 @@ func TestGeneratePolicySets(t *testing.T) {
17101724
Path: path.Join(tmpDir, "configmap.yaml"),
17111725
},
17121726
},
1713-
PolicySets: []string{},
1727+
PolicyOptions: types.PolicyOptions{
1728+
PolicySets: []string{},
1729+
},
17141730
}
17151731
},
17161732
expectedPolicySetConfigInPolicy: [][]string{
@@ -1820,7 +1836,9 @@ func TestGeneratePolicySetsWithPlacement(t *testing.T) {
18201836
Path: path.Join(tmpDir, "configmap.yaml"),
18211837
},
18221838
},
1823-
PolicySets: []string{"policyset"},
1839+
PolicyOptions: types.PolicyOptions{
1840+
PolicySets: []string{"policyset"},
1841+
},
18241842
}
18251843
p.Policies = append(p.Policies, policyConf)
18261844

@@ -1929,7 +1947,9 @@ func TestGeneratePolicySetsWithPolicyPlacement(t *testing.T) {
19291947
Path: path.Join(tmpDir, "configmap.yaml"),
19301948
},
19311949
},
1932-
PolicySets: []string{"my-policyset"},
1950+
PolicyOptions: types.PolicyOptions{
1951+
PolicySets: []string{"my-policyset"},
1952+
},
19331953
}
19341954
p.Policies = append(p.Policies, policyConf)
19351955
p.PolicySets = []types.PolicySetConfig{
@@ -2141,10 +2161,10 @@ func getYAMLEvaluationInterval(
21412161
configPolicy, ok := plcTemplate["objectDefinition"].(map[string]interface{})
21422162
assertEqual(t, ok, true)
21432163

2144-
configPolicySpec, ok := configPolicy["spec"].(map[string]interface{})
2164+
configPolicyOptions, ok := configPolicy["spec"].(map[string]interface{})
21452165
assertEqual(t, ok, true)
21462166

2147-
evaluationInterval, ok := configPolicySpec["evaluationInterval"].(map[string]interface{})
2167+
evaluationInterval, ok := configPolicyOptions["evaluationInterval"].(map[string]interface{})
21482168

21492169
if !skipFinalValidation {
21502170
assertEqual(t, ok, true)
@@ -2174,18 +2194,24 @@ func TestGenerateEvaluationInterval(t *testing.T) {
21742194

21752195
// Test that the policy evaluation interval gets inherited when not set on a manifest.
21762196
policyConf := types.PolicyConfig{
2177-
ConsolidateManifests: false,
2178-
EvaluationInterval: types.EvaluationInterval{
2179-
Compliant: "30m",
2180-
NonCompliant: "30s",
2197+
PolicyOptions: types.PolicyOptions{
2198+
ConsolidateManifests: false,
2199+
},
2200+
ConfigurationPolicyOptions: types.ConfigurationPolicyOptions{
2201+
EvaluationInterval: types.EvaluationInterval{
2202+
Compliant: "30m",
2203+
NonCompliant: "30s",
2204+
},
21812205
},
21822206
Name: "policy-app-config",
21832207
Manifests: []types.Manifest{
21842208
{Path: path.Join(tmpDir, "configmap.yaml")},
21852209
{
2186-
EvaluationInterval: types.EvaluationInterval{
2187-
Compliant: "25m",
2188-
NonCompliant: "5m",
2210+
ConfigurationPolicyOptions: types.ConfigurationPolicyOptions{
2211+
EvaluationInterval: types.EvaluationInterval{
2212+
Compliant: "25m",
2213+
NonCompliant: "5m",
2214+
},
21892215
},
21902216
Path: path.Join(tmpDir, "configmap.yaml"),
21912217
},
@@ -2204,8 +2230,10 @@ func TestGenerateEvaluationInterval(t *testing.T) {
22042230
}
22052231
// Test that explicitly setting evaluationInterval to an empty value overrides the policy default.
22062232
policyConf3 := types.PolicyConfig{
2207-
EvaluationInterval: types.EvaluationInterval{},
2208-
Name: "policy-app-config3",
2233+
ConfigurationPolicyOptions: types.ConfigurationPolicyOptions{
2234+
EvaluationInterval: types.EvaluationInterval{},
2235+
},
2236+
Name: "policy-app-config3",
22092237
Manifests: []types.Manifest{
22102238
{Path: path.Join(tmpDir, "configmap.yaml")},
22112239
},
@@ -2459,9 +2487,9 @@ func TestCreatePolicyWithNamespaceSelector(t *testing.T) {
24592487
// nolint: forcetypeassert
24602488
configPolicy := policyTemplates[0].(map[string]interface{})["objectDefinition"].(map[string]interface{})
24612489
// nolint: forcetypeassert
2462-
configPolicySpec := configPolicy["spec"].(map[string]interface{})
2490+
configPolicyOptions := configPolicy["spec"].(map[string]interface{})
24632491
// nolint: forcetypeassert
2464-
configPolicySelector := configPolicySpec["namespaceSelector"].(map[string]interface{})
2492+
configPolicySelector := configPolicyOptions["namespaceSelector"].(map[string]interface{})
24652493

24662494
if reflect.DeepEqual(test.namespaceSelector, types.NamespaceSelector{}) {
24672495
assertSelectorEqual(t, configPolicySelector, p.PolicyDefaults.NamespaceSelector)

internal/types/types.go

Lines changed: 39 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,35 @@ import (
77
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
88
)
99

10+
type PolicyOptions struct {
11+
Categories []string `json:"categories,omitempty" yaml:"categories,omitempty"`
12+
Controls []string `json:"controls,omitempty" yaml:"controls,omitempty"`
13+
Placement PlacementConfig `json:"placement,omitempty" yaml:"placement,omitempty"`
14+
Standards []string `json:"standards,omitempty" yaml:"standards,omitempty"`
15+
ConsolidateManifests bool `json:"consolidateManifests,omitempty" yaml:"consolidateManifests,omitempty"`
16+
Disabled bool `json:"disabled,omitempty" yaml:"disabled,omitempty"`
17+
InformGatekeeperPolicies bool `json:"informGatekeeperPolicies,omitempty" yaml:"informGatekeeperPolicies,omitempty"`
18+
InformKyvernoPolicies bool `json:"informKyvernoPolicies,omitempty" yaml:"informKyvernoPolicies,omitempty"`
19+
GeneratePlacementWhenInSet bool `json:"generatePlacementWhenInSet,omitempty" yaml:"generatePlacementWhenInSet,omitempty"`
20+
PolicySets []string `json:"policySets,omitempty" yaml:"policySets,omitempty"`
21+
PolicyAnnotations map[string]string `json:"policyAnnotations,omitempty" yaml:"policyAnnotations,omitempty"`
22+
ConfigurationPolicyAnnotations map[string]string `json:"configurationPolicyAnnotations,omitempty" yaml:"configurationPolicyAnnotations,omitempty"`
23+
}
24+
25+
type ConfigurationPolicyOptions struct {
26+
RemediationAction string `json:"remediationAction,omitempty" yaml:"remediationAction,omitempty"`
27+
Severity string `json:"severity,omitempty" yaml:"severity,omitempty"`
28+
ComplianceType string `json:"complianceType,omitempty" yaml:"complianceType,omitempty"`
29+
MetadataComplianceType string `json:"metadataComplianceType,omitempty" yaml:"metadataComplianceType,omitempty"`
30+
EvaluationInterval EvaluationInterval `json:"evaluationInterval,omitempty" yaml:"evaluationInterval,omitempty"`
31+
NamespaceSelector NamespaceSelector `json:"namespaceSelector,omitempty" yaml:"namespaceSelector,omitempty"`
32+
PruneObjectBehavior string `json:"pruneObjectBehavior,omitempty" yaml:"pruneObjectBehavior,omitempty"`
33+
}
34+
1035
type Manifest struct {
11-
ComplianceType string `json:"complianceType,omitempty" yaml:"complianceType,omitempty"`
12-
MetadataComplianceType string `json:"metadataComplianceType,omitempty" yaml:"metadataComplianceType,omitempty"`
13-
EvaluationInterval EvaluationInterval `json:"evaluationInterval,omitempty" yaml:"evaluationInterval,omitempty"`
14-
PruneObjectBehavior string `json:"pruneObjectBehavior,omitempty" yaml:"pruneObjectBehavior,omitempty"`
15-
Patches []map[string]interface{} `json:"patches,omitempty" yaml:"patches,omitempty"`
16-
Path string `json:"path,omitempty" yaml:"path,omitempty"`
36+
ConfigurationPolicyOptions `json:",inline" yaml:",inline"`
37+
Patches []map[string]interface{} `json:"patches,omitempty" yaml:"patches,omitempty"`
38+
Path string `json:"path,omitempty" yaml:"path,omitempty"`
1739
}
1840

1941
type NamespaceSelector struct {
@@ -58,60 +80,23 @@ type EvaluationInterval struct {
5880

5981
// PolicyConfig represents a policy entry in the PolicyGenerator configuration.
6082
type PolicyConfig struct {
61-
Categories []string `json:"categories,omitempty" yaml:"categories,omitempty"`
62-
ComplianceType string `json:"complianceType,omitempty" yaml:"complianceType,omitempty"`
63-
MetadataComplianceType string `json:"metadataComplianceType,omitempty" yaml:"metadataComplianceType,omitempty"`
64-
Controls []string `json:"controls,omitempty" yaml:"controls,omitempty"`
83+
PolicyOptions `json:",inline" yaml:",inline"`
84+
ConfigurationPolicyOptions `json:",inline" yaml:",inline"`
85+
Name string `json:"name,omitempty" yaml:"name,omitempty"`
6586
// This a slice of structs to allow additional configuration related to a manifest such as
6687
// accepting patches.
67-
Manifests []Manifest `json:"manifests,omitempty" yaml:"manifests,omitempty"`
68-
Name string `json:"name,omitempty" yaml:"name,omitempty"`
69-
NamespaceSelector NamespaceSelector `json:"namespaceSelector,omitempty" yaml:"namespaceSelector,omitempty"`
70-
// This is named Placement so that eventually PlacementRules and Placements will be supported
71-
Placement PlacementConfig `json:"placement,omitempty" yaml:"placement,omitempty"`
72-
RemediationAction string `json:"remediationAction,omitempty" yaml:"remediationAction,omitempty"`
73-
Severity string `json:"severity,omitempty" yaml:"severity,omitempty"`
74-
Standards []string `json:"standards,omitempty" yaml:"standards,omitempty"`
75-
ConsolidateManifests bool `json:"consolidateManifests,omitempty" yaml:"consolidateManifests,omitempty"`
76-
Disabled bool `json:"disabled,omitempty" yaml:"disabled,omitempty"`
77-
InformGatekeeperPolicies bool `json:"informGatekeeperPolicies,omitempty" yaml:"informGatekeeperPolicies,omitempty"`
78-
InformKyvernoPolicies bool `json:"informKyvernoPolicies,omitempty" yaml:"informKyvernoPolicies,omitempty"`
79-
GeneratePlacementWhenInSet bool `json:"generatePlacementWhenInSet,omitempty" yaml:"generatePlacementWhenInSet,omitempty"`
80-
PolicySets []string `json:"policySets,omitempty" yaml:"policySets,omitempty"`
81-
EvaluationInterval EvaluationInterval `json:"evaluationInterval,omitempty" yaml:"evaluationInterval,omitempty"`
82-
PolicyAnnotations map[string]string `json:"policyAnnotations,omitempty" yaml:"policyAnnotations,omitempty"`
83-
ConfigurationPolicyAnnotations map[string]string `json:"configurationPolicyAnnotations,omitempty" yaml:"configurationPolicyAnnotations,omitempty"`
84-
PruneObjectBehavior string `json:"pruneObjectBehavior,omitempty" yaml:"pruneObjectBehavior,omitempty"`
88+
Manifests []Manifest `json:"manifests,omitempty" yaml:"manifests,omitempty"`
8589
}
8690

8791
type PolicyDefaults struct {
88-
Categories []string `json:"categories,omitempty" yaml:"categories,omitempty"`
89-
ComplianceType string `json:"complianceType,omitempty" yaml:"complianceType,omitempty"`
90-
MetadataComplianceType string `json:"metadataComplianceType,omitempty" yaml:"metadataComplianceType,omitempty"`
91-
Controls []string `json:"controls,omitempty" yaml:"controls,omitempty"`
92-
Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"`
93-
NamespaceSelector NamespaceSelector `json:"namespaceSelector,omitempty" yaml:"namespaceSelector,omitempty"`
94-
// This is named Placement so that eventually PlacementRules and Placements will be supported
95-
Placement PlacementConfig `json:"placement,omitempty" yaml:"placement,omitempty"`
96-
RemediationAction string `json:"remediationAction,omitempty" yaml:"remediationAction,omitempty"`
97-
Severity string `json:"severity,omitempty" yaml:"severity,omitempty"`
98-
Standards []string `json:"standards,omitempty" yaml:"standards,omitempty"`
99-
ConsolidateManifests bool `json:"consolidateManifests,omitempty" yaml:"consolidateManifests,omitempty"`
100-
Disabled bool `json:"disabled,omitempty" yaml:"disabled,omitempty"`
101-
InformGatekeeperPolicies bool `json:"informGatekeeperPolicies,omitempty" yaml:"informGatekeeperPolicies,omitempty"`
102-
InformKyvernoPolicies bool `json:"informKyvernoPolicies,omitempty" yaml:"informKyvernoPolicies,omitempty"`
103-
GeneratePlacementWhenInSet bool `json:"generatePlacementWhenInSet,omitempty" yaml:"generatePlacementWhenInSet,omitempty"`
104-
PolicySets []string `json:"policySets,omitempty" yaml:"policySets,omitempty"`
105-
EvaluationInterval EvaluationInterval `json:"evaluationInterval,omitempty" yaml:"evaluationInterval,omitempty"`
106-
PolicyAnnotations map[string]string `json:"policyAnnotations,omitempty" yaml:"policyAnnotations,omitempty"`
107-
ConfigurationPolicyAnnotations map[string]string `json:"configurationPolicyAnnotations,omitempty" yaml:"configurationPolicyAnnotations,omitempty"`
108-
PruneObjectBehavior string `json:"pruneObjectBehavior,omitempty" yaml:"pruneObjectBehavior,omitempty"`
92+
PolicyOptions `json:",inline" yaml:",inline"`
93+
ConfigurationPolicyOptions `json:",inline" yaml:",inline"`
94+
Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"`
10995
}
11096

11197
type PolicySetConfig struct {
112-
Name string `json:"name,omitempty" yaml:"name,omitempty"`
113-
Description string `json:"description,omitempty" yaml:"description,omitempty"`
114-
Policies []string `json:"policies,omitempty" yaml:"policies,omitempty"`
115-
// This is named Placement so that eventually PlacementRules and Placements will be supported
116-
Placement PlacementConfig `json:"placement,omitempty" yaml:"placement,omitempty"`
98+
Name string `json:"name,omitempty" yaml:"name,omitempty"`
99+
Description string `json:"description,omitempty" yaml:"description,omitempty"`
100+
Policies []string `json:"policies,omitempty" yaml:"policies,omitempty"`
101+
Placement PlacementConfig `json:"placement,omitempty" yaml:"placement,omitempty"`
117102
}

0 commit comments

Comments
 (0)