diff --git a/api/v1alpha1/entandoappv2_types.go b/api/v1alpha1/entandoappv2_types.go index 6dbcfae..6b179bb 100644 --- a/api/v1alpha1/entandoappv2_types.go +++ b/api/v1alpha1/entandoappv2_types.go @@ -108,6 +108,7 @@ type EntandoAppV2Status struct { // An EntandoAppV2 deploys the components required to upgrade an Entando App. The server side // components that are deployed include the Entando App Engine, the Entando Component Manager, // the Entando App Builder, and the user facing application. +// +kubebuilder:printcolumn:name="Ready",type="string",JSONPath=`.status.conditions[?(@.type=="Ready")].status`,description="state of EntandoApp" type EntandoAppV2 struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` diff --git a/config/crd/bases/app.entando.org_entandoappv2s.yaml b/config/crd/bases/app.entando.org_entandoappv2s.yaml index 50e7bbd..bb95c53 100644 --- a/config/crd/bases/app.entando.org_entandoappv2s.yaml +++ b/config/crd/bases/app.entando.org_entandoappv2s.yaml @@ -15,7 +15,12 @@ spec: singular: entandoappv2 scope: Namespaced versions: - - name: v1alpha1 + - additionalPrinterColumns: + - description: state of EntandoApp + jsonPath: .status.conditions[?(@.type=="Ready")].status + name: Ready + type: string + name: v1alpha1 schema: openAPIV3Schema: description: An EntandoAppV2 deploys the components required to upgrade an diff --git a/controllers/entandoappv2_controller.go b/controllers/entandoappv2_controller.go index d317cbd..3e85e0c 100644 --- a/controllers/entandoappv2_controller.go +++ b/controllers/entandoappv2_controller.go @@ -18,15 +18,18 @@ package controllers import ( "context" - - v1alpha1 "github.com/entgigi/upgrade-operator.git/api/v1alpha1" + "github.com/entgigi/upgrade-operator.git/api/v1alpha1" "github.com/entgigi/upgrade-operator.git/controllers/reconciliation" + "github.com/entgigi/upgrade-operator.git/utils" "github.com/go-logr/logr" + appsv1 "k8s.io/api/apps/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/predicate" + "sigs.k8s.io/controller-runtime/pkg/handler" + "sigs.k8s.io/controller-runtime/pkg/source" ) const ( @@ -51,14 +54,57 @@ type EntandoAppV2Reconciler struct { func (r *EntandoAppV2Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { log := r.Log.WithName(controllerLogName) - log.Info("Start reconciling EntandoAppV2 custom resources") + log.Info("Start reconciling EntandoAppV2 custom resources", "req", req) entandoAppV2 := v1alpha1.EntandoAppV2{} + deployment := appsv1.Deployment{} err := r.Client.Get(ctx, req.NamespacedName, &entandoAppV2) - if err != nil { - return ctrl.Result{}, client.IgnoreNotFound(err) + err2 := r.Client.Get(ctx, req.NamespacedName, &deployment) + + if err2 == nil { + log.Info("is a deployment") + // are all deployment ready? + list := []string{"default-sso-in-namespace-deployment", "quickstart-ab-deployment", "quickstart-cm-deployment", "quickstart-deployment"} + counter := 0 + for _, componentname := range list { + + r.Client.Get(ctx, types.NamespacedName{ + Namespace: req.Namespace, + Name: componentname, + }, &deployment) + + //log.Info("deployment", "deployment", deployment) + // idx := slices.IndexFunc(deployment.Status.Conditions, func(c appsv1.DeploymentCondition) bool { return c.Type == "Available" && c.Status == "True" }) + if deployment.Status.ReadyReplicas > 0 { + counter++ + } + log.Info("ReadyReplicas has value", "deployment.Status.ReadyReplicas", deployment.Status.ReadyReplicas) + } + log.Info("counter has value", "counter", counter) + if counter == 4 { + statusUpdater := reconciliation.NewStatusUpdater(r.Client, r.Log) + statusUpdater.SetReady(ctx, types.NamespacedName{ + Namespace: req.Namespace, + Name: "entando-app-v2-sample", + }) + } else { + statusUpdater := reconciliation.NewStatusUpdater(r.Client, r.Log) + statusUpdater.SetNotReady(ctx, types.NamespacedName{ + Namespace: req.Namespace, + Name: "entando-app-v2-sample", + }) + } + + return ctrl.Result{}, nil + + } else { + log.Info("is a CR") } + /*if err != nil { + return ctrl.Result{}, client.IgnoreNotFound(err) + }*/ + // Check if the EntandoApp instance is marked to be deleted, which is // indicated by the deletion timestamp being set. isEntandoAppV2MarkedToBeDeleted := entandoAppV2.GetDeletionTimestamp() != nil @@ -92,8 +138,10 @@ func (r *EntandoAppV2Reconciler) SetupWithManager(mgr ctrl.Manager) error { //log := r.Log.WithName("Upgrade Controller") return ctrl.NewControllerManagedBy(mgr). // FIXME! add filter on create for EntandoAppV2 cr - For(&v1alpha1.EntandoAppV2{}). - WithEventFilter(predicate.GenerationChangedPredicate{}). //solo modifiche a spec + For(&v1alpha1.EntandoAppV2{}, utils.ForOptionCustom()). + Watches(&source.Kind{Type: &appsv1.Deployment{}}, &handler.EnqueueRequestForObject{}). + //WithEventFilter(predicate.GenerationChangedPredicate{}). //solo modifiche a spec + //Watches(&source.Kind{Type: &appsv1.Deployment{}}, &handler.EnqueueRequestForObject{}). Complete(r) } diff --git a/controllers/reconciliation/manager.go b/controllers/reconciliation/manager.go index 0fdc8e3..b73831d 100644 --- a/controllers/reconciliation/manager.go +++ b/controllers/reconciliation/manager.go @@ -2,6 +2,7 @@ package reconciliation import ( "context" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/entgigi/upgrade-operator.git/api/v1alpha1" "github.com/entgigi/upgrade-operator.git/common" @@ -9,6 +10,7 @@ import ( "github.com/entgigi/upgrade-operator.git/service" "github.com/entgigi/upgrade-operator.git/utils" "github.com/go-logr/logr" + "golang.org/x/exp/slices" v1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" ctrl "sigs.k8s.io/controller-runtime" @@ -40,83 +42,93 @@ func NewReconcileManager(client client.Client, log logr.Logger) *ReconcileManage func (r *ReconcileManager) MainReconcile(ctx context.Context, req ctrl.Request) error { r.Log.Info("Starting main reconciliation flow") - r.statusUpdater.SetReconcileStarted(ctx, req.NamespacedName, numberOfSteps) + //r.statusUpdater.SetReconcileStarted(ctx, req.NamespacedName, numberOfSteps) var err error crReadOnly := &v1alpha1.EntandoAppV2{} - if err := r.Client.Get(ctx, req.NamespacedName, crReadOnly); err != nil { - return err - } - - imageManager := service.NewImageManager(r.Log) - var images service.EntandoAppImages - if images, err = imageManager.FetchAndComposeImagesMap(crReadOnly); err != nil { + if err := r.Client.Get(ctx, req.NamespacedName, crReadOnly); err != nil { return err } - //r.Log.Info(fmt.Sprintf("%+v\n", images)) - //TODO reconcile secrets for ca before EntandoApp components + idx := slices.IndexFunc(crReadOnly.Status.Conditions, func(c metav1.Condition) bool { return c.Type == Initialized && c.Status == "True" }) + r.Log.Info("idx has value", "idx", idx) - if _, err = r.reconcileComponent(ctx, req, "Keycloak", r.reconcileKeycloak, images.FetchKeycloak(), crReadOnly); err != nil { - return err - } + // image not written + if idx == -1 { + imageManager := service.NewImageManager(r.Log) + var images service.EntandoAppImages - if _, err = r.reconcileComponent(ctx, req, "DeApp", r.reconcileDeApp, images.FetchDeApp(), crReadOnly); err != nil { - return err - } + if images, err = imageManager.FetchAndComposeImagesMap(crReadOnly); err != nil { + return err + } + //r.Log.Info(fmt.Sprintf("%+v\n", images)) - if _, err = r.reconcileComponent(ctx, req, "AppBuilder", r.reconcileAppBuilder, images.FetchAppBuilder(), crReadOnly); err != nil { - return err - } + //TODO reconcile secrets for ca before EntandoApp components - // TODO before check entando-k8s-service app ready - cr := &v1alpha1.EntandoAppV2{} - if cr, err = r.reconcileComponent(ctx, req, "ComponentManager", r.reconcileComponentManager, images.FetchComponentManager(), crReadOnly); err != nil { - return err - } + if _, err = r.reconcileComponent(ctx, req, "Keycloak", r.reconcileKeycloak, images.FetchKeycloak(), crReadOnly); err != nil { + return err + } - // =========================== start legacy section =========================== - // progress step not added because is not a business step but jsut technical - legacyReconcile := legacy.NewLegacyReconcileManager(r.Client, r.Log) - if utils.IsOlmInstallation() { - r.statusUpdater.SetReconcileProcessingComponent(ctx, req.NamespacedName, "Csv") + if _, err = r.reconcileComponent(ctx, req, "DeApp", r.reconcileDeApp, images.FetchDeApp(), crReadOnly); err != nil { + return err + } - if err = legacyReconcile.ReconcileClusterServiceVersion(ctx, req, images); err != nil { - r.statusUpdater.SetReconcileFailed(ctx, req.NamespacedName, "CsvReconciliationFailed") + if _, err = r.reconcileComponent(ctx, req, "AppBuilder", r.reconcileAppBuilder, images.FetchAppBuilder(), crReadOnly); err != nil { return err } - } else { - r.statusUpdater.SetReconcileProcessingComponent(ctx, req.NamespacedName, "ImageInfo") - if err = legacyReconcile.ReconcileImageInfo(ctx, req, images); err != nil { - r.statusUpdater.SetReconcileFailed(ctx, req.NamespacedName, "ImageInfoReconciliationFailed") + + // TODO before check entando-k8s-service app ready + //cr := &v1alpha1.EntandoAppV2{} + if _, err = r.reconcileComponent(ctx, req, "ComponentManager", r.reconcileComponentManager, images.FetchComponentManager(), crReadOnly); err != nil { return err } - } - // =========================== end legacy section ============================= - // reconcile k8s-service component taking into account of the legacy Operator behavior, - // in non-olm install we need to reconcile k8s-service deployment - if !utils.IsOlmInstallation() { - // K8sService - r.statusUpdater.SetReconcileProcessingComponent(ctx, req.NamespacedName, "K8sService") + // =========================== start legacy section =========================== + // progress step not added because is not a business step but jsut technical + legacyReconcile := legacy.NewLegacyReconcileManager(r.Client, r.Log) + if utils.IsOlmInstallation() { + //r.statusUpdater.SetReconcileProcessingComponent(ctx, req.NamespacedName, "Csv") + + if err = legacyReconcile.ReconcileClusterServiceVersion(ctx, req, images); err != nil { + //r.statusUpdater.SetReconcileFailed(ctx, req.NamespacedName, "CsvReconciliationFailed") + return err + } + } else { + //r.statusUpdater.SetReconcileProcessingComponent(ctx, req.NamespacedName, "ImageInfo") + if err = legacyReconcile.ReconcileImageInfo(ctx, req, images); err != nil { + //r.statusUpdater.SetReconcileFailed(ctx, req.NamespacedName, "ImageInfoReconciliationFailed") + return err + } + } + // =========================== end legacy section ============================= + + // reconcile k8s-service component taking into account of the legacy Operator behavior, + // in non-olm install we need to reconcile k8s-service deployment + if !utils.IsOlmInstallation() { + // K8sService + //r.statusUpdater.SetReconcileProcessingComponent(ctx, req.NamespacedName, "K8sService") - // TODO decide if add the k8service in the progress count. in that case we could also consider to adapt the k8s-service reconciliation function to the standard format + // TODO decide if add the k8service in the progress count. in that case we could also consider to adapt the k8s-service reconciliation function to the standard format + + if err = r.reconcileK8sService(ctx, req, images.FetchK8sService(), crReadOnly); err != nil { + //r.statusUpdater.SetReconcileFailed(ctx, req.NamespacedName, "K8sServiceReconciliationFailed") + return err + } + // legacy K8sCoordinator restart ? no needs - if err = r.reconcileK8sService(ctx, req, images.FetchK8sService(), crReadOnly); err != nil { - r.statusUpdater.SetReconcileFailed(ctx, req.NamespacedName, "K8sServiceReconciliationFailed") - return err } - // legacy K8sCoordinator restart ? no needs - } + // Check for progress/total mismatch + /*if cr.Status.Progress != numberOfSteps { + r.Log.Info("WARNING: progress different from total at the end of reconciliation", "progress", cr.Status.Progress, "total", numberOfSteps) + }*/ + + r.statusUpdater.SetInitialized(ctx, req.NamespacedName) - // Check for progress/total mismatch - if cr.Status.Progress != numberOfSteps { - r.Log.Info("WARNING: progress different from total at the end of reconciliation", "progress", cr.Status.Progress, "total", numberOfSteps) } - r.statusUpdater.SetReconcileSuccessfullyCompleted(ctx, req.NamespacedName) + //r.statusUpdater.SetReconcileSuccessfullyCompleted(ctx, req.NamespacedName) return nil } @@ -129,12 +141,12 @@ func (r *ReconcileManager) reconcileComponent(ctx context.Context, imageUrl string, cr *v1alpha1.EntandoAppV2) (*v1alpha1.EntandoAppV2, error) { - r.statusUpdater.SetReconcileProcessingComponent(ctx, req.NamespacedName, componentName) + //r.statusUpdater.SetReconcileProcessingComponent(ctx, req.NamespacedName, componentName) if err := reconcile(ctx, imageUrl, req, cr); err != nil { - r.statusUpdater.SetReconcileFailed(ctx, req.NamespacedName, componentName+"ReconciliationFailed") + //r.statusUpdater.SetReconcileFailed(ctx, req.NamespacedName, componentName+"ReconciliationFailed") return nil, err } - return r.statusUpdater.IncrementProgress(ctx, req.NamespacedName) + return cr, nil //r.statusUpdater.IncrementProgress(ctx, req.NamespacedName) } // mustGetDeployment try to get the first deployment starting by the entando label dedicated to identify the component diff --git a/controllers/reconciliation/status.go b/controllers/reconciliation/status.go index 0bd6428..f0e3276 100644 --- a/controllers/reconciliation/status.go +++ b/controllers/reconciliation/status.go @@ -16,8 +16,9 @@ const ( statusUpdaterLogName = "StatusUpdater" // Condition Types - Ready = "Ready" - Succeeded = "Succeeded" + Ready = "Ready" + Succeeded = "Succeeded" + Initialized = "Initialized" // Condition Reasons CustomResourceChanged = "CustomResourceChanged" @@ -147,6 +148,63 @@ func (su *StatusUpdater) IncrementProgress(ctx context.Context, key types.Namesp return cr, err } +func (su *StatusUpdater) SetInitialized(ctx context.Context, key types.NamespacedName) (*v1alpha1.EntandoAppV2, error) { + cr, err := su.updateStatus(ctx, key, func(cr *v1alpha1.EntandoAppV2) { + meta.SetStatusCondition(&cr.Status.Conditions, metav1.Condition{ + Type: Initialized, + Status: metav1.ConditionTrue, + Reason: "ImageWritten", + Message: "Image written in components", + }) + }) + + if err != nil { + su.log.Error(err, "Unable to update EntandoAppV2's status for reconciliation initialized") + } + + return cr, err +} + +func (su *StatusUpdater) SetReady(ctx context.Context, key types.NamespacedName) (*v1alpha1.EntandoAppV2, error) { + cr, err := su.updateStatus(ctx, key, func(cr *v1alpha1.EntandoAppV2) { + meta.SetStatusCondition(&cr.Status.Conditions, metav1.Condition{ + Type: Ready, + Status: metav1.ConditionTrue, + Reason: "Ready", + Message: "All components are Ready", + }) + meta.SetStatusCondition(&cr.Status.Conditions, metav1.Condition{ + Type: Initialized, + Status: metav1.ConditionFalse, + Reason: "ReconciliationDone", + Message: "Reconciliation process success", + }) + }) + + if err != nil { + su.log.Error(err, "Unable to update EntandoAppV2's status for reconciliation initialized") + } + + return cr, err +} + +func (su *StatusUpdater) SetNotReady(ctx context.Context, key types.NamespacedName) (*v1alpha1.EntandoAppV2, error) { + cr, err := su.updateStatus(ctx, key, func(cr *v1alpha1.EntandoAppV2) { + meta.SetStatusCondition(&cr.Status.Conditions, metav1.Condition{ + Type: Ready, + Status: metav1.ConditionFalse, + Reason: "Ready", + Message: "All components are not Ready", + }) + }) + + if err != nil { + su.log.Error(err, "Unable to update EntandoAppV2's status for reconciliation initialized") + } + + return cr, err +} + func (su *StatusUpdater) updateStatus(ctx context.Context, key types.NamespacedName, updateFields func(cr *v1alpha1.EntandoAppV2)) (*v1alpha1.EntandoAppV2, error) { cr := &v1alpha1.EntandoAppV2{} diff --git a/go.mod b/go.mod index 03d8e53..5838a49 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/onsi/ginkgo v1.16.5 github.com/onsi/gomega v1.18.1 go.uber.org/zap v1.19.1 + golang.org/x/exp v0.0.0-20221109134031-9ce248df8de5 k8s.io/apimachinery v0.24.2 k8s.io/client-go v0.24.2 sigs.k8s.io/controller-runtime v0.12.2 @@ -39,7 +40,7 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.6 // indirect + github.com/google/go-cmp v0.5.8 // indirect github.com/google/gofuzz v1.1.0 // indirect github.com/google/uuid v1.3.0 // indirect github.com/imdario/mergo v0.3.13 // indirect @@ -51,7 +52,7 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nxadm/tail v1.4.8 // indirect - github.com/opencontainers/go-digest v1.0.0 + github.com/opencontainers/go-digest v1.0.0 // indirect github.com/operator-framework/api v0.17.1 github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect @@ -61,13 +62,13 @@ require ( github.com/prometheus/procfs v0.7.3 // indirect github.com/sirupsen/logrus v1.9.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/testify v1.8.1 // indirect + github.com/stretchr/testify v1.8.1 go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.6.0 // indirect golang.org/x/crypto v0.0.0-20220919173607-35f4265a4bc0 // indirect golang.org/x/net v0.0.0-20220909164309-bea034e7d591 // indirect golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect - golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 // indirect + golang.org/x/sys v0.1.0 // indirect golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 // indirect golang.org/x/text v0.3.7 // indirect golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect @@ -83,7 +84,7 @@ require ( k8s.io/component-base v0.24.2 // indirect k8s.io/klog/v2 v2.60.1 // indirect k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect + k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect sigs.k8s.io/yaml v1.3.0 // indirect diff --git a/go.sum b/go.sum index 1bbbb8f..b202a16 100644 --- a/go.sum +++ b/go.sum @@ -83,7 +83,6 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -236,10 +235,9 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -259,7 +257,6 @@ github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -298,8 +295,6 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -423,7 +418,6 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= @@ -447,7 +441,6 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= @@ -477,7 +470,6 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -548,7 +540,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220919173607-35f4265a4bc0 h1:a5Yg6ylndHHYJqIPrdq0AhvR6KTvDTAvgBtaidhEevY= golang.org/x/crypto v0.0.0-20220919173607-35f4265a4bc0/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= @@ -562,6 +553,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20221109134031-9ce248df8de5 h1:pug8He0YPdPwDXZN4B/1sJ/8d4YsZqwVZEzg/Xi5w3Y= +golang.org/x/exp v0.0.0-20221109134031-9ce248df8de5/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= 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= @@ -636,7 +629,6 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220909164309-bea034e7d591 h1:D0B/7al0LLrVC8aWF4+oxpv/m8bc7ViFfVS8/gXGdqI= @@ -653,7 +645,6 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= @@ -733,13 +724,11 @@ golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158 h1:rm+CHSpPEEW2IsXUib1ThaHIjuBVZjxNgSKmBLFfD4c= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc= -golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 h1:CBpWXWQpIRjzmkkA+M7q9Fqnwd2mZr3AFqexg8YTfoM= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -821,7 +810,6 @@ golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= @@ -934,7 +922,6 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= @@ -966,7 +953,6 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/utils/foroptioncustom.go b/utils/foroptioncustom.go new file mode 100644 index 0000000..8568297 --- /dev/null +++ b/utils/foroptioncustom.go @@ -0,0 +1,36 @@ +package utils + +import ( + "sigs.k8s.io/controller-runtime/pkg/builder" + "sigs.k8s.io/controller-runtime/pkg/event" + "sigs.k8s.io/controller-runtime/pkg/predicate" +) + +func ForOptionCustom() builder.ForOption { + return builder.WithPredicates( + predicate.Funcs{ + CreateFunc: func(event event.CreateEvent) bool { + return true + }, + DeleteFunc: func(deleteEvent event.DeleteEvent) bool { + return true + }, + UpdateFunc: func(updateEvent event.UpdateEvent) bool { + return filterBySpec(updateEvent) + }, + GenericFunc: func(genericEvent event.GenericEvent) bool { + return false + }, + }) +} + +func filterBySpec(e event.UpdateEvent) bool { + if e.ObjectOld == nil { + return false + } + if e.ObjectNew == nil { + return false + } + + return e.ObjectNew.GetGeneration() != e.ObjectOld.GetGeneration() +}