From dd6094614205553e714476684d265b3004a109db Mon Sep 17 00:00:00 2001 From: Yuwen Ma Date: Fri, 5 May 2023 10:15:14 -0700 Subject: [PATCH] feat: avoid importing kubectl deps when using ApplysetApplier --- dev/test | 5 ++++ pkg/patterns/declarative/metrics_test.go | 4 +-- .../declarative/pkg/applier/direct.go | 6 ++-- .../declarative/pkg/applier/direct_test.go | 3 ++ pkg/patterns/declarative/pkg/applier/exec.go | 3 ++ .../declarative/pkg/applier/exec_test.go | 3 ++ .../declarative/pkg/applier/global.go | 6 ++++ .../pkg/applier/global_without_kubectl.go | 10 +++++++ pkg/patterns/declarative/reconciler.go | 2 +- .../simpletest/controller_test.go | 30 ------------------- .../simpletest/with_kubectl_test.go | 21 +++++++++++++ .../simpletest/without_kubectl_test.go | 21 +++++++++++++ 12 files changed, 78 insertions(+), 36 deletions(-) create mode 100644 pkg/patterns/declarative/pkg/applier/global.go create mode 100644 pkg/patterns/declarative/pkg/applier/global_without_kubectl.go create mode 100644 pkg/test/testreconciler/simpletest/with_kubectl_test.go create mode 100644 pkg/test/testreconciler/simpletest/without_kubectl_test.go diff --git a/dev/test b/dev/test index 165d010c..e110cea8 100755 --- a/dev/test +++ b/dev/test @@ -35,7 +35,12 @@ pushd applylib CGO_ENABLED=0 go test -count=1 -v ./... popd +# default, test direct kubectl applier CGO_ENABLED=0 go test -count=1 -v ./... +# test applyset applier, without kubectl direct and exec dependencies +CGO_ENABLED=0 go test -tags without_exec_applier,without_direct_applier -count=1 -v ./... +# test exec kubectl applier, without direct_applier dependencies +CGO_ENABLED=0 go test -tags without_direct_applier -count=1 -v ./... pushd examples/guestbook-operator CGO_ENABLED=0 go test -count=1 -v ./... diff --git a/pkg/patterns/declarative/metrics_test.go b/pkg/patterns/declarative/metrics_test.go index a2d2e5c7..450b73e7 100644 --- a/pkg/patterns/declarative/metrics_test.go +++ b/pkg/patterns/declarative/metrics_test.go @@ -543,9 +543,7 @@ func TestAddIfNotPresent(t *testing.T) { t.Fatalf("failed to get restmapping for parent: %v", err) } options.ParentRef = applyset.NewParentRef(parent, "kdp-test", "default", restmapping) - applier := applier.NewApplySetApplier( - metav1.PatchOptions{FieldManager: "kdp-test"}, metav1.DeleteOptions{}, applier.ApplysetOptions{}) - + applier := applier.DefaultApplier if err := applier.Apply(ctx, options); err != nil { t.Fatalf("failed to apply objects: %v", err) } diff --git a/pkg/patterns/declarative/pkg/applier/direct.go b/pkg/patterns/declarative/pkg/applier/direct.go index b325debc..bdbb2a28 100644 --- a/pkg/patterns/declarative/pkg/applier/direct.go +++ b/pkg/patterns/declarative/pkg/applier/direct.go @@ -1,3 +1,6 @@ +//go:build !without_exec_applier || !without_direct_applier +// +build !without_exec_applier !without_direct_applier + package applier import ( @@ -6,8 +9,6 @@ import ( "os" "strings" - "k8s.io/kubectl/pkg/util/prune" - "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" utilerrors "k8s.io/apimachinery/pkg/util/errors" @@ -20,6 +21,7 @@ import ( "k8s.io/kubectl/pkg/cmd/apply" cmdDelete "k8s.io/kubectl/pkg/cmd/delete" cmdutil "k8s.io/kubectl/pkg/cmd/util" + "k8s.io/kubectl/pkg/util/prune" "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/declarative/pkg/manifest" ) diff --git a/pkg/patterns/declarative/pkg/applier/direct_test.go b/pkg/patterns/declarative/pkg/applier/direct_test.go index 3a63e0c3..7651bcf7 100644 --- a/pkg/patterns/declarative/pkg/applier/direct_test.go +++ b/pkg/patterns/declarative/pkg/applier/direct_test.go @@ -1,3 +1,6 @@ +//go:build !without_exec_applier || !without_direct_applier +// +build !without_exec_applier !without_direct_applier + /* Copyright 2022 The Kubernetes Authors. diff --git a/pkg/patterns/declarative/pkg/applier/exec.go b/pkg/patterns/declarative/pkg/applier/exec.go index 241d7b84..7dcf510c 100644 --- a/pkg/patterns/declarative/pkg/applier/exec.go +++ b/pkg/patterns/declarative/pkg/applier/exec.go @@ -1,3 +1,6 @@ +//go:build !without_exec_applier +// +build !without_exec_applier + /* Copyright 2018 The Kubernetes Authors. diff --git a/pkg/patterns/declarative/pkg/applier/exec_test.go b/pkg/patterns/declarative/pkg/applier/exec_test.go index 1f33834f..7d97748b 100644 --- a/pkg/patterns/declarative/pkg/applier/exec_test.go +++ b/pkg/patterns/declarative/pkg/applier/exec_test.go @@ -1,3 +1,6 @@ +//go:build !without_exec_applier +// +build !without_exec_applier + /* Copyright 2019 The Kubernetes Authors. diff --git a/pkg/patterns/declarative/pkg/applier/global.go b/pkg/patterns/declarative/pkg/applier/global.go new file mode 100644 index 00000000..4815bddf --- /dev/null +++ b/pkg/patterns/declarative/pkg/applier/global.go @@ -0,0 +1,6 @@ +//go:build !without_exec_applier || !without_direct_applier +// +build !without_exec_applier !without_direct_applier + +package applier + +var DefaultApplier = NewDirectApplier() diff --git a/pkg/patterns/declarative/pkg/applier/global_without_kubectl.go b/pkg/patterns/declarative/pkg/applier/global_without_kubectl.go new file mode 100644 index 00000000..e1e80703 --- /dev/null +++ b/pkg/patterns/declarative/pkg/applier/global_without_kubectl.go @@ -0,0 +1,10 @@ +//go:build without_exec_applier && without_direct_applier +// +build without_exec_applier,without_direct_applier + +package applier + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +var DefaultApplier = NewApplySetApplier(metav1.PatchOptions{}, metav1.DeleteOptions{}, ApplysetOptions{}) diff --git a/pkg/patterns/declarative/reconciler.go b/pkg/patterns/declarative/reconciler.go index c7a059a2..f814d5dc 100644 --- a/pkg/patterns/declarative/reconciler.go +++ b/pkg/patterns/declarative/reconciler.go @@ -95,7 +95,7 @@ func (e *ErrorResult) Error() string { } // For mocking -var defaultApplier = applier.NewDirectApplier() +var defaultApplier = applier.DefaultApplier func (r *Reconciler) Init(mgr manager.Manager, prototype DeclarativeObject, opts ...ReconcilerOption) error { r.prototype = prototype diff --git a/pkg/test/testreconciler/simpletest/controller_test.go b/pkg/test/testreconciler/simpletest/controller_test.go index fb3597cb..5d009d3d 100644 --- a/pkg/test/testreconciler/simpletest/controller_test.go +++ b/pkg/test/testreconciler/simpletest/controller_test.go @@ -4,11 +4,9 @@ import ( "context" "net/http" "path/filepath" - "testing" "time" "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/rest" @@ -19,7 +17,6 @@ import ( "sigs.k8s.io/kubebuilder-declarative-pattern/mockkubeapiserver" "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/addon/pkg/loaders" - "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/addon/pkg/status" "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/declarative" "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/declarative/pkg/applier" "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/test/httprecorder" @@ -28,33 +25,6 @@ import ( api "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/test/testreconciler/simpletest/v1alpha1" ) -func TestSimpleReconciler(t *testing.T) { - appliers := []struct { - Key string - Applier applier.Applier - Status declarative.Status - }{ - { - Key: "direct", - Applier: applier.NewDirectApplier(), - Status: status.NewBasic(nil), - }, - { - Key: "ssa", - Applier: applier.NewApplySetApplier( - metav1.PatchOptions{FieldManager: "kdp-test"}, metav1.DeleteOptions{}, applier.ApplysetOptions{}), - Status: status.NewKstatusCheck(nil, nil), - }, - } - for _, applier := range appliers { - t.Run(applier.Key, func(t *testing.T) { - testharness.RunGoldenTests(t, "testdata/reconcile/"+applier.Key+"/", func(h *testharness.Harness, testdir string) { - testSimpleReconciler(h, testdir, applier.Applier, applier.Status) - }) - }) - } -} - func testSimpleReconciler(h *testharness.Harness, testdir string, applier applier.Applier, status declarative.Status) { ctx := context.Background() diff --git a/pkg/test/testreconciler/simpletest/with_kubectl_test.go b/pkg/test/testreconciler/simpletest/with_kubectl_test.go new file mode 100644 index 00000000..1537cb1b --- /dev/null +++ b/pkg/test/testreconciler/simpletest/with_kubectl_test.go @@ -0,0 +1,21 @@ +//go:build !without_exec_applier || !without_direct_applier +// +build !without_exec_applier !without_direct_applier + +package simpletest + +import ( + "testing" + + "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/addon/pkg/status" + "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/declarative/pkg/applier" + "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/test/testharness" +) + +func TestDirectSimpleReconciler(t *testing.T) { + Key := "direct" + t.Run(Key, func(t *testing.T) { + testharness.RunGoldenTests(t, "testdata/reconcile/"+Key+"/", func(h *testharness.Harness, testdir string) { + testSimpleReconciler(h, testdir, applier.NewDirectApplier(), status.NewBasic(nil)) + }) + }) +} diff --git a/pkg/test/testreconciler/simpletest/without_kubectl_test.go b/pkg/test/testreconciler/simpletest/without_kubectl_test.go new file mode 100644 index 00000000..24caaaff --- /dev/null +++ b/pkg/test/testreconciler/simpletest/without_kubectl_test.go @@ -0,0 +1,21 @@ +package simpletest + +import ( + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/addon/pkg/status" + "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/declarative/pkg/applier" + "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/test/testharness" +) + +func TestSSASimpleReconciler(t *testing.T) { + Key := "ssa" + a := applier.NewApplySetApplier( + metav1.PatchOptions{FieldManager: "kdp-test"}, metav1.DeleteOptions{}, applier.ApplysetOptions{}) + t.Run(Key, func(t *testing.T) { + testharness.RunGoldenTests(t, "testdata/reconcile/"+Key+"/", func(h *testharness.Harness, testdir string) { + testSimpleReconciler(h, testdir, a, status.NewKstatusCheck(nil, nil)) + }) + }) +}