Skip to content

Commit d5c85eb

Browse files
committed
add resource mutators for validatingadmissionpolicy and -binding resources
1 parent 3a5387f commit d5c85eb

File tree

4 files changed

+314
-0
lines changed

4 files changed

+314
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package resources
2+
3+
import (
4+
"fmt"
5+
6+
admissionv1 "k8s.io/api/admissionregistration/v1"
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
)
9+
10+
type ValidatingAdmissionPolicyMutator struct {
11+
Name string
12+
Spec admissionv1.ValidatingAdmissionPolicySpec
13+
meta MetadataMutator
14+
}
15+
16+
var _ Mutator[*admissionv1.ValidatingAdmissionPolicy] = &ValidatingAdmissionPolicyMutator{}
17+
18+
func NewValidatingAdmissionPolicyMutator(name string, sourceSpec admissionv1.ValidatingAdmissionPolicySpec) Mutator[*admissionv1.ValidatingAdmissionPolicy] {
19+
return &ValidatingAdmissionPolicyMutator{
20+
Name: name,
21+
Spec: sourceSpec,
22+
meta: NewMetadataMutator(),
23+
}
24+
}
25+
26+
func (m *ValidatingAdmissionPolicyMutator) String() string {
27+
return fmt.Sprintf("validatingadmissionpolicy %s", m.Name)
28+
}
29+
30+
func (m *ValidatingAdmissionPolicyMutator) Empty() *admissionv1.ValidatingAdmissionPolicy {
31+
return &admissionv1.ValidatingAdmissionPolicy{
32+
TypeMeta: metav1.TypeMeta{
33+
APIVersion: "admissionregistration.k8s.io/v1",
34+
Kind: "ValidatingAdmissionPolicy",
35+
},
36+
ObjectMeta: metav1.ObjectMeta{
37+
Name: m.Name,
38+
},
39+
}
40+
}
41+
42+
func (m *ValidatingAdmissionPolicyMutator) Mutate(r *admissionv1.ValidatingAdmissionPolicy) error {
43+
r.Spec = *m.Spec.DeepCopy()
44+
return m.meta.Mutate(r)
45+
}
46+
47+
func (m *ValidatingAdmissionPolicyMutator) MetadataMutator() MetadataMutator {
48+
return m.meta
49+
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package resources_test
2+
3+
import (
4+
"context"
5+
6+
. "github.com/onsi/ginkgo/v2"
7+
. "github.com/onsi/gomega"
8+
9+
admissionv1 "k8s.io/api/admissionregistration/v1"
10+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
"k8s.io/apimachinery/pkg/runtime"
12+
"k8s.io/utils/ptr"
13+
"sigs.k8s.io/controller-runtime/pkg/client"
14+
15+
"github.com/openmcp-project/controller-utils/pkg/resources"
16+
"github.com/openmcp-project/controller-utils/pkg/testing"
17+
)
18+
19+
var _ = Describe("ValidatingAdmissionPolicyMutator", func() {
20+
var (
21+
ctx context.Context
22+
fakeClient client.WithWatch
23+
scheme *runtime.Scheme
24+
labels map[string]string
25+
annotations map[string]string
26+
mutator resources.Mutator[*admissionv1.ValidatingAdmissionPolicy]
27+
)
28+
29+
BeforeEach(func() {
30+
ctx = context.TODO()
31+
32+
// Create a scheme and register the admissionregistration/v1 API
33+
scheme = runtime.NewScheme()
34+
Expect(admissionv1.AddToScheme(scheme)).To(Succeed())
35+
36+
// Initialize the fake client
37+
var err error
38+
fakeClient, err = testing.GetFakeClient(scheme)
39+
Expect(err).ToNot(HaveOccurred())
40+
41+
// Define labels and annotations
42+
labels = map[string]string{"label1": "value1"}
43+
annotations = map[string]string{"annotation1": "value1"}
44+
45+
// Create a ValidatingAdmissionPolicy mutator
46+
mutator = resources.NewValidatingAdmissionPolicyMutator("test-vap", admissionv1.ValidatingAdmissionPolicySpec{
47+
ParamKind: &admissionv1.ParamKind{
48+
APIVersion: "v1",
49+
Kind: "TestParam",
50+
},
51+
MatchConstraints: &admissionv1.MatchResources{
52+
NamespaceSelector: &metav1.LabelSelector{
53+
MatchLabels: map[string]string{"foo": "bar"},
54+
},
55+
},
56+
Validations: []admissionv1.Validation{
57+
{
58+
Expression: "asdf",
59+
Message: "doesnotmatter",
60+
MessageExpression: "qwer",
61+
},
62+
},
63+
FailurePolicy: ptr.To(admissionv1.Fail),
64+
AuditAnnotations: []admissionv1.AuditAnnotation{
65+
{
66+
Key: "example.com/audit",
67+
ValueExpression: "example.com/audit-value",
68+
},
69+
},
70+
MatchConditions: []admissionv1.MatchCondition{
71+
{
72+
Name: "example-condition",
73+
Expression: "example.com/condition-expression",
74+
},
75+
},
76+
Variables: []admissionv1.Variable{
77+
{
78+
Name: "example-variable",
79+
Expression: "example.com/variable-expression",
80+
},
81+
},
82+
})
83+
mutator.MetadataMutator().WithLabels(labels).WithAnnotations(annotations)
84+
})
85+
86+
It("should create an empty ValidatingAdmissionPolicy with correct metadata", func() {
87+
vap := mutator.Empty()
88+
89+
Expect(vap.Name).To(Equal("test-vap"))
90+
Expect(vap.APIVersion).To(Equal("admissionregistration.k8s.io/v1"))
91+
Expect(vap.Kind).To(Equal("ValidatingAdmissionPolicy"))
92+
})
93+
94+
It("should apply labels and annotations using Mutate", func() {
95+
vap := mutator.Empty()
96+
97+
// Apply the mutator's Mutate method
98+
Expect(mutator.Mutate(vap)).To(Succeed())
99+
100+
// Verify that the labels and annotations are applied
101+
Expect(vap.Labels).To(Equal(labels))
102+
Expect(vap.Annotations).To(Equal(annotations))
103+
})
104+
105+
It("should create and retrieve the ValidatingAdmissionPolicy using the fake client", func() {
106+
vap := mutator.Empty()
107+
Expect(mutator.Mutate(vap)).To(Succeed())
108+
109+
// Create the ValidatingAdmissionPolicy in the fake client
110+
Expect(fakeClient.Create(ctx, vap)).To(Succeed())
111+
112+
// Retrieve the ValidatingAdmissionPolicy from the fake client and verify it
113+
retrievedValidatingAdmissionPolicy := &admissionv1.ValidatingAdmissionPolicy{}
114+
Expect(fakeClient.Get(ctx, client.ObjectKey{Name: "test-vap"}, retrievedValidatingAdmissionPolicy)).To(Succeed())
115+
Expect(retrievedValidatingAdmissionPolicy).To(Equal(vap))
116+
})
117+
})
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package resources
2+
3+
import (
4+
"fmt"
5+
6+
admissionv1 "k8s.io/api/admissionregistration/v1"
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
)
9+
10+
type ValidatingAdmissionPolicyBindingMutator struct {
11+
Name string
12+
Spec admissionv1.ValidatingAdmissionPolicyBindingSpec
13+
meta MetadataMutator
14+
}
15+
16+
var _ Mutator[*admissionv1.ValidatingAdmissionPolicyBinding] = &ValidatingAdmissionPolicyBindingMutator{}
17+
18+
func NewValidatingAdmissionPolicyBindingMutator(name string, sourceSpec admissionv1.ValidatingAdmissionPolicyBindingSpec) Mutator[*admissionv1.ValidatingAdmissionPolicyBinding] {
19+
return &ValidatingAdmissionPolicyBindingMutator{
20+
Name: name,
21+
Spec: sourceSpec,
22+
meta: NewMetadataMutator(),
23+
}
24+
}
25+
26+
func (m *ValidatingAdmissionPolicyBindingMutator) String() string {
27+
return fmt.Sprintf("validatingadmissionpolicy %s", m.Name)
28+
}
29+
30+
func (m *ValidatingAdmissionPolicyBindingMutator) Empty() *admissionv1.ValidatingAdmissionPolicyBinding {
31+
return &admissionv1.ValidatingAdmissionPolicyBinding{
32+
TypeMeta: metav1.TypeMeta{
33+
APIVersion: "admissionregistration.k8s.io/v1",
34+
Kind: "ValidatingAdmissionPolicyBinding",
35+
},
36+
ObjectMeta: metav1.ObjectMeta{
37+
Name: m.Name,
38+
},
39+
}
40+
}
41+
42+
func (m *ValidatingAdmissionPolicyBindingMutator) Mutate(r *admissionv1.ValidatingAdmissionPolicyBinding) error {
43+
r.Spec = *m.Spec.DeepCopy()
44+
return m.meta.Mutate(r)
45+
}
46+
47+
func (m *ValidatingAdmissionPolicyBindingMutator) MetadataMutator() MetadataMutator {
48+
return m.meta
49+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package resources_test
2+
3+
import (
4+
"context"
5+
6+
. "github.com/onsi/ginkgo/v2"
7+
. "github.com/onsi/gomega"
8+
9+
admissionv1 "k8s.io/api/admissionregistration/v1"
10+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
"k8s.io/apimachinery/pkg/runtime"
12+
"k8s.io/utils/ptr"
13+
"sigs.k8s.io/controller-runtime/pkg/client"
14+
15+
"github.com/openmcp-project/controller-utils/pkg/resources"
16+
"github.com/openmcp-project/controller-utils/pkg/testing"
17+
)
18+
19+
var _ = Describe("ValidatingAdmissionPolicyBindingMutator", func() {
20+
var (
21+
ctx context.Context
22+
fakeClient client.WithWatch
23+
scheme *runtime.Scheme
24+
labels map[string]string
25+
annotations map[string]string
26+
mutator resources.Mutator[*admissionv1.ValidatingAdmissionPolicyBinding]
27+
)
28+
29+
BeforeEach(func() {
30+
ctx = context.TODO()
31+
32+
// Create a scheme and register the admissionregistration/v1 API
33+
scheme = runtime.NewScheme()
34+
Expect(admissionv1.AddToScheme(scheme)).To(Succeed())
35+
36+
// Initialize the fake client
37+
var err error
38+
fakeClient, err = testing.GetFakeClient(scheme)
39+
Expect(err).ToNot(HaveOccurred())
40+
41+
// Define labels and annotations
42+
labels = map[string]string{"label1": "value1"}
43+
annotations = map[string]string{"annotation1": "value1"}
44+
45+
// Create a ValidatingAdmissionPolicyBinding mutator
46+
mutator = resources.NewValidatingAdmissionPolicyBindingMutator("test-vapb", admissionv1.ValidatingAdmissionPolicyBindingSpec{
47+
PolicyName: "test-policy",
48+
ParamRef: &admissionv1.ParamRef{
49+
Name: "test-param",
50+
Namespace: "foo",
51+
Selector: &metav1.LabelSelector{
52+
MatchLabels: map[string]string{"foo": "bar"},
53+
},
54+
ParameterNotFoundAction: ptr.To(admissionv1.DenyAction),
55+
},
56+
MatchResources: &admissionv1.MatchResources{
57+
NamespaceSelector: &metav1.LabelSelector{
58+
MatchLabels: map[string]string{"foo": "bar"},
59+
},
60+
},
61+
ValidationActions: []admissionv1.ValidationAction{
62+
"asdf",
63+
},
64+
})
65+
mutator.MetadataMutator().WithLabels(labels).WithAnnotations(annotations)
66+
})
67+
68+
It("should create an empty ValidatingAdmissionPolicyBinding with correct metadata", func() {
69+
vapb := mutator.Empty()
70+
71+
Expect(vapb.Name).To(Equal("test-vapb"))
72+
Expect(vapb.APIVersion).To(Equal("admissionregistration.k8s.io/v1"))
73+
Expect(vapb.Kind).To(Equal("ValidatingAdmissionPolicyBinding"))
74+
})
75+
76+
It("should apply labels and annotations using Mutate", func() {
77+
vapb := mutator.Empty()
78+
79+
// Apply the mutator's Mutate method
80+
Expect(mutator.Mutate(vapb)).To(Succeed())
81+
82+
// Verify that the labels and annotations are applied
83+
Expect(vapb.Labels).To(Equal(labels))
84+
Expect(vapb.Annotations).To(Equal(annotations))
85+
})
86+
87+
It("should create and retrieve the ValidatingAdmissionPolicyBinding using the fake client", func() {
88+
vapb := mutator.Empty()
89+
Expect(mutator.Mutate(vapb)).To(Succeed())
90+
91+
// Create the ValidatingAdmissionPolicyBinding in the fake client
92+
Expect(fakeClient.Create(ctx, vapb)).To(Succeed())
93+
94+
// Retrieve the ValidatingAdmissionPolicyBinding from the fake client and verify it
95+
retrievedValidatingAdmissionPolicyBinding := &admissionv1.ValidatingAdmissionPolicyBinding{}
96+
Expect(fakeClient.Get(ctx, client.ObjectKey{Name: "test-vapb"}, retrievedValidatingAdmissionPolicyBinding)).To(Succeed())
97+
Expect(retrievedValidatingAdmissionPolicyBinding).To(Equal(vapb))
98+
})
99+
})

0 commit comments

Comments
 (0)