From 8311f1fe1a418e990056b3fcf8ba6f8d894a6cae Mon Sep 17 00:00:00 2001 From: Dario Tranchitella Date: Thu, 15 Dec 2022 15:05:36 +0100 Subject: [PATCH] fix: ensure default datastore exists before starting manager --- charts/kamaji/templates/datastore.yaml | 2 +- cmd/manager/cmd.go | 17 +++++++------ cmd/utils/check_flags.go | 22 ++++++++++++++++ internal/datastore/utils/check.go | 35 ++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 8 deletions(-) create mode 100644 cmd/utils/check_flags.go create mode 100644 internal/datastore/utils/check.go diff --git a/charts/kamaji/templates/datastore.yaml b/charts/kamaji/templates/datastore.yaml index b99ba8a..210818a 100644 --- a/charts/kamaji/templates/datastore.yaml +++ b/charts/kamaji/templates/datastore.yaml @@ -3,7 +3,7 @@ kind: DataStore metadata: name: {{ include "datastore.fullname" . }} annotations: - "helm.sh/hook": post-install + "helm.sh/hook": pre-install labels: {{- include "datastore.labels" . | nindent 4 }} spec: diff --git a/cmd/manager/cmd.go b/cmd/manager/cmd.go index a1c4651..6fff00c 100644 --- a/cmd/manager/cmd.go +++ b/cmd/manager/cmd.go @@ -19,10 +19,12 @@ import ( "sigs.k8s.io/controller-runtime/pkg/log/zap" kamajiv1alpha1 "github.com/clastix/kamaji/api/v1alpha1" + cmdutils "github.com/clastix/kamaji/cmd/utils" "github.com/clastix/kamaji/controllers" "github.com/clastix/kamaji/controllers/soot" "github.com/clastix/kamaji/indexers" "github.com/clastix/kamaji/internal" + datastoreutils "github.com/clastix/kamaji/internal/datastore/utils" "github.com/clastix/kamaji/internal/webhook" ) @@ -44,6 +46,8 @@ func NewCmd(scheme *runtime.Scheme) *cobra.Command { webhookCAPath string ) + ctx := ctrl.SetupSignalHandler() + cmd := &cobra.Command{ Use: "manager", Short: "Start the Kamaji Kubernetes Operator", @@ -54,24 +58,23 @@ func NewCmd(scheme *runtime.Scheme) *cobra.Command { klog.SetOutput(io.Discard) klog.LogToStderr(false) - for _, arg := range []string{"kine-image", "datastore", "migrate-image", "tmp-directory", "pod-namespace", "webhook-service-name", "serviceaccount-name", "webhook-ca-path"} { - v, _ := cmd.Flags().GetString(arg) - if len(v) == 0 { - return fmt.Errorf("expecting a value for --%s arg", arg) - } + if err = cmdutils.CheckFlags(cmd.Flags(), []string{"kine-image", "datastore", "migrate-image", "tmp-directory", "pod-namespace", "webhook-service-name", "serviceaccount-name", "webhook-ca-path"}...); err != nil { + return err } if webhookCABundle, err = os.ReadFile(webhookCAPath); err != nil { return fmt.Errorf("unable to read webhook CA: %w", err) } + if err = datastoreutils.CheckExists(ctx, scheme, datastore); err != nil { + return err + } + return nil }, RunE: func(cmd *cobra.Command, args []string) error { setupLog := ctrl.Log.WithName("setup") - ctx := ctrl.SetupSignalHandler() - setupLog.Info(fmt.Sprintf("Kamaji version %s %s%s", internal.GitTag, internal.GitCommit, internal.GitDirty)) setupLog.Info(fmt.Sprintf("Build from: %s", internal.GitRepo)) setupLog.Info(fmt.Sprintf("Build date: %s", internal.BuildTime)) diff --git a/cmd/utils/check_flags.go b/cmd/utils/check_flags.go new file mode 100644 index 0000000..3397fa9 --- /dev/null +++ b/cmd/utils/check_flags.go @@ -0,0 +1,22 @@ +// Copyright 2022 Clastix Labs +// SPDX-License-Identifier: Apache-2.0 + +package utils + +import ( + "fmt" + + "github.com/spf13/pflag" +) + +func CheckFlags(flags *pflag.FlagSet, args ...string) error { + for _, arg := range args { + v, _ := flags.GetString(arg) + + if len(v) == 0 { + return fmt.Errorf("expecting a value for --%s arg", arg) + } + } + + return nil +} diff --git a/internal/datastore/utils/check.go b/internal/datastore/utils/check.go new file mode 100644 index 0000000..a587ddd --- /dev/null +++ b/internal/datastore/utils/check.go @@ -0,0 +1,35 @@ +// Copyright 2022 Clastix Labs +// SPDX-License-Identifier: Apache-2.0 + +package utils + +import ( + "context" + "fmt" + + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + + kamajiv1alpha1 "github.com/clastix/kamaji/api/v1alpha1" +) + +// CheckExists ensures that the default Datastore exists before starting the manager. +func CheckExists(ctx context.Context, scheme *runtime.Scheme, datastoreName string) error { + ctrlClient, err := client.New(ctrl.GetConfigOrDie(), client.Options{Scheme: scheme}) + if err != nil { + return fmt.Errorf("unable to create controlerruntime.Client: %w", err) + } + + if err = ctrlClient.Get(ctx, types.NamespacedName{Name: datastoreName}, &kamajiv1alpha1.DataStore{}); err != nil { + if errors.IsNotFound(err) { + return fmt.Errorf("the default Datastore %s doesn't exist", datastoreName) + } + + return fmt.Errorf("an error occurred during datastore retrieval: %w", err) + } + + return nil +}