From a03a9f07cd16e2263d399f30b6ecb41fca61b54b Mon Sep 17 00:00:00 2001 From: Josef Karasek Date: Mon, 19 Feb 2024 15:46:50 +0100 Subject: [PATCH 1/9] Add option to select keda release to KedaController CRD Signed-off-by: Josef Karasek --- apis/keda/v1alpha1/kedacontroller_types.go | 5 +- config/crd/bases/keda.sh_kedacontrollers.yaml | 2 + .../samples/keda_v1alpha1_kedacontroller.yaml | 2 + controllers/keda/kedacontroller_controller.go | 181 ++++++++++-------- controllers/keda/kedacontroller_finalizer.go | 8 +- hack/kedacontroller.yaml | 2 + main.go | 2 +- resources/resources_handler.go | 14 +- 8 files changed, 124 insertions(+), 92 deletions(-) diff --git a/apis/keda/v1alpha1/kedacontroller_types.go b/apis/keda/v1alpha1/kedacontroller_types.go index 26e884029..0b94489c6 100644 --- a/apis/keda/v1alpha1/kedacontroller_types.go +++ b/apis/keda/v1alpha1/kedacontroller_types.go @@ -35,6 +35,9 @@ const ( // +kubebuilder:subresource:status type KedaControllerSpec struct { + // +optional + KedaRelease string `json:"kedaRelease,omitempty"` + // +optional WatchNamespace string `json:"watchNamespace,omitempty"` @@ -206,8 +209,6 @@ type KedaControllerStatus struct { ConfigMapDataSum string `json:"configmapdatasum,omitempty"` // +optional SecretDataSum string `json:"secretdatasum,omitempty"` - - // Important: Run "make" to regenerate code after modifying this file } // +kubebuilder:object:root=true diff --git a/config/crd/bases/keda.sh_kedacontrollers.yaml b/config/crd/bases/keda.sh_kedacontrollers.yaml index fd883b6d0..956fbbc4d 100644 --- a/config/crd/bases/keda.sh_kedacontrollers.yaml +++ b/config/crd/bases/keda.sh_kedacontrollers.yaml @@ -1210,6 +1210,8 @@ spec: type: object type: array type: object + kedaRelease: + type: string metricsServer: properties: affinity: diff --git a/config/samples/keda_v1alpha1_kedacontroller.yaml b/config/samples/keda_v1alpha1_kedacontroller.yaml index 0dfa55978..e7ad0caf7 100644 --- a/config/samples/keda_v1alpha1_kedacontroller.yaml +++ b/config/samples/keda_v1alpha1_kedacontroller.yaml @@ -9,6 +9,8 @@ spec: # with Name set to 'keda' created in namespace 'keda' ### + # kedaRelease: "" + ## Namespace that should be watched by KEDA, # omit or set empty to watch all namespaces (default setting) watchNamespace: "" diff --git a/controllers/keda/kedacontroller_controller.go b/controllers/keda/kedacontroller_controller.go index c1507f27c..d8d8db0a2 100644 --- a/controllers/keda/kedacontroller_controller.go +++ b/controllers/keda/kedacontroller_controller.go @@ -75,38 +75,30 @@ const ( // KedaControllerReconciler reconciles a KedaController object type KedaControllerReconciler struct { client.Client - Log logr.Logger - Scheme *runtime.Scheme - CertDir string - LeaderElection bool - rotatorStarted bool - mgr ctrl.Manager + Log logr.Logger + Scheme *runtime.Scheme + CertDir string + LeaderElection bool + rotatorStarted bool + mgr ctrl.Manager + manifests map[string]resourceManifests + discoveryClient *discovery.DiscoveryClient + resourceNamespace string +} + +type resourceManifests struct { resourcesGeneral mf.Manifest resourcesController mf.Manifest resourcesMetrics mf.Manifest resourcesWebhooks mf.Manifest resourcesMonitoring mf.Manifest - discoveryClient *discovery.DiscoveryClient - resourceNamespace string } func (r *KedaControllerReconciler) SetupWithManager(mgr ctrl.Manager, kedaControllerResourceNamespace string, logger logr.Logger) error { r.resourceNamespace = kedaControllerResourceNamespace r.mgr = mgr - resourcesManifest, err := resources.GetResourcesManifest() - if err != nil { - return err - } - manifestGeneral, manifestController, manifestMetrics, manifestWebhooks, manifestMonitoring, err := parseManifestsFromFile(resourcesManifest, r.Client) - if err != nil { - return err - } + r.manifests = make(map[string]resourceManifests) - r.resourcesGeneral = manifestGeneral - r.resourcesController = manifestController - r.resourcesMetrics = manifestMetrics - r.resourcesWebhooks = manifestWebhooks - r.resourcesMonitoring = manifestMonitoring if restConfig, err := ctrl.GetConfig(); err != nil { logger.Info("Unable to get REST Config for cluster version discovery. Ignore this message in test environments", "err", err) } else { @@ -164,12 +156,17 @@ func (r *KedaControllerReconciler) Reconcile(ctx context.Context, req ctrl.Reque return ctrl.Result{}, util.UpdateKedaControllerStatus(ctx, r.Client, instance, status) } - if instance.GetDeletionTimestamp() != nil { + manifests, err := r.getResourceManifests(instance.Spec.KedaRelease) + if err != nil { + return ctrl.Result{}, err + } + + if !instance.GetDeletionTimestamp().IsZero() { if contains(instance.GetFinalizers(), kedaControllerFinalizer) { // Run finalization logic for kedaControllerFinalizer. If the // finalization logic fails, don't remove the finalizer so // that we can retry during the next reconciliation. - if err := r.finalizeKedaController(logger); err != nil { + if err := r.finalizeKedaController(logger, manifests); err != nil { return ctrl.Result{}, err } // Remove kedaControllerFinalizer. Once all finalizers have been @@ -194,21 +191,21 @@ func (r *KedaControllerReconciler) Reconcile(ctx context.Context, req ctrl.Reque status := instance.Status.DeepCopy() - if err := r.installSA(logger, instance); err != nil { + if err := r.installSA(logger, instance, manifests); err != nil { status.MarkInstallFailed("Not able to create ServiceAccount") if statusErr := util.UpdateKedaControllerStatus(ctx, r.Client, instance, status); statusErr != nil { err = fmt.Errorf("got error: %s and then another: %s", err, statusErr) } return ctrl.Result{}, err } - if err := r.installController(ctx, logger, instance); err != nil { + if err := r.installController(ctx, logger, instance, manifests); err != nil { status.MarkInstallFailed("Not able to install KEDA Controller") if statusErr := util.UpdateKedaControllerStatus(ctx, r.Client, instance, status); statusErr != nil { err = fmt.Errorf("got error: %s and then another: %s", err, statusErr) } return ctrl.Result{}, err } - if err := r.installMetricsServer(ctx, logger, instance); err != nil { + if err := r.installMetricsServer(ctx, logger, instance, manifests); err != nil { status.MarkInstallFailed("Not able to install KEDA Metrics Server") if statusErr := util.UpdateKedaControllerStatus(ctx, r.Client, instance, status); statusErr != nil { err = fmt.Errorf("got error: %s and then another: %s", err, statusErr) @@ -216,7 +213,7 @@ func (r *KedaControllerReconciler) Reconcile(ctx context.Context, req ctrl.Reque return ctrl.Result{}, err } - if err := r.installAdmissionWebhooks(ctx, logger, instance); err != nil { + if err := r.installAdmissionWebhooks(ctx, logger, instance, manifests); err != nil { status.MarkInstallFailed("Not able to install KEDA Admission Webhooks") if statusErr := util.UpdateKedaControllerStatus(ctx, r.Client, instance, status); statusErr != nil { err = fmt.Errorf("got error: %s and then another: %s", err, statusErr) @@ -224,7 +221,7 @@ func (r *KedaControllerReconciler) Reconcile(ctx context.Context, req ctrl.Reque return ctrl.Result{}, err } - if err := r.installMonitoring(ctx, logger, instance); err != nil { + if err := r.installMonitoring(ctx, logger, instance, manifests); err != nil { status.MarkInstallFailed("Not able to install monitoring resources") if statusErr := util.UpdateKedaControllerStatus(ctx, r.Client, instance, status); statusErr != nil { err = fmt.Errorf("got error: %s and then another: %s", err, statusErr) @@ -241,67 +238,91 @@ func (r *KedaControllerReconciler) Reconcile(ctx context.Context, req ctrl.Reque return ctrl.Result{}, nil } -func parseManifestsFromFile(manifest mf.Manifest, c client.Client) (manifestGeneral, manifestController, - manifestMetrics, manifestWebhook, manifestMonitoring mf.Manifest, err error) { +func (r *KedaControllerReconciler) getResourceManifests(kedaRelease string) (*resourceManifests, error) { + if m, ok := r.manifests[kedaRelease]; ok { + return &m, nil + } + manifestsFile, err := resources.GetResourcesManifest(kedaRelease) + if err != nil { + return nil, fmt.Errorf("unable to get resources manifest: %v", err) + } + parsedManifests, err := r.parseManifestsFromFile(manifestsFile) + if err != nil { + return nil, fmt.Errorf("unable to parse resources manifest: %v", err) + } + + r.manifests[kedaRelease] = *parsedManifests + + return parsedManifests, nil +} + +func (r *KedaControllerReconciler) parseManifestsFromFile(manifest mf.Manifest) (*resourceManifests, error) { var generalResources, controllerResources, metricsResources, webhookResources, monitoringResources []unstructured.Unstructured - for _, r := range manifest.Resources() { - switch kind := r.GetKind(); kind { + for _, res := range manifest.Resources() { + switch kind := res.GetKind(); kind { case "APIService", "ValidatingWebhookConfiguration": - if name := r.GetName(); name == "keda-admission-webhooks" || name == "keda-admission" { - webhookResources = append(webhookResources, r) + if name := res.GetName(); name == "keda-admission-webhooks" || name == "keda-admission" { + webhookResources = append(webhookResources, res) } else { - metricsResources = append(metricsResources, r) + metricsResources = append(metricsResources, res) } case "ClusterRole", "ClusterRoleBinding", "Deployment", "Role", "RoleBinding", "Service": - if name := r.GetName(); name == "keda-operator" { - controllerResources = append(controllerResources, r) - } else if name := r.GetName(); name == "keda-admission-webhooks" || name == "keda-admission" { - webhookResources = append(webhookResources, r) + if name := res.GetName(); name == "keda-operator" { + controllerResources = append(controllerResources, res) + } else if name := res.GetName(); name == "keda-admission-webhooks" || name == "keda-admission" { + webhookResources = append(webhookResources, res) } else { - metricsResources = append(metricsResources, r) + metricsResources = append(metricsResources, res) } case "Secret": - controllerResources = append(controllerResources, r) + controllerResources = append(controllerResources, res) case "Namespace", "ServiceAccount": - generalResources = append(generalResources, r) + generalResources = append(generalResources, res) case "PodMonitor", "ServiceMonitor": - monitoringResources = append(monitoringResources, r) + monitoringResources = append(monitoringResources, res) } } - manifestClient := mfc.NewClient(c) - manifestGeneral, err = mf.ManifestFrom(mf.Slice(generalResources), mf.UseLastAppliedConfigAnnotation(resources.LastConfigID)) + var err error + manifestClient := mfc.NewClient(r.Client) + resourcesGeneral, err := mf.ManifestFrom(mf.Slice(generalResources), mf.UseLastAppliedConfigAnnotation(resources.LastConfigID)) if err != nil { - return mf.Manifest{}, mf.Manifest{}, mf.Manifest{}, mf.Manifest{}, mf.Manifest{}, err + return nil, err } - manifestGeneral.Client = manifestClient + resourcesGeneral.Client = manifestClient - manifestController, err = mf.ManifestFrom(mf.Slice(controllerResources), mf.UseLastAppliedConfigAnnotation(resources.LastConfigID)) + resourcesController, err := mf.ManifestFrom(mf.Slice(controllerResources), mf.UseLastAppliedConfigAnnotation(resources.LastConfigID)) if err != nil { - return mf.Manifest{}, mf.Manifest{}, mf.Manifest{}, mf.Manifest{}, mf.Manifest{}, err + return nil, err } - manifestController.Client = manifestClient + resourcesController.Client = manifestClient - manifestMetrics, err = mf.ManifestFrom(mf.Slice(sortMetricsResources(&metricsResources)), mf.UseLastAppliedConfigAnnotation(resources.LastConfigID)) + resourcesMetrics, err := mf.ManifestFrom(mf.Slice(sortMetricsResources(&metricsResources)), mf.UseLastAppliedConfigAnnotation(resources.LastConfigID)) if err != nil { - return mf.Manifest{}, mf.Manifest{}, mf.Manifest{}, mf.Manifest{}, mf.Manifest{}, err + return nil, err } - manifestMetrics.Client = manifestClient + resourcesMetrics.Client = manifestClient - manifestWebhook, err = mf.ManifestFrom(mf.Slice(webhookResources), mf.UseLastAppliedConfigAnnotation(resources.LastConfigID)) + resourcesWebhooks, err := mf.ManifestFrom(mf.Slice(webhookResources), mf.UseLastAppliedConfigAnnotation(resources.LastConfigID)) if err != nil { - return mf.Manifest{}, mf.Manifest{}, mf.Manifest{}, mf.Manifest{}, mf.Manifest{}, err + return nil, err } - manifestWebhook.Client = manifestClient + resourcesWebhooks.Client = manifestClient - manifestMonitoring, err = mf.ManifestFrom(mf.Slice(monitoringResources), mf.UseLastAppliedConfigAnnotation(resources.LastConfigID)) + resourcesMonitoring, err := mf.ManifestFrom(mf.Slice(monitoringResources), mf.UseLastAppliedConfigAnnotation(resources.LastConfigID)) if err != nil { - return mf.Manifest{}, mf.Manifest{}, mf.Manifest{}, mf.Manifest{}, mf.Manifest{}, err + return nil, err } - manifestMonitoring.Client = manifestClient + resourcesMonitoring.Client = manifestClient - return + return &resourceManifests{ + resourcesGeneral: resourcesGeneral, + resourcesController: resourcesController, + resourcesMetrics: resourcesMetrics, + resourcesWebhooks: resourcesWebhooks, + resourcesMonitoring: resourcesMonitoring, + }, nil } func sortMetricsResources(resources *[]unstructured.Unstructured) []unstructured.Unstructured { @@ -331,7 +352,7 @@ func sortMetricsResources(resources *[]unstructured.Unstructured) []unstructured return sortedResources } -func (r *KedaControllerReconciler) installSA(logger logr.Logger, instance *kedav1alpha1.KedaController) error { +func (r *KedaControllerReconciler) installSA(logger logr.Logger, instance *kedav1alpha1.KedaController, manifests *resourceManifests) error { logger.Info("Reconciling KEDA ServiceAccount") transforms := []mf.Transformer{ transform.InjectOwner(instance), @@ -346,14 +367,14 @@ func (r *KedaControllerReconciler) installSA(logger logr.Logger, instance *kedav transforms = append(transforms, transform.AddServiceAccountLabels(instance.Spec.ServiceAccount.Labels, r.Scheme)) } - manifest, err := r.resourcesGeneral.Transform(transforms...) + manifest, err := manifests.resourcesGeneral.Transform(transforms...) if err != nil { logger.Error(err, "Unable to transform ServiceAccount manifest") return err } - r.resourcesGeneral = manifest + manifests.resourcesGeneral = manifest - if err := r.resourcesGeneral.Apply(); err != nil { + if err := manifests.resourcesGeneral.Apply(); err != nil { logger.Error(err, "Unable to install ServiceAccount") return err } @@ -361,7 +382,7 @@ func (r *KedaControllerReconciler) installSA(logger logr.Logger, instance *kedav return nil } -func (r *KedaControllerReconciler) installController(ctx context.Context, logger logr.Logger, instance *kedav1alpha1.KedaController) error { +func (r *KedaControllerReconciler) installController(ctx context.Context, logger logr.Logger, instance *kedav1alpha1.KedaController, manifests *resourceManifests) error { logger.Info("Reconciling KEDA Controller deployment") transforms := []mf.Transformer{ transform.InjectOwner(instance), @@ -448,14 +469,14 @@ func (r *KedaControllerReconciler) installController(ctx context.Context, logger transforms = append(transforms, transform.ReplaceArbitraryArg(instance.Spec.Operator.Args[i], "operator", r.Scheme, logger)) } - manifest, err := r.resourcesController.Transform(transforms...) + manifest, err := manifests.resourcesController.Transform(transforms...) if err != nil { logger.Error(err, "Unable to transform KEDA Controller manifest") return err } - r.resourcesController = manifest + manifests.resourcesController = manifest - if err := r.resourcesController.Apply(); err != nil { + if err := manifests.resourcesController.Apply(); err != nil { logger.Error(err, "Unable to install KEDA Controller") return err } @@ -486,7 +507,7 @@ func (r *KedaControllerReconciler) installController(ctx context.Context, logger } // installMonitoring install the controller resources for the monitoring stack -func (r *KedaControllerReconciler) installMonitoring(ctx context.Context, logger logr.Logger, instance *kedav1alpha1.KedaController) error { +func (r *KedaControllerReconciler) installMonitoring(ctx context.Context, logger logr.Logger, instance *kedav1alpha1.KedaController, manifests *resourceManifests) error { logger.Info("Reconciling monitoring resources") // this works only if required CRDs are present @@ -504,14 +525,14 @@ func (r *KedaControllerReconciler) installMonitoring(ctx context.Context, logger transform.ReplaceAllNamespaces(instance.Namespace), } - manifest, err := r.resourcesMonitoring.Transform(transforms...) + manifest, err := manifests.resourcesMonitoring.Transform(transforms...) if err != nil { logger.Error(err, "Unable to transform monitoring resource manifests") return err } - r.resourcesMonitoring = manifest + manifests.resourcesMonitoring = manifest - if err := r.resourcesMonitoring.Apply(); err != nil { + if err := manifests.resourcesMonitoring.Apply(); err != nil { logger.Error(err, "Unable to install monitoring resources") return err } @@ -519,7 +540,7 @@ func (r *KedaControllerReconciler) installMonitoring(ctx context.Context, logger return nil } -func (r *KedaControllerReconciler) installMetricsServer(ctx context.Context, logger logr.Logger, instance *kedav1alpha1.KedaController) error { +func (r *KedaControllerReconciler) installMetricsServer(ctx context.Context, logger logr.Logger, instance *kedav1alpha1.KedaController, manifests *resourceManifests) error { logger.Info("Reconciling KEDA Metrics Server Deployment") transforms := []mf.Transformer{ @@ -659,14 +680,14 @@ func (r *KedaControllerReconciler) installMetricsServer(ctx context.Context, log // replace namespace in RoleBinding from keda to kube-system transforms = append(transforms, transform.ReplaceNamespace(roleBindingName, roleBindingNamespace, r.Scheme, logger)) - manifest, err := r.resourcesMetrics.Transform(transforms...) + manifest, err := manifests.resourcesMetrics.Transform(transforms...) if err != nil { logger.Error(err, "Unable to transform Metrics Server manifest") return err } - r.resourcesMetrics = manifest + manifests.resourcesMetrics = manifest - if err := r.resourcesMetrics.Apply(); err != nil { + if err := manifests.resourcesMetrics.Apply(); err != nil { logger.Error(err, "Unable to install Metrics Server") return err } @@ -796,7 +817,7 @@ func (r *KedaControllerReconciler) ensureMetricsServerAuditLogPolicyConfigMap(ct return nil } -func (r *KedaControllerReconciler) installAdmissionWebhooks(ctx context.Context, logger logr.Logger, instance *kedav1alpha1.KedaController) error { +func (r *KedaControllerReconciler) installAdmissionWebhooks(ctx context.Context, logger logr.Logger, instance *kedav1alpha1.KedaController, manifests *resourceManifests) error { logger.Info("Reconciling KEDA Admission Webhooks deployment") transforms := []mf.Transformer{ transform.InjectOwner(instance), @@ -878,14 +899,14 @@ func (r *KedaControllerReconciler) installAdmissionWebhooks(ctx context.Context, transforms = append(transforms, transform.ReplaceArbitraryArg(instance.Spec.AdmissionWebhooks.Args[i], "admissionwebhooks", r.Scheme, logger)) } - manifest, err := r.resourcesWebhooks.Transform(transforms...) + manifest, err := manifests.resourcesWebhooks.Transform(transforms...) if err != nil { logger.Error(err, "Unable to transform KEDA Admission Webhooks manifest") return err } - r.resourcesWebhooks = manifest + manifests.resourcesWebhooks = manifest - if err := r.resourcesWebhooks.Apply(); err != nil { + if err := manifests.resourcesWebhooks.Apply(); err != nil { logger.Error(err, "Unable to install KEDA Admission Webhooks") return err } diff --git a/controllers/keda/kedacontroller_finalizer.go b/controllers/keda/kedacontroller_finalizer.go index dce093884..78ddd1b01 100644 --- a/controllers/keda/kedacontroller_finalizer.go +++ b/controllers/keda/kedacontroller_finalizer.go @@ -14,16 +14,16 @@ const ( ) // finalizeKedaController is deleting resources for the respective KedaController -func (r *KedaControllerReconciler) finalizeKedaController(logger logr.Logger) error { - if err := r.resourcesGeneral.Delete(); err != nil { +func (r *KedaControllerReconciler) finalizeKedaController(logger logr.Logger, manifests *resourceManifests) error { + if err := manifests.resourcesGeneral.Delete(); err != nil { logger.Info("error finalized KedaController general", "error", err) return err } - if err := r.resourcesController.Delete(); err != nil { + if err := manifests.resourcesController.Delete(); err != nil { logger.Info("error finalized KedaController controller", "error", err) return err } - if err := r.resourcesMetrics.Delete(); err != nil { + if err := manifests.resourcesMetrics.Delete(); err != nil { logger.Info("error finalized KedaController metrics", "error", err) return err } diff --git a/hack/kedacontroller.yaml b/hack/kedacontroller.yaml index 8d23a186c..ff921a1a1 100644 --- a/hack/kedacontroller.yaml +++ b/hack/kedacontroller.yaml @@ -9,6 +9,8 @@ spec: # with Name set to 'keda' created in namespace 'keda' ### + # kedaRelease: "" + ## Namespace that should be watched by KEDA, # omit or set empty to watch all namespaces (default setting) watchNamespace: "" diff --git a/main.go b/main.go index 97e7ee428..b6fa32fe3 100644 --- a/main.go +++ b/main.go @@ -91,7 +91,7 @@ func main() { HealthProbeBindAddress: probeAddr, LeaderElection: enableLeaderElection, LeaderElectionID: "olm-operator.keda.sh", - Cache: cache.Options{DefaultNamespaces: map[string]cache.Config{getWatchNamespace(): {}}}, + Cache: cache.Options{DefaultNamespaces: map[string]cache.Config{installNamespace: {}}}, }) if err != nil { setupLog.Error(err, "unable to start manager") diff --git a/resources/resources_handler.go b/resources/resources_handler.go index 0fb311ed3..c16c893a1 100644 --- a/resources/resources_handler.go +++ b/resources/resources_handler.go @@ -1,6 +1,7 @@ package resources import ( + "fmt" "path/filepath" "runtime" @@ -11,14 +12,17 @@ const resourcesPath = "keda.yaml" const olmResourcesPath = "keda-olm-operator.yaml" const LastConfigID = "olm-operator.keda.sh/last-applied-configuration" -func GetResourcesManifest() (mf.Manifest, error) { +func GetResourcesManifest(kedaRelease string) (mf.Manifest, error) { _, path, _, _ := runtime.Caller(0) - fullPath := filepath.Join(filepath.Dir(path), resourcesPath) - olmFullPath := filepath.Join(filepath.Dir(path), olmResourcesPath) + fullPath := filepath.Join(filepath.Dir(path), kedaRelease, resourcesPath) + olmFullPath := filepath.Join(filepath.Dir(path), kedaRelease, olmResourcesPath) kedamf, err := mf.NewManifest(fullPath, mf.UseLastAppliedConfigAnnotation(LastConfigID)) if err != nil { - return kedamf, err + return kedamf, fmt.Errorf("error creating manifest from %s: %v", fullPath, err) } operatormf, err := mf.NewManifest(olmFullPath, mf.UseLastAppliedConfigAnnotation(LastConfigID)) - return kedamf.Append(operatormf), err + if err != nil { + return mf.Manifest{}, fmt.Errorf("error creating manifest from %s: %v", olmFullPath, err) + } + return kedamf.Append(operatormf), nil } From f9cc8dac8ab8b8d275e28c91595f5e0635c37891 Mon Sep 17 00:00:00 2001 From: Josef Karasek Date: Tue, 20 Feb 2024 16:01:26 +0100 Subject: [PATCH 2/9] validate input: keda semantic version Signed-off-by: Josef Karasek --- .../samples/keda_v1alpha1_kedacontroller.yaml | 2 +- go.mod | 10 ++++------ go.sum | 20 ++++--------------- resources/resources_handler.go | 19 ++++++++++++++++-- 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/config/samples/keda_v1alpha1_kedacontroller.yaml b/config/samples/keda_v1alpha1_kedacontroller.yaml index e7ad0caf7..80f434ebf 100644 --- a/config/samples/keda_v1alpha1_kedacontroller.yaml +++ b/config/samples/keda_v1alpha1_kedacontroller.yaml @@ -9,7 +9,7 @@ spec: # with Name set to 'keda' created in namespace 'keda' ### - # kedaRelease: "" + # kedaRelease: "v2.12.1" ## Namespace that should be watched by KEDA, # omit or set empty to watch all namespaces (default setting) diff --git a/go.mod b/go.mod index 5a1cc1007..856e32989 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,6 @@ module github.com/kedacore/keda-olm-operator -go 1.21 - -toolchain go1.21.3 +go 1.20 require ( github.com/go-logr/logr v1.4.1 @@ -11,7 +9,8 @@ require ( github.com/onsi/ginkgo v1.16.5 github.com/onsi/gomega v1.31.1 github.com/open-policy-agent/cert-controller v0.10.1 - github.com/openshift/api v0.0.0-20240213032657-54b3334bfac5 + github.com/openshift/api v0.0.0-20240215110531-750a3e21ebaf + golang.org/x/mod v0.15.0 k8s.io/api v0.29.1 k8s.io/apimachinery v0.29.1 k8s.io/apiserver v0.29.1 @@ -72,8 +71,7 @@ require ( go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/exp v0.0.0-20240213143201-ec583247a57a // indirect - golang.org/x/mod v0.15.0 // indirect + golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect golang.org/x/net v0.21.0 // indirect golang.org/x/oauth2 v0.17.0 // indirect golang.org/x/sys v0.17.0 // indirect diff --git a/go.sum b/go.sum index 59ecadf92..36245eea2 100644 --- a/go.sum +++ b/go.sum @@ -177,7 +177,6 @@ github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85n github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gobuffalo/flect v1.0.2 h1:eqjPGSo2WmjgY2XlpGwo2NXgL3RucAKo4k4qQMNA5sA= github.com/gobuffalo/flect v1.0.2/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -236,7 +235,6 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -297,12 +295,10 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -358,7 +354,6 @@ github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= -github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -370,9 +365,8 @@ github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYG github.com/open-policy-agent/cert-controller v0.10.1 h1:RXSYoyn8FdCenWecRP//UV5nbVfmstNpj4kHQFkvPK4= github.com/open-policy-agent/cert-controller v0.10.1/go.mod h1:4uRbBLY5DsPOog+a9pqk3JLxuuhrWsbUedQW65HcLTI= github.com/open-policy-agent/frameworks/constraint v0.0.0-20230822235116-f0b62fe1e4c4 h1:5dum5SLEz+95JDLkMls7Z7IDPjvSq3UhJSFe4f5einQ= -github.com/open-policy-agent/frameworks/constraint v0.0.0-20230822235116-f0b62fe1e4c4/go.mod h1:54/KzLMvA5ndBVpm7B1OjLeV0cUtTLTz2bZ2OtydLpU= -github.com/openshift/api v0.0.0-20240213032657-54b3334bfac5 h1:BtYHQIqReug+WOLohbP9ncc4sqn19iNOTPOqc/uwfZY= -github.com/openshift/api v0.0.0-20240213032657-54b3334bfac5/go.mod h1:CxgbWAlvu2iQB0UmKTtRu1YfepRg1/vJ64n2DlIEVz4= +github.com/openshift/api v0.0.0-20240215110531-750a3e21ebaf h1:ZA6VKfclZuTjOhhLEmKyulM7Ily+9cXxq9IqrREBIjA= +github.com/openshift/api v0.0.0-20240215110531-750a3e21ebaf/go.mod h1:CxgbWAlvu2iQB0UmKTtRu1YfepRg1/vJ64n2DlIEVz4= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= @@ -411,12 +405,10 @@ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40T github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -455,7 +447,6 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -488,7 +479,6 @@ go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -516,8 +506,8 @@ golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20240213143201-ec583247a57a h1:HinSgX1tJRX3KsL//Gxynpw5CTOAIPhgL4W8PNiIpVE= -golang.org/x/exp v0.0.0-20240213143201-ec583247a57a/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -587,7 +577,6 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -742,7 +731,6 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/evanphx/json-patch.v5 v5.9.0 h1:hx1VU2SGj4F8r9b8GUwJLdc8DNO8sy79ZGui0G05GLo= diff --git a/resources/resources_handler.go b/resources/resources_handler.go index c16c893a1..98cef51c9 100644 --- a/resources/resources_handler.go +++ b/resources/resources_handler.go @@ -6,6 +6,7 @@ import ( "runtime" mf "github.com/manifestival/manifestival" + "golang.org/x/mod/semver" ) const resourcesPath = "keda.yaml" @@ -13,16 +14,30 @@ const olmResourcesPath = "keda-olm-operator.yaml" const LastConfigID = "olm-operator.keda.sh/last-applied-configuration" func GetResourcesManifest(kedaRelease string) (mf.Manifest, error) { + if err := validateSemanticVersion(kedaRelease); err != nil { + return mf.Manifest{}, err + } _, path, _, _ := runtime.Caller(0) fullPath := filepath.Join(filepath.Dir(path), kedaRelease, resourcesPath) olmFullPath := filepath.Join(filepath.Dir(path), kedaRelease, olmResourcesPath) kedamf, err := mf.NewManifest(fullPath, mf.UseLastAppliedConfigAnnotation(LastConfigID)) if err != nil { - return kedamf, fmt.Errorf("error creating manifest from %s: %v", fullPath, err) + return mf.Manifest{}, fmt.Errorf("error creating manifest from %s, KEDA release %q not supported: %v", fullPath, kedaRelease, err) } operatormf, err := mf.NewManifest(olmFullPath, mf.UseLastAppliedConfigAnnotation(LastConfigID)) if err != nil { - return mf.Manifest{}, fmt.Errorf("error creating manifest from %s: %v", olmFullPath, err) + return mf.Manifest{}, fmt.Errorf("error creating manifest from %s, KEDA release %q not supported: %v", olmFullPath, kedaRelease, err) } return kedamf.Append(operatormf), nil } + +func validateSemanticVersion(v string) error { + if v == "" { + // we allow empty version for reverse compatibility + return nil + } + if !semver.IsValid(v) { + return fmt.Errorf("given KEDA release version %q is not a valid semantic version. Use a valid release, for example v2.12.1", v) + } + return nil +} From f51753eb182889108f05e2abb422381d6bb420a6 Mon Sep 17 00:00:00 2001 From: Josef Karasek Date: Tue, 20 Feb 2024 16:11:58 +0100 Subject: [PATCH 3/9] include tests Signed-off-by: Josef Karasek --- resources/resources_handler_test.go | 31 +++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 resources/resources_handler_test.go diff --git a/resources/resources_handler_test.go b/resources/resources_handler_test.go new file mode 100644 index 000000000..20322bd6d --- /dev/null +++ b/resources/resources_handler_test.go @@ -0,0 +1,31 @@ +package resources + +import "testing" + +// TestResourceHandler tests the GetResourcesManifest function +func TestResourceHandler(t *testing.T) { + _, err := GetResourcesManifest("") + if err != nil { + t.Errorf("GetResourcesManifest failed: %v", err) + } + _, err = GetResourcesManifest("keda-not-released") + if err == nil { + t.Errorf("GetResourcesManifest failed: %v", err) + } +} + +// TestValidateSemanticVersion tests the validateSemanticVersion function +func TestValidateSemanticVersion(t *testing.T) { + err := validateSemanticVersion("v2.0") + if err != nil { + t.Errorf("validateSemanticVersion failed: %v", err) + } + err = validateSemanticVersion("v2.0.0") + if err != nil { + t.Errorf("validateSemanticVersion failed: %v", err) + } + err = validateSemanticVersion("") + if err != nil { + t.Errorf("validateSemanticVersion failed: %v", err) + } +} From 63fe11c1b8ea6d9298c0ecf22b8b6aecd92693a8 Mon Sep 17 00:00:00 2001 From: Josef Karasek Date: Tue, 20 Feb 2024 16:24:38 +0100 Subject: [PATCH 4/9] fix test Signed-off-by: Josef Karasek --- hack/kedacontroller.yaml | 2 +- resources/resources_handler_test.go | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/hack/kedacontroller.yaml b/hack/kedacontroller.yaml index ff921a1a1..90ee4c90a 100644 --- a/hack/kedacontroller.yaml +++ b/hack/kedacontroller.yaml @@ -9,7 +9,7 @@ spec: # with Name set to 'keda' created in namespace 'keda' ### - # kedaRelease: "" + # kedaRelease: "v2.12.1" ## Namespace that should be watched by KEDA, # omit or set empty to watch all namespaces (default setting) diff --git a/resources/resources_handler_test.go b/resources/resources_handler_test.go index 20322bd6d..754e5d7ec 100644 --- a/resources/resources_handler_test.go +++ b/resources/resources_handler_test.go @@ -1,6 +1,19 @@ package resources -import "testing" +import ( + "flag" + "testing" + + _ "github.com/onsi/ginkgo" +) + +var ( + testType string +) + +func init() { + flag.StringVar(&testType, "test.type", "", "type of test: functionality / deployment") +} // TestResourceHandler tests the GetResourcesManifest function func TestResourceHandler(t *testing.T) { From abae737f9ac6c12c3fd58663b9a45480d5f101d8 Mon Sep 17 00:00:00 2001 From: Josef Karasek Date: Wed, 21 Feb 2024 10:40:09 +0100 Subject: [PATCH 5/9] fix test & update dockerfile Signed-off-by: Josef Karasek --- Dockerfile | 2 + Makefile | 2 +- README.md | 5 ++ .../samples/keda_v1alpha1_kedacontroller.yaml | 5 +- resources/resources_handler.go | 20 +++-- resources/resources_handler_test.go | 82 ++++++++++++------- resources/resources_suite_test.go | 13 +++ 7 files changed, 91 insertions(+), 38 deletions(-) create mode 100644 resources/resources_suite_test.go diff --git a/Dockerfile b/Dockerfile index 334937752..0f42541ff 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,6 +31,8 @@ RUN VERSION=${BUILD_VERSION} GIT_COMMIT=${GIT_COMMIT} GIT_VERSION=${GIT_VERSION} # Refer to https://github.com/GoogleContainerTools/distroless for more details FROM gcr.io/distroless/static:nonroot WORKDIR / +COPY --from=builder /workspace/resources/keda.yaml /workspace/resources/${BUILD_VERSION}/keda.yaml +COPY --from=builder /workspace/resources/keda-olm-operator.yaml /workspace/resources/${BUILD_VERSION}/keda-olm-operator.yaml COPY --from=builder /workspace/resources/keda.yaml /workspace/resources/keda.yaml COPY --from=builder /workspace/resources/keda-olm-operator.yaml /workspace/resources/keda-olm-operator.yaml COPY --from=builder /workspace/bin/manager . diff --git a/Makefile b/Makefile index 3f55cbd11..8f49c9a34 100644 --- a/Makefile +++ b/Makefile @@ -66,7 +66,7 @@ test-deployment: manifests generate fmt vet envtest ## Test OLM deployment. KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./... -v -ginkgo.v -coverprofile cover.out -test.type deployment -ginkgo.focus "Deploying KedaController manifest" test: manifests generate fmt vet envtest - KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./... -v -ginkgo.v -coverprofile cover.out -test.type unit + KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test resources/... -v -ginkgo.v -coverprofile cover.out -test.type unit ##@ Build diff --git a/README.md b/README.md index f9898f9ad..f5cf2e8f1 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,11 @@ spec: # with Name set to 'keda' created in namespace where the operator is installed (usually 'keda') ### + # select KEDA release to install + # from keda-olm-operator release 2.12.2 onwards, three latest KEDA releases are supported + # kedaRelease: "" # default value is empty, which means the latest KEDA release will be installed + # kedaRelease: "2.12.1" + ## Namespace that should be watched by KEDA, # omit or set empty to watch all namespaces (default setting) watchNamespace: "" diff --git a/config/samples/keda_v1alpha1_kedacontroller.yaml b/config/samples/keda_v1alpha1_kedacontroller.yaml index 80f434ebf..c38ce404f 100644 --- a/config/samples/keda_v1alpha1_kedacontroller.yaml +++ b/config/samples/keda_v1alpha1_kedacontroller.yaml @@ -9,7 +9,10 @@ spec: # with Name set to 'keda' created in namespace 'keda' ### - # kedaRelease: "v2.12.1" + # select KEDA release to install + # from keda-olm-operator release 2.12.2 onwards, three latest KEDA releases are supported + # kedaRelease: "" # default value is empty, which means the latest KEDA release will be installed + # kedaRelease: "2.12.1" ## Namespace that should be watched by KEDA, # omit or set empty to watch all namespaces (default setting) diff --git a/resources/resources_handler.go b/resources/resources_handler.go index 98cef51c9..968c596a2 100644 --- a/resources/resources_handler.go +++ b/resources/resources_handler.go @@ -14,12 +14,13 @@ const olmResourcesPath = "keda-olm-operator.yaml" const LastConfigID = "olm-operator.keda.sh/last-applied-configuration" func GetResourcesManifest(kedaRelease string) (mf.Manifest, error) { - if err := validateSemanticVersion(kedaRelease); err != nil { + kedaReleaseDir, err := parseDirName(kedaRelease) + if err != nil { return mf.Manifest{}, err } _, path, _, _ := runtime.Caller(0) - fullPath := filepath.Join(filepath.Dir(path), kedaRelease, resourcesPath) - olmFullPath := filepath.Join(filepath.Dir(path), kedaRelease, olmResourcesPath) + fullPath := filepath.Join(filepath.Dir(path), kedaReleaseDir, resourcesPath) + olmFullPath := filepath.Join(filepath.Dir(path), kedaReleaseDir, olmResourcesPath) kedamf, err := mf.NewManifest(fullPath, mf.UseLastAppliedConfigAnnotation(LastConfigID)) if err != nil { return mf.Manifest{}, fmt.Errorf("error creating manifest from %s, KEDA release %q not supported: %v", fullPath, kedaRelease, err) @@ -31,13 +32,16 @@ func GetResourcesManifest(kedaRelease string) (mf.Manifest, error) { return kedamf.Append(operatormf), nil } -func validateSemanticVersion(v string) error { +func parseDirName(v string) (string, error) { if v == "" { - // we allow empty version for reverse compatibility - return nil + // we allow empty version for backwards compatibility + return v, nil + } + if v[0] != 'v' { + v = "v" + v } if !semver.IsValid(v) { - return fmt.Errorf("given KEDA release version %q is not a valid semantic version. Use a valid release, for example v2.12.1", v) + return "", fmt.Errorf("given KEDA release version %q is not valid. Use a valid release, for example 2.12.1", v) } - return nil + return v[1:], nil } diff --git a/resources/resources_handler_test.go b/resources/resources_handler_test.go index 754e5d7ec..8dab1eaae 100644 --- a/resources/resources_handler_test.go +++ b/resources/resources_handler_test.go @@ -2,9 +2,11 @@ package resources import ( "flag" - "testing" - _ "github.com/onsi/ginkgo" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + + mf "github.com/manifestival/manifestival" ) var ( @@ -15,30 +17,54 @@ func init() { flag.StringVar(&testType, "test.type", "", "type of test: functionality / deployment") } -// TestResourceHandler tests the GetResourcesManifest function -func TestResourceHandler(t *testing.T) { - _, err := GetResourcesManifest("") - if err != nil { - t.Errorf("GetResourcesManifest failed: %v", err) - } - _, err = GetResourcesManifest("keda-not-released") - if err == nil { - t.Errorf("GetResourcesManifest failed: %v", err) - } -} +var _ = Describe("Checking KEDA resources manifest", func() { + When("valid KEDA release is given", func() { + It("should return valid manifest", func() { + manifest, err := GetResourcesManifest("") + Expect(err).To(BeNil()) + Expect(manifest).To(Not(BeNil())) + }) + }) -// TestValidateSemanticVersion tests the validateSemanticVersion function -func TestValidateSemanticVersion(t *testing.T) { - err := validateSemanticVersion("v2.0") - if err != nil { - t.Errorf("validateSemanticVersion failed: %v", err) - } - err = validateSemanticVersion("v2.0.0") - if err != nil { - t.Errorf("validateSemanticVersion failed: %v", err) - } - err = validateSemanticVersion("") - if err != nil { - t.Errorf("validateSemanticVersion failed: %v", err) - } -} + When("invalid KEDA release is given", func() { + It("should return error", func() { + manifest, err := GetResourcesManifest("keda-not-released") + Expect(err).To(Not(BeNil())) + Expect(manifest).To(Equal(mf.Manifest{})) + }) + }) +}) + +var _ = Describe("Checking KEDA release dir parsing", func() { + When("empty string is given as KEDA release", func() { + It("should result in valid release", func() { + dir, err := parseDirName("") + Expect(err).To(BeNil()) + Expect(dir).To(Equal("")) + }) + }) + + When("semver with 'v' prefix is given as KEDA release", func() { + It("should result in valid release and parsed dir does not contain the prefix 'v'", func() { + dir, err := parseDirName("v2.0.0") + Expect(err).To(BeNil()) + Expect(dir).To(Equal("2.0.0")) + }) + }) + + When("semver without 'v' prefix is given as KEDA release", func() { + It("should result in valid release and parsed dir does not contain the prefix 'v'", func() { + dir, err := parseDirName("2.0.0") + Expect(err).To(BeNil()) + Expect(dir).To(Equal("2.0.0")) + }) + }) + + When("invalid string is given as KEDA release", func() { + It("should result in error", func() { + dir, err := parseDirName("keda-v2.0.0") + Expect(err).To(Not(BeNil())) + Expect(dir).To(Equal("")) + }) + }) +}) diff --git a/resources/resources_suite_test.go b/resources/resources_suite_test.go new file mode 100644 index 000000000..187f3db87 --- /dev/null +++ b/resources/resources_suite_test.go @@ -0,0 +1,13 @@ +package resources + +import ( + "testing" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +func TestResourceHandler(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Resource Handler Suite") +} From d86543a40497c7031c703b64f90742a5a21709ca Mon Sep 17 00:00:00 2001 From: Josef Karasek Date: Wed, 21 Feb 2024 10:40:43 +0100 Subject: [PATCH 6/9] fix test Signed-off-by: Josef Karasek --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 8f49c9a34..3f55cbd11 100644 --- a/Makefile +++ b/Makefile @@ -66,7 +66,7 @@ test-deployment: manifests generate fmt vet envtest ## Test OLM deployment. KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./... -v -ginkgo.v -coverprofile cover.out -test.type deployment -ginkgo.focus "Deploying KedaController manifest" test: manifests generate fmt vet envtest - KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test resources/... -v -ginkgo.v -coverprofile cover.out -test.type unit + KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./... -v -ginkgo.v -coverprofile cover.out -test.type unit ##@ Build From ac1d3de73a3af7870341828f723d8caefb818711 Mon Sep 17 00:00:00 2001 From: Josef Karasek Date: Wed, 21 Feb 2024 10:43:58 +0100 Subject: [PATCH 7/9] fix version Signed-off-by: Josef Karasek --- hack/kedacontroller.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/kedacontroller.yaml b/hack/kedacontroller.yaml index 90ee4c90a..9e2aabb78 100644 --- a/hack/kedacontroller.yaml +++ b/hack/kedacontroller.yaml @@ -9,7 +9,7 @@ spec: # with Name set to 'keda' created in namespace 'keda' ### - # kedaRelease: "v2.12.1" + # kedaRelease: "2.12.1" ## Namespace that should be watched by KEDA, # omit or set empty to watch all namespaces (default setting) From 78f952a10e6448e4b5db81c4a9e3ef93f5e6bbf6 Mon Sep 17 00:00:00 2001 From: Josef Karasek Date: Wed, 21 Feb 2024 10:48:43 +0100 Subject: [PATCH 8/9] revert go change Signed-off-by: Josef Karasek --- go.mod | 4 +++- go.sum | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 856e32989..c7db94667 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/kedacore/keda-olm-operator -go 1.20 +go 1.21 + +toolchain go1.21.3 require ( github.com/go-logr/logr v1.4.1 diff --git a/go.sum b/go.sum index 36245eea2..3152b89db 100644 --- a/go.sum +++ b/go.sum @@ -177,6 +177,7 @@ github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85n github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gobuffalo/flect v1.0.2 h1:eqjPGSo2WmjgY2XlpGwo2NXgL3RucAKo4k4qQMNA5sA= github.com/gobuffalo/flect v1.0.2/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -235,6 +236,7 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -295,10 +297,12 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -354,6 +358,7 @@ github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= +github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -365,6 +370,7 @@ github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYG github.com/open-policy-agent/cert-controller v0.10.1 h1:RXSYoyn8FdCenWecRP//UV5nbVfmstNpj4kHQFkvPK4= github.com/open-policy-agent/cert-controller v0.10.1/go.mod h1:4uRbBLY5DsPOog+a9pqk3JLxuuhrWsbUedQW65HcLTI= github.com/open-policy-agent/frameworks/constraint v0.0.0-20230822235116-f0b62fe1e4c4 h1:5dum5SLEz+95JDLkMls7Z7IDPjvSq3UhJSFe4f5einQ= +github.com/open-policy-agent/frameworks/constraint v0.0.0-20230822235116-f0b62fe1e4c4/go.mod h1:54/KzLMvA5ndBVpm7B1OjLeV0cUtTLTz2bZ2OtydLpU= github.com/openshift/api v0.0.0-20240215110531-750a3e21ebaf h1:ZA6VKfclZuTjOhhLEmKyulM7Ily+9cXxq9IqrREBIjA= github.com/openshift/api v0.0.0-20240215110531-750a3e21ebaf/go.mod h1:CxgbWAlvu2iQB0UmKTtRu1YfepRg1/vJ64n2DlIEVz4= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= @@ -405,10 +411,12 @@ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40T github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -447,6 +455,7 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -479,6 +488,7 @@ go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -577,6 +587,7 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -731,6 +742,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/evanphx/json-patch.v5 v5.9.0 h1:hx1VU2SGj4F8r9b8GUwJLdc8DNO8sy79ZGui0G05GLo= From c49879ba3aa5b82d2804ffa3a280c8b3552159e0 Mon Sep 17 00:00:00 2001 From: Josef Karasek Date: Wed, 21 Feb 2024 10:56:51 +0100 Subject: [PATCH 9/9] fix lint issue Signed-off-by: Josef Karasek --- resources/resources_handler_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/resources_handler_test.go b/resources/resources_handler_test.go index 8dab1eaae..3c9dfc2f9 100644 --- a/resources/resources_handler_test.go +++ b/resources/resources_handler_test.go @@ -3,10 +3,9 @@ package resources import ( "flag" + mf "github.com/manifestival/manifestival" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - - mf "github.com/manifestival/manifestival" ) var (