From 16121948a208934e9b21aca1e4a07403bbff0ecf Mon Sep 17 00:00:00 2001 From: kkb0318 Date: Fri, 5 Apr 2024 20:59:39 +0900 Subject: [PATCH] mockgen --- Makefile | 19 +- go.mod | 1 + go.sum | 2 + internal/mock/oidc_mock.go | 334 ++++++++++++++++++ .../selfhosted/oidc/id_provider_discovery.go | 6 +- test/e2e/e2e_suite_test.go | 32 -- test/e2e/e2e_test.go | 121 ------- test/utils/utils.go | 140 -------- 8 files changed, 352 insertions(+), 303 deletions(-) create mode 100644 internal/mock/oidc_mock.go delete mode 100644 test/e2e/e2e_suite_test.go delete mode 100644 test/e2e/e2e_test.go delete mode 100644 test/utils/utils.go diff --git a/Makefile b/Makefile index 5a407a3..25c602d 100644 --- a/Makefile +++ b/Makefile @@ -60,6 +60,8 @@ ENVTEST_K8S_VERSION = 1.28.3 # CRD_REF_DOCS_VERSION CRD_REF_DOCS_VERSION = v0.0.12 +GOLANGCI_LINT_VERSION ?= v1.57.2 + .PHONY: all all: build @@ -70,6 +72,10 @@ all: build helm: manifests kustomize helmify $(KUSTOMIZE) build config/release | $(HELMIFY) -crd-dir charts/irsa-manager +.PHONY: mock +mock: mockgen + mockgen -source internal/selfhosted/oidc.go -destination internal/mock/oidc_mock.go -package mock + .PHONY: manifests manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects. @@ -89,15 +95,9 @@ vet: ## Run go vet against code. .PHONY: test test: manifests generate fmt vet envtest ## Run tests. - KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(LOCALBIN) -p path)" go test $$(go list ./... | grep -v /e2e) -coverprofile cover.out - -# Utilize Kind or modify the e2e tests to load the image locally, enabling compatibility with other vendors. -.PHONY: test-e2e # Run the e2e tests against a Kind k8s instance that is spun up. -test-e2e: - go test ./test/e2e/ -v -ginkgo.v + KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(LOCALBIN) -p path)" go test -coverprofile cover.out GOLANGCI_LINT = $(shell pwd)/bin/golangci-lint -GOLANGCI_LINT_VERSION ?= v1.54.2 golangci-lint: @[ -f $(GOLANGCI_LINT) ] || { \ set -e ;\ @@ -184,6 +184,11 @@ envtest: $(ENVTEST) ## Download envtest-setup locally if necessary. $(ENVTEST): $(LOCALBIN) test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest +.PHONY: mockgen +mockgen: $(MOCKGEN) ## Download envtest-setup locally if necessary. +$(MOCKGEN): $(LOCALBIN) + test -s $(LOCALBIN)/mockgen || GOBIN=$(LOCALBIN) go install go.uber.org/mock/mockgen@latest + .PHONY: helmify helmify: $(HELMIFY) ## Download helmify locally if necessary. $(HELMIFY): $(LOCALBIN) diff --git a/go.mod b/go.mod index 5331728..ef06720 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( github.com/onsi/ginkgo/v2 v2.17.1 github.com/onsi/gomega v1.30.0 github.com/stretchr/testify v1.9.0 + go.uber.org/mock v0.4.0 k8s.io/apimachinery v0.29.3 k8s.io/client-go v0.29.3 sigs.k8s.io/controller-runtime v0.17.2 diff --git a/go.sum b/go.sum index fc3cbfd..9942af0 100644 --- a/go.sum +++ b/go.sum @@ -137,6 +137,8 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= diff --git a/internal/mock/oidc_mock.go b/internal/mock/oidc_mock.go new file mode 100644 index 0000000..46f27af --- /dev/null +++ b/internal/mock/oidc_mock.go @@ -0,0 +1,334 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: internal/selfhosted/oidc.go +// +// Generated by this command: +// +// mockgen -source internal/selfhosted/oidc.go -destination internal/mock/oidc_mock.go -package mock +// + +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + reflect "reflect" + + selfhosted "github.com/kkb0318/irsa-manager/internal/selfhosted" + gomock "go.uber.org/mock/gomock" +) + +// MockOIDCIssuerMeta is a mock of OIDCIssuerMeta interface. +type MockOIDCIssuerMeta struct { + ctrl *gomock.Controller + recorder *MockOIDCIssuerMetaMockRecorder +} + +// MockOIDCIssuerMetaMockRecorder is the mock recorder for MockOIDCIssuerMeta. +type MockOIDCIssuerMetaMockRecorder struct { + mock *MockOIDCIssuerMeta +} + +// NewMockOIDCIssuerMeta creates a new mock instance. +func NewMockOIDCIssuerMeta(ctrl *gomock.Controller) *MockOIDCIssuerMeta { + mock := &MockOIDCIssuerMeta{ctrl: ctrl} + mock.recorder = &MockOIDCIssuerMetaMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockOIDCIssuerMeta) EXPECT() *MockOIDCIssuerMetaMockRecorder { + return m.recorder +} + +// IssuerHostPath mocks base method. +func (m *MockOIDCIssuerMeta) IssuerHostPath() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IssuerHostPath") + ret0, _ := ret[0].(string) + return ret0 +} + +// IssuerHostPath indicates an expected call of IssuerHostPath. +func (mr *MockOIDCIssuerMetaMockRecorder) IssuerHostPath() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IssuerHostPath", reflect.TypeOf((*MockOIDCIssuerMeta)(nil).IssuerHostPath)) +} + +// IssuerUrl mocks base method. +func (m *MockOIDCIssuerMeta) IssuerUrl() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IssuerUrl") + ret0, _ := ret[0].(string) + return ret0 +} + +// IssuerUrl indicates an expected call of IssuerUrl. +func (mr *MockOIDCIssuerMetaMockRecorder) IssuerUrl() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IssuerUrl", reflect.TypeOf((*MockOIDCIssuerMeta)(nil).IssuerUrl)) +} + +// MockOIDCIdP is a mock of OIDCIdP interface. +type MockOIDCIdP struct { + ctrl *gomock.Controller + recorder *MockOIDCIdPMockRecorder +} + +// MockOIDCIdPMockRecorder is the mock recorder for MockOIDCIdP. +type MockOIDCIdPMockRecorder struct { + mock *MockOIDCIdP +} + +// NewMockOIDCIdP creates a new mock instance. +func NewMockOIDCIdP(ctrl *gomock.Controller) *MockOIDCIdP { + mock := &MockOIDCIdP{ctrl: ctrl} + mock.recorder = &MockOIDCIdPMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockOIDCIdP) EXPECT() *MockOIDCIdPMockRecorder { + return m.recorder +} + +// Create mocks base method. +func (m *MockOIDCIdP) Create(ctx context.Context) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Create", ctx) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Create indicates an expected call of Create. +func (mr *MockOIDCIdPMockRecorder) Create(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockOIDCIdP)(nil).Create), ctx) +} + +// IsUpdate mocks base method. +func (m *MockOIDCIdP) IsUpdate() (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsUpdate") + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// IsUpdate indicates an expected call of IsUpdate. +func (mr *MockOIDCIdPMockRecorder) IsUpdate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsUpdate", reflect.TypeOf((*MockOIDCIdP)(nil).IsUpdate)) +} + +// Update mocks base method. +func (m *MockOIDCIdP) Update(ctx context.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Update", ctx) + ret0, _ := ret[0].(error) + return ret0 +} + +// Update indicates an expected call of Update. +func (mr *MockOIDCIdPMockRecorder) Update(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockOIDCIdP)(nil).Update), ctx) +} + +// MockOIDCIdPDiscoveryContents is a mock of OIDCIdPDiscoveryContents interface. +type MockOIDCIdPDiscoveryContents struct { + ctrl *gomock.Controller + recorder *MockOIDCIdPDiscoveryContentsMockRecorder +} + +// MockOIDCIdPDiscoveryContentsMockRecorder is the mock recorder for MockOIDCIdPDiscoveryContents. +type MockOIDCIdPDiscoveryContentsMockRecorder struct { + mock *MockOIDCIdPDiscoveryContents +} + +// NewMockOIDCIdPDiscoveryContents creates a new mock instance. +func NewMockOIDCIdPDiscoveryContents(ctrl *gomock.Controller) *MockOIDCIdPDiscoveryContents { + mock := &MockOIDCIdPDiscoveryContents{ctrl: ctrl} + mock.recorder = &MockOIDCIdPDiscoveryContentsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockOIDCIdPDiscoveryContents) EXPECT() *MockOIDCIdPDiscoveryContentsMockRecorder { + return m.recorder +} + +// Discovery mocks base method. +func (m *MockOIDCIdPDiscoveryContents) Discovery() ([]byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Discovery") + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Discovery indicates an expected call of Discovery. +func (mr *MockOIDCIdPDiscoveryContentsMockRecorder) Discovery() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Discovery", reflect.TypeOf((*MockOIDCIdPDiscoveryContents)(nil).Discovery)) +} + +// JWK mocks base method. +func (m *MockOIDCIdPDiscoveryContents) JWK() ([]byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "JWK") + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// JWK indicates an expected call of JWK. +func (mr *MockOIDCIdPDiscoveryContentsMockRecorder) JWK() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "JWK", reflect.TypeOf((*MockOIDCIdPDiscoveryContents)(nil).JWK)) +} + +// JWKsFileName mocks base method. +func (m *MockOIDCIdPDiscoveryContents) JWKsFileName() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "JWKsFileName") + ret0, _ := ret[0].(string) + return ret0 +} + +// JWKsFileName indicates an expected call of JWKsFileName. +func (mr *MockOIDCIdPDiscoveryContentsMockRecorder) JWKsFileName() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "JWKsFileName", reflect.TypeOf((*MockOIDCIdPDiscoveryContents)(nil).JWKsFileName)) +} + +// MockOIDCIdPDiscovery is a mock of OIDCIdPDiscovery interface. +type MockOIDCIdPDiscovery struct { + ctrl *gomock.Controller + recorder *MockOIDCIdPDiscoveryMockRecorder +} + +// MockOIDCIdPDiscoveryMockRecorder is the mock recorder for MockOIDCIdPDiscovery. +type MockOIDCIdPDiscoveryMockRecorder struct { + mock *MockOIDCIdPDiscovery +} + +// NewMockOIDCIdPDiscovery creates a new mock instance. +func NewMockOIDCIdPDiscovery(ctrl *gomock.Controller) *MockOIDCIdPDiscovery { + mock := &MockOIDCIdPDiscovery{ctrl: ctrl} + mock.recorder = &MockOIDCIdPDiscoveryMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockOIDCIdPDiscovery) EXPECT() *MockOIDCIdPDiscoveryMockRecorder { + return m.recorder +} + +// CreateStorage mocks base method. +func (m *MockOIDCIdPDiscovery) CreateStorage(ctx context.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateStorage", ctx) + ret0, _ := ret[0].(error) + return ret0 +} + +// CreateStorage indicates an expected call of CreateStorage. +func (mr *MockOIDCIdPDiscoveryMockRecorder) CreateStorage(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateStorage", reflect.TypeOf((*MockOIDCIdPDiscovery)(nil).CreateStorage), ctx) +} + +// Upload mocks base method. +func (m *MockOIDCIdPDiscovery) Upload(ctx context.Context, o selfhosted.OIDCIdPDiscoveryContents) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Upload", ctx, o) + ret0, _ := ret[0].(error) + return ret0 +} + +// Upload indicates an expected call of Upload. +func (mr *MockOIDCIdPDiscoveryMockRecorder) Upload(ctx, o any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Upload", reflect.TypeOf((*MockOIDCIdPDiscovery)(nil).Upload), ctx, o) +} + +// MockOIDCIdPFactory is a mock of OIDCIdPFactory interface. +type MockOIDCIdPFactory struct { + ctrl *gomock.Controller + recorder *MockOIDCIdPFactoryMockRecorder +} + +// MockOIDCIdPFactoryMockRecorder is the mock recorder for MockOIDCIdPFactory. +type MockOIDCIdPFactoryMockRecorder struct { + mock *MockOIDCIdPFactory +} + +// NewMockOIDCIdPFactory creates a new mock instance. +func NewMockOIDCIdPFactory(ctrl *gomock.Controller) *MockOIDCIdPFactory { + mock := &MockOIDCIdPFactory{ctrl: ctrl} + mock.recorder = &MockOIDCIdPFactoryMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockOIDCIdPFactory) EXPECT() *MockOIDCIdPFactoryMockRecorder { + return m.recorder +} + +// IdP mocks base method. +func (m *MockOIDCIdPFactory) IdP(i selfhosted.OIDCIssuerMeta) (selfhosted.OIDCIdP, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IdP", i) + ret0, _ := ret[0].(selfhosted.OIDCIdP) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// IdP indicates an expected call of IdP. +func (mr *MockOIDCIdPFactoryMockRecorder) IdP(i any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IdP", reflect.TypeOf((*MockOIDCIdPFactory)(nil).IdP), i) +} + +// IdPDiscovery mocks base method. +func (m *MockOIDCIdPFactory) IdPDiscovery() selfhosted.OIDCIdPDiscovery { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IdPDiscovery") + ret0, _ := ret[0].(selfhosted.OIDCIdPDiscovery) + return ret0 +} + +// IdPDiscovery indicates an expected call of IdPDiscovery. +func (mr *MockOIDCIdPFactoryMockRecorder) IdPDiscovery() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IdPDiscovery", reflect.TypeOf((*MockOIDCIdPFactory)(nil).IdPDiscovery)) +} + +// IdPDiscoveryContents mocks base method. +func (m *MockOIDCIdPFactory) IdPDiscoveryContents(i selfhosted.OIDCIssuerMeta) selfhosted.OIDCIdPDiscoveryContents { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IdPDiscoveryContents", i) + ret0, _ := ret[0].(selfhosted.OIDCIdPDiscoveryContents) + return ret0 +} + +// IdPDiscoveryContents indicates an expected call of IdPDiscoveryContents. +func (mr *MockOIDCIdPFactoryMockRecorder) IdPDiscoveryContents(i any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IdPDiscoveryContents", reflect.TypeOf((*MockOIDCIdPFactory)(nil).IdPDiscoveryContents), i) +} + +// IssuerMeta mocks base method. +func (m *MockOIDCIdPFactory) IssuerMeta() selfhosted.OIDCIssuerMeta { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IssuerMeta") + ret0, _ := ret[0].(selfhosted.OIDCIssuerMeta) + return ret0 +} + +// IssuerMeta indicates an expected call of IssuerMeta. +func (mr *MockOIDCIdPFactoryMockRecorder) IssuerMeta() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IssuerMeta", reflect.TypeOf((*MockOIDCIdPFactory)(nil).IssuerMeta)) +} diff --git a/internal/selfhosted/oidc/id_provider_discovery.go b/internal/selfhosted/oidc/id_provider_discovery.go index fd99699..47d9792 100644 --- a/internal/selfhosted/oidc/id_provider_discovery.go +++ b/internal/selfhosted/oidc/id_provider_discovery.go @@ -23,7 +23,7 @@ func NewS3IdPDiscovery(awsConfig *client.AwsConfig, bucketName string) *S3IdPDis // CreateStorage creates an S3 bucket func (s *S3IdPDiscovery) CreateStorage(ctx context.Context) error { - err := s.s3Client.CreateBucket(ctx) + err := s.s3Client.CreateBucketPublic(ctx) if err != nil { return fmt.Errorf("unable to create bucket, %w", err) } @@ -37,7 +37,7 @@ func (s *S3IdPDiscovery) Upload(ctx context.Context, o selfhosted.OIDCIdPDiscove if err != nil { return nil } - err = s.s3Client.PutObject(ctx, + err = s.s3Client.PutObjectPublic(ctx, CONFIGURATION_PATH, discovery, ) @@ -50,7 +50,7 @@ func (s *S3IdPDiscovery) Upload(ctx context.Context, o selfhosted.OIDCIdPDiscove if err != nil { return nil } - err = s.s3Client.PutObject(ctx, + err = s.s3Client.PutObjectPublic(ctx, o.JWKsFileName(), jwk, ) diff --git a/test/e2e/e2e_suite_test.go b/test/e2e/e2e_suite_test.go deleted file mode 100644 index 85f7f23..0000000 --- a/test/e2e/e2e_suite_test.go +++ /dev/null @@ -1,32 +0,0 @@ -/* -Copyright 2024. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package e2e - -import ( - "fmt" - "testing" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -// Run e2e tests using the Ginkgo runner. -func TestE2E(t *testing.T) { - RegisterFailHandler(Fail) - fmt.Fprintf(GinkgoWriter, "Starting irsa-manager suite\n") - RunSpecs(t, "e2e suite") -} diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go deleted file mode 100644 index d688289..0000000 --- a/test/e2e/e2e_test.go +++ /dev/null @@ -1,121 +0,0 @@ -/* -Copyright 2024. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package e2e - -import ( - "fmt" - "os/exec" - "time" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - - "github.com/kkb0318/irsa-manager/test/utils" -) - -const namespace = "irsa-manager-system" - -var _ = Describe("controller", Ordered, func() { - BeforeAll(func() { - By("installing prometheus operator") - Expect(utils.InstallPrometheusOperator()).To(Succeed()) - - By("installing the cert-manager") - Expect(utils.InstallCertManager()).To(Succeed()) - - By("creating manager namespace") - cmd := exec.Command("kubectl", "create", "ns", namespace) - _, _ = utils.Run(cmd) - }) - - AfterAll(func() { - By("uninstalling the Prometheus manager bundle") - utils.UninstallPrometheusOperator() - - By("uninstalling the cert-manager bundle") - utils.UninstallCertManager() - - By("removing manager namespace") - cmd := exec.Command("kubectl", "delete", "ns", namespace) - _, _ = utils.Run(cmd) - }) - - Context("Operator", func() { - It("should run successfully", func() { - var controllerPodName string - var err error - - // projectimage stores the name of the image used in the example - var projectimage = "example.com/irsa-manager:v0.0.1" - - By("building the manager(Operator) image") - cmd := exec.Command("make", "docker-build", fmt.Sprintf("IMG=%s", projectimage)) - _, err = utils.Run(cmd) - ExpectWithOffset(1, err).NotTo(HaveOccurred()) - - By("loading the the manager(Operator) image on Kind") - err = utils.LoadImageToKindClusterWithName(projectimage) - ExpectWithOffset(1, err).NotTo(HaveOccurred()) - - By("installing CRDs") - cmd = exec.Command("make", "install") - _, err = utils.Run(cmd) - - By("deploying the controller-manager") - cmd = exec.Command("make", "deploy", fmt.Sprintf("IMG=%s", projectimage)) - _, err = utils.Run(cmd) - ExpectWithOffset(1, err).NotTo(HaveOccurred()) - - By("validating that the controller-manager pod is running as expected") - verifyControllerUp := func() error { - // Get pod name - - cmd = exec.Command("kubectl", "get", - "pods", "-l", "control-plane=controller-manager", - "-o", "go-template={{ range .items }}"+ - "{{ if not .metadata.deletionTimestamp }}"+ - "{{ .metadata.name }}"+ - "{{ \"\\n\" }}{{ end }}{{ end }}", - "-n", namespace, - ) - - podOutput, err := utils.Run(cmd) - ExpectWithOffset(2, err).NotTo(HaveOccurred()) - podNames := utils.GetNonEmptyLines(string(podOutput)) - if len(podNames) != 1 { - return fmt.Errorf("expect 1 controller pods running, but got %d", len(podNames)) - } - controllerPodName = podNames[0] - ExpectWithOffset(2, controllerPodName).Should(ContainSubstring("controller-manager")) - - // Validate pod status - cmd = exec.Command("kubectl", "get", - "pods", controllerPodName, "-o", "jsonpath={.status.phase}", - "-n", namespace, - ) - status, err := utils.Run(cmd) - ExpectWithOffset(2, err).NotTo(HaveOccurred()) - if string(status) != "Running" { - return fmt.Errorf("controller pod in %s status", status) - } - return nil - } - EventuallyWithOffset(1, verifyControllerUp, time.Minute, time.Second).Should(Succeed()) - - }) - }) -}) diff --git a/test/utils/utils.go b/test/utils/utils.go deleted file mode 100644 index 7363aa5..0000000 --- a/test/utils/utils.go +++ /dev/null @@ -1,140 +0,0 @@ -/* -Copyright 2024. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package utils - -import ( - "fmt" - "os" - "os/exec" - "strings" - - . "github.com/onsi/ginkgo/v2" //nolint:golint,revive -) - -const ( - prometheusOperatorVersion = "v0.68.0" - prometheusOperatorURL = "https://github.com/prometheus-operator/prometheus-operator/" + - "releases/download/%s/bundle.yaml" - - certmanagerVersion = "v1.5.3" - certmanagerURLTmpl = "https://github.com/jetstack/cert-manager/releases/download/%s/cert-manager.yaml" -) - -func warnError(err error) { - fmt.Fprintf(GinkgoWriter, "warning: %v\n", err) -} - -// InstallPrometheusOperator installs the prometheus Operator to be used to export the enabled metrics. -func InstallPrometheusOperator() error { - url := fmt.Sprintf(prometheusOperatorURL, prometheusOperatorVersion) - cmd := exec.Command("kubectl", "create", "-f", url) - _, err := Run(cmd) - return err -} - -// Run executes the provided command within this context -func Run(cmd *exec.Cmd) ([]byte, error) { - dir, _ := GetProjectDir() - cmd.Dir = dir - - if err := os.Chdir(cmd.Dir); err != nil { - fmt.Fprintf(GinkgoWriter, "chdir dir: %s\n", err) - } - - cmd.Env = append(os.Environ(), "GO111MODULE=on") - command := strings.Join(cmd.Args, " ") - fmt.Fprintf(GinkgoWriter, "running: %s\n", command) - output, err := cmd.CombinedOutput() - if err != nil { - return output, fmt.Errorf("%s failed with error: (%v) %s", command, err, string(output)) - } - - return output, nil -} - -// UninstallPrometheusOperator uninstalls the prometheus -func UninstallPrometheusOperator() { - url := fmt.Sprintf(prometheusOperatorURL, prometheusOperatorVersion) - cmd := exec.Command("kubectl", "delete", "-f", url) - if _, err := Run(cmd); err != nil { - warnError(err) - } -} - -// UninstallCertManager uninstalls the cert manager -func UninstallCertManager() { - url := fmt.Sprintf(certmanagerURLTmpl, certmanagerVersion) - cmd := exec.Command("kubectl", "delete", "-f", url) - if _, err := Run(cmd); err != nil { - warnError(err) - } -} - -// InstallCertManager installs the cert manager bundle. -func InstallCertManager() error { - url := fmt.Sprintf(certmanagerURLTmpl, certmanagerVersion) - cmd := exec.Command("kubectl", "apply", "-f", url) - if _, err := Run(cmd); err != nil { - return err - } - // Wait for cert-manager-webhook to be ready, which can take time if cert-manager - // was re-installed after uninstalling on a cluster. - cmd = exec.Command("kubectl", "wait", "deployment.apps/cert-manager-webhook", - "--for", "condition=Available", - "--namespace", "cert-manager", - "--timeout", "5m", - ) - - _, err := Run(cmd) - return err -} - -// LoadImageToKindCluster loads a local docker image to the kind cluster -func LoadImageToKindClusterWithName(name string) error { - cluster := "kind" - if v, ok := os.LookupEnv("KIND_CLUSTER"); ok { - cluster = v - } - kindOptions := []string{"load", "docker-image", name, "--name", cluster} - cmd := exec.Command("kind", kindOptions...) - _, err := Run(cmd) - return err -} - -// GetNonEmptyLines converts given command output string into individual objects -// according to line breakers, and ignores the empty elements in it. -func GetNonEmptyLines(output string) []string { - var res []string - elements := strings.Split(output, "\n") - for _, element := range elements { - if element != "" { - res = append(res, element) - } - } - - return res -} - -// GetProjectDir will return the directory where the project is -func GetProjectDir() (string, error) { - wd, err := os.Getwd() - if err != nil { - return wd, err - } - wd = strings.Replace(wd, "/test/e2e", "", -1) - return wd, nil -}