From 1fbead3621c47e2def0d652db4a2068b21486421 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 14:43:09 +0200 Subject: [PATCH 01/44] chore(lint): enable mnd --- .golangci.yml | 12 +++++++++++- pkg/controller/client/client.go | 6 +++++- pkg/controller/controller.go | 9 +++++++-- pkg/resources/resources_apply.go | 18 +++++++++++++----- test/e2e/common/dapr_app.go | 6 +++++- test/e2e/support/dapr-test-app/main.go | 6 +++++- test/support/dapr/support_dapr.go | 20 +++++++++++++------- test/support/helm/helm_install.go | 6 +++++- test/support/olm/support_olm.go | 6 +++++- test/support/support.go | 8 -------- test/support/test.go | 20 ++++++++++++++++---- 11 files changed, 85 insertions(+), 32 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 5205bcb..d43cc51 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -24,6 +24,17 @@ linters-settings: rules: - name: dot-imports disabled: true + mnd: + checks: + - argument + - case + - operation + - return + - assign + ignored-functions: + - '^len\.' + - '^strings\.SplitN$' + - '^make$' linters: enable-all: true disable: @@ -44,7 +55,6 @@ linters: - goerr113 - gofumpt - golint - - gomnd - gomoddirectives - interfacer - ireturn diff --git a/pkg/controller/client/client.go b/pkg/controller/client/client.go index 1390ed1..4e20920 100644 --- a/pkg/controller/client/client.go +++ b/pkg/controller/client/client.go @@ -23,6 +23,10 @@ import ( daprClient "github.com/dapr-sandbox/dapr-kubernetes-operator/pkg/client/clientset/versioned" ) +const ( + DiscoveryLimiterBurst = 30 +) + var scaleConverter = scale.NewScaleConverter() var codecs = serializer.NewCodecFactory(scaleConverter.Scheme()) @@ -82,7 +86,7 @@ func NewClient(cfg *rest.Config, scheme *runtime.Scheme, cc ctrl.Client) (*Clien rest: restCl, } - c.discoveryLimiter = rate.NewLimiter(rate.Every(time.Second), 30) + c.discoveryLimiter = rate.NewLimiter(rate.Every(time.Second), DiscoveryLimiterBurst) c.discoveryCache = memory.NewMemCacheClient(discoveryCl) c.mapper = restmapper.NewDeferredDiscoveryRESTMapper(c.discoveryCache) diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index 4c6f166..c59b883 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -28,6 +28,11 @@ var ( Log = ctrl.Log.WithName("controller") ) +const ( + PprofReadTimeout = 10 * time.Second + PprofWriteTimeout = 10 * time.Second +) + func init() { utilruntime.Must(clientgoscheme.AddToScheme(Scheme)) } @@ -78,8 +83,8 @@ func Start(options Options, setup func(manager.Manager, Options) error) error { server := &http.Server{ Addr: options.PprofAddr, - ReadTimeout: 10 * time.Second, - WriteTimeout: 10 * time.Second, + ReadTimeout: PprofReadTimeout, + WriteTimeout: PprofWriteTimeout, Handler: mux, } diff --git a/pkg/resources/resources_apply.go b/pkg/resources/resources_apply.go index 3e39efd..a7e5f3b 100644 --- a/pkg/resources/resources_apply.go +++ b/pkg/resources/resources_apply.go @@ -10,6 +10,14 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" ) +const ( + DefaultProbeInitialDelay = 5 + DefaultProbePeriod = 10 + DefaultProbeTimeout = 10 + DefaultProbeFailureThreshold = 10 + DefaultProbeSuccessThreshold = 1 +) + func WithOwnerReference(object client.Object) *metav1ac.OwnerReferenceApplyConfiguration { return metav1ac.OwnerReference(). WithAPIVersion(object.GetObjectKind().GroupVersionKind().GroupVersion().String()). @@ -22,11 +30,11 @@ func WithOwnerReference(object client.Object) *metav1ac.OwnerReferenceApplyConfi func WithHTTPProbe(path string, port int32) *corev1ac.ProbeApplyConfiguration { return corev1ac.Probe(). - WithInitialDelaySeconds(5). - WithPeriodSeconds(10). - WithFailureThreshold(10). - WithSuccessThreshold(1). - WithTimeoutSeconds(10). + WithInitialDelaySeconds(DefaultProbeInitialDelay). + WithPeriodSeconds(DefaultProbePeriod). + WithFailureThreshold(DefaultProbeFailureThreshold). + WithSuccessThreshold(DefaultProbeSuccessThreshold). + WithTimeoutSeconds(DefaultProbeTimeout). WithHTTPGet(corev1ac.HTTPGetAction(). WithPath(path). WithPort(intstr.IntOrString{IntVal: port}). diff --git a/test/e2e/common/dapr_app.go b/test/e2e/common/dapr_app.go index 83d1491..78c0e55 100644 --- a/test/e2e/common/dapr_app.go +++ b/test/e2e/common/dapr_app.go @@ -16,6 +16,10 @@ import ( corev1 "k8s.io/api/core/v1" ) +const ( + IngressPort = 8081 +) + func ValidateDaprApp(test support.Test, namespace string) { test.T().Helper() @@ -52,7 +56,7 @@ func ValidateDaprApp(test support.Test, namespace string) { test.T().Logf("Testing the app with name %s", appName) - base := fmt.Sprintf("http://localhost:%d/%s", 8081, appName) + base := fmt.Sprintf("http://localhost:%d/%s", IngressPort, appName) value := xid.New().String() //nolint:bodyclose diff --git a/test/e2e/support/dapr-test-app/main.go b/test/e2e/support/dapr-test-app/main.go index 432bf3e..9c00855 100644 --- a/test/e2e/support/dapr-test-app/main.go +++ b/test/e2e/support/dapr-test-app/main.go @@ -19,6 +19,10 @@ var ( once sync.Once ) +const ( + HTTPReadHeaderTimeout = 3 * time.Second +) + func init() { appPort = os.Getenv("APP_PORT") if appPort == "" { @@ -110,7 +114,7 @@ func main() { server := &http.Server{ Addr: ":" + appPort, - ReadHeaderTimeout: 3 * time.Second, + ReadHeaderTimeout: HTTPReadHeaderTimeout, } err := server.ListenAndServe() diff --git a/test/support/dapr/support_dapr.go b/test/support/dapr/support_dapr.go index 606acc6..32353de 100644 --- a/test/support/dapr/support_dapr.go +++ b/test/support/dapr/support_dapr.go @@ -2,6 +2,7 @@ package dapr import ( "encoding/json" + "strconv" "strings" "github.com/dapr-sandbox/dapr-kubernetes-operator/pkg/pointer" @@ -25,6 +26,11 @@ import ( metav1ac "k8s.io/client-go/applyconfigurations/meta/v1" ) +const ( + TestAppPort = 8080 + TestAppServicePort = 80 +) + func DeployTestApp(t support.Test, name string, namespace string) { t.T().Helper() t.T().Logf("Setting up Dapr Application %s in namespace %s", name, namespace) @@ -103,7 +109,7 @@ func DeployTestApp(t support.Test, name string, namespace string) { }). WithAnnotations(map[string]string{ "dapr.io/app-id": name, - "dapr.io/app-port": "8080", + "dapr.io/app-port": strconv.Itoa(TestAppPort), "dapr.io/enabled": "true", "dapr.io/enable-api-logging": "true", }). @@ -112,9 +118,9 @@ func DeployTestApp(t support.Test, name string, namespace string) { WithImage("kind.local/dapr-test-app:latest"). WithImagePullPolicy(corev1.PullNever). WithName("app"). - WithPorts(resources.WithPort("http", 8080)). - WithReadinessProbe(resources.WithHTTPProbe("/health/readiness", 8080)). - WithLivenessProbe(resources.WithHTTPProbe("/health/liveness", 8080)). + WithPorts(resources.WithPort("http", TestAppPort)). + WithReadinessProbe(resources.WithHTTPProbe("/health/readiness", TestAppPort)). + WithLivenessProbe(resources.WithHTTPProbe("/health/liveness", TestAppPort)). WithEnv(resources.WithEnv("STATESTORE_NAME", name)), ), ), @@ -148,8 +154,8 @@ func DeployTestApp(t support.Test, name string, namespace string) { WithPorts(corev1ac.ServicePort(). WithName("http"). WithProtocol(corev1.ProtocolTCP). - WithPort(80). - WithTargetPort(intstr.FromInt32(8080))). + WithPort(TestAppServicePort). + WithTargetPort(intstr.FromInt32(TestAppPort))). WithSelector(map[string]string{ "app": name, }). @@ -198,7 +204,7 @@ func DeployTestApp(t support.Test, name string, namespace string) { WithService(netv1ac.IngressServiceBackend(). WithName(name). WithPort(netv1ac.ServiceBackendPort(). - WithNumber(80), + WithNumber(TestAppServicePort), ), ), ), diff --git a/test/support/helm/helm_install.go b/test/support/helm/helm_install.go index 68faab6..676decd 100644 --- a/test/support/helm/helm_install.go +++ b/test/support/helm/helm_install.go @@ -11,6 +11,10 @@ import ( "helm.sh/helm/v3/pkg/release" ) +const ( + DefaultInstallTimeout = 10 * time.Minute +) + type InstallOption func(*ReleaseOptions[action.Install]) func (h *Helm) Install(ctx context.Context, chart string, options ...InstallOption) (*release.Release, error) { @@ -21,7 +25,7 @@ func (h *Helm) Install(ctx context.Context, chart string, options ...InstallOpti client.IncludeCRDs = true client.Wait = true client.Namespace = xid.New().String() - client.Timeout = 10 * time.Minute + client.Timeout = DefaultInstallTimeout io := ReleaseOptions[action.Install]{ Client: client, diff --git a/test/support/olm/support_olm.go b/test/support/olm/support_olm.go index 591f0c9..3b73a1c 100644 --- a/test/support/olm/support_olm.go +++ b/test/support/olm/support_olm.go @@ -17,6 +17,10 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +const ( + CatalogRegistryPollInterval = 10 * time.Minute +) + func DeployOperator(test support.Test, ns *corev1.Namespace, image string) { // // Install OperatorGroups @@ -91,7 +95,7 @@ func DeployOperator(test support.Test, ns *corev1.Namespace, image string) { UpdateStrategy: &olmV1Alpha1.UpdateStrategy{ RegistryPoll: &olmV1Alpha1.RegistryPoll{ Interval: &metav1.Duration{ - Duration: 10 * time.Minute, + Duration: CatalogRegistryPollInterval, }, }, }, diff --git a/test/support/support.go b/test/support/support.go index c70c665..cb050e1 100644 --- a/test/support/support.go +++ b/test/support/support.go @@ -3,7 +3,6 @@ package support import ( "encoding/json" "fmt" - "time" "github.com/onsi/gomega" @@ -14,13 +13,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" ) -const ( - TestTimeoutMini = 5 * time.Second - TestTimeoutShort = 1 * time.Minute - TestTimeoutMedium = 2 * time.Minute - TestTimeoutLong = 5 * time.Minute -) - func runCleanup(t Test, in runtime.Object) error { un, err := resources.ToUnstructured(t.Client().Scheme(), in) if err != nil { diff --git a/test/support/test.go b/test/support/test.go index 110b084..d185df5 100644 --- a/test/support/test.go +++ b/test/support/test.go @@ -28,6 +28,18 @@ import ( olmV1Alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1" ) +const ( + TestTimeoutMini = 5 * time.Second + TestTimeoutShort = 1 * time.Minute + TestTimeoutMedium = 2 * time.Minute + TestTimeoutLong = 5 * time.Minute + + DefaultEventuallyPollingInterval = 500 * time.Millisecond + DefaultEventuallyTimeout = TestTimeoutLong + DefaultConsistentlyDuration = 500 * time.Millisecond + DefaultConsistentlyPollingInterval = 500 * time.Millisecond +) + func init() { if err := daprApi.AddToScheme(scheme.Scheme); err != nil { panic(err) @@ -81,10 +93,10 @@ func With(t *testing.T) Test { cleanup: make([]func() []runtime.Object, 0), } - answer.SetDefaultEventuallyPollingInterval(500 * time.Millisecond) - answer.SetDefaultEventuallyTimeout(TestTimeoutLong) - answer.SetDefaultConsistentlyDuration(500 * time.Millisecond) - answer.SetDefaultConsistentlyDuration(TestTimeoutLong) + answer.SetDefaultEventuallyPollingInterval(DefaultEventuallyPollingInterval) + answer.SetDefaultEventuallyTimeout(DefaultEventuallyTimeout) + answer.SetDefaultConsistentlyDuration(DefaultConsistentlyDuration) + answer.SetDefaultConsistentlyPollingInterval(DefaultConsistentlyPollingInterval) t.Cleanup(func() { t.Log("Run Test cleanup") From e75380ca34d7a0531d4bd8d0c80b36c58fb0fa75 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 14:45:17 +0200 Subject: [PATCH 02/44] chore(lint): enable gomoddirectives --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index d43cc51..ad61efe 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -55,7 +55,6 @@ linters: - goerr113 - gofumpt - golint - - gomoddirectives - interfacer - ireturn - lll From c29fca4c79bb2163d425093bcfc364d631a65a48 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 14:46:24 +0200 Subject: [PATCH 03/44] chore(lint): enable lll --- .golangci.yml | 1 - cmd/run/run.go | 30 +++++++++++++++++++----------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index ad61efe..cf76c91 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -57,7 +57,6 @@ linters: - golint - interfacer - ireturn - - lll - maligned - nakedret - nestif diff --git a/cmd/run/run.go b/cmd/run/run.go index c0b21dd..656c863 100644 --- a/cmd/run/run.go +++ b/cmd/run/run.go @@ -30,7 +30,7 @@ func init() { func NewRunCmd() *cobra.Command { - controllerOpts := controller.Options{ + co := controller.Options{ MetricsAddr: ":8080", ProbeAddr: ":8081", PprofAddr: "", @@ -53,7 +53,7 @@ func NewRunCmd() *cobra.Command { return fmt.Errorf("unable to compute cache's watch selector: %w", err) } - controllerOpts.WatchSelectors = map[rtclient.Object]rtcache.ByObject{ + co.WatchSelectors = map[rtclient.Object]rtcache.ByObject{ // k8s &rbacv1.ClusterRole{}: {Label: selector}, &rbacv1.ClusterRoleBinding{}: {Label: selector}, @@ -67,7 +67,7 @@ func NewRunCmd() *cobra.Command { &appsv1.Deployment{}: {Label: selector}, } - return controller.Start(controllerOpts, func(manager manager.Manager, opts controller.Options) error { + return controller.Start(co, func(manager manager.Manager, opts controller.Options) error { if _, err := controlplane.NewReconciler(cmd.Context(), manager, helmOpts); err != nil { return fmt.Errorf("unable to set-up DaprControlPlane reconciler: %w", err) } @@ -81,16 +81,24 @@ func NewRunCmd() *cobra.Command { }, } - cmd.Flags().StringVar(&controllerOpts.LeaderElectionID, "leader-election-id", controllerOpts.LeaderElectionID, "The leader election ID of the operator.") - cmd.Flags().StringVar(&controllerOpts.LeaderElectionNamespace, "leader-election-namespace", controllerOpts.LeaderElectionNamespace, "The leader election namespace.") - cmd.Flags().BoolVar(&controllerOpts.EnableLeaderElection, "leader-election", controllerOpts.EnableLeaderElection, "Enable leader election for controller manager.") - cmd.Flags().BoolVar(&controllerOpts.ReleaseLeaderElectionOnCancel, "leader-election-release", controllerOpts.ReleaseLeaderElectionOnCancel, "If the leader should step down voluntarily.") + cmd.Flags().StringVar( + &co.LeaderElectionID, "leader-election-id", co.LeaderElectionID, "The leader election ID of the operator.") + cmd.Flags().StringVar( + &co.LeaderElectionNamespace, "leader-election-namespace", co.LeaderElectionNamespace, "The leader election namespace.") + cmd.Flags().BoolVar( + &co.EnableLeaderElection, "leader-election", co.EnableLeaderElection, "Enable leader election for controller manager.") + cmd.Flags().BoolVar( + &co.ReleaseLeaderElectionOnCancel, "leader-election-release", co.ReleaseLeaderElectionOnCancel, "If the leader should step down voluntarily.") - cmd.Flags().StringVar(&controllerOpts.MetricsAddr, "metrics-bind-address", controllerOpts.MetricsAddr, "The address the metric endpoint binds to.") - cmd.Flags().StringVar(&controllerOpts.ProbeAddr, "health-probe-bind-address", controllerOpts.ProbeAddr, "The address the probe endpoint binds to.") - cmd.Flags().StringVar(&controllerOpts.PprofAddr, "pprof-bind-address", controllerOpts.PprofAddr, "The address the pprof endpoint binds to.") + cmd.Flags().StringVar( + &co.MetricsAddr, "metrics-bind-address", co.MetricsAddr, "The address the metric endpoint binds to.") + cmd.Flags().StringVar( + &co.ProbeAddr, "health-probe-bind-address", co.ProbeAddr, "The address the probe endpoint binds to.") + cmd.Flags().StringVar( + &co.PprofAddr, "pprof-bind-address", co.PprofAddr, "The address the pprof endpoint binds to.") - cmd.Flags().StringVar(&helmOpts.ChartsDir, "helm-charts-dir", helmOpts.ChartsDir, "Helm charts dir.") + cmd.Flags().StringVar( + &helmOpts.ChartsDir, "helm-charts-dir", helmOpts.ChartsDir, "Helm charts dir.") return &cmd } From 87e444c912995472b5549118f9bdc0dcba68bf21 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 14:53:51 +0200 Subject: [PATCH 04/44] chore(lint): enable nestif --- .golangci.yml | 1 - .../dapr_controlplane_controller_reconcile.go | 1 + .../dapr_instance_controller_action_chart.go | 65 +++++++++++-------- .../dapr_instance_controller_reconcile.go | 1 + 4 files changed, 40 insertions(+), 28 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index cf76c91..62987cd 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -59,7 +59,6 @@ linters: - ireturn - maligned - nakedret - - nestif - nilnil - nlreturn - nosnakecase diff --git a/internal/controller/operator/controlplane/dapr_controlplane_controller_reconcile.go b/internal/controller/operator/controlplane/dapr_controlplane_controller_reconcile.go index ff8bdaf..9cbbc6a 100644 --- a/internal/controller/operator/controlplane/dapr_controlplane_controller_reconcile.go +++ b/internal/controller/operator/controlplane/dapr_controlplane_controller_reconcile.go @@ -92,6 +92,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu return ctrl.Result{}, err } + //nolint:nestif if rr.Resource.ObjectMeta.DeletionTimestamp.IsZero() { // diff --git a/internal/controller/operator/instance/dapr_instance_controller_action_chart.go b/internal/controller/operator/instance/dapr_instance_controller_action_chart.go index 6c85b65..2f58bae 100644 --- a/internal/controller/operator/instance/dapr_instance_controller_action_chart.go +++ b/internal/controller/operator/instance/dapr_instance_controller_action_chart.go @@ -4,6 +4,8 @@ import ( "context" "fmt" + "helm.sh/helm/v3/pkg/chart" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/dapr-sandbox/dapr-kubernetes-operator/api/operator/v1alpha1" @@ -40,33 +42,11 @@ func (a *ChartAction) Run(ctx context.Context, rc *ReconciliationRequest) error rc.Resource.Status.Chart = &v1alpha1.ChartMeta{} } + rc.Resource.Status.Chart.Repo = ChartRepoEmbedded + // TODO: maybe cache the chart if rc.Resource.Spec.Chart != nil { - opts := helm.ChartOptions{} - opts.Name = rc.Resource.Spec.Chart.Name - opts.RepoURL = rc.Resource.Spec.Chart.Repo - opts.Version = rc.Resource.Spec.Chart.Version - - if rc.Resource.Spec.Chart.Secret != "" { - s, err := rc.Client.CoreV1().Secrets(rc.Resource.Namespace).Get( - ctx, - rc.Resource.Spec.Chart.Secret, - metav1.GetOptions{}, - ) - - if err != nil { - return fmt.Errorf("unable to fetch secret %s, %w", rc.Resource.Spec.Chart.Secret, err) - } - - if v, ok := s.Data[ChartRepoUsernameKey]; ok { - opts.Username = string(v) - } - if v, ok := s.Data[ChartRepoPasswordKey]; ok { - opts.Password = string(v) - } - } - - c, err := a.engine.Load(opts) + c, err := a.loadChart(ctx, rc) if err != nil { return err } @@ -74,8 +54,6 @@ func (a *ChartAction) Run(ctx context.Context, rc *ReconciliationRequest) error rc.Chart = c rc.Resource.Status.Chart.Repo = rc.Resource.Spec.Chart.Repo - } else { - rc.Resource.Status.Chart.Repo = ChartRepoEmbedded } rc.Resource.Status.Chart.Version = rc.Chart.Metadata.Version @@ -87,3 +65,36 @@ func (a *ChartAction) Run(ctx context.Context, rc *ReconciliationRequest) error func (a *ChartAction) Cleanup(_ context.Context, _ *ReconciliationRequest) error { return nil } + +func (a *ChartAction) loadChart(ctx context.Context, rc *ReconciliationRequest) (*chart.Chart, error) { + opts := helm.ChartOptions{} + opts.Name = rc.Resource.Spec.Chart.Name + opts.RepoURL = rc.Resource.Spec.Chart.Repo + opts.Version = rc.Resource.Spec.Chart.Version + + if rc.Resource.Spec.Chart.Secret != "" { + s, err := rc.Client.CoreV1().Secrets(rc.Resource.Namespace).Get( + ctx, + rc.Resource.Spec.Chart.Secret, + metav1.GetOptions{}, + ) + + if err != nil { + return nil, fmt.Errorf("unable to fetch secret %s, %w", rc.Resource.Spec.Chart.Secret, err) + } + + if v, ok := s.Data[ChartRepoUsernameKey]; ok { + opts.Username = string(v) + } + if v, ok := s.Data[ChartRepoPasswordKey]; ok { + opts.Password = string(v) + } + } + + c, err := a.engine.Load(opts) + if err != nil { + return nil, err + } + + return c, nil +} diff --git a/internal/controller/operator/instance/dapr_instance_controller_reconcile.go b/internal/controller/operator/instance/dapr_instance_controller_reconcile.go index b2618dd..c3626b6 100644 --- a/internal/controller/operator/instance/dapr_instance_controller_reconcile.go +++ b/internal/controller/operator/instance/dapr_instance_controller_reconcile.go @@ -99,6 +99,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu return ctrl.Result{}, err } + //nolint:nestif if rr.Resource.ObjectMeta.DeletionTimestamp.IsZero() { // From 6ec4d99493a9c053f2d5b2786f5d3ec6dba2a025 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 14:55:09 +0200 Subject: [PATCH 05/44] chore(lint): enable golint --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 62987cd..3baaeba 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -54,7 +54,6 @@ linters: - godox - goerr113 - gofumpt - - golint - interfacer - ireturn - maligned From f1c36e3b09c9eb2b469be8ac19a7f2634d580835 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:04:58 +0200 Subject: [PATCH 06/44] chore(lint): enable inamedparam --- .golangci.yml | 1 - .../controlplane/dapr_controlplane_controller_type.go | 6 +++--- .../operator/instance/dapr_instance_controller_type.go | 6 +++--- test/support/test.go | 4 ++-- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 3baaeba..0167049 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -77,5 +77,4 @@ linters: - varcheck - deadcode - ifshort - - inamedparam - depguard diff --git a/internal/controller/operator/controlplane/dapr_controlplane_controller_type.go b/internal/controller/operator/controlplane/dapr_controlplane_controller_type.go index 9f23a1f..b2d88c8 100644 --- a/internal/controller/operator/controlplane/dapr_controlplane_controller_type.go +++ b/internal/controller/operator/controlplane/dapr_controlplane_controller_type.go @@ -25,7 +25,7 @@ type ReconciliationRequest struct { } type Action interface { - Configure(context.Context, *client.Client, *builder.Builder) (*builder.Builder, error) - Run(context.Context, *ReconciliationRequest) error - Cleanup(context.Context, *ReconciliationRequest) error + Configure(ctx context.Context, c *client.Client, b *builder.Builder) (*builder.Builder, error) + Run(ctx context.Context, rc *ReconciliationRequest) error + Cleanup(ctx context.Context, rc *ReconciliationRequest) error } diff --git a/internal/controller/operator/instance/dapr_instance_controller_type.go b/internal/controller/operator/instance/dapr_instance_controller_type.go index d12048f..e8879a5 100644 --- a/internal/controller/operator/instance/dapr_instance_controller_type.go +++ b/internal/controller/operator/instance/dapr_instance_controller_type.go @@ -28,7 +28,7 @@ type ReconciliationRequest struct { } type Action interface { - Configure(context.Context, *client.Client, *builder.Builder) (*builder.Builder, error) - Run(context.Context, *ReconciliationRequest) error - Cleanup(context.Context, *ReconciliationRequest) error + Configure(ctx context.Context, c *client.Client, b *builder.Builder) (*builder.Builder, error) + Run(ctx context.Context, rc *ReconciliationRequest) error + Cleanup(ctx context.Context, rc *ReconciliationRequest) error } diff --git a/test/support/test.go b/test/support/test.go index d185df5..3ec323b 100644 --- a/test/support/test.go +++ b/test/support/test.go @@ -59,13 +59,13 @@ type Test interface { Ctx() context.Context ID() string - Cleanup(func() []runtime.Object) + Cleanup(f func() []runtime.Object) Client() *supportclient.Client Helm() *helmsupport.Helm HTTPClient() *http.Client - NewTestNamespace(...Option[*corev1.Namespace]) *corev1.Namespace + NewTestNamespace(opts ...Option[*corev1.Namespace]) *corev1.Namespace } type Option[T any] interface { From d269d6590b8c67c8cc148dc20a7e6a6a4c336444 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:05:28 +0200 Subject: [PATCH 07/44] chore(lint): enable ifshort --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 0167049..6d23cd8 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -76,5 +76,4 @@ linters: - wsl - varcheck - deadcode - - ifshort - depguard From 091949adfdadeea023d02527ff71111284a84a03 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:06:16 +0200 Subject: [PATCH 08/44] chore(lint): enable deadcode --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 6d23cd8..95965bb 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -75,5 +75,4 @@ linters: - wrapcheck - wsl - varcheck - - deadcode - depguard From 2e0e8ac272d85f8a8e8cc84f7b63942ef6c3ecc5 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:06:45 +0200 Subject: [PATCH 09/44] chore(lint): enable varcheck --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 95965bb..fce277b 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -74,5 +74,4 @@ linters: - whitespace - wrapcheck - wsl - - varcheck - depguard From 0e977d1edc4c0e27d46e73ddf0523e67817be1b2 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:18:16 +0200 Subject: [PATCH 10/44] chore(lint): enable dupl --- .golangci.yml | 7 +- test/e2e/olm/dapr_olm_controlplane_test.go | 74 -------------- test/e2e/olm/dapr_olm_instance_test.go | 74 -------------- test/e2e/olm/dapr_olm_test.go | 112 +++++++++++++++++++++ 4 files changed, 118 insertions(+), 149 deletions(-) delete mode 100644 test/e2e/olm/dapr_olm_controlplane_test.go delete mode 100644 test/e2e/olm/dapr_olm_instance_test.go create mode 100644 test/e2e/olm/dapr_olm_test.go diff --git a/.golangci.yml b/.golangci.yml index fce277b..e1982a7 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -38,8 +38,13 @@ linters-settings: linters: enable-all: true disable: + # abandoned + - deadcode + - golint + - ifshort + - varcheck + # others - cyclop - - dupl - exhaustive - exhaustivestruct - exhaustruct diff --git a/test/e2e/olm/dapr_olm_controlplane_test.go b/test/e2e/olm/dapr_olm_controlplane_test.go deleted file mode 100644 index 9261f58..0000000 --- a/test/e2e/olm/dapr_olm_controlplane_test.go +++ /dev/null @@ -1,74 +0,0 @@ -package operator - -import ( - "os" - "testing" - - "github.com/dapr-sandbox/dapr-kubernetes-operator/internal/controller/operator/controlplane" - "github.com/dapr-sandbox/dapr-kubernetes-operator/test/support/dapr" - "github.com/dapr-sandbox/dapr-kubernetes-operator/test/support/olm" - - daprAc "github.com/dapr-sandbox/dapr-kubernetes-operator/pkg/client/applyconfiguration/operator/v1alpha1" - daprTC "github.com/dapr-sandbox/dapr-kubernetes-operator/test/e2e/common" - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - - . "github.com/dapr-sandbox/dapr-kubernetes-operator/test/support" - . "github.com/onsi/gomega" -) - -func TestDaprDeployWithControlPlane(t *testing.T) { - test := With(t) - - ns := test.NewTestNamespace() - image := os.Getenv("CATALOG_CONTAINER_IMAGE") - - test.Expect(image). - ToNot(BeEmpty()) - - // - // Install Operator - // - - olm.DeployOperator(test, ns, image) - - // - // Control plane - // - - test.Eventually(Deployment(test, "dapr-control-plane", ns.Name), TestTimeoutLong).Should( - WithTransform(ConditionStatus(appsv1.DeploymentAvailable), Equal(corev1.ConditionTrue))) - - // - // Dapr - // - - res := dapr.DeployControlPlane( - test, - daprAc.DaprControlPlaneSpec(). - WithValues(dapr.Values(test, map[string]interface{}{ - // enable pod watchdog as sometimes the sidecar for some - // (yet) unknown reason is not injected when the pod is - // created, hence the dapr app won't properly start up - "dapr_operator": map[string]interface{}{ - "watchInterval": "1s", - }, - })), - dapr.WithControlPlaneName(controlplane.DaprControlPlaneResourceName), - dapr.WithControlPlaneNamespace(ns.Name), - ) - - test.Eventually(Deployment(test, "dapr-operator", res.Namespace), TestTimeoutLong).Should( - WithTransform(ConditionStatus(appsv1.DeploymentAvailable), Equal(corev1.ConditionTrue))) - test.Eventually(Deployment(test, "dapr-sentry", res.Namespace), TestTimeoutLong).Should( - WithTransform(ConditionStatus(appsv1.DeploymentAvailable), Equal(corev1.ConditionTrue))) - test.Eventually(Deployment(test, "dapr-sidecar-injector", res.Namespace), TestTimeoutLong).Should( - WithTransform(ConditionStatus(appsv1.DeploymentAvailable), Equal(corev1.ConditionTrue))) - - // - // Dapr Application - // - - daprTC.ValidateDaprApp(test, res.Namespace) - -} diff --git a/test/e2e/olm/dapr_olm_instance_test.go b/test/e2e/olm/dapr_olm_instance_test.go deleted file mode 100644 index d594482..0000000 --- a/test/e2e/olm/dapr_olm_instance_test.go +++ /dev/null @@ -1,74 +0,0 @@ -package operator - -import ( - "os" - "testing" - - "github.com/dapr-sandbox/dapr-kubernetes-operator/internal/controller/operator/instance" - "github.com/dapr-sandbox/dapr-kubernetes-operator/test/support/dapr" - "github.com/dapr-sandbox/dapr-kubernetes-operator/test/support/olm" - - daprAc "github.com/dapr-sandbox/dapr-kubernetes-operator/pkg/client/applyconfiguration/operator/v1alpha1" - daprTC "github.com/dapr-sandbox/dapr-kubernetes-operator/test/e2e/common" - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - - . "github.com/dapr-sandbox/dapr-kubernetes-operator/test/support" - . "github.com/onsi/gomega" -) - -func TestDaprDeployWithInstance(t *testing.T) { - test := With(t) - - ns := test.NewTestNamespace() - image := os.Getenv("CATALOG_CONTAINER_IMAGE") - - test.Expect(image). - ToNot(BeEmpty()) - - // - // Install Operator - // - - olm.DeployOperator(test, ns, image) - - // - // Control plane - // - - test.Eventually(Deployment(test, "dapr-control-plane", ns.Name), TestTimeoutLong).Should( - WithTransform(ConditionStatus(appsv1.DeploymentAvailable), Equal(corev1.ConditionTrue))) - - // - // Dapr - // - - res := dapr.DeployInstance( - test, - daprAc.DaprInstanceSpec(). - WithValues(dapr.Values(test, map[string]interface{}{ - // enable pod watchdog as sometimes the sidecar for some - // (yet) unknown reason is not injected when the pod is - // created, hence the dapr app won't properly start up - "dapr_operator": map[string]interface{}{ - "watchInterval": "1s", - }, - })), - dapr.WithInstanceName(instance.DaprInstanceResourceName), - dapr.WithInstanceNamespace(ns.Name), - ) - - test.Eventually(Deployment(test, "dapr-operator", res.Namespace), TestTimeoutLong).Should( - WithTransform(ConditionStatus(appsv1.DeploymentAvailable), Equal(corev1.ConditionTrue))) - test.Eventually(Deployment(test, "dapr-sentry", res.Namespace), TestTimeoutLong).Should( - WithTransform(ConditionStatus(appsv1.DeploymentAvailable), Equal(corev1.ConditionTrue))) - test.Eventually(Deployment(test, "dapr-sidecar-injector", res.Namespace), TestTimeoutLong).Should( - WithTransform(ConditionStatus(appsv1.DeploymentAvailable), Equal(corev1.ConditionTrue))) - - // - // Dapr Application - // - - daprTC.ValidateDaprApp(test, res.Namespace) - -} diff --git a/test/e2e/olm/dapr_olm_test.go b/test/e2e/olm/dapr_olm_test.go new file mode 100644 index 0000000..6c37952 --- /dev/null +++ b/test/e2e/olm/dapr_olm_test.go @@ -0,0 +1,112 @@ +package operator + +import ( + "os" + "testing" + + "github.com/dapr-sandbox/dapr-kubernetes-operator/internal/controller/operator/controlplane" + "github.com/dapr-sandbox/dapr-kubernetes-operator/internal/controller/operator/instance" + daprAc "github.com/dapr-sandbox/dapr-kubernetes-operator/pkg/client/applyconfiguration/operator/v1alpha1" + "github.com/dapr-sandbox/dapr-kubernetes-operator/test/support/dapr" + "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/dapr-sandbox/dapr-kubernetes-operator/test/support/olm" + + daprTC "github.com/dapr-sandbox/dapr-kubernetes-operator/test/e2e/common" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + + . "github.com/dapr-sandbox/dapr-kubernetes-operator/test/support" + . "github.com/onsi/gomega" +) + +func TestDaprDeploy(t *testing.T) { + + t.Run("With ControlPlane", func(t *testing.T) { + testDaprDeploy( + With(t), + func(test Test, ns *corev1.Namespace) client.Object { + return dapr.DeployControlPlane( + test, + daprAc.DaprControlPlaneSpec(). + WithValues(dapr.Values(test, map[string]interface{}{ + // enable pod watchdog as sometimes the sidecar for some + // (yet) unknown reason is not injected when the pod is + // created, hence the dapr app won't properly start up + "dapr_operator": map[string]interface{}{ + "watchInterval": "1s", + }, + })), + dapr.WithControlPlaneName(controlplane.DaprControlPlaneResourceName), + dapr.WithControlPlaneNamespace(ns.Name), + ) + }, + ) + }) + + t.Run("With Instance", func(t *testing.T) { + testDaprDeploy( + With(t), + func(test Test, ns *corev1.Namespace) client.Object { + return dapr.DeployInstance( + test, + daprAc.DaprInstanceSpec(). + WithValues(dapr.Values(test, map[string]interface{}{ + // enable pod watchdog as sometimes the sidecar for some + // (yet) unknown reason is not injected when the pod is + // created, hence the dapr app won't properly start up + "dapr_operator": map[string]interface{}{ + "watchInterval": "1s", + }, + })), + dapr.WithInstanceName(instance.DaprInstanceResourceName), + dapr.WithInstanceNamespace(ns.Name), + ) + }, + ) + }) + +} + +func testDaprDeploy(test Test, f func(t Test, ns *corev1.Namespace) client.Object) { + test.T().Helper() + + ns := test.NewTestNamespace() + image := os.Getenv("CATALOG_CONTAINER_IMAGE") + + test.Expect(image). + ToNot(BeEmpty()) + + // + // Install Operator + // + + olm.DeployOperator(test, ns, image) + + // + // Control plane + // + + test.Eventually(Deployment(test, "dapr-control-plane", ns.Name), TestTimeoutLong).Should( + WithTransform(ConditionStatus(appsv1.DeploymentAvailable), Equal(corev1.ConditionTrue))) + + // + // Dapr + // + + res := f(test, ns) + + test.Eventually(Deployment(test, "dapr-operator", res.GetNamespace()), TestTimeoutLong).Should( + WithTransform(ConditionStatus(appsv1.DeploymentAvailable), Equal(corev1.ConditionTrue))) + test.Eventually(Deployment(test, "dapr-sentry", res.GetNamespace()), TestTimeoutLong).Should( + WithTransform(ConditionStatus(appsv1.DeploymentAvailable), Equal(corev1.ConditionTrue))) + test.Eventually(Deployment(test, "dapr-sidecar-injector", res.GetNamespace()), TestTimeoutLong).Should( + WithTransform(ConditionStatus(appsv1.DeploymentAvailable), Equal(corev1.ConditionTrue))) + + // + // Dapr Application + // + + daprTC.ValidateDaprApp(test, res.GetNamespace()) + +} From ce44e487c9e595f3a1dc03aa6bdf68a7ca40b33b Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:33:39 +0200 Subject: [PATCH 11/44] chore(lint): enable wsl --- .golangci.yml | 4 +++- api/operator/v1alpha1/common_types.go | 5 +++++ cmd/run/run.go | 1 - .../operator/controlplane/dapr_controlplane_controller.go | 1 + .../dapr_controlplane_controller_reconcile.go | 6 +----- .../operator/instance/dapr_instance_controller.go | 1 + .../dapr_instance_controller_action_apply_crds.go | 4 ++-- .../dapr_instance_controller_action_apply_resources.go | 8 ++++---- .../instance/dapr_instance_controller_action_chart.go | 1 + .../dapr_instance_controller_action_conditions.go | 1 + .../instance/dapr_instance_controller_reconcile.go | 7 ++----- .../operator/instance/dapr_instance_controller_support.go | 3 ++- pkg/conditions/conditions.go | 1 + pkg/controller/client/client.go | 7 ++++++- pkg/controller/controller.go | 1 + pkg/controller/gc/gc.go | 7 ++++++- pkg/controller/predicates/annotation.go | 1 + pkg/controller/predicates/has_label.go | 1 + pkg/controller/predicates/status.go | 1 + pkg/helm/helm.go | 4 +++- pkg/resources/resources.go | 3 ++- pkg/utils/maputils/maps.go | 2 ++ test/e2e/olm/dapr_olm_test.go | 3 --- test/e2e/operator/dapr_controlplane_test.go | 1 - test/e2e/operator/dapr_instance_test.go | 1 - test/support/client/client.go | 5 ++++- test/support/dapr/support_dapr.go | 3 +-- test/support/dapr/support_dapr_http.go | 1 - test/support/helm/helm.go | 1 - test/support/olm/support_olm.go | 3 ++- test/support/support.go | 1 + test/support/support_k8s.go | 1 + test/support/support_k8s_namespace.go | 6 ++++-- test/support/test.go | 6 ++++++ 34 files changed, 66 insertions(+), 36 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index e1982a7..7c298ce 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -35,6 +35,9 @@ linters-settings: - '^len\.' - '^strings\.SplitN$' - '^make$' + wsl: + allow-cuddle-declarations: true + allow-separated-leading-comment: true linters: enable-all: true disable: @@ -78,5 +81,4 @@ linters: - wastedassign - whitespace - wrapcheck - - wsl - depguard diff --git a/api/operator/v1alpha1/common_types.go b/api/operator/v1alpha1/common_types.go index fb72b88..e80d268 100644 --- a/api/operator/v1alpha1/common_types.go +++ b/api/operator/v1alpha1/common_types.go @@ -40,6 +40,7 @@ func (m RawMessage) MarshalJSON() ([]byte, error) { if m == nil { return []byte("null"), nil } + return m, nil } @@ -48,7 +49,9 @@ func (m *RawMessage) UnmarshalJSON(data []byte) error { if m == nil { return errors.New("json.RawMessage: UnmarshalJSON on nil pointer") } + *m = append((*m)[0:0], data...) + return nil } @@ -57,10 +60,12 @@ func (m *RawMessage) String() string { if m == nil { return "" } + b, err := m.MarshalJSON() if err != nil { return "" } + return string(b) } diff --git a/cmd/run/run.go b/cmd/run/run.go index 656c863..d1afca8 100644 --- a/cmd/run/run.go +++ b/cmd/run/run.go @@ -29,7 +29,6 @@ func init() { } func NewRunCmd() *cobra.Command { - co := controller.Options{ MetricsAddr: ":8080", ProbeAddr: ":8081", diff --git a/internal/controller/operator/controlplane/dapr_controlplane_controller.go b/internal/controller/operator/controlplane/dapr_controlplane_controller.go index 8a23d45..199e1bc 100644 --- a/internal/controller/operator/controlplane/dapr_controlplane_controller.go +++ b/internal/controller/operator/controlplane/dapr_controlplane_controller.go @@ -56,6 +56,7 @@ func NewReconciler(ctx context.Context, manager ctrlRt.Manager, o helm.Options) if err != nil { return nil, err } + if isOpenshift { rec.ClusterType = controller.ClusterTypeOpenShift } diff --git a/internal/controller/operator/controlplane/dapr_controlplane_controller_reconcile.go b/internal/controller/operator/controlplane/dapr_controlplane_controller_reconcile.go index 9cbbc6a..5d5571e 100644 --- a/internal/controller/operator/controlplane/dapr_controlplane_controller_reconcile.go +++ b/internal/controller/operator/controlplane/dapr_controlplane_controller_reconcile.go @@ -94,11 +94,9 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu //nolint:nestif if rr.Resource.ObjectMeta.DeletionTimestamp.IsZero() { - // // Add finalizer // - if ctrlutil.AddFinalizer(rr.Resource, DaprControlPlaneFinalizerName) { if err := r.Update(ctx, rr.Resource); err != nil { if k8serrors.IsConflict(err) { @@ -109,11 +107,9 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu } } } else { - // // Cleanup leftovers if needed // - for i := len(r.actions) - 1; i >= 0; i-- { if err := r.actions[i].Cleanup(ctx, &rr); err != nil { return ctrl.Result{}, err @@ -123,7 +119,6 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu // // Handle finalizer // - if ctrlutil.RemoveFinalizer(rr.Resource, DaprControlPlaneFinalizerName) { if err := r.Update(ctx, rr.Resource); err != nil { if k8serrors.IsConflict(err) { @@ -150,6 +145,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu } errs := make([]error, 0, len(r.actions)+1) + for i := range r.actions { if err := r.actions[i].Run(ctx, &rr); err != nil { errs = append(errs, err) diff --git a/internal/controller/operator/instance/dapr_instance_controller.go b/internal/controller/operator/instance/dapr_instance_controller.go index 26f4413..fe801bb 100644 --- a/internal/controller/operator/instance/dapr_instance_controller.go +++ b/internal/controller/operator/instance/dapr_instance_controller.go @@ -62,6 +62,7 @@ func NewReconciler(ctx context.Context, manager ctrlRt.Manager, o helm.Options) if err != nil { return nil, err } + if isOpenshift { rec.ClusterType = controller.ClusterTypeOpenShift } diff --git a/internal/controller/operator/instance/dapr_instance_controller_action_apply_crds.go b/internal/controller/operator/instance/dapr_instance_controller_action_apply_crds.go index b9473ce..d186616 100644 --- a/internal/controller/operator/instance/dapr_instance_controller_action_apply_crds.go +++ b/internal/controller/operator/instance/dapr_instance_controller_action_apply_crds.go @@ -72,11 +72,12 @@ func (a *ApplyCRDsAction) Run(ctx context.Context, rc *ReconciliationRequest) er }) apply := rc.Resource.Generation != rc.Resource.Status.ObservedGeneration - _, err = dc.Get(ctx, obj.GetName(), metav1.GetOptions{}) + _, err = dc.Get(ctx, obj.GetName(), metav1.GetOptions{}) if err != nil && !k8serrors.IsNotFound(err) { return fmt.Errorf("cannot determine if CRD %s exists: %w", resources.Ref(&obj), err) } + if err != nil && k8serrors.IsNotFound(err) { apply = true } @@ -105,7 +106,6 @@ func (a *ApplyCRDsAction) Run(ctx context.Context, rc *ReconciliationRequest) er "apply", "true", "gen", rc.Resource.Generation, "ref", resources.Ref(&obj)) - } } diff --git a/internal/controller/operator/instance/dapr_instance_controller_action_apply_resources.go b/internal/controller/operator/instance/dapr_instance_controller_action_apply_resources.go index 942a3d6..d33a5a9 100644 --- a/internal/controller/operator/instance/dapr_instance_controller_action_apply_resources.go +++ b/internal/controller/operator/instance/dapr_instance_controller_action_apply_resources.go @@ -107,7 +107,6 @@ func (a *ApplyResourcesAction) Run(ctx context.Context, rc *ReconciliationReques }) switch dc.(type) { - // // NamespacedResource: in this case, filtering with ownership can be implemented // as all the namespaced resources created by this controller have the Dapr CR as @@ -120,7 +119,6 @@ func (a *ApplyResourcesAction) Run(ctx context.Context, rc *ReconciliationReques r := gvk.GroupVersion().String() + ":" + gvk.Kind if _, ok := a.subscriptions[r]; !ok { - a.l.Info("watch", "ref", r) err = rc.Reconciler.Watch( @@ -152,7 +150,6 @@ func (a *ApplyResourcesAction) Run(ctx context.Context, rc *ReconciliationReques r := gvk.GroupVersion().String() + ":" + gvk.Kind if _, ok := a.subscriptions[r]; !ok { - a.l.Info("watch", "ref", r) err = rc.Reconciler.Watch( @@ -196,7 +193,6 @@ func (a *ApplyResourcesAction) Run(ctx context.Context, rc *ReconciliationReques // - https://github.com/dapr/dapr/issues/3968 // - https://github.com/dapr/dapr/issues/6500 // - a.l.Info("run", "apply", "false", "ref", resources.Ref(&obj), @@ -284,9 +280,11 @@ func (a *ApplyResourcesAction) watchForUpdates(gvk schema.GroupVersionKind) bool if gvk.Group == "" && gvk.Version == "v1" && gvk.Kind == "Secret" { return false } + if gvk.Group == "admissionregistration.k8s.io" && gvk.Version == "v1" && gvk.Kind == "MutatingWebhookConfiguration" { return false } + if gvk.Group == "apiextensions.k8s.io" && gvk.Version == "v1" && gvk.Kind == "CustomResourceDefinition" { return false } @@ -306,9 +304,11 @@ func (a *ApplyResourcesAction) installOnly(gvk schema.GroupVersionKind) bool { if gvk.Group == "" && gvk.Version == "v1" && gvk.Kind == "Secret" { return true } + if gvk.Group == "admissionregistration.k8s.io" && gvk.Version == "v1" && gvk.Kind == "MutatingWebhookConfiguration" { return true } + if gvk.Group == "apiextensions.k8s.io" && gvk.Version == "v1" && gvk.Kind == "CustomResourceDefinition" { return true } diff --git a/internal/controller/operator/instance/dapr_instance_controller_action_chart.go b/internal/controller/operator/instance/dapr_instance_controller_action_chart.go index 2f58bae..d94abbb 100644 --- a/internal/controller/operator/instance/dapr_instance_controller_action_chart.go +++ b/internal/controller/operator/instance/dapr_instance_controller_action_chart.go @@ -86,6 +86,7 @@ func (a *ChartAction) loadChart(ctx context.Context, rc *ReconciliationRequest) if v, ok := s.Data[ChartRepoUsernameKey]; ok { opts.Username = string(v) } + if v, ok := s.Data[ChartRepoPasswordKey]; ok { opts.Password = string(v) } diff --git a/internal/controller/operator/instance/dapr_instance_controller_action_conditions.go b/internal/controller/operator/instance/dapr_instance_controller_action_conditions.go index 2948e7b..c8b9e87 100644 --- a/internal/controller/operator/instance/dapr_instance_controller_action_conditions.go +++ b/internal/controller/operator/instance/dapr_instance_controller_action_conditions.go @@ -52,6 +52,7 @@ func (a *ConditionsAction) Run(ctx context.Context, rc *ReconciliationRequest) e } ready := 0 + for i := range deployments.Items { if conditions.ConditionStatus(deployments.Items[i], appsv1.DeploymentAvailable) == corev1.ConditionTrue { ready++ diff --git a/internal/controller/operator/instance/dapr_instance_controller_reconcile.go b/internal/controller/operator/instance/dapr_instance_controller_reconcile.go index c3626b6..d5d2d9d 100644 --- a/internal/controller/operator/instance/dapr_instance_controller_reconcile.go +++ b/internal/controller/operator/instance/dapr_instance_controller_reconcile.go @@ -101,11 +101,9 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu //nolint:nestif if rr.Resource.ObjectMeta.DeletionTimestamp.IsZero() { - // // Add finalizer // - if ctrlutil.AddFinalizer(rr.Resource, DaprInstanceFinalizerName) { if err := r.Update(ctx, rr.Resource); err != nil { if k8serrors.IsConflict(err) { @@ -116,11 +114,9 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu } } } else { - // // Cleanup leftovers if needed // - for i := len(r.actions) - 1; i >= 0; i-- { if err := r.actions[i].Cleanup(ctx, &rr); err != nil { return ctrl.Result{}, err @@ -130,7 +126,6 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu // // Handle finalizer // - if ctrlutil.RemoveFinalizer(rr.Resource, DaprInstanceFinalizerName) { if err := r.Update(ctx, rr.Resource); err != nil { if k8serrors.IsConflict(err) { @@ -157,6 +152,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu } errs := make([]error, 0, len(r.actions)+1) + for i := range r.actions { if err := r.actions[i].Run(ctx, &rr); err != nil { errs = append(errs, err) @@ -185,6 +181,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu // err = r.Status().Update(ctx, rr.Resource) + if err != nil && k8serrors.IsConflict(err) { l.Info(err.Error()) return ctrl.Result{Requeue: true}, nil diff --git a/internal/controller/operator/instance/dapr_instance_controller_support.go b/internal/controller/operator/instance/dapr_instance_controller_support.go index 0e03ce7..bf710db 100644 --- a/internal/controller/operator/instance/dapr_instance_controller_support.go +++ b/internal/controller/operator/instance/dapr_instance_controller_support.go @@ -18,7 +18,6 @@ import ( ) func gcSelector(rc *ReconciliationRequest) (labels.Selector, error) { - namespace, err := labels.NewRequirement( helm.ReleaseNamespace, selection.Equals, @@ -59,10 +58,12 @@ func labelsToRequest(_ context.Context, object ctrlCli.Object) []reconcile.Reque if allLabels == nil { return nil } + name := allLabels[helm.ReleaseName] if name == "" { return nil } + namespace := allLabels[helm.ReleaseNamespace] if namespace == "" { return nil diff --git a/pkg/conditions/conditions.go b/pkg/conditions/conditions.go index 44b8603..b3f804f 100644 --- a/pkg/conditions/conditions.go +++ b/pkg/conditions/conditions.go @@ -35,6 +35,7 @@ func Get(from Getter, t ConditionType) *metav1.Condition { return &condition } } + return nil } diff --git a/pkg/controller/client/client.go b/pkg/controller/client/client.go index 4e20920..4371635 100644 --- a/pkg/controller/client/client.go +++ b/pkg/controller/client/client.go @@ -48,27 +48,31 @@ type Client struct { } func NewClient(cfg *rest.Config, scheme *runtime.Scheme, cc ctrl.Client) (*Client, error) { - discoveryCl, err := discovery.NewDiscoveryClientForConfig(cfg) if err != nil { return nil, err } + kubeCl, err := kubernetes.NewForConfig(cfg) if err != nil { return nil, err } + restCl, err := newRESTClientForConfig(cfg) if err != nil { return nil, err } + dynCl, err := dynamic.NewForConfig(cfg) if err != nil { return nil, err } + daprCl, err := daprClient.NewForConfig(cfg) if err != nil { return nil, err } + apiextCl, err := apiextv1.NewForConfig(cfg) if err != nil { return nil, err @@ -98,6 +102,7 @@ func newRESTClientForConfig(config *rest.Config) (*rest.RESTClient, error) { // so that the RESTClientFor doesn't complain cfg.GroupVersion = &schema.GroupVersion{} cfg.NegotiatedSerializer = codecs.WithoutConversion() + if len(cfg.UserAgent) == 0 { cfg.UserAgent = rest.DefaultKubernetesUserAgent() } diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index c59b883..0b5de36 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -69,6 +69,7 @@ func Start(options Options, setup func(manager.Manager, Options) error) error { if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { return fmt.Errorf("unable to set up health check: %w", err) } + if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil { return fmt.Errorf("unable to set up readiness check: %w", err) } diff --git a/pkg/controller/gc/gc.go b/pkg/controller/gc/gc.go index 299b3c8..f7a8275 100644 --- a/pkg/controller/gc/gc.go +++ b/pkg/controller/gc/gc.go @@ -51,7 +51,6 @@ func (gc *GC) Run(ctx context.Context, ns string, c *client.Client, selector lab } func (gc *GC) deleteEachOf(ctx context.Context, c *client.Client, selector labels.Selector) (int, error) { - deleted := 0 for GVK := range gc.collectableGVKs { @@ -70,9 +69,11 @@ func (gc *GC) deleteEachOf(ctx context.Context, c *client.Client, selector label gc.l.Info("cannot gc, forbidden", "gvk", GVK.String()) continue } + if !k8serrors.IsNotFound(err) { return 0, fmt.Errorf("cannot list child resources %s: %w", GVK.String(), err) } + continue } @@ -154,9 +155,11 @@ func (gc *GC) computeDeletableTypes(ctx context.Context, ns string, c *client.Cl } GVKs := make(map[schema.GroupVersionKind]struct{}) + for _, res := range apiResourceLists { for i := range res.APIResources { resourceGroup := res.APIResources[i].Group + if resourceGroup == "" { // Empty implies the group of the containing resource list should be used gv, err := schema.ParseGroupVersion(res.GroupVersion) @@ -166,6 +169,7 @@ func (gc *GC) computeDeletableTypes(ctx context.Context, ns string, c *client.Cl resourceGroup = gv.Group } + rule: for _, rule := range ssrr.Status.ResourceRules { if !slices.Contains(rule.Verbs, "delete") && !slices.Contains(rule.Verbs, "*") { @@ -179,6 +183,7 @@ func (gc *GC) computeDeletableTypes(ctx context.Context, ns string, c *client.Cl if gc.canBeDeleted(ctx, GVK) { GVKs[GVK] = struct{}{} } + break rule } } diff --git a/pkg/controller/predicates/annotation.go b/pkg/controller/predicates/annotation.go index 7f4417d..3a16c06 100644 --- a/pkg/controller/predicates/annotation.go +++ b/pkg/controller/predicates/annotation.go @@ -30,6 +30,7 @@ func (p AnnotationChanged) Update(e event.UpdateEvent) bool { log.Error(nil, "Update event has no old object to update", "event", e) return false } + if e.ObjectOld.GetAnnotations() == nil { log.Error(nil, "Update event has no old object annotations to update", "event", e) return false diff --git a/pkg/controller/predicates/has_label.go b/pkg/controller/predicates/has_label.go index a8e8de1..0c7d0af 100644 --- a/pkg/controller/predicates/has_label.go +++ b/pkg/controller/predicates/has_label.go @@ -33,6 +33,7 @@ func (p HasLabel) test(obj client.Object) bool { if obj == nil { return false } + if obj.GetLabels() == nil { return false } diff --git a/pkg/controller/predicates/status.go b/pkg/controller/predicates/status.go index 3b07bf6..39a915c 100644 --- a/pkg/controller/predicates/status.go +++ b/pkg/controller/predicates/status.go @@ -33,6 +33,7 @@ func (p StatusChanged) Update(e event.UpdateEvent) bool { log.Error(nil, "Update event has no old object to update", "event", e) return false } + if e.ObjectNew == nil { log.Error(nil, "Update event has no new object to update", "event", e) return false diff --git a/pkg/helm/helm.go b/pkg/helm/helm.go index 2ea4575..c08710c 100644 --- a/pkg/helm/helm.go +++ b/pkg/helm/helm.go @@ -78,6 +78,7 @@ func (e *Engine) Render(c *chart.Chart, dapr *daprApi.DaprInstance, overrides ma } keys := make([]string, 0, len(files)) + for k := range files { if !strings.HasSuffix(k, ".yaml") && !strings.HasSuffix(k, ".yml") { continue @@ -92,10 +93,12 @@ func (e *Engine) Render(c *chart.Chart, dapr *daprApi.DaprInstance, overrides ma for _, k := range keys { v := files[k] + ul, err := resources.Decode(e.decoder, []byte(v)) if err != nil { return nil, fmt.Errorf("cannot decode %s: %w", k, err) } + if ul == nil { continue } @@ -152,5 +155,4 @@ func (e *Engine) renderValues( } return rv, nil - } diff --git a/pkg/resources/resources.go b/pkg/resources/resources.go index 8c12236..3a1e59a 100644 --- a/pkg/resources/resources.go +++ b/pkg/resources/resources.go @@ -108,6 +108,7 @@ func ToUnstructured(s *runtime.Scheme, obj runtime.Object) (*unstructured.Unstru if err != nil { return nil, fmt.Errorf("failed to convert to unstructured - unable to get GVK %w", err) } + apiv, k := gvks[0].ToAPIVersionAndKind() u.SetAPIVersion(apiv) @@ -139,6 +140,7 @@ func Decode(decoder runtime.Decoder, content []byte) ([]unstructured.Unstructure if len(out) == 0 { continue } + if out["Kind"] == "" { continue } @@ -159,7 +161,6 @@ func Decode(decoder runtime.Decoder, content []byte) ([]unstructured.Unstructure } results = append(results, obj) - } return results, nil diff --git a/pkg/utils/maputils/maps.go b/pkg/utils/maputils/maps.go index dbbb5d1..f2c25c9 100644 --- a/pkg/utils/maputils/maps.go +++ b/pkg/utils/maputils/maps.go @@ -18,6 +18,7 @@ func Merge(dst map[string]interface{}, source map[string]interface{}) map[string } } } + out[k] = v } @@ -28,6 +29,7 @@ func Lookup(m map[string]interface{}, ks ...string) (interface{}, error) { if len(ks) == 0 { // degenerate input return nil, errors.New("lookup needs at least one key") } + if rval, ok := m[ks[0]]; !ok { return nil, fmt.Errorf("key not found; remaining keys: %v", ks) } else if len(ks) == 1 { // we've reached the final key diff --git a/test/e2e/olm/dapr_olm_test.go b/test/e2e/olm/dapr_olm_test.go index 6c37952..cb7c225 100644 --- a/test/e2e/olm/dapr_olm_test.go +++ b/test/e2e/olm/dapr_olm_test.go @@ -21,7 +21,6 @@ import ( ) func TestDaprDeploy(t *testing.T) { - t.Run("With ControlPlane", func(t *testing.T) { testDaprDeploy( With(t), @@ -65,7 +64,6 @@ func TestDaprDeploy(t *testing.T) { }, ) }) - } func testDaprDeploy(test Test, f func(t Test, ns *corev1.Namespace) client.Object) { @@ -108,5 +106,4 @@ func testDaprDeploy(test Test, f func(t Test, ns *corev1.Namespace) client.Objec // daprTC.ValidateDaprApp(test, res.GetNamespace()) - } diff --git a/test/e2e/operator/dapr_controlplane_test.go b/test/e2e/operator/dapr_controlplane_test.go index 88f000c..ec7a61a 100644 --- a/test/e2e/operator/dapr_controlplane_test.go +++ b/test/e2e/operator/dapr_controlplane_test.go @@ -69,5 +69,4 @@ func TestDaprControlPlaneDeployWrongCR(t *testing.T) { WithTransform(ConditionStatus(conditions.TypeReconciled), Equal(corev1.ConditionFalse))) test.Eventually(dapr.ControlPlane(test, instance), TestTimeoutLong).Should( WithTransform(ConditionReason(conditions.TypeReconciled), Equal(conditions.ReasonUnsupportedConfiguration))) - } diff --git a/test/e2e/operator/dapr_instance_test.go b/test/e2e/operator/dapr_instance_test.go index 79709bd..0723da7 100644 --- a/test/e2e/operator/dapr_instance_test.go +++ b/test/e2e/operator/dapr_instance_test.go @@ -128,7 +128,6 @@ func TestDaprInstanceDeployWithCustomSidecarImage(t *testing.T) { jq.Match(`.items[0].spec.containers[0].env[] | select(.name == "SIDECAR_IMAGE_PULL_POLICY") | .value == "%s"`, corev1.PullAlways), )), ) - } func TestDaprInstanceDeployWithApp(t *testing.T) { diff --git a/test/support/client/client.go b/test/support/client/client.go index 680c1b2..2709a18 100644 --- a/test/support/client/client.go +++ b/test/support/client/client.go @@ -46,14 +46,17 @@ func New(t *testing.T) (*Client, error) { if err != nil { return nil, err } + dynamicClient, err := dynamic.NewForConfig(cfg) if err != nil { return nil, err } + kubeClient, err := kubernetes.NewForConfig(cfg) if err != nil { return nil, err } + extClient, err := apiextClient.NewForConfig(cfg) if err != nil { return nil, err @@ -106,8 +109,8 @@ func (c *Client) RESTMapper() (meta.RESTMapper, error) { } return restmapper.NewDiscoveryRESTMapper(gr), nil - } + func (c *Client) ForResource(in *unstructured.Unstructured) (dynamic.ResourceInterface, error) { gvk := in.GetObjectKind().GroupVersionKind() gk := schema.GroupKind{Group: gvk.Group, Kind: gvk.Kind} diff --git a/test/support/dapr/support_dapr.go b/test/support/dapr/support_dapr.go index 32353de..5c10bf6 100644 --- a/test/support/dapr/support_dapr.go +++ b/test/support/dapr/support_dapr.go @@ -183,6 +183,7 @@ func DeployTestApp(t support.Test, name string, namespace string) { if !strings.HasPrefix(path, "/") { path = "/" + path } + if !strings.HasSuffix(path, "(/|$)(.*)") { path += "(/|$)(.*)" } @@ -226,7 +227,6 @@ func DeployTestApp(t support.Test, name string, namespace string) { t.Cleanup(func() []runtime.Object { return []runtime.Object{ing} }) - } func Values(t support.Test, in map[string]any) *daprAc.JSONApplyConfiguration { @@ -245,5 +245,4 @@ func Values(t support.Test, in map[string]any) *daprAc.JSONApplyConfiguration { cfg.RawMessage = data return cfg - } diff --git a/test/support/dapr/support_dapr_http.go b/test/support/dapr/support_dapr_http.go index 291960f..0f7820a 100644 --- a/test/support/dapr/support_dapr_http.go +++ b/test/support/dapr/support_dapr_http.go @@ -20,7 +20,6 @@ func GET(t support.Test, url string) func(g gomega.Gomega) (*http.Response, erro } func POST(t support.Test, url string, contentType string, content []byte) func(g gomega.Gomega) (*http.Response, error) { - return func(g gomega.Gomega) (*http.Response, error) { data := content if data == nil { diff --git a/test/support/helm/helm.go b/test/support/helm/helm.go index 8d8fe49..eed5bac 100644 --- a/test/support/helm/helm.go +++ b/test/support/helm/helm.go @@ -22,7 +22,6 @@ func WithLog(value func(string, ...interface{})) ConfigurationOption { } func New(options ...ConfigurationOption) (*Helm, error) { - settings := cli.New() config := action.Configuration{} diff --git a/test/support/olm/support_olm.go b/test/support/olm/support_olm.go index 3b73a1c..f9b0c59 100644 --- a/test/support/olm/support_olm.go +++ b/test/support/olm/support_olm.go @@ -25,7 +25,6 @@ func DeployOperator(test support.Test, ns *corev1.Namespace, image string) { // // Install OperatorGroups // - og, err := test.Client().OLM().OperatorsV1().OperatorGroups(ns.Name).Create( test.Ctx(), &olmV1.OperatorGroup{ @@ -176,9 +175,11 @@ func OperatorGroup(t support.Test, name string, namespace string) func(g gomega. name, metav1.GetOptions{}, ) + if err != nil && !k8serrors.IsNotFound(err) { return nil, err } + if err != nil && k8serrors.IsNotFound(err) { return nil, nil } diff --git a/test/support/support.go b/test/support/support.go index cb050e1..73b495b 100644 --- a/test/support/support.go +++ b/test/support/support.go @@ -29,6 +29,7 @@ func runCleanup(t Test, in runtime.Object) error { if err != nil && !k8serrors.IsNotFound(err) { return fmt.Errorf("failed to get current object, %w", err) } + if err != nil && k8serrors.IsNotFound(err) { return nil } diff --git a/test/support/support_k8s.go b/test/support/support_k8s.go index ef120aa..44361e4 100644 --- a/test/support/support_k8s.go +++ b/test/support/support_k8s.go @@ -127,6 +127,7 @@ func Resource(t Test, ri dynamic.ResourceInterface, un *unstructured.Unstructure if err != nil && !k8serrors.IsNotFound(err) { return nil, err } + if err != nil && k8serrors.IsNotFound(err) { return nil, nil } diff --git a/test/support/support_k8s_namespace.go b/test/support/support_k8s_namespace.go index 257b516..1182048 100644 --- a/test/support/support_k8s_namespace.go +++ b/test/support/support_k8s_namespace.go @@ -1,6 +1,7 @@ package support import ( + "github.com/dapr-sandbox/dapr-kubernetes-operator/pkg/pointer" "github.com/onsi/gomega" "github.com/rs/xid" corev1 "k8s.io/api/core/v1" @@ -29,9 +30,10 @@ func createTestNamespace(t Test, options ...Option[*corev1.Namespace]) *corev1.N func deleteTestNamespace(t Test, namespace *corev1.Namespace) { t.T().Helper() - propagationPolicy := metav1.DeletePropagationBackground + err := t.Client().CoreV1().Namespaces().Delete(t.Ctx(), namespace.Name, metav1.DeleteOptions{ - PropagationPolicy: &propagationPolicy, + PropagationPolicy: pointer.Any(metav1.DeletePropagationBackground), }) + t.Expect(err).NotTo(gomega.HaveOccurred()) } diff --git a/test/support/test.go b/test/support/test.go index 3ec323b..ba165b1 100644 --- a/test/support/test.go +++ b/test/support/test.go @@ -44,9 +44,11 @@ func init() { if err := daprApi.AddToScheme(scheme.Scheme); err != nil { panic(err) } + if err := olmV1.AddToScheme(scheme.Scheme); err != nil { panic(err) } + if err := olmV1Alpha1.AddToScheme(scheme.Scheme); err != nil { panic(err) } @@ -82,8 +84,10 @@ func With(t *testing.T) Test { if deadline, ok := t.Deadline(); ok { withDeadline, cancel := context.WithDeadline(ctx, deadline) t.Cleanup(cancel) + ctx = withDeadline } + answer := &T{ WithT: gomega.NewWithT(t), id: xid.New().String(), @@ -158,8 +162,10 @@ func (t *T) Client() *supportclient.Client { if err != nil { t.T().Fatalf("Error creating client: %v", err) } + t.client = c }) + return t.client } From 9afbadfd9ed1df96d78a4e30b6af7b101dc6526b Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:34:39 +0200 Subject: [PATCH 12/44] chore(lint): enable whitespace --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 7c298ce..7df70b6 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -79,6 +79,5 @@ linters: - testpackage - varnamelen - wastedassign - - whitespace - wrapcheck - depguard From c0e78c7e3dc47bfca2db8c5c948ad07edbd48bb6 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:35:01 +0200 Subject: [PATCH 13/44] chore(lint): enable wastedassign --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 7df70b6..0770e8d 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -78,6 +78,5 @@ linters: - tenv - testpackage - varnamelen - - wastedassign - wrapcheck - depguard From 5b2233cc15e9442caaef6bea87eb8f0b2351a23e Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:36:04 +0200 Subject: [PATCH 14/44] chore(lint): keep varnamelen disabled --- .golangci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 0770e8d..64173ec 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -46,7 +46,9 @@ linters: - golint - ifshort - varcheck - # others + # keep + - varnamelen + # validate - cyclop - exhaustive - exhaustivestruct @@ -77,6 +79,5 @@ linters: - tagliatelle - tenv - testpackage - - varnamelen - wrapcheck - depguard From 15c9c31d907b44ac11fa18b8934263df0fd77cbe Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:36:34 +0200 Subject: [PATCH 15/44] chore(lint): enable tenv --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 64173ec..4663df6 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -77,7 +77,6 @@ linters: - structcheck - sqlclosecheck - tagliatelle - - tenv - testpackage - wrapcheck - depguard From 6725ce739b06f5cd7f78d397929b0a1b34f4feae Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:37:02 +0200 Subject: [PATCH 16/44] chore(lint): enable tagliatelle --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 4663df6..4fe6a4c 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -76,7 +76,6 @@ linters: - scopelint - structcheck - sqlclosecheck - - tagliatelle - testpackage - wrapcheck - depguard From 2b7ad771ef97998117efe30f989550905e53ce9d Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:37:22 +0200 Subject: [PATCH 17/44] chore(lint): enable sqlclosecheck --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 4fe6a4c..9a5752a 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -75,7 +75,6 @@ linters: - rowserrcheck - scopelint - structcheck - - sqlclosecheck - testpackage - wrapcheck - depguard From 80da9055492420b916621e20b5511d33b4b47b8c Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:37:58 +0200 Subject: [PATCH 18/44] chore(lint): keep structcheck disabled --- .golangci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 9a5752a..72177ad 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -46,6 +46,7 @@ linters: - golint - ifshort - varcheck + - structcheck # keep - varnamelen # validate @@ -74,7 +75,6 @@ linters: - paralleltest - rowserrcheck - scopelint - - structcheck - testpackage - wrapcheck - depguard From 8206de3c6557048015e92e74f0c66b61f110a797 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:38:57 +0200 Subject: [PATCH 19/44] chore(lint): keep scopelint disabled --- .golangci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 72177ad..b95e544 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -47,6 +47,7 @@ linters: - ifshort - varcheck - structcheck + - scopelint # keep - varnamelen # validate @@ -74,7 +75,6 @@ linters: - nosnakecase - paralleltest - rowserrcheck - - scopelint - testpackage - wrapcheck - depguard From b3fd8910d3cff7c85c1f999238b54ce4af1985ff Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:39:24 +0200 Subject: [PATCH 20/44] chore(lint): enable rowserrcheck --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index b95e544..17a0ebb 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -74,7 +74,6 @@ linters: - nlreturn - nosnakecase - paralleltest - - rowserrcheck - testpackage - wrapcheck - depguard From 7ab9424459afdd6d2c9def84ed32ac6495b115f1 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:40:51 +0200 Subject: [PATCH 21/44] chore(lint): enable nlreturn --- .golangci.yml | 3 ++- pkg/controller/gc/gc.go | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 17a0ebb..d59dcd3 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -38,6 +38,8 @@ linters-settings: wsl: allow-cuddle-declarations: true allow-separated-leading-comment: true + nlreturn: + block-size: 2 linters: enable-all: true disable: @@ -71,7 +73,6 @@ linters: - maligned - nakedret - nilnil - - nlreturn - nosnakecase - paralleltest - testpackage diff --git a/pkg/controller/gc/gc.go b/pkg/controller/gc/gc.go index f7a8275..b002268 100644 --- a/pkg/controller/gc/gc.go +++ b/pkg/controller/gc/gc.go @@ -67,6 +67,7 @@ func (gc *GC) deleteEachOf(ctx context.Context, c *client.Client, selector label if err := c.List(ctx, &items, options...); err != nil { if k8serrors.IsForbidden(err) { gc.l.Info("cannot gc, forbidden", "gvk", GVK.String()) + continue } From 38565c680349cf853f3aacec3e6c3a089ced3186 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:41:59 +0200 Subject: [PATCH 22/44] chore(lint): keep nosnakecase disabled --- .golangci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index d59dcd3..25cf349 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -50,6 +50,7 @@ linters: - varcheck - structcheck - scopelint + - nosnakecase # keep - varnamelen # validate @@ -73,7 +74,6 @@ linters: - maligned - nakedret - nilnil - - nosnakecase - paralleltest - testpackage - wrapcheck From 343e1e36d985ce9f951a7f0fe8cd21df19327df2 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:42:51 +0200 Subject: [PATCH 23/44] chore(lint): enable goconst --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 25cf349..223c441 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -64,7 +64,6 @@ linters: - gochecknoglobals - gochecknoinits - gocognit - - goconst - gocyclo - godox - goerr113 From 540c1609cc1365ccdfada092a4dce0e28b3cff67 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:44:42 +0200 Subject: [PATCH 24/44] chore(lint): keep godox disabled --- .golangci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 223c441..e3078d0 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -53,6 +53,7 @@ linters: - nosnakecase # keep - varnamelen + - godox # there are a bunch of TODOs that must be solved # validate - cyclop - exhaustive @@ -65,7 +66,6 @@ linters: - gochecknoinits - gocognit - gocyclo - - godox - goerr113 - gofumpt - interfacer From 2e743633a46a5a240db4a7cf4ddb52425961bfb1 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:50:20 +0200 Subject: [PATCH 25/44] chore(lint): enable goerr113 --- .golangci.yml | 1 - api/operator/v1alpha1/common_types.go | 5 ++++- pkg/utils/maputils/maps.go | 18 ------------------ 3 files changed, 4 insertions(+), 20 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index e3078d0..8a25041 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -66,7 +66,6 @@ linters: - gochecknoinits - gocognit - gocyclo - - goerr113 - gofumpt - interfacer - ireturn diff --git a/api/operator/v1alpha1/common_types.go b/api/operator/v1alpha1/common_types.go index e80d268..ec24e09 100644 --- a/api/operator/v1alpha1/common_types.go +++ b/api/operator/v1alpha1/common_types.go @@ -18,8 +18,11 @@ package v1alpha1 import ( "encoding/json" "errors" + "fmt" ) +var ErrUnmarshalOnNil = errors.New("UnmarshalJSON on nil pointer") + // RawMessage is a raw encoded JSON value. // It implements Marshaler and Unmarshaler and can // be used to delay JSON decoding or precompute a JSON encoding. @@ -47,7 +50,7 @@ func (m RawMessage) MarshalJSON() ([]byte, error) { // UnmarshalJSON sets *m to a copy of data. func (m *RawMessage) UnmarshalJSON(data []byte) error { if m == nil { - return errors.New("json.RawMessage: UnmarshalJSON on nil pointer") + return fmt.Errorf("json.RawMessage: %w", ErrUnmarshalOnNil) } *m = append((*m)[0:0], data...) diff --git a/pkg/utils/maputils/maps.go b/pkg/utils/maputils/maps.go index f2c25c9..72c0081 100644 --- a/pkg/utils/maputils/maps.go +++ b/pkg/utils/maputils/maps.go @@ -1,8 +1,6 @@ package maputils import ( - "errors" - "fmt" "maps" ) @@ -24,19 +22,3 @@ func Merge(dst map[string]interface{}, source map[string]interface{}) map[string return out } - -func Lookup(m map[string]interface{}, ks ...string) (interface{}, error) { - if len(ks) == 0 { // degenerate input - return nil, errors.New("lookup needs at least one key") - } - - if rval, ok := m[ks[0]]; !ok { - return nil, fmt.Errorf("key not found; remaining keys: %v", ks) - } else if len(ks) == 1 { // we've reached the final key - return rval, nil - } else if m, ok := rval.(map[string]interface{}); !ok { - return nil, fmt.Errorf("malformed structure at %#v", rval) - } else { // 1+ more keys - return Lookup(m, ks[1:]...) - } -} From 3ed1893824a4625029c5f2a09793f720c39f226d Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:50:48 +0200 Subject: [PATCH 26/44] chore(lint): enable nakedret --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 8a25041..ce70c67 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -70,7 +70,6 @@ linters: - interfacer - ireturn - maligned - - nakedret - nilnil - paralleltest - testpackage From 0cbc34c75bd3f31963828dd4b4ae774e36a12821 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:51:38 +0200 Subject: [PATCH 27/44] chore(lint): keep gci disabled --- .golangci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index ce70c67..b329df8 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -54,6 +54,7 @@ linters: # keep - varnamelen - godox # there are a bunch of TODOs that must be solved + - gci # validate - cyclop - exhaustive @@ -61,7 +62,6 @@ linters: - exhaustruct - forbidigo - funlen - - gci - gochecknoglobals - gochecknoinits - gocognit From 9fd121eb699590bf928057d72d90c498a035d426 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:52:40 +0200 Subject: [PATCH 28/44] chore(lint): keep gofumpt disabled --- .golangci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index b329df8..46ae28c 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -55,6 +55,7 @@ linters: - varnamelen - godox # there are a bunch of TODOs that must be solved - gci + - gofumpt # validate - cyclop - exhaustive @@ -66,7 +67,6 @@ linters: - gochecknoinits - gocognit - gocyclo - - gofumpt - interfacer - ireturn - maligned From 821c7d0f4cc6889688cbc1b2fadf11858676ed70 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:53:11 +0200 Subject: [PATCH 29/44] chore(lint): enable nilnil --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 46ae28c..1493637 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -70,7 +70,6 @@ linters: - interfacer - ireturn - maligned - - nilnil - paralleltest - testpackage - wrapcheck From 814cc80aa0001f7e4ad1dd79f744b9e98d3b90f9 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:53:43 +0200 Subject: [PATCH 30/44] chore(lint): enable forbidigo --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 1493637..bb128f0 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -61,7 +61,6 @@ linters: - exhaustive - exhaustivestruct - exhaustruct - - forbidigo - funlen - gochecknoglobals - gochecknoinits From 2b61d3ce41136297b56f91889f40e84b858c97d5 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:54:11 +0200 Subject: [PATCH 31/44] chore(lint): keep exhaustruct disabled --- .golangci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index bb128f0..2056d79 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -56,11 +56,11 @@ linters: - godox # there are a bunch of TODOs that must be solved - gci - gofumpt + - exhaustruct # validate - cyclop - exhaustive - exhaustivestruct - - exhaustruct - funlen - gochecknoglobals - gochecknoinits From 8967d347cef419b77a8163a98309597bf28d2aa2 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:54:41 +0200 Subject: [PATCH 32/44] chore(lint): keep paralleltest disabled --- .golangci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 2056d79..5ea0a2f 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -57,6 +57,7 @@ linters: - gci - gofumpt - exhaustruct + - paralleltest # validate - cyclop - exhaustive @@ -69,7 +70,6 @@ linters: - interfacer - ireturn - maligned - - paralleltest - testpackage - wrapcheck - depguard From 8e031dd23b02989eb265a7b78c7eec844643c9b7 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:55:25 +0200 Subject: [PATCH 33/44] chore(lint): keep maligned disabled --- .golangci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 5ea0a2f..a9220a3 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -51,6 +51,7 @@ linters: - structcheck - scopelint - nosnakecase + - maligned # keep - varnamelen - godox # there are a bunch of TODOs that must be solved @@ -69,7 +70,6 @@ linters: - gocyclo - interfacer - ireturn - - maligned - testpackage - wrapcheck - depguard From 32829ebfffdb8312006217f701c2146ea3d34787 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:56:01 +0200 Subject: [PATCH 34/44] chore(lint): keep exhaustivestruct disabled --- .golangci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index a9220a3..6ebe5f1 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -52,6 +52,7 @@ linters: - scopelint - nosnakecase - maligned + - exhaustivestruct # keep - varnamelen - godox # there are a bunch of TODOs that must be solved @@ -62,7 +63,6 @@ linters: # validate - cyclop - exhaustive - - exhaustivestruct - funlen - gochecknoglobals - gochecknoinits From 0fddd6b367a9a849e07615bfb09268956527de2a Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:56:38 +0200 Subject: [PATCH 35/44] chore(lint): enable exhaustive --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 6ebe5f1..839c288 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -62,7 +62,6 @@ linters: - paralleltest # validate - cyclop - - exhaustive - funlen - gochecknoglobals - gochecknoinits From d3647c64ddd38e08f915436fce55594b3640c08b Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:57:10 +0200 Subject: [PATCH 36/44] chore(lint): keep interfacer disabled --- .golangci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 839c288..6aeba3d 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -53,6 +53,7 @@ linters: - nosnakecase - maligned - exhaustivestruct + - interfacer # keep - varnamelen - godox # there are a bunch of TODOs that must be solved @@ -67,7 +68,6 @@ linters: - gochecknoinits - gocognit - gocyclo - - interfacer - ireturn - testpackage - wrapcheck From 16bacba801a27ddf464c14c558158109ac21f34a Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 15:57:58 +0200 Subject: [PATCH 37/44] chore(lint): keep ireturn disabled --- .golangci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 6aeba3d..5451983 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -61,6 +61,7 @@ linters: - gofumpt - exhaustruct - paralleltest + - ireturn # validate - cyclop - funlen @@ -68,7 +69,6 @@ linters: - gochecknoinits - gocognit - gocyclo - - ireturn - testpackage - wrapcheck - depguard From 4dc42a73266cfb3eaa70f740ad4c398fc432221b Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 16:01:11 +0200 Subject: [PATCH 38/44] chore(lint): keep funlen disabled --- .golangci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 5451983..6b3e34a 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -62,9 +62,9 @@ linters: - exhaustruct - paralleltest - ireturn + - funlen # validate - cyclop - - funlen - gochecknoglobals - gochecknoinits - gocognit From bbd582fccfbaa5876746429eb6d5ec590134da87 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 16:01:39 +0200 Subject: [PATCH 39/44] chore(lint): enable gocyclo --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 6b3e34a..75ae1b6 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -68,7 +68,6 @@ linters: - gochecknoglobals - gochecknoinits - gocognit - - gocyclo - testpackage - wrapcheck - depguard From 958cbac64bb8f497b9ceec7d5693f9bdbfc4de7f Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 16:03:42 +0200 Subject: [PATCH 40/44] chore(lint): keep gochecknoglobals disabled --- .golangci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 75ae1b6..f36b8a6 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -63,9 +63,9 @@ linters: - paralleltest - ireturn - funlen + - gochecknoglobals # validate - cyclop - - gochecknoglobals - gochecknoinits - gocognit - testpackage From b16042da6e4bf7ad52b0dd734c34d9b9cf604d2f Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Thu, 16 May 2024 16:03:54 +0200 Subject: [PATCH 41/44] chore(lint): keep gochecknoinits disabled --- .golangci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index f36b8a6..2135d6b 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -64,9 +64,9 @@ linters: - ireturn - funlen - gochecknoglobals + - gochecknoinits # validate - cyclop - - gochecknoinits - gocognit - testpackage - wrapcheck From 2386e4b66dbcceb661f3e92712c897b787ac1131 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Fri, 17 May 2024 09:57:47 +0200 Subject: [PATCH 42/44] chore(lint): enable testpackage --- .golangci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 2135d6b..37bb4ee 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -40,6 +40,8 @@ linters-settings: allow-separated-leading-comment: true nlreturn: block-size: 2 + testpackage: + skip-regexp: test/e2e/... linters: enable-all: true disable: @@ -68,6 +70,5 @@ linters: # validate - cyclop - gocognit - - testpackage - wrapcheck - depguard From 8da4f1354e243b2c4edfe44e208af0087e247b3d Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Fri, 17 May 2024 12:41:12 +0200 Subject: [PATCH 43/44] chore(lint): enable wrapcheck --- .golangci.yml | 7 +++- .../dapr_controlplane_controller.go | 12 +++++-- ...pr_controlplane_controller_action_apply.go | 7 +++- ...r_controlplane_controller_action_status.go | 3 +- .../dapr_controlplane_controller_reconcile.go | 9 +++--- .../instance/dapr_instance_controller.go | 24 +++++++++++--- .../dapr_instance_controller_action_chart.go | 1 + .../dapr_instance_controller_reconcile.go | 9 +++--- pkg/controller/client/client.go | 32 +++++++++---------- pkg/controller/gc/gc.go | 6 ++-- .../{customizer__jq.go => customizer_jq.go} | 6 ++-- pkg/helm/helm.go | 9 ++++-- pkg/helm/helm_support.go | 1 + pkg/openshift/openshift.go | 8 +++-- pkg/resources/resources.go | 6 ++-- test/support/client/client.go | 26 +++++++-------- test/support/helm/helm.go | 3 +- test/support/helm/helm_uninstall.go | 3 +- 18 files changed, 111 insertions(+), 61 deletions(-) rename pkg/helm/customizers/{customizer__jq.go => customizer_jq.go} (81%) diff --git a/.golangci.yml b/.golangci.yml index 37bb4ee..405f9a6 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -42,6 +42,12 @@ linters-settings: block-size: 2 testpackage: skip-regexp: test/e2e/... +issues: + exclude-rules: + # Exclude some linters from running on tests files. + - path: test + linters: + - wrapcheck linters: enable-all: true disable: @@ -70,5 +76,4 @@ linters: # validate - cyclop - gocognit - - wrapcheck - depguard diff --git a/internal/controller/operator/controlplane/dapr_controlplane_controller.go b/internal/controller/operator/controlplane/dapr_controlplane_controller.go index 199e1bc..0e91a9b 100644 --- a/internal/controller/operator/controlplane/dapr_controlplane_controller.go +++ b/internal/controller/operator/controlplane/dapr_controlplane_controller.go @@ -18,6 +18,9 @@ package controlplane import ( "context" + "fmt" + + "github.com/dapr-sandbox/dapr-kubernetes-operator/pkg/openshift" "github.com/dapr-sandbox/dapr-kubernetes-operator/pkg/helm" @@ -41,6 +44,7 @@ import ( func NewReconciler(ctx context.Context, manager ctrlRt.Manager, o helm.Options) (*Reconciler, error) { c, err := client.NewClient(manager.GetConfig(), manager.GetScheme(), manager.GetClient()) if err != nil { + //nolint:wrapcheck return nil, err } @@ -52,8 +56,9 @@ func NewReconciler(ctx context.Context, manager ctrlRt.Manager, o helm.Options) rec.manager = manager rec.recorder = manager.GetEventRecorderFor(controller.FieldManager) - isOpenshift, err := c.IsOpenShift() + isOpenshift, err := openshift.IsOpenShift(c.Discovery) if err != nil { + //nolint: wrapcheck return nil, err } @@ -66,7 +71,7 @@ func NewReconciler(ctx context.Context, manager ctrlRt.Manager, o helm.Options) hc, err := loader.Load(o.ChartsDir) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to load chart from dir %s: %w", o.ChartsDir, err) } rec.c = hc @@ -112,6 +117,7 @@ func (r *Reconciler) init(ctx context.Context) error { for i := range r.actions { b, err := r.actions[i].Configure(ctx, r.Client, c) if err != nil { + //nolint:wrapcheck return err } @@ -120,7 +126,7 @@ func (r *Reconciler) init(ctx context.Context) error { ct, err := c.Build(r) if err != nil { - return err + return fmt.Errorf("failure building the application controller for DaprControlPlane resource: %w", err) } r.controller = ct diff --git a/internal/controller/operator/controlplane/dapr_controlplane_controller_action_apply.go b/internal/controller/operator/controlplane/dapr_controlplane_controller_action_apply.go index b2cb39b..7f19882 100644 --- a/internal/controller/operator/controlplane/dapr_controlplane_controller_action_apply.go +++ b/internal/controller/operator/controlplane/dapr_controlplane_controller_action_apply.go @@ -2,6 +2,7 @@ package controlplane import ( "context" + "fmt" "github.com/dapr-sandbox/dapr-kubernetes-operator/pkg/controller" @@ -61,7 +62,11 @@ func (a *ApplyAction) Run(ctx context.Context, rr *ReconciliationRequest) error FieldManager: controller.FieldManager, }) - return err + if err != nil { + return fmt.Errorf("failure to apply changes to %s: %w", rr.NamespacedName, err) + } + + return nil } func (a *ApplyAction) Cleanup(_ context.Context, _ *ReconciliationRequest) error { diff --git a/internal/controller/operator/controlplane/dapr_controlplane_controller_action_status.go b/internal/controller/operator/controlplane/dapr_controlplane_controller_action_status.go index a5e649e..abde047 100644 --- a/internal/controller/operator/controlplane/dapr_controlplane_controller_action_status.go +++ b/internal/controller/operator/controlplane/dapr_controlplane_controller_action_status.go @@ -2,6 +2,7 @@ package controlplane import ( "context" + "fmt" "github.com/dapr-sandbox/dapr-kubernetes-operator/internal/controller/operator/instance" k8serrors "k8s.io/apimachinery/pkg/api/errors" @@ -44,7 +45,7 @@ func (a *StatusAction) Run(ctx context.Context, rr *ReconciliationRequest) error ) if err != nil && !k8serrors.IsNotFound(err) { - return err + return fmt.Errorf("failure to lookup resource %s: %w", rr.NamespacedName, err) } for i := range di.Status.Conditions { diff --git a/internal/controller/operator/controlplane/dapr_controlplane_controller_reconcile.go b/internal/controller/operator/controlplane/dapr_controlplane_controller_reconcile.go index 5d5571e..ce46891 100644 --- a/internal/controller/operator/controlplane/dapr_controlplane_controller_reconcile.go +++ b/internal/controller/operator/controlplane/dapr_controlplane_controller_reconcile.go @@ -89,7 +89,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu return ctrl.Result{Requeue: true}, nil } - return ctrl.Result{}, err + return ctrl.Result{}, fmt.Errorf("error updating DaprControlPlane resource: %w", err) } //nolint:nestif @@ -100,10 +100,10 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu if ctrlutil.AddFinalizer(rr.Resource, DaprControlPlaneFinalizerName) { if err := r.Update(ctx, rr.Resource); err != nil { if k8serrors.IsConflict(err) { - return ctrl.Result{}, err + return ctrl.Result{}, fmt.Errorf("conflict when adding finalizer to %s: %w", req.NamespacedName, err) } - return ctrl.Result{}, fmt.Errorf("failure adding finalizer to connector cluster %s: %w", req.NamespacedName, err) + return ctrl.Result{}, fmt.Errorf("failure adding finalizer to %s: %w", req.NamespacedName, err) } } } else { @@ -112,6 +112,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu // for i := len(r.actions) - 1; i >= 0; i-- { if err := r.actions[i].Cleanup(ctx, &rr); err != nil { + //nolint:wrapcheck return ctrl.Result{}, err } } @@ -122,7 +123,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu if ctrlutil.RemoveFinalizer(rr.Resource, DaprControlPlaneFinalizerName) { if err := r.Update(ctx, rr.Resource); err != nil { if k8serrors.IsConflict(err) { - return ctrl.Result{}, err + return ctrl.Result{}, fmt.Errorf("conflict when removing finalizer to %s: %w", req.NamespacedName, err) } return ctrl.Result{}, fmt.Errorf("failure removing finalizer from %s: %w", req.NamespacedName, err) diff --git a/internal/controller/operator/instance/dapr_instance_controller.go b/internal/controller/operator/instance/dapr_instance_controller.go index fe801bb..fe02eba 100644 --- a/internal/controller/operator/instance/dapr_instance_controller.go +++ b/internal/controller/operator/instance/dapr_instance_controller.go @@ -18,6 +18,9 @@ package instance import ( "context" + "fmt" + + "github.com/dapr-sandbox/dapr-kubernetes-operator/pkg/openshift" "github.com/dapr-sandbox/dapr-kubernetes-operator/pkg/helm" @@ -47,6 +50,7 @@ import ( func NewReconciler(ctx context.Context, manager ctrlRt.Manager, o helm.Options) (*Reconciler, error) { c, err := client.NewClient(manager.GetConfig(), manager.GetScheme(), manager.GetClient()) if err != nil { + //nolint:wrapcheck return nil, err } @@ -58,8 +62,9 @@ func NewReconciler(ctx context.Context, manager ctrlRt.Manager, o helm.Options) rec.manager = manager rec.recorder = manager.GetEventRecorderFor(controller.FieldManager) - isOpenshift, err := c.IsOpenShift() + isOpenshift, err := openshift.IsOpenShift(c.Discovery) if err != nil { + //nolint:wrapcheck return nil, err } @@ -74,7 +79,7 @@ func NewReconciler(ctx context.Context, manager ctrlRt.Manager, o helm.Options) hc, err := loader.Load(o.ChartsDir) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to load chart from dir %s: %w", o.ChartsDir, err) } rec.c = hc @@ -144,6 +149,7 @@ func (r *Reconciler) init(ctx context.Context) error { for i := range r.actions { b, err := r.actions[i].Configure(ctx, r.Client, c) if err != nil { + //nolint:wrapcheck return err } @@ -152,7 +158,7 @@ func (r *Reconciler) init(ctx context.Context) error { ct, err := c.Build(r) if err != nil { - return err + return fmt.Errorf("failure building the application controller for DaprInstance resource: %w", err) } r.controller = ct @@ -161,7 +167,7 @@ func (r *Reconciler) init(ctx context.Context) error { } func (r *Reconciler) Watch(obj ctrlCli.Object, eh handler.EventHandler, predicates ...predicate.Predicate) error { - return r.controller.Watch( + err := r.controller.Watch( source.Kind( r.manager.GetCache(), obj, @@ -169,6 +175,16 @@ func (r *Reconciler) Watch(obj ctrlCli.Object, eh handler.EventHandler, predicat predicates..., ), ) + + if err != nil { + return fmt.Errorf( + "error configuring watcher for resource %s:%s, reson: %w", + obj.GetObjectKind().GroupVersionKind().String(), + obj.GetName(), + err) + } + + return nil } func (r *Reconciler) EnqueueRequestForOwner(owner ctrlCli.Object, opts ...handler.OwnerOption) handler.EventHandler { diff --git a/internal/controller/operator/instance/dapr_instance_controller_action_chart.go b/internal/controller/operator/instance/dapr_instance_controller_action_chart.go index d94abbb..f18c052 100644 --- a/internal/controller/operator/instance/dapr_instance_controller_action_chart.go +++ b/internal/controller/operator/instance/dapr_instance_controller_action_chart.go @@ -94,6 +94,7 @@ func (a *ChartAction) loadChart(ctx context.Context, rc *ReconciliationRequest) c, err := a.engine.Load(opts) if err != nil { + //nolint:wrapcheck return nil, err } diff --git a/internal/controller/operator/instance/dapr_instance_controller_reconcile.go b/internal/controller/operator/instance/dapr_instance_controller_reconcile.go index d5d2d9d..1db4bf1 100644 --- a/internal/controller/operator/instance/dapr_instance_controller_reconcile.go +++ b/internal/controller/operator/instance/dapr_instance_controller_reconcile.go @@ -96,7 +96,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu return ctrl.Result{Requeue: true}, nil } - return ctrl.Result{}, err + return ctrl.Result{}, fmt.Errorf("error updating DaprInstance resource: %w", err) } //nolint:nestif @@ -107,10 +107,10 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu if ctrlutil.AddFinalizer(rr.Resource, DaprInstanceFinalizerName) { if err := r.Update(ctx, rr.Resource); err != nil { if k8serrors.IsConflict(err) { - return ctrl.Result{}, err + return ctrl.Result{}, fmt.Errorf("conflict when adding finalizer to %s: %w", req.NamespacedName, err) } - return ctrl.Result{}, fmt.Errorf("failure adding finalizer to connector cluster %s: %w", req.NamespacedName, err) + return ctrl.Result{}, fmt.Errorf("failure adding finalizer to %s: %w", req.NamespacedName, err) } } } else { @@ -119,6 +119,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu // for i := len(r.actions) - 1; i >= 0; i-- { if err := r.actions[i].Cleanup(ctx, &rr); err != nil { + //nolint:wrapcheck return ctrl.Result{}, err } } @@ -129,7 +130,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu if ctrlutil.RemoveFinalizer(rr.Resource, DaprInstanceFinalizerName) { if err := r.Update(ctx, rr.Resource); err != nil { if k8serrors.IsConflict(err) { - return ctrl.Result{}, err + return ctrl.Result{}, fmt.Errorf("conflict when removing finalizer to %s: %w", req.NamespacedName, err) } return ctrl.Result{}, fmt.Errorf("failure removing finalizer from %s: %w", req.NamespacedName, err) diff --git a/pkg/controller/client/client.go b/pkg/controller/client/client.go index 4371635..030871e 100644 --- a/pkg/controller/client/client.go +++ b/pkg/controller/client/client.go @@ -1,9 +1,9 @@ package client import ( + "fmt" "time" - "github.com/dapr-sandbox/dapr-kubernetes-operator/pkg/openshift" "golang.org/x/time/rate" apiextv1 "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1" "k8s.io/apimachinery/pkg/api/meta" @@ -50,32 +50,32 @@ type Client struct { func NewClient(cfg *rest.Config, scheme *runtime.Scheme, cc ctrl.Client) (*Client, error) { discoveryCl, err := discovery.NewDiscoveryClientForConfig(cfg) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to construct a Discovery client: %w", err) } kubeCl, err := kubernetes.NewForConfig(cfg) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to construct a Kubernetes client: %w", err) } restCl, err := newRESTClientForConfig(cfg) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to construct a REST client: %w", err) } dynCl, err := dynamic.NewForConfig(cfg) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to construct a Dynamic client: %w", err) } daprCl, err := daprClient.NewForConfig(cfg) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to construct a Dapr client: %w", err) } apiextCl, err := apiextv1.NewForConfig(cfg) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to construct an API Extension client: %w", err) } c := Client{ @@ -107,16 +107,12 @@ func newRESTClientForConfig(config *rest.Config) (*rest.RESTClient, error) { cfg.UserAgent = rest.DefaultKubernetesUserAgent() } - return rest.RESTClientFor(cfg) -} - -// IsOpenShift returns true if we are connected to a OpenShift cluster. -func (c *Client) IsOpenShift() (bool, error) { - if c.Discovery == nil { - return false, nil + rc, err := rest.RESTClientFor(cfg) + if err != nil { + return nil, fmt.Errorf("unable to construct a REST client: %w", err) } - return openshift.IsOpenShift(c.Discovery) + return rc, nil } func (c *Client) Dynamic(namespace string, obj *unstructured.Unstructured) (dynamic.ResourceInterface, error) { @@ -128,7 +124,11 @@ func (c *Client) Dynamic(namespace string, obj *unstructured.Unstructured) (dyna mapping, err := c.mapper.RESTMapping(obj.GroupVersionKind().GroupKind(), obj.GroupVersionKind().Version) if err != nil { - return nil, err + return nil, fmt.Errorf( + "unable to identify preferred resource mapping for %s/%s: %w", + obj.GroupVersionKind().GroupKind(), + obj.GroupVersionKind().Version, + err) } var dr dynamic.ResourceInterface diff --git a/pkg/controller/gc/gc.go b/pkg/controller/gc/gc.go index b002268..1ffa330 100644 --- a/pkg/controller/gc/gc.go +++ b/pkg/controller/gc/gc.go @@ -135,7 +135,7 @@ func (gc *GC) computeDeletableTypes(ctx context.Context, ns string, c *client.Cl // an aggregated API for custom.metrics.k8s.io that requires special // authentication scheme while discovering preferred resources. if err != nil && !discovery.IsGroupDiscoveryFailedError(err) { - return err + return fmt.Errorf("failure retireving supported namespaced resources: %w", err) } // We only take types that support the "delete" verb, @@ -152,7 +152,7 @@ func (gc *GC) computeDeletableTypes(ctx context.Context, ns string, c *client.Cl ssrr, err = c.AuthorizationV1().SelfSubjectRulesReviews().Create(ctx, ssrr, metav1.CreateOptions{}) if err != nil { - return err + return fmt.Errorf("unable to create SelfSubjectRulesReviews: %w", err) } GVKs := make(map[schema.GroupVersionKind]struct{}) @@ -165,7 +165,7 @@ func (gc *GC) computeDeletableTypes(ctx context.Context, ns string, c *client.Cl // Empty implies the group of the containing resource list should be used gv, err := schema.ParseGroupVersion(res.GroupVersion) if err != nil { - return err + return fmt.Errorf("failure creating SelfSubjectRulesReview: %w", err) } resourceGroup = gv.Group diff --git a/pkg/helm/customizers/customizer__jq.go b/pkg/helm/customizers/customizer_jq.go similarity index 81% rename from pkg/helm/customizers/customizer__jq.go rename to pkg/helm/customizers/customizer_jq.go index 572242b..f8d7398 100644 --- a/pkg/helm/customizers/customizer__jq.go +++ b/pkg/helm/customizers/customizer_jq.go @@ -1,6 +1,8 @@ package customizers import ( + "fmt" + "github.com/itchyny/gojq" ) @@ -8,7 +10,7 @@ func JQ(expression string) func(map[string]any) (map[string]any, error) { return func(in map[string]any) (map[string]any, error) { query, err := gojq.Parse(expression) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to parse expression %s: %w", expression, err) } it := query.Run(in) @@ -23,7 +25,7 @@ func JQ(expression string) func(map[string]any) (map[string]any, error) { } if r, ok := v.(map[string]any); ok { - return r, err + return r, nil } return in, nil diff --git a/pkg/helm/helm.go b/pkg/helm/helm.go index c08710c..dc79f23 100644 --- a/pkg/helm/helm.go +++ b/pkg/helm/helm.go @@ -60,10 +60,15 @@ func (e *Engine) Customizer(customizer ValuesCustomizer, customizers ...ValuesCu func (e *Engine) Load(options ChartOptions) (*chart.Chart, error) { path, err := options.LocateChart(options.Name, e.env) if err != nil { - return nil, fmt.Errorf("unable to load chart (repo: %s, name: %s, version: %s), reson: %w", options.RepoURL, options.Name, options.Version, err) + return nil, fmt.Errorf("unable to load chart (repo: %s, name: %s, version: %s): %w", options.RepoURL, options.Name, options.Version, err) } - return loader.Load(path) + c, err := loader.Load(path) + if err != nil { + return nil, fmt.Errorf("unable to load chart (repo: %s, name: %s, version: %s): %w", options.RepoURL, options.Name, options.Version, err) + } + + return c, nil } func (e *Engine) Render(c *chart.Chart, dapr *daprApi.DaprInstance, overrides map[string]interface{}) ([]unstructured.Unstructured, error) { diff --git a/pkg/helm/helm_support.go b/pkg/helm/helm_support.go index 86dc9d8..c7b8102 100644 --- a/pkg/helm/helm_support.go +++ b/pkg/helm/helm_support.go @@ -5,6 +5,7 @@ import ( "k8s.io/apimachinery/pkg/selection" ) +//nolint:wrapcheck func ReleaseSelector() (labels.Selector, error) { hasReleaseNameLabel, err := labels.NewRequirement(ReleaseName, selection.Exists, []string{}) if err != nil { diff --git a/pkg/openshift/openshift.go b/pkg/openshift/openshift.go index 55f3538..423a9de 100644 --- a/pkg/openshift/openshift.go +++ b/pkg/openshift/openshift.go @@ -1,6 +1,8 @@ package openshift import ( + "fmt" + k8serrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/client-go/discovery" ) @@ -14,8 +16,10 @@ func IsOpenShift(client discovery.DiscoveryInterface) (bool, error) { _, err := client.ServerResourcesForGroupVersion("route.openshift.io/v1") if err != nil && k8serrors.IsNotFound(err) { return false, nil - } else if err != nil { - return false, err + } + + if err != nil { + return false, fmt.Errorf("unable to determine if the Kubernetes distro is OpenShift: %w", err) } return true, nil diff --git a/pkg/resources/resources.go b/pkg/resources/resources.go index 3a1e59a..fbb9766 100644 --- a/pkg/resources/resources.go +++ b/pkg/resources/resources.go @@ -134,7 +134,7 @@ func Decode(decoder runtime.Decoder, content []byte) ([]unstructured.Unstructure break } - return nil, err + return nil, fmt.Errorf("unable to decode resource: %w", err) } if len(out) == 0 { @@ -147,7 +147,7 @@ func Decode(decoder runtime.Decoder, content []byte) ([]unstructured.Unstructure encoded, err := yaml.Marshal(out) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to marshal resource: %w", err) } var obj unstructured.Unstructured @@ -157,7 +157,7 @@ func Decode(decoder runtime.Decoder, content []byte) ([]unstructured.Unstructure continue } - return nil, err + return nil, fmt.Errorf("unable to decode resource: %w", err) } results = append(results, obj) diff --git a/test/support/client/client.go b/test/support/client/client.go index 2709a18..9b48add 100644 --- a/test/support/client/client.go +++ b/test/support/client/client.go @@ -39,37 +39,37 @@ func New(t *testing.T) (*Client, error) { cfg, err := config.GetConfig() if err != nil { - return nil, err + return nil, fmt.Errorf("unable to get Kubernetes config: %w", err) } discoveryClient, err := discovery.NewDiscoveryClientForConfig(cfg) if err != nil { - return nil, err - } - - dynamicClient, err := dynamic.NewForConfig(cfg) - if err != nil { - return nil, err + return nil, fmt.Errorf("unable to construct a Discovery client: %w", err) } kubeClient, err := kubernetes.NewForConfig(cfg) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to construct a Kubernetes client: %w", err) } - extClient, err := apiextClient.NewForConfig(cfg) + dynamicClient, err := dynamic.NewForConfig(cfg) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to construct a Dynamic client: %w", err) } dpClient, err := daprClient.NewForConfig(cfg) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to construct a Dapr client: %w", err) + } + + extClient, err := apiextClient.NewForConfig(cfg) + if err != nil { + return nil, fmt.Errorf("unable to construct an API Extension client: %w", err) } oClient, err := olmAC.NewForConfig(cfg) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to construct an OLM client: %w", err) } c := Client{ @@ -105,7 +105,7 @@ func (c *Client) Scheme() *runtime.Scheme { func (c *Client) RESTMapper() (meta.RESTMapper, error) { gr, err := restmapper.GetAPIGroupResources(c.Discovery()) if err != nil { - return nil, err + return nil, fmt.Errorf("error computing API/Group resources, %w", err) } return restmapper.NewDiscoveryRESTMapper(gr), nil diff --git a/test/support/helm/helm.go b/test/support/helm/helm.go index eed5bac..7f62ae3 100644 --- a/test/support/helm/helm.go +++ b/test/support/helm/helm.go @@ -1,6 +1,7 @@ package helm import ( + "fmt" "os" "helm.sh/helm/v3/pkg/action" @@ -43,7 +44,7 @@ func New(options ...ConfigurationOption) (*Helm, error) { err = config.Init(settings.RESTClientGetter(), settings.Namespace(), "memory", config.Log) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to initialize action config: %w", err) } h := Helm{ diff --git a/test/support/helm/helm_uninstall.go b/test/support/helm/helm_uninstall.go index 7055422..04bb0a4 100644 --- a/test/support/helm/helm_uninstall.go +++ b/test/support/helm/helm_uninstall.go @@ -2,6 +2,7 @@ package helm import ( "context" + "fmt" "helm.sh/helm/v3/pkg/action" ) @@ -24,7 +25,7 @@ func (h *Helm) Uninstall(_ context.Context, name string, options ...UninstallOpt _, err := client.Run(name) if err != nil { - return err + return fmt.Errorf("unabele to uninstall release %s: %w", name, err) } return nil From d1a63db0b01e81372014a1cf00e7793353d6c824 Mon Sep 17 00:00:00 2001 From: Luca Burgazzoli Date: Fri, 17 May 2024 15:58:22 +0200 Subject: [PATCH 44/44] chore(lint): keep depguard disabled --- .golangci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index 405f9a6..f6f9ce1 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -73,7 +73,7 @@ linters: - funlen - gochecknoglobals - gochecknoinits + - depguard # validate - cyclop - gocognit - - depguard