Skip to content

Commit 60aab74

Browse files
committed
Add resourceapply for VAP and VAPB
1 parent 0a7eb4b commit 60aab74

File tree

1 file changed

+90
-0
lines changed

1 file changed

+90
-0
lines changed

pkg/controllers/resourceapply/resourceapply.go

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
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.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

Comments
 (0)