|
| 1 | +/* |
| 2 | +Copyright (c) Microsoft Corporation. |
| 3 | +Licensed under the MIT license. |
| 4 | +*/ |
| 5 | + |
| 6 | +package managedresource |
| 7 | + |
| 8 | +import ( |
| 9 | + "context" |
| 10 | + |
| 11 | + v1 "k8s.io/api/admissionregistration/v1" |
| 12 | + apierrors "k8s.io/apimachinery/pkg/api/errors" |
| 13 | + "k8s.io/apimachinery/pkg/api/meta" |
| 14 | + "k8s.io/klog/v2" |
| 15 | + "sigs.k8s.io/controller-runtime/pkg/client" |
| 16 | + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" |
| 17 | +) |
| 18 | + |
| 19 | +func EnsureNoVAP(ctx context.Context, c client.Client, isHub bool) error { |
| 20 | + objs := []client.Object{getValidatingAdmissionPolicy(isHub), getValidatingAdmissionPolicyBinding()} |
| 21 | + for _, obj := range objs { |
| 22 | + err := c.Delete(ctx, obj) |
| 23 | + switch { |
| 24 | + case err == nil, apierrors.IsNotFound(err): |
| 25 | + // continue |
| 26 | + case meta.IsNoMatchError(err): |
| 27 | + klog.Infof("object type %T is not supported in this cluster, continuing", obj) |
| 28 | + // continue |
| 29 | + default: |
| 30 | + klog.Errorf("Delete object type %T failed: %s", obj, err) |
| 31 | + return err |
| 32 | + } |
| 33 | + } |
| 34 | + return nil |
| 35 | +} |
| 36 | + |
| 37 | +func EnsureVAP(ctx context.Context, c client.Client, isHub bool) error { |
| 38 | + type vapObjectAndMutator struct { |
| 39 | + obj client.Object |
| 40 | + mutate func() error |
| 41 | + } |
| 42 | + // TODO: this can be simplified by dealing with the specific type rather than using client.Object |
| 43 | + vap, mutateVAP := getVAPWithMutator(isHub) |
| 44 | + vapb, mutateVAPB := getVAPBindingWithMutator() |
| 45 | + objsAndMutators := []vapObjectAndMutator{ |
| 46 | + { |
| 47 | + obj: vap, |
| 48 | + mutate: mutateVAP, |
| 49 | + }, |
| 50 | + { |
| 51 | + obj: vapb, |
| 52 | + mutate: mutateVAPB, |
| 53 | + }, |
| 54 | + } |
| 55 | + |
| 56 | + for _, objectMutator := range objsAndMutators { |
| 57 | + opResult, err := controllerutil.CreateOrUpdate(ctx, c, objectMutator.obj, objectMutator.mutate) |
| 58 | + switch { |
| 59 | + case err == nil: |
| 60 | + // continue |
| 61 | + case meta.IsNoMatchError(err): |
| 62 | + klog.Infof("object type %T is not supported in this cluster, continuing", objectMutator.obj) |
| 63 | + // continue |
| 64 | + default: |
| 65 | + klog.Errorf("CreateOrUpdate (operation: %s) for object type %T failed: %s", opResult, objectMutator.obj, err) |
| 66 | + return err |
| 67 | + } |
| 68 | + } |
| 69 | + return nil |
| 70 | +} |
| 71 | + |
| 72 | +func getVAPWithMutator(isHub bool) (*v1.ValidatingAdmissionPolicy, func() error) { |
| 73 | + vap := getValidatingAdmissionPolicy(isHub) |
| 74 | + return vap, func() error { |
| 75 | + mutateValidatingAdmissionPolicy(vap, isHub) |
| 76 | + return nil |
| 77 | + } |
| 78 | +} |
| 79 | + |
| 80 | +func getVAPBindingWithMutator() (*v1.ValidatingAdmissionPolicyBinding, func() error) { |
| 81 | + vapb := getValidatingAdmissionPolicyBinding() |
| 82 | + return vapb, func() error { |
| 83 | + mutateValidatingAdmissionPolicyBinding(vapb) |
| 84 | + return nil |
| 85 | + } |
| 86 | +} |
0 commit comments