8
8
"fmt"
9
9
"reflect"
10
10
11
+ admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
11
12
appsv1 "k8s.io/api/apps/v1"
12
13
corev1 "k8s.io/api/core/v1"
13
14
policyv1 "k8s.io/api/policy/v1"
@@ -22,6 +23,7 @@ import (
22
23
"sigs.k8s.io/controller-runtime/pkg/client"
23
24
coreclientv1 "sigs.k8s.io/controller-runtime/pkg/client"
24
25
26
+ "github.com/openshift/library-go/pkg/operator/resource/resourceapply"
25
27
"github.com/openshift/library-go/pkg/operator/resource/resourcemerge"
26
28
)
27
29
@@ -83,6 +85,10 @@ func ApplyResource(ctx context.Context, client coreclientv1.Client, recorder rec
83
85
return applyRoleBinding (ctx , client , recorder , t )
84
86
case * rbacv1.ClusterRoleBinding :
85
87
return applyClusterRoleBinding (ctx , client , recorder , t )
88
+ case * admissionregistrationv1.ValidatingAdmissionPolicy :
89
+ return applyValidatingAdmissionPolicy (ctx , client , recorder , t )
90
+ case * admissionregistrationv1.ValidatingAdmissionPolicyBinding :
91
+ return applyValidatingAdmissionPolicyBinding (ctx , client , recorder , t )
86
92
default :
87
93
return false , fmt .Errorf ("unhandled type %T" , resource )
88
94
}
@@ -560,3 +566,87 @@ func applyClusterRoleBinding(ctx context.Context, client coreclientv1.Client, re
560
566
recorder .Event (required , corev1 .EventTypeNormal , ResourceUpdateSuccessEvent , "Resource was successfully updated" )
561
567
return true , nil
562
568
}
569
+
570
+ func applyValidatingAdmissionPolicy (ctx context.Context , client coreclientv1.Client , recorder record.EventRecorder ,
571
+ requiredOriginal * admissionregistrationv1.ValidatingAdmissionPolicy ) (bool , error ) {
572
+ required := requiredOriginal .DeepCopy ()
573
+
574
+ existing := & admissionregistrationv1.ValidatingAdmissionPolicy {}
575
+ err := client .Get (ctx , coreclientv1 .ObjectKeyFromObject (requiredOriginal ), existing )
576
+ if apierrors .IsNotFound (err ) {
577
+ required := requiredOriginal .DeepCopy ()
578
+ if err := client .Create (ctx , required ); err != nil {
579
+ recorder .Event (required , corev1 .EventTypeWarning , ResourceCreateFailedEvent , err .Error ())
580
+ return false , fmt .Errorf ("validatingadmissionpolicy creation failed: %v" , err )
581
+ }
582
+ recorder .Event (required , corev1 .EventTypeNormal , ResourceCreateSuccessEvent , "Resource was successfully created" )
583
+ return true , nil
584
+ } else if err != nil {
585
+ recorder .Event (required , corev1 .EventTypeWarning , ResourceUpdateFailedEvent , err .Error ())
586
+ return false , fmt .Errorf ("failed to get validatingadmissionpolicy for update: %v" , err )
587
+ }
588
+
589
+ modified := false
590
+ existingCopy := existing .DeepCopy ()
591
+
592
+ resourcemerge .EnsureObjectMeta (& modified , & existingCopy .ObjectMeta , required .ObjectMeta )
593
+ specEquivalent := equality .Semantic .DeepDerivative (required .Spec , existingCopy .Spec )
594
+ if specEquivalent && ! modified {
595
+ return false , nil
596
+ }
597
+ // at this point we know that we're going to perform a write. We're just trying to get the object correct
598
+ toWrite := existingCopy // shallow copy so the code reads easier
599
+ toWrite .Spec = required .Spec
600
+
601
+ klog .V (2 ).Infof ("ValidatingAdmissionPolicyConfiguration %q changes: %v" , required .GetNamespace ()+ "/" + required .GetName (), resourceapply .JSONPatchNoError (existing , toWrite ))
602
+
603
+ if err := client .Update (ctx , existingCopy ); err != nil {
604
+ recorder .Event (required , corev1 .EventTypeWarning , ResourceUpdateFailedEvent , err .Error ())
605
+ return false , err
606
+ }
607
+ recorder .Event (required , corev1 .EventTypeNormal , ResourceUpdateSuccessEvent , "Resource was successfully updated" )
608
+
609
+ return true , nil
610
+ }
611
+
612
+ func applyValidatingAdmissionPolicyBinding (ctx context.Context , client coreclientv1.Client , recorder record.EventRecorder ,
613
+ requiredOriginal * admissionregistrationv1.ValidatingAdmissionPolicyBinding ) (bool , error ) {
614
+ required := requiredOriginal .DeepCopy ()
615
+
616
+ existing := & admissionregistrationv1.ValidatingAdmissionPolicyBinding {}
617
+ err := client .Get (ctx , coreclientv1 .ObjectKeyFromObject (requiredOriginal ), existing )
618
+ if apierrors .IsNotFound (err ) {
619
+ required := requiredOriginal .DeepCopy ()
620
+ if err := client .Create (ctx , required ); err != nil {
621
+ recorder .Event (required , corev1 .EventTypeWarning , ResourceCreateFailedEvent , err .Error ())
622
+ return false , fmt .Errorf ("validatingadmissionpolicybinding creation failed: %v" , err )
623
+ }
624
+ recorder .Event (required , corev1 .EventTypeNormal , ResourceCreateSuccessEvent , "Resource was successfully created" )
625
+ return true , nil
626
+ } else if err != nil {
627
+ recorder .Event (required , corev1 .EventTypeWarning , ResourceUpdateFailedEvent , err .Error ())
628
+ return false , fmt .Errorf ("failed to get validatingadmissionpolicybinding for update: %v" , err )
629
+ }
630
+
631
+ modified := false
632
+ existingCopy := existing .DeepCopy ()
633
+
634
+ resourcemerge .EnsureObjectMeta (& modified , & existingCopy .ObjectMeta , required .ObjectMeta )
635
+ specEquivalent := equality .Semantic .DeepDerivative (required .Spec , existingCopy .Spec )
636
+ if specEquivalent && ! modified {
637
+ return false , nil
638
+ }
639
+ // at this point we know that we're going to perform a write. We're just trying to get the object correct
640
+ toWrite := existingCopy // shallow copy so the code reads easier
641
+ toWrite .Spec = required .Spec
642
+
643
+ klog .V (2 ).Infof ("ValidatingAdmissionPolicyBindingConfiguration %q changes: %v" , required .GetNamespace ()+ "/" + required .GetName (), resourceapply .JSONPatchNoError (existing , toWrite ))
644
+
645
+ if err := client .Update (ctx , existingCopy ); err != nil {
646
+ recorder .Event (required , corev1 .EventTypeWarning , ResourceUpdateFailedEvent , err .Error ())
647
+ return false , err
648
+ }
649
+ recorder .Event (required , corev1 .EventTypeNormal , ResourceUpdateSuccessEvent , "Resource was successfully updated" )
650
+
651
+ return true , nil
652
+ }
0 commit comments