Skip to content

Commit 10fcc51

Browse files
committed
podsecurityreadinesscontroller: wire classification, simplify conditions
1 parent a2def2c commit 10fcc51

File tree

3 files changed

+44
-34
lines changed

3 files changed

+44
-34
lines changed

pkg/operator/podsecurityreadinesscontroller/conditions.go

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@ package podsecurityreadinesscontroller
33
import (
44
"fmt"
55
"sort"
6-
"strings"
76

87
corev1 "k8s.io/api/core/v1"
98
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10-
"k8s.io/apimachinery/pkg/util/sets"
119

1210
operatorv1 "github.com/openshift/api/operator/v1"
1311
"github.com/openshift/library-go/pkg/operator/v1helpers"
@@ -19,53 +17,45 @@ const (
1917
PodSecurityRunLevelZeroType = "PodSecurityRunLevelZeroEvaluationConditionsDetected"
2018
PodSecurityDisabledSyncerType = "PodSecurityDisabledSyncerEvaluationConditionsDetected"
2119
PodSecurityInconclusiveType = "PodSecurityInconclusiveEvaluationConditionsDetected"
20+
PodSecurityUserSCCType = "PodSecurityUserSCCEvaluationConditionsDetected"
2221

2322
labelSyncControlLabel = "security.openshift.io/scc.podSecurityLabelSync"
2423

2524
violationReason = "PSViolationsDetected"
2625
inconclusiveReason = "PSViolationDecisionInconclusive"
2726
)
2827

29-
var (
30-
// run-level zero namespaces, shouldn't avoid openshift namespaces
31-
runLevelZeroNamespaces = sets.New[string](
32-
"default",
33-
"kube-system",
34-
"kube-public",
35-
)
36-
)
37-
3828
type podSecurityOperatorConditions struct {
3929
violatingOpenShiftNamespaces []string
4030
violatingRunLevelZeroNamespaces []string
4131
violatingCustomerNamespaces []string
4232
violatingDisabledSyncerNamespaces []string
33+
violatingUserSCCNamespaces []string
4334
inconclusiveNamespaces []string
4435
}
4536

46-
func (c *podSecurityOperatorConditions) addViolation(ns *corev1.Namespace) {
47-
if runLevelZeroNamespaces.Has(ns.Name) {
48-
c.violatingRunLevelZeroNamespaces = append(c.violatingRunLevelZeroNamespaces, ns.Name)
49-
return
50-
}
37+
func (c *podSecurityOperatorConditions) addInconclusive(ns *corev1.Namespace) {
38+
c.inconclusiveNamespaces = append(c.inconclusiveNamespaces, ns.Name)
39+
}
5140

52-
isOpenShift := strings.HasPrefix(ns.Name, "openshift")
53-
if isOpenShift {
54-
c.violatingOpenShiftNamespaces = append(c.violatingOpenShiftNamespaces, ns.Name)
55-
return
56-
}
41+
func (c *podSecurityOperatorConditions) addViolatingRunLevelZero(ns *corev1.Namespace) {
42+
c.violatingRunLevelZeroNamespaces = append(c.violatingRunLevelZeroNamespaces, ns.Name)
43+
}
5744

58-
if ns.Labels[labelSyncControlLabel] == "false" {
59-
// This is the only case in which the controller wouldn't enforce the pod security standards.
60-
c.violatingDisabledSyncerNamespaces = append(c.violatingDisabledSyncerNamespaces, ns.Name)
61-
return
62-
}
45+
func (c *podSecurityOperatorConditions) addViolatingOpenShift(ns *corev1.Namespace) {
46+
c.violatingOpenShiftNamespaces = append(c.violatingOpenShiftNamespaces, ns.Name)
47+
}
6348

49+
func (c *podSecurityOperatorConditions) addViolatingDisabledSyncer(ns *corev1.Namespace) {
50+
c.violatingDisabledSyncerNamespaces = append(c.violatingDisabledSyncerNamespaces, ns.Name)
51+
}
52+
53+
func (c *podSecurityOperatorConditions) addViolatingCustomer(ns *corev1.Namespace) {
6454
c.violatingCustomerNamespaces = append(c.violatingCustomerNamespaces, ns.Name)
6555
}
6656

67-
func (c *podSecurityOperatorConditions) addInconclusive(ns *corev1.Namespace) {
68-
c.inconclusiveNamespaces = append(c.inconclusiveNamespaces, ns.Name)
57+
func (c *podSecurityOperatorConditions) addViolatingUserSCC(ns *corev1.Namespace) {
58+
c.violatingUserSCCNamespaces = append(c.violatingUserSCCNamespaces, ns.Name)
6959
}
7060

7161
func makeCondition(conditionType, conditionReason string, namespaces []string) operatorv1.OperatorCondition {
@@ -108,6 +98,7 @@ func (c *podSecurityOperatorConditions) toConditionFuncs() []v1helpers.UpdateSta
10898
v1helpers.UpdateConditionFn(makeCondition(PodSecurityOpenshiftType, violationReason, c.violatingOpenShiftNamespaces)),
10999
v1helpers.UpdateConditionFn(makeCondition(PodSecurityRunLevelZeroType, violationReason, c.violatingRunLevelZeroNamespaces)),
110100
v1helpers.UpdateConditionFn(makeCondition(PodSecurityDisabledSyncerType, violationReason, c.violatingDisabledSyncerNamespaces)),
101+
v1helpers.UpdateConditionFn(makeCondition(PodSecurityUserSCCType, violationReason, c.violatingUserSCCNamespaces)),
111102
v1helpers.UpdateConditionFn(makeCondition(PodSecurityInconclusiveType, inconclusiveReason, c.inconclusiveNamespaces)),
112103
}
113104
}

pkg/operator/podsecurityreadinesscontroller/conditions_test.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package podsecurityreadinesscontroller
22

33
import (
4+
"strings"
45
"testing"
56

67
operatorv1 "github.com/openshift/api/operator/v1"
@@ -117,6 +118,7 @@ func TestOperatorStatus(t *testing.T) {
117118
"PodSecurityOpenshiftEvaluationConditionsDetected": operatorv1.ConditionFalse,
118119
"PodSecurityRunLevelZeroEvaluationConditionsDetected": operatorv1.ConditionFalse,
119120
"PodSecurityDisabledSyncerEvaluationConditionsDetected": operatorv1.ConditionFalse,
121+
"PodSecurityUserSCCEvaluationConditionsDetected": operatorv1.ConditionFalse,
120122
"PodSecurityInconclusiveEvaluationConditionsDetected": operatorv1.ConditionFalse,
121123
},
122124
},
@@ -138,6 +140,7 @@ func TestOperatorStatus(t *testing.T) {
138140
"PodSecurityOpenshiftEvaluationConditionsDetected": operatorv1.ConditionFalse,
139141
"PodSecurityRunLevelZeroEvaluationConditionsDetected": operatorv1.ConditionFalse,
140142
"PodSecurityDisabledSyncerEvaluationConditionsDetected": operatorv1.ConditionTrue,
143+
"PodSecurityUserSCCEvaluationConditionsDetected": operatorv1.ConditionFalse,
141144
"PodSecurityInconclusiveEvaluationConditionsDetected": operatorv1.ConditionFalse,
142145
},
143146
},
@@ -159,6 +162,7 @@ func TestOperatorStatus(t *testing.T) {
159162
"PodSecurityOpenshiftEvaluationConditionsDetected": operatorv1.ConditionFalse,
160163
"PodSecurityRunLevelZeroEvaluationConditionsDetected": operatorv1.ConditionFalse,
161164
"PodSecurityDisabledSyncerEvaluationConditionsDetected": operatorv1.ConditionFalse,
165+
"PodSecurityUserSCCEvaluationConditionsDetected": operatorv1.ConditionFalse,
162166
"PodSecurityInconclusiveEvaluationConditionsDetected": operatorv1.ConditionFalse,
163167
},
164168
},
@@ -177,6 +181,7 @@ func TestOperatorStatus(t *testing.T) {
177181
"PodSecurityOpenshiftEvaluationConditionsDetected": operatorv1.ConditionTrue,
178182
"PodSecurityRunLevelZeroEvaluationConditionsDetected": operatorv1.ConditionFalse,
179183
"PodSecurityDisabledSyncerEvaluationConditionsDetected": operatorv1.ConditionFalse,
184+
"PodSecurityUserSCCEvaluationConditionsDetected": operatorv1.ConditionFalse,
180185
"PodSecurityInconclusiveEvaluationConditionsDetected": operatorv1.ConditionFalse,
181186
},
182187
},
@@ -195,6 +200,7 @@ func TestOperatorStatus(t *testing.T) {
195200
"PodSecurityOpenshiftEvaluationConditionsDetected": operatorv1.ConditionFalse,
196201
"PodSecurityRunLevelZeroEvaluationConditionsDetected": operatorv1.ConditionTrue,
197202
"PodSecurityDisabledSyncerEvaluationConditionsDetected": operatorv1.ConditionFalse,
203+
"PodSecurityUserSCCEvaluationConditionsDetected": operatorv1.ConditionFalse,
198204
"PodSecurityInconclusiveEvaluationConditionsDetected": operatorv1.ConditionFalse,
199205
},
200206
},
@@ -221,6 +227,7 @@ func TestOperatorStatus(t *testing.T) {
221227
"PodSecurityOpenshiftEvaluationConditionsDetected": operatorv1.ConditionFalse,
222228
"PodSecurityRunLevelZeroEvaluationConditionsDetected": operatorv1.ConditionFalse,
223229
"PodSecurityDisabledSyncerEvaluationConditionsDetected": operatorv1.ConditionTrue,
230+
"PodSecurityUserSCCEvaluationConditionsDetected": operatorv1.ConditionFalse,
224231
"PodSecurityInconclusiveEvaluationConditionsDetected": operatorv1.ConditionFalse,
225232
},
226233
},
@@ -251,6 +258,7 @@ func TestOperatorStatus(t *testing.T) {
251258
"PodSecurityOpenshiftEvaluationConditionsDetected": operatorv1.ConditionTrue,
252259
"PodSecurityRunLevelZeroEvaluationConditionsDetected": operatorv1.ConditionTrue,
253260
"PodSecurityDisabledSyncerEvaluationConditionsDetected": operatorv1.ConditionFalse,
261+
"PodSecurityUserSCCEvaluationConditionsDetected": operatorv1.ConditionFalse,
254262
"PodSecurityInconclusiveEvaluationConditionsDetected": operatorv1.ConditionFalse,
255263
},
256264
},
@@ -270,6 +278,7 @@ func TestOperatorStatus(t *testing.T) {
270278
"PodSecurityOpenshiftEvaluationConditionsDetected": operatorv1.ConditionFalse,
271279
"PodSecurityRunLevelZeroEvaluationConditionsDetected": operatorv1.ConditionFalse,
272280
"PodSecurityDisabledSyncerEvaluationConditionsDetected": operatorv1.ConditionFalse,
281+
"PodSecurityUserSCCEvaluationConditionsDetected": operatorv1.ConditionFalse,
273282
"PodSecurityInconclusiveEvaluationConditionsDetected": operatorv1.ConditionTrue,
274283
},
275284
},
@@ -280,7 +289,17 @@ func TestOperatorStatus(t *testing.T) {
280289

281290
for _, ns := range tt.namespace {
282291
if tt.addViolation {
283-
cond.addViolation(ns)
292+
// Classify namespace based on the same logic as classifyViolatingNamespace
293+
if runLevelZeroNamespaces.Has(ns.Name) {
294+
cond.addViolatingRunLevelZero(ns)
295+
} else if strings.HasPrefix(ns.Name, "openshift") {
296+
cond.addViolatingOpenShift(ns)
297+
} else if ns.Labels[labelSyncControlLabel] == "false" {
298+
cond.addViolatingDisabledSyncer(ns)
299+
} else {
300+
// Default to customer violation for test purposes
301+
cond.addViolatingCustomer(ns)
302+
}
284303
}
285304
if tt.addInconclusive {
286305
cond.addInconclusive(ns)

pkg/operator/podsecurityreadinesscontroller/podsecurityreadinesscontroller_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -315,8 +315,8 @@ func TestPodSecurityViolationController(t *testing.T) {
315315
},
316316
},
317317
expectedViolation: false,
318-
expectedEnforceLabel: "",
319-
expectedError: true,
318+
expectedEnforceLabel: "restricted",
319+
expectedError: false,
320320
},
321321
{
322322
name: "error against inconclusive namespace",
@@ -328,8 +328,8 @@ func TestPodSecurityViolationController(t *testing.T) {
328328
},
329329
},
330330
expectedViolation: false,
331-
expectedEnforceLabel: "",
332-
expectedError: true,
331+
expectedEnforceLabel: "restricted",
332+
expectedError: false,
333333
},
334334
} {
335335
tt := tt
@@ -357,7 +357,7 @@ func TestPodSecurityViolationController(t *testing.T) {
357357
},
358358
}
359359

360-
isViolating, err := controller.isNamespaceViolating(context.TODO(), tt.namespace)
360+
isViolating, _, err := controller.isNamespaceViolating(context.TODO(), tt.namespace)
361361
if (err != nil) != tt.expectedError {
362362
t.Errorf("expected error %v, got %v", tt.expectedError, err)
363363
}

0 commit comments

Comments
 (0)