88 "fmt"
99 "reflect"
1010
11+ admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
1112 appsv1 "k8s.io/api/apps/v1"
1213 corev1 "k8s.io/api/core/v1"
1314 policyv1 "k8s.io/api/policy/v1"
@@ -22,6 +23,7 @@ import (
2223 "sigs.k8s.io/controller-runtime/pkg/client"
2324 coreclientv1 "sigs.k8s.io/controller-runtime/pkg/client"
2425
26+ "github.com/openshift/library-go/pkg/operator/resource/resourceapply"
2527 "github.com/openshift/library-go/pkg/operator/resource/resourcemerge"
2628)
2729
@@ -83,6 +85,10 @@ func ApplyResource(ctx context.Context, client coreclientv1.Client, recorder rec
8385 return applyRoleBinding (ctx , client , recorder , t )
8486 case * rbacv1.ClusterRoleBinding :
8587 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 )
8692 default :
8793 return false , fmt .Errorf ("unhandled type %T" , resource )
8894 }
@@ -560,3 +566,87 @@ func applyClusterRoleBinding(ctx context.Context, client coreclientv1.Client, re
560566 recorder .Event (required , corev1 .EventTypeNormal , ResourceUpdateSuccessEvent , "Resource was successfully updated" )
561567 return true , nil
562568}
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 .DeepEqual (existingCopy .Spec , required .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 .DeepEqual (existingCopy .Spec , required .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