This commit is contained in:
kkb0318
2024-04-05 20:59:39 +09:00
parent f01fcd85e9
commit 16121948a2
8 changed files with 352 additions and 303 deletions
+12 -7
View File
@@ -60,6 +60,8 @@ ENVTEST_K8S_VERSION = 1.28.3
# CRD_REF_DOCS_VERSION # CRD_REF_DOCS_VERSION
CRD_REF_DOCS_VERSION = v0.0.12 CRD_REF_DOCS_VERSION = v0.0.12
GOLANGCI_LINT_VERSION ?= v1.57.2
.PHONY: all .PHONY: all
all: build all: build
@@ -70,6 +72,10 @@ all: build
helm: manifests kustomize helmify helm: manifests kustomize helmify
$(KUSTOMIZE) build config/release | $(HELMIFY) -crd-dir charts/irsa-manager $(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 .PHONY: manifests
manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects. manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects.
@@ -89,15 +95,9 @@ vet: ## Run go vet against code.
.PHONY: test .PHONY: test
test: manifests generate fmt vet envtest ## Run tests. 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 KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(LOCALBIN) -p path)" go test -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
GOLANGCI_LINT = $(shell pwd)/bin/golangci-lint GOLANGCI_LINT = $(shell pwd)/bin/golangci-lint
GOLANGCI_LINT_VERSION ?= v1.54.2
golangci-lint: golangci-lint:
@[ -f $(GOLANGCI_LINT) ] || { \ @[ -f $(GOLANGCI_LINT) ] || { \
set -e ;\ set -e ;\
@@ -184,6 +184,11 @@ envtest: $(ENVTEST) ## Download envtest-setup locally if necessary.
$(ENVTEST): $(LOCALBIN) $(ENVTEST): $(LOCALBIN)
test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest 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 .PHONY: helmify
helmify: $(HELMIFY) ## Download helmify locally if necessary. helmify: $(HELMIFY) ## Download helmify locally if necessary.
$(HELMIFY): $(LOCALBIN) $(HELMIFY): $(LOCALBIN)
+1
View File
@@ -13,6 +13,7 @@ require (
github.com/onsi/ginkgo/v2 v2.17.1 github.com/onsi/ginkgo/v2 v2.17.1
github.com/onsi/gomega v1.30.0 github.com/onsi/gomega v1.30.0
github.com/stretchr/testify v1.9.0 github.com/stretchr/testify v1.9.0
go.uber.org/mock v0.4.0
k8s.io/apimachinery v0.29.3 k8s.io/apimachinery v0.29.3
k8s.io/client-go v0.29.3 k8s.io/client-go v0.29.3
sigs.k8s.io/controller-runtime v0.17.2 sigs.k8s.io/controller-runtime v0.17.2
+2
View File
@@ -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= 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 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= 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 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
+334
View File
@@ -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))
}
@@ -23,7 +23,7 @@ func NewS3IdPDiscovery(awsConfig *client.AwsConfig, bucketName string) *S3IdPDis
// CreateStorage creates an S3 bucket // CreateStorage creates an S3 bucket
func (s *S3IdPDiscovery) CreateStorage(ctx context.Context) error { func (s *S3IdPDiscovery) CreateStorage(ctx context.Context) error {
err := s.s3Client.CreateBucket(ctx) err := s.s3Client.CreateBucketPublic(ctx)
if err != nil { if err != nil {
return fmt.Errorf("unable to create bucket, %w", err) 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 { if err != nil {
return nil return nil
} }
err = s.s3Client.PutObject(ctx, err = s.s3Client.PutObjectPublic(ctx,
CONFIGURATION_PATH, CONFIGURATION_PATH,
discovery, discovery,
) )
@@ -50,7 +50,7 @@ func (s *S3IdPDiscovery) Upload(ctx context.Context, o selfhosted.OIDCIdPDiscove
if err != nil { if err != nil {
return nil return nil
} }
err = s.s3Client.PutObject(ctx, err = s.s3Client.PutObjectPublic(ctx,
o.JWKsFileName(), o.JWKsFileName(),
jwk, jwk,
) )
-32
View File
@@ -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")
}
-121
View File
@@ -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())
})
})
})
-140
View File
@@ -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
}