From 993b08a204f64a6426ff0e48baa20cc451eacc9b Mon Sep 17 00:00:00 2001 From: kkb0318 Date: Sun, 14 Apr 2024 20:44:02 +0900 Subject: [PATCH] no update (secret) --- internal/controller/irsasetup_controller.go | 2 +- .../controller/irsasetup_controller_test.go | 1 + internal/handler/handler.go | 3 +++ internal/handler/kubernetes.go | 16 +++++++++++++ internal/kubernetes/apply.go | 7 ------ internal/kubernetes/client.go | 7 ++++++ internal/kubernetes/create.go | 22 ++++++++++++++++++ internal/kubernetes/delete.go | 13 +++-------- internal/kubernetes/get.go | 23 +++++++++++++++++++ 9 files changed, 76 insertions(+), 18 deletions(-) create mode 100644 internal/kubernetes/create.go create mode 100644 internal/kubernetes/get.go diff --git a/internal/controller/irsasetup_controller.go b/internal/controller/irsasetup_controller.go index 43914b9..e4a4660 100644 --- a/internal/controller/irsasetup_controller.go +++ b/internal/controller/irsasetup_controller.go @@ -143,7 +143,7 @@ func reconcileSelfhosted(ctx context.Context, obj *irsav1alpha1.IRSASetup, awsCl if err != nil { return err } - err = kubeHandler.ApplyAll(ctx) + err = kubeHandler.CreateAll(ctx) if err != nil { return err } diff --git a/internal/controller/irsasetup_controller_test.go b/internal/controller/irsasetup_controller_test.go index 203ffa4..9110544 100644 --- a/internal/controller/irsasetup_controller_test.go +++ b/internal/controller/irsasetup_controller_test.go @@ -108,6 +108,7 @@ var _ = Describe("IRSASetup Controller", func() { for _, expect := range expected { checkNoExist(expect, newSecret) } + Expect(err).To(HaveOccurred()) }) }) }) diff --git a/internal/handler/handler.go b/internal/handler/handler.go index a33488d..7f0a642 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -4,11 +4,14 @@ import ( "context" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "sigs.k8s.io/controller-runtime/pkg/client" ) type KubernetesClient interface { Apply(ctx context.Context, obj client.Object) error + Create(ctx context.Context, obj client.Object) error + Get(ctx context.Context, obj client.Object) (*unstructured.Unstructured, error) Delete(ctx context.Context, obj client.Object, opts DeleteOptions) error } diff --git a/internal/handler/kubernetes.go b/internal/handler/kubernetes.go index b639e65..9d8cef7 100644 --- a/internal/handler/kubernetes.go +++ b/internal/handler/kubernetes.go @@ -2,7 +2,9 @@ package handler import ( "context" + "log" + "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -23,6 +25,20 @@ func (k *KubernetesHandler) Append(obj client.Object) { k.objs = append(k.objs, obj) } +// CreateAll creates the given objects (AlreadyExists errors are ignored) +func (k *KubernetesHandler) CreateAll(ctx context.Context) error { + for _, obj := range k.objs { + err := k.client.Create(ctx, obj) + if err != nil { + if !errors.IsAlreadyExists(err) { + return err + } + log.Printf("resource %s/%s already exists. skipped to create \n", obj.GetNamespace(), obj.GetName()) + } + } + return nil +} + func (k *KubernetesHandler) ApplyAll(ctx context.Context) error { for _, obj := range k.objs { err := k.client.Apply(ctx, obj) diff --git a/internal/kubernetes/apply.go b/internal/kubernetes/apply.go index 4050216..08f85d9 100644 --- a/internal/kubernetes/apply.go +++ b/internal/kubernetes/apply.go @@ -6,13 +6,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" ) -func NewKubernetesClient(c client.Client, owner Owner) (*KubernetesClient, error) { - return &KubernetesClient{ - client: c, - owner: owner, - }, nil -} - func (h KubernetesClient) Apply(ctx context.Context, obj client.Object) error { opts := []client.PatchOption{ client.ForceOwnership, diff --git a/internal/kubernetes/client.go b/internal/kubernetes/client.go index efd5403..9c36140 100644 --- a/internal/kubernetes/client.go +++ b/internal/kubernetes/client.go @@ -8,3 +8,10 @@ type KubernetesClient struct { client client.Client owner Owner } + +func NewKubernetesClient(c client.Client, owner Owner) (*KubernetesClient, error) { + return &KubernetesClient{ + client: c, + owner: owner, + }, nil +} diff --git a/internal/kubernetes/create.go b/internal/kubernetes/create.go new file mode 100644 index 0000000..00717fd --- /dev/null +++ b/internal/kubernetes/create.go @@ -0,0 +1,22 @@ +package kubernetes + +import ( + "context" + + "sigs.k8s.io/controller-runtime/pkg/client" +) + +func (h KubernetesClient) Create(ctx context.Context, obj client.Object) error { + opts := []client.CreateOption{ + client.FieldOwner(h.owner.Field), + } + u, err := h.toUnstructured(obj) + if err != nil { + return err + } + err = h.client.Create(ctx, u, opts...) + if err != nil { + return err + } + return nil +} diff --git a/internal/kubernetes/delete.go b/internal/kubernetes/delete.go index c535bb7..c2377ae 100644 --- a/internal/kubernetes/delete.go +++ b/internal/kubernetes/delete.go @@ -8,7 +8,6 @@ import ( "github.com/kkb0318/irsa-manager/internal/handler" "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/labels" "sigs.k8s.io/controller-runtime/pkg/client" @@ -16,13 +15,7 @@ import ( // Delete deletes the given object (not found errors are ignored). func (h *KubernetesClient) Delete(ctx context.Context, obj client.Object, opts handler.DeleteOptions) error { - u, err := h.toUnstructured(obj) - if err != nil { - return err - } - existingObject := &unstructured.Unstructured{} - existingObject.SetGroupVersionKind(u.GroupVersionKind()) - err = h.client.Get(ctx, client.ObjectKeyFromObject(u), existingObject) + existingObj, err := h.Get(ctx, obj) if err != nil { if !errors.IsNotFound(err) { return fmt.Errorf("failed to delete: %w", err) @@ -35,11 +28,11 @@ func (h *KubernetesClient) Delete(ctx context.Context, obj client.Object, opts h return fmt.Errorf("label selector failed: %w", err) } - if !sel.Matches(labels.Set(existingObject.GetLabels())) { + if !sel.Matches(labels.Set(existingObj.GetLabels())) { return nil } - if err := h.client.Delete(ctx, existingObject, client.PropagationPolicy(opts.DeletionPropagation)); err != nil { + if err := h.client.Delete(ctx, existingObj, client.PropagationPolicy(opts.DeletionPropagation)); err != nil { return fmt.Errorf("delete failed: %w", err) } diff --git a/internal/kubernetes/get.go b/internal/kubernetes/get.go new file mode 100644 index 0000000..08c6ebd --- /dev/null +++ b/internal/kubernetes/get.go @@ -0,0 +1,23 @@ +package kubernetes + +import ( + "context" + + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +// Get gets the given object. +func (h KubernetesClient) Get(ctx context.Context, obj client.Object) (*unstructured.Unstructured, error) { + u, err := h.toUnstructured(obj) + if err != nil { + return nil, err + } + existingObj := &unstructured.Unstructured{} + existingObj.SetGroupVersionKind(u.GroupVersionKind()) + err = h.client.Get(ctx, client.ObjectKeyFromObject(u), existingObj) + if err != nil { + return nil, err + } + return existingObj, nil +}