From d439e8ba1d7e429e18528e9749a7ee2f27e412af Mon Sep 17 00:00:00 2001 From: Christoph Barbian Date: Mon, 10 Jul 2023 15:01:34 +0200 Subject: [PATCH] cleanup/refactoring --- .github/workflows/release.yaml | 17 +++ .gitignore | 8 +- .vscode/settings.json | 4 +- Dockerfile | 8 +- Makefile | 129 +++++++++--------- api/v1alpha1/clusterspace_types.go | 16 +-- api/v1alpha1/clusterspace_webhook.go | 4 +- api/v1alpha1/servicebinding_types.go | 12 +- api/v1alpha1/servicebinding_webhook.go | 4 +- api/v1alpha1/serviceinstance_types.go | 12 +- api/v1alpha1/serviceinstance_webhook.go | 4 +- api/v1alpha1/space_types.go | 12 +- api/v1alpha1/space_webhook.go | 4 +- .../bases/cf.cs.sap.com_clusterspaces.yaml | 2 +- .../bases/cf.cs.sap.com_servicebindings.yaml | 2 +- .../bases/cf.cs.sap.com_serviceinstances.yaml | 2 +- config/crd/bases/cf.cs.sap.com_spaces.yaml | 2 +- crds/cf.cs.sap.com_clusterspaces.yaml | 2 +- crds/cf.cs.sap.com_servicebindings.yaml | 2 +- crds/cf.cs.sap.com_serviceinstances.yaml | 2 +- crds/cf.cs.sap.com_spaces.yaml | 2 +- .../controllers/servicebinding_controller.go | 14 +- .../controllers/serviceinstance_controller.go | 14 +- internal/controllers/space_controller.go | 16 +-- main.go | 8 +- .../content/en/docs/installation/_index.md | 2 +- 26 files changed, 165 insertions(+), 139 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 409fd1e..2cf5b79 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -108,6 +108,23 @@ jobs: echo "Target commit: $sha" echo "sha=$sha" >> $GITHUB_OUTPUT + - name: Wait for build to finish + uses: fountainhead/action-wait-for-check@v1.1.0 + id: wait_for_build + with: + token: ${{ github.token }} + checkName: Build Docker image + ref: ${{ steps.get_target_commit.outputs.sha }} + timeoutSeconds: 900 + + - name: Check that build was successful + uses: actions/github-script@v3 + with: + script: | + if ('${{ steps.wait_for_build.outputs.conclusion}}' != 'success') { + core.setFailed('Build not successful, conclusion: ${{ steps.wait_for_build.outputs.conclusion}}.') + } + - name: Create Release uses: softprops/action-gh-release@v1 with: diff --git a/.gitignore b/.gitignore index 9de88e7..bd2edf6 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,8 @@ *.dylib bin testbin/* +__debug_bin +Dockerfile.cross # Test binary, build with `go test -c` *.test @@ -26,17 +28,13 @@ testbin/* # vscode stuff .vscode/*.log -# temporary folder +# temp stuff /tmp # local stuff /.kubeconfig /.local/ssl -# Debug artifacts -__debug_bin -debug.* - # Hugo artifacts .hugo_build.lock /website/resources diff --git a/.vscode/settings.json b/.vscode/settings.json index 9e1b815..6c33fe3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,5 @@ { - "docker.commands.build": "docker build --pull --rm -f \"${dockerfile}\" -t ${tag} ${workspaceFolder}" + "go.testEnvVars": { + "KUBEBUILDER_ASSETS": "${workspaceFolder}/bin/k8s/current" + } } \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 0e2f0c1..f7079f1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,9 +16,13 @@ COPY main.go main.go COPY api/ api/ COPY pkg/ pkg/ COPY internal/ internal/ +COPY crds/ crds/ +COPY Makefile Makefile -# Build -RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -a -o manager main.go +# Run tests and build +RUN make envtest \ + && CGO_ENABLED=0 KUBEBUILDER_ASSETS="/workspace/bin/k8s/current" go test ./... \ + && CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -a -o manager main.go # Use distroless as minimal base image to package the manager binary # Refer to https://github.com/GoogleContainerTools/distroless for more details diff --git a/Makefile b/Makefile index c5b919f..425841b 100644 --- a/Makefile +++ b/Makefile @@ -2,13 +2,7 @@ # Image URL to use all building/pushing image targets IMG ?= controller:latest # ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary. -ENVTEST_K8S_VERSION = 1.24 -BUILDOS := $(shell go env GOOS) -BUILDARCH := $(shell go env GOARCH) -TESTOS ?= $(BUILDOS) -TESTARCH ?= $(BUILDARCH) -TARGETOS ?= $(TESTOS) -TARGETARCH ?= $(TESTARCH) +ENVTEST_K8S_VERSION = 1.25.0 # Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) ifeq (,$(shell go env GOBIN)) @@ -18,7 +12,6 @@ GOBIN=$(shell go env GOBIN) endif # Setting SHELL to bash allows bash commands to be executed by recipes. -# This is a requirement for 'setup-envtest.sh' in the test target. # Options are set to exit when a recipe line exits non-zero or a piped command fails. SHELL = /usr/bin/env bash -o pipefail .SHELLFLAGS = -ec @@ -47,7 +40,7 @@ help: ## Display this help. .PHONY: manifests manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects. - $(CONTROLLER_GEN) rbac:roleName=manager-role crd webhook paths="main.go" paths="./api/..." paths="./pkg/..." paths="./internal/..." output:crd:artifacts:config=config/crd/bases + $(CONTROLLER_GEN) rbac:roleName=manager-role crd:generateEmbeddedObjectMeta=true webhook paths="main.go" paths="./api/..." paths="./pkg/..." paths="./internal/..." output:crd:artifacts:config=config/crd/bases rm -rf crds && cp -r config/crd/bases crds .PHONY: generate @@ -65,22 +58,21 @@ vet: ## Run go vet against code. .PHONY: test test: manifests generate fmt vet envtest ## Run tests. - KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./... -coverprofile cover.out - -.PHONY: envtest-test -envtest-test: ## Run tests. - KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./... -coverprofile cover.out + KUBEBUILDER_ASSETS="$(LOCALBIN)/k8s/current" go test ./... -coverprofile cover.out ##@ Build .PHONY: build build: generate fmt vet ## Build manager binary. - GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -o bin/manager main.go + go build -o bin/manager main.go .PHONY: run run: manifests generate fmt vet ## Run a controller from your host. go run ./main.go +# If you wish built the manager image targeting other platforms you can use the --platform flag. +# (i.e. docker build --platform linux/arm64 ). However, you must enable docker buildKit for it. +# More info: https://docs.docker.com/develop/develop-images/build_enhancements/ .PHONY: docker-build docker-build: test ## Build docker image with the manager. docker build -t ${IMG} . @@ -89,6 +81,23 @@ docker-build: test ## Build docker image with the manager. docker-push: ## Push docker image with the manager. docker push ${IMG} +# PLATFORMS defines the target platforms for the manager image be build to provide support to multiple +# architectures. (i.e. make docker-buildx IMG=myregistry/mypoperator:0.0.1). To use this option you need to: +# - able to use docker buildx . More info: https://docs.docker.com/build/buildx/ +# - have enable BuildKit, More info: https://docs.docker.com/develop/develop-images/build_enhancements/ +# - be able to push the image for your registry (i.e. if you do not inform a valid value via IMG=> than the export will fail) +# To properly provided solutions that supports more than one platform you should use this option. +PLATFORMS ?= linux/arm64,linux/amd64,linux/s390x,linux/ppc64le +.PHONY: docker-buildx +docker-buildx: test ## Build and push docker image for the manager for cross-platform support + # copy existing Dockerfile and insert --platform=${BUILDPLATFORM} into Dockerfile.cross, and preserve the original Dockerfile + sed -e '1 s/\(^FROM\)/FROM --platform=\$$\{BUILDPLATFORM\}/; t' -e ' 1,// s//FROM --platform=\$$\{BUILDPLATFORM\}/' Dockerfile > Dockerfile.cross + - docker buildx create --name project-v3-builder + docker buildx use project-v3-builder + - docker buildx build --push --platform=$(PLATFORMS) --tag ${IMG} -f Dockerfile.cross + - docker buildx rm project-v3-builder + rm Dockerfile.cross + ##@ Deployment ifndef ignore-not-found @@ -112,60 +121,56 @@ deploy: manifests kustomize ## Deploy controller to the K8s cluster specified in undeploy: ## Undeploy controller from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion. $(KUSTOMIZE) build config/default | kubectl delete --ignore-not-found=$(ignore-not-found) -f - -CONTROLLER_GEN = $(shell pwd)/bin/controller-gen -.PHONY: controller-gen -controller-gen: ## Download controller-gen locally if necessary. - $(call go-install-tool,$(CONTROLLER_GEN),sigs.k8s.io/controller-tools/cmd/controller-gen@v0.10.0) +##@ Build Dependencies + +## Location to install dependencies to +LOCALBIN ?= $(shell pwd)/bin +$(LOCALBIN): + mkdir -p $(LOCALBIN) -KUSTOMIZE = $(shell pwd)/bin/kustomize +## Tool Binaries +KUSTOMIZE ?= $(LOCALBIN)/kustomize +CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen +ENVTEST ?= $(LOCALBIN)/setup-envtest +CLIENT_GEN ?= $(shell pwd)/bin/client-gen +INFORMER_GEN ?= $(shell pwd)/bin/informer-gen +LISTER_GEN ?= $(shell pwd)/bin/lister-gen + +## Tool Versions +KUSTOMIZE_VERSION ?= v3.8.7 +CONTROLLER_TOOLS_VERSION ?= v0.9.2 +CODE_GENERATOR_VERSION ?= v0.23.4 + +KUSTOMIZE_INSTALL_SCRIPT ?= "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" .PHONY: kustomize -kustomize: ## Download kustomize locally if necessary. - $(call go-get-tool,$(KUSTOMIZE),sigs.k8s.io/kustomize/kustomize/v3@v3.8.7) +kustomize: $(KUSTOMIZE) ## Download kustomize locally if necessary. +$(KUSTOMIZE): $(LOCALBIN) + test -s $(LOCALBIN)/kustomize || { curl -Ss $(KUSTOMIZE_INSTALL_SCRIPT) | bash -s -- $(subst v,,$(KUSTOMIZE_VERSION)) $(LOCALBIN); } + +.PHONY: controller-gen +controller-gen: $(CONTROLLER_GEN) ## Download controller-gen locally if necessary. +$(CONTROLLER_GEN): $(LOCALBIN) + test -s $(LOCALBIN)/controller-gen || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-tools/cmd/controller-gen@$(CONTROLLER_TOOLS_VERSION) -ENVTEST = $(shell pwd)/bin/setup-envtest .PHONY: envtest -envtest: ## Download envtest-setup locally if necessary. - $(call go-install-tool,$(ENVTEST),sigs.k8s.io/controller-runtime/tools/setup-envtest@latest) +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 + ENVTESTDIR=$$($(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(LOCALBIN) -p path) ;\ + rm -f $(LOCALBIN)/k8s/current ;\ + ln -s $$ENVTESTDIR $(LOCALBIN)/k8s/current -CLIENT_GEN = $(shell pwd)/bin/client-gen .PHONY: client-gen -client-gen: ## Download client-gen - $(call go-install-tool,$(CLIENT_GEN),k8s.io/code-generator/cmd/client-gen@v0.23.4) +client-gen: $(CLIENT_GEN) ## Download client-gen +$(CLIENT_GEN): $(LOCALBIN) + test -s $(LOCALBIN)/client-gen || GOBIN=$(LOCALBIN) go install k8s.io/code-generator/cmd/client-gen@$(CODE_GENERATOR_VERSION) -INFORMER_GEN = $(shell pwd)/bin/informer-gen .PHONY: informer-gen -informer-gen: ## Download informer-gen - $(call go-install-tool,$(INFORMER_GEN),k8s.io/code-generator/cmd/informer-gen@v0.23.4) +informer-gen: $(INFORMER_GEN) ## Download informer-gen +$(INFORMER_GEN): $(LOCALBIN) + test -s $(LOCALBIN)/informer-gen || GOBIN=$(LOCALBIN) go install k8s.io/code-generator/cmd/informer-gen@$(CODE_GENERATOR_VERSION) -LISTER_GEN = $(shell pwd)/bin/lister-gen .PHONY: lister-gen -lister-gen: ## Download lister-gen - $(call go-install-tool,$(LISTER_GEN),k8s.io/code-generator/cmd/lister-gen@v0.23.4) - -# go-get-tool will 'go get' any package $2 and install it to $1. -PROJECT_DIR := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST)))) -define go-get-tool -@[ -f $(1) ] || { \ -set -e ;\ -TMP_DIR=$$(mktemp -d) ;\ -cd $$TMP_DIR ;\ -go mod init tmp ;\ -echo "Downloading $(2)" ;\ -GOBIN=$(PROJECT_DIR)/bin go get $(2) ;\ -rm -rf $$TMP_DIR ;\ -} -endef - -# go-install-tool will 'go install' any package $2 and install it to $1. -PROJECT_DIR := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST)))) -define go-install-tool -@[ -f $(1) ] || { \ -set -e ;\ -TMP_DIR=$$(mktemp -d) ;\ -cd $$TMP_DIR ;\ -go mod init tmp ;\ -echo "Downloading $(2)" ;\ -GOBIN=$(PROJECT_DIR)/bin go install $(2) ;\ -rm -rf $$TMP_DIR ;\ -} -endef +lister-gen: $(LISTER_GEN) ## Download lister-gen +$(LISTER_GEN): $(LOCALBIN) + test -s $(LOCALBIN)/lister-gen || GOBIN=$(LOCALBIN) go install k8s.io/code-generator/cmd/lister-gen@$(CODE_GENERATOR_VERSION) diff --git a/api/v1alpha1/clusterspace_types.go b/api/v1alpha1/clusterspace_types.go index 30cc0b3..a401cda 100644 --- a/api/v1alpha1/clusterspace_types.go +++ b/api/v1alpha1/clusterspace_types.go @@ -9,13 +9,13 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -//+kubebuilder:object:root=true -//+kubebuilder:subresource:status -//+kubebuilder:resource:scope=Cluster -//+kubebuilder:printcolumn:name="State",type=string,JSONPath=`.status.state` -//+kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" -//+genclient -//+genclient:nonNamespaced +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:resource:scope=Cluster +// +kubebuilder:printcolumn:name="State",type=string,JSONPath=`.status.state` +// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" +// +genclient +// +genclient:nonNamespaced // ClusterSpace is the Schema for the clusterspaces API type ClusterSpace struct { @@ -28,7 +28,7 @@ type ClusterSpace struct { Status SpaceStatus `json:"status,omitempty"` } -//+kubebuilder:object:root=true +// +kubebuilder:object:root=true // ClusterSpaceList contains a list of ClusterSpace type ClusterSpaceList struct { diff --git a/api/v1alpha1/clusterspace_webhook.go b/api/v1alpha1/clusterspace_webhook.go index e0c6de4..7b665f1 100644 --- a/api/v1alpha1/clusterspace_webhook.go +++ b/api/v1alpha1/clusterspace_webhook.go @@ -23,7 +23,7 @@ func (r *ClusterSpace) SetupWebhookWithManager(mgr ctrl.Manager) error { Complete() } -//+kubebuilder:webhook:path=/mutate-cf-cs-sap-com-v1alpha1-clusterspace,mutating=true,failurePolicy=fail,sideEffects=None,groups=cf.cs.sap.com,resources=clusterspaces,verbs=create;update,versions=v1alpha1,name=mclusterspace.kb.io,admissionReviewVersions=v1 +// +kubebuilder:webhook:path=/mutate-cf-cs-sap-com-v1alpha1-clusterspace,mutating=true,failurePolicy=fail,sideEffects=None,groups=cf.cs.sap.com,resources=clusterspaces,verbs=create;update,versions=v1alpha1,name=mclusterspace.kb.io,admissionReviewVersions=v1 var _ webhook.Defaulter = &ClusterSpace{} @@ -36,7 +36,7 @@ func (r *ClusterSpace) Default() { } } -//+kubebuilder:webhook:path=/validate-cf-cs-sap-com-v1alpha1-clusterspace,mutating=false,failurePolicy=fail,sideEffects=None,groups=cf.cs.sap.com,resources=clusterspaces,verbs=create;update,versions=v1alpha1,name=vclusterspace.kb.io,admissionReviewVersions=v1 +// +kubebuilder:webhook:path=/validate-cf-cs-sap-com-v1alpha1-clusterspace,mutating=false,failurePolicy=fail,sideEffects=None,groups=cf.cs.sap.com,resources=clusterspaces,verbs=create;update,versions=v1alpha1,name=vclusterspace.kb.io,admissionReviewVersions=v1 var _ webhook.Validator = &ClusterSpace{} diff --git a/api/v1alpha1/servicebinding_types.go b/api/v1alpha1/servicebinding_types.go index 17a6b4e..99041e3 100644 --- a/api/v1alpha1/servicebinding_types.go +++ b/api/v1alpha1/servicebinding_types.go @@ -10,11 +10,11 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -//+kubebuilder:object:root=true -//+kubebuilder:subresource:status -//+kubebuilder:printcolumn:name="State",type=string,JSONPath=`.status.state` -//+kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" -//+genclient +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:printcolumn:name="State",type=string,JSONPath=`.status.state` +// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" +// +genclient // ServiceBinding is the Schema for the servicebindings API type ServiceBinding struct { @@ -27,7 +27,7 @@ type ServiceBinding struct { Status ServiceBindingStatus `json:"status,omitempty"` } -//+kubebuilder:object:root=true +// +kubebuilder:object:root=true // ServiceBindingList contains a list of ServiceBinding type ServiceBindingList struct { diff --git a/api/v1alpha1/servicebinding_webhook.go b/api/v1alpha1/servicebinding_webhook.go index d490c43..e8706c4 100644 --- a/api/v1alpha1/servicebinding_webhook.go +++ b/api/v1alpha1/servicebinding_webhook.go @@ -23,7 +23,7 @@ func (r *ServiceBinding) SetupWebhookWithManager(mgr ctrl.Manager) error { Complete() } -//+kubebuilder:webhook:path=/mutate-cf-cs-sap-com-v1alpha1-servicebinding,mutating=true,failurePolicy=fail,sideEffects=None,groups=cf.cs.sap.com,resources=servicebindings,verbs=create;update,versions=v1alpha1,name=mservicebinding.kb.io,admissionReviewVersions=v1 +// +kubebuilder:webhook:path=/mutate-cf-cs-sap-com-v1alpha1-servicebinding,mutating=true,failurePolicy=fail,sideEffects=None,groups=cf.cs.sap.com,resources=servicebindings,verbs=create;update,versions=v1alpha1,name=mservicebinding.kb.io,admissionReviewVersions=v1 var _ webhook.Defaulter = &ServiceBinding{} @@ -44,7 +44,7 @@ func (r *ServiceBinding) Default() { } } -//+kubebuilder:webhook:path=/validate-cf-cs-sap-com-v1alpha1-servicebinding,mutating=false,failurePolicy=fail,sideEffects=None,groups=cf.cs.sap.com,resources=servicebindings,verbs=create;update,versions=v1alpha1,name=vservicebinding.kb.io,admissionReviewVersions=v1 +// +kubebuilder:webhook:path=/validate-cf-cs-sap-com-v1alpha1-servicebinding,mutating=false,failurePolicy=fail,sideEffects=None,groups=cf.cs.sap.com,resources=servicebindings,verbs=create;update,versions=v1alpha1,name=vservicebinding.kb.io,admissionReviewVersions=v1 var _ webhook.Validator = &ServiceBinding{} diff --git a/api/v1alpha1/serviceinstance_types.go b/api/v1alpha1/serviceinstance_types.go index 356c87e..e746b0b 100644 --- a/api/v1alpha1/serviceinstance_types.go +++ b/api/v1alpha1/serviceinstance_types.go @@ -10,11 +10,11 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -//+kubebuilder:object:root=true -//+kubebuilder:subresource:status -//+kubebuilder:printcolumn:name="State",type=string,JSONPath=`.status.state` -//+kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" -//+genclient +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:printcolumn:name="State",type=string,JSONPath=`.status.state` +// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" +// +genclient // ServiceInstance is the Schema for the serviceinstances API type ServiceInstance struct { @@ -27,7 +27,7 @@ type ServiceInstance struct { Status ServiceInstanceStatus `json:"status,omitempty"` } -//+kubebuilder:object:root=true +// +kubebuilder:object:root=true // ServiceInstanceList contains a list of ServiceInstance type ServiceInstanceList struct { diff --git a/api/v1alpha1/serviceinstance_webhook.go b/api/v1alpha1/serviceinstance_webhook.go index 159cf6a..f570153 100644 --- a/api/v1alpha1/serviceinstance_webhook.go +++ b/api/v1alpha1/serviceinstance_webhook.go @@ -23,7 +23,7 @@ func (r *ServiceInstance) SetupWebhookWithManager(mgr ctrl.Manager) error { Complete() } -//+kubebuilder:webhook:path=/mutate-cf-cs-sap-com-v1alpha1-serviceinstance,mutating=true,failurePolicy=fail,sideEffects=None,groups=cf.cs.sap.com,resources=serviceinstances,verbs=create;update,versions=v1alpha1,name=mserviceinstance.kb.io,admissionReviewVersions=v1 +// +kubebuilder:webhook:path=/mutate-cf-cs-sap-com-v1alpha1-serviceinstance,mutating=true,failurePolicy=fail,sideEffects=None,groups=cf.cs.sap.com,resources=serviceinstances,verbs=create;update,versions=v1alpha1,name=mserviceinstance.kb.io,admissionReviewVersions=v1 var _ webhook.Defaulter = &ServiceInstance{} @@ -46,7 +46,7 @@ func (r *ServiceInstance) Default() { } } -//+kubebuilder:webhook:path=/validate-cf-cs-sap-com-v1alpha1-serviceinstance,mutating=false,failurePolicy=fail,sideEffects=None,groups=cf.cs.sap.com,resources=serviceinstances,verbs=create;update,versions=v1alpha1,name=vserviceinstance.kb.io,admissionReviewVersions=v1 +// +kubebuilder:webhook:path=/validate-cf-cs-sap-com-v1alpha1-serviceinstance,mutating=false,failurePolicy=fail,sideEffects=None,groups=cf.cs.sap.com,resources=serviceinstances,verbs=create;update,versions=v1alpha1,name=vserviceinstance.kb.io,admissionReviewVersions=v1 var _ webhook.Validator = &ServiceInstance{} diff --git a/api/v1alpha1/space_types.go b/api/v1alpha1/space_types.go index 847c2db..51940df 100644 --- a/api/v1alpha1/space_types.go +++ b/api/v1alpha1/space_types.go @@ -9,11 +9,11 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -//+kubebuilder:object:root=true -//+kubebuilder:subresource:status -//+kubebuilder:printcolumn:name="State",type=string,JSONPath=`.status.state` -//+kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" -//+genclient +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:printcolumn:name="State",type=string,JSONPath=`.status.state` +// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" +// +genclient // Space is the Schema for the spaces API type Space struct { @@ -26,7 +26,7 @@ type Space struct { Status SpaceStatus `json:"status,omitempty"` } -//+kubebuilder:object:root=true +// +kubebuilder:object:root=true // SpaceList contains a list of Space type SpaceList struct { diff --git a/api/v1alpha1/space_webhook.go b/api/v1alpha1/space_webhook.go index 1fcf9e6..a7e0c8a 100644 --- a/api/v1alpha1/space_webhook.go +++ b/api/v1alpha1/space_webhook.go @@ -23,7 +23,7 @@ func (r *Space) SetupWebhookWithManager(mgr ctrl.Manager) error { Complete() } -//+kubebuilder:webhook:path=/mutate-cf-cs-sap-com-v1alpha1-space,mutating=true,failurePolicy=fail,sideEffects=None,groups=cf.cs.sap.com,resources=spaces,verbs=create;update,versions=v1alpha1,name=mspace.kb.io,admissionReviewVersions=v1 +// +kubebuilder:webhook:path=/mutate-cf-cs-sap-com-v1alpha1-space,mutating=true,failurePolicy=fail,sideEffects=None,groups=cf.cs.sap.com,resources=spaces,verbs=create;update,versions=v1alpha1,name=mspace.kb.io,admissionReviewVersions=v1 var _ webhook.Defaulter = &Space{} @@ -36,7 +36,7 @@ func (r *Space) Default() { } } -//+kubebuilder:webhook:path=/validate-cf-cs-sap-com-v1alpha1-space,mutating=false,failurePolicy=fail,sideEffects=None,groups=cf.cs.sap.com,resources=spaces,verbs=create;update,versions=v1alpha1,name=vspace.kb.io,admissionReviewVersions=v1 +// +kubebuilder:webhook:path=/validate-cf-cs-sap-com-v1alpha1-space,mutating=false,failurePolicy=fail,sideEffects=None,groups=cf.cs.sap.com,resources=spaces,verbs=create;update,versions=v1alpha1,name=vspace.kb.io,admissionReviewVersions=v1 var _ webhook.Validator = &Space{} diff --git a/config/crd/bases/cf.cs.sap.com_clusterspaces.yaml b/config/crd/bases/cf.cs.sap.com_clusterspaces.yaml index c2c471f..3f6cc6a 100644 --- a/config/crd/bases/cf.cs.sap.com_clusterspaces.yaml +++ b/config/crd/bases/cf.cs.sap.com_clusterspaces.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.10.0 + controller-gen.kubebuilder.io/version: v0.9.2 creationTimestamp: null name: clusterspaces.cf.cs.sap.com spec: diff --git a/config/crd/bases/cf.cs.sap.com_servicebindings.yaml b/config/crd/bases/cf.cs.sap.com_servicebindings.yaml index 04f6224..8cbd942 100644 --- a/config/crd/bases/cf.cs.sap.com_servicebindings.yaml +++ b/config/crd/bases/cf.cs.sap.com_servicebindings.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.10.0 + controller-gen.kubebuilder.io/version: v0.9.2 creationTimestamp: null name: servicebindings.cf.cs.sap.com spec: diff --git a/config/crd/bases/cf.cs.sap.com_serviceinstances.yaml b/config/crd/bases/cf.cs.sap.com_serviceinstances.yaml index 1baaff6..b88c531 100644 --- a/config/crd/bases/cf.cs.sap.com_serviceinstances.yaml +++ b/config/crd/bases/cf.cs.sap.com_serviceinstances.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.10.0 + controller-gen.kubebuilder.io/version: v0.9.2 creationTimestamp: null name: serviceinstances.cf.cs.sap.com spec: diff --git a/config/crd/bases/cf.cs.sap.com_spaces.yaml b/config/crd/bases/cf.cs.sap.com_spaces.yaml index 209048e..5286712 100644 --- a/config/crd/bases/cf.cs.sap.com_spaces.yaml +++ b/config/crd/bases/cf.cs.sap.com_spaces.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.10.0 + controller-gen.kubebuilder.io/version: v0.9.2 creationTimestamp: null name: spaces.cf.cs.sap.com spec: diff --git a/crds/cf.cs.sap.com_clusterspaces.yaml b/crds/cf.cs.sap.com_clusterspaces.yaml index c2c471f..3f6cc6a 100644 --- a/crds/cf.cs.sap.com_clusterspaces.yaml +++ b/crds/cf.cs.sap.com_clusterspaces.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.10.0 + controller-gen.kubebuilder.io/version: v0.9.2 creationTimestamp: null name: clusterspaces.cf.cs.sap.com spec: diff --git a/crds/cf.cs.sap.com_servicebindings.yaml b/crds/cf.cs.sap.com_servicebindings.yaml index 04f6224..8cbd942 100644 --- a/crds/cf.cs.sap.com_servicebindings.yaml +++ b/crds/cf.cs.sap.com_servicebindings.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.10.0 + controller-gen.kubebuilder.io/version: v0.9.2 creationTimestamp: null name: servicebindings.cf.cs.sap.com spec: diff --git a/crds/cf.cs.sap.com_serviceinstances.yaml b/crds/cf.cs.sap.com_serviceinstances.yaml index 1baaff6..b88c531 100644 --- a/crds/cf.cs.sap.com_serviceinstances.yaml +++ b/crds/cf.cs.sap.com_serviceinstances.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.10.0 + controller-gen.kubebuilder.io/version: v0.9.2 creationTimestamp: null name: serviceinstances.cf.cs.sap.com spec: diff --git a/crds/cf.cs.sap.com_spaces.yaml b/crds/cf.cs.sap.com_spaces.yaml index 209048e..5286712 100644 --- a/crds/cf.cs.sap.com_spaces.yaml +++ b/crds/cf.cs.sap.com_spaces.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.10.0 + controller-gen.kubebuilder.io/version: v0.9.2 creationTimestamp: null name: spaces.cf.cs.sap.com spec: diff --git a/internal/controllers/servicebinding_controller.go b/internal/controllers/servicebinding_controller.go index 613b5e0..7c556ac 100644 --- a/internal/controllers/servicebinding_controller.go +++ b/internal/controllers/servicebinding_controller.go @@ -49,13 +49,13 @@ type ServiceBindingReconciler struct { ClientBuilder facade.SpaceClientBuilder } -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=servicebindings,verbs=get;list;watch;update -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=servicebindings/status,verbs=get;update;patch -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=servicebindings/finalizers,verbs=update -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=serviceinstances,verbs=get;list;watch -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=clusterspaces,verbs=get;list;watch -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=spaces,verbs=get;list;watch -//+kubebuilder:rbac:groups=core,resources=secrets,verbs=get;list;watch;create;update;patch +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=servicebindings,verbs=get;list;watch;update +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=servicebindings/status,verbs=get;update;patch +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=servicebindings/finalizers,verbs=update +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=serviceinstances,verbs=get;list;watch +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=clusterspaces,verbs=get;list;watch +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=spaces,verbs=get;list;watch +// +kubebuilder:rbac:groups=core,resources=secrets,verbs=get;list;watch;create;update;patch func (r *ServiceBindingReconciler) Reconcile(ctx context.Context, req ctrl.Request) (result ctrl.Result, err error) { log := ctrl.LoggerFrom(ctx) diff --git a/internal/controllers/serviceinstance_controller.go b/internal/controllers/serviceinstance_controller.go index 82efc6a..89d2df3 100644 --- a/internal/controllers/serviceinstance_controller.go +++ b/internal/controllers/serviceinstance_controller.go @@ -46,13 +46,13 @@ type ServiceInstanceReconciler struct { ClientBuilder facade.SpaceClientBuilder } -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=serviceinstances,verbs=get;list;watch;update -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=serviceinstances/status,verbs=get;update;patch -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=serviceinstances/finalizers,verbs=update -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=clusterspaces,verbs=get;list;watch -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=spaces,verbs=get;list;watch -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=servicebindings,verbs=get;list;watch -//+kubebuilder:rbac:groups=core,resources=secrets,verbs=get;list;watch +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=serviceinstances,verbs=get;list;watch;update +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=serviceinstances/status,verbs=get;update;patch +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=serviceinstances/finalizers,verbs=update +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=clusterspaces,verbs=get;list;watch +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=spaces,verbs=get;list;watch +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=servicebindings,verbs=get;list;watch +// +kubebuilder:rbac:groups=core,resources=secrets,verbs=get;list;watch func (r *ServiceInstanceReconciler) Reconcile(ctx context.Context, req ctrl.Request) (result ctrl.Result, err error) { log := ctrl.LoggerFrom(ctx) diff --git a/internal/controllers/space_controller.go b/internal/controllers/space_controller.go index d63d3fc..79cd8c6 100644 --- a/internal/controllers/space_controller.go +++ b/internal/controllers/space_controller.go @@ -48,14 +48,14 @@ type SpaceReconciler struct { HealthCheckerBuilder facade.SpaceHealthCheckerBuilder } -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=clusterspaces,verbs=get;list;watch;update -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=clusterspaces/status,verbs=get;update;patch -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=clusterspaces/finalizers,verbs=update -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=spaces,verbs=get;list;watch;update -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=spaces/status,verbs=get;update;patch -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=spaces/finalizers,verbs=update -//+kubebuilder:rbac:groups=cf.cs.sap.com,resources=serviceinstances,verbs=get;list;watch -//+kubebuilder:rbac:groups=core,resources=secrets,verbs=get;list;watch;update +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=clusterspaces,verbs=get;list;watch;update +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=clusterspaces/status,verbs=get;update;patch +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=clusterspaces/finalizers,verbs=update +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=spaces,verbs=get;list;watch;update +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=spaces/status,verbs=get;update;patch +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=spaces/finalizers,verbs=update +// +kubebuilder:rbac:groups=cf.cs.sap.com,resources=serviceinstances,verbs=get;list;watch +// +kubebuilder:rbac:groups=core,resources=secrets,verbs=get;list;watch;update func (r *SpaceReconciler) Reconcile(ctx context.Context, req ctrl.Request) (result ctrl.Result, err error) { log := ctrl.LoggerFrom(ctx) diff --git a/main.go b/main.go index 4abc9dd..cc37588 100644 --- a/main.go +++ b/main.go @@ -27,7 +27,7 @@ import ( cfv1alpha1 "github.com/sap/cf-service-operator/api/v1alpha1" "github.com/sap/cf-service-operator/internal/cf" "github.com/sap/cf-service-operator/internal/controllers" - //+kubebuilder:scaffold:imports + // +kubebuilder:scaffold:imports ) const ( @@ -42,7 +42,7 @@ var ( func init() { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(cfv1alpha1.AddToScheme(scheme)) - //+kubebuilder:scaffold:scheme + // +kubebuilder:scaffold:scheme } func main() { @@ -56,7 +56,7 @@ func main() { flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.") flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.") flag.StringVar(&webhookAddr, "webhook-bind-address", ":9443", "The address the webhook endpoint binds to.") - flag.StringVar(&webhookCertDir, "webhook-tls-directory", "", "The directory containing tls server key and certificate, as tls.key and tls.crt; defaults to $TMPDIR/k8s-webhook-server/serving-certs") + flag.StringVar(&webhookCertDir, "webhook-tls-directory", "", "The directory containing tls server key and certificate, as tls.key and tls.crt; defaults to $TMPDIR/k8s-webhook-server/serving-certs.") flag.BoolVar(&enableLeaderElection, "leader-elect", false, "Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager.") flag.StringVar(&clusterResourceNamespace, "cluster-resource-namespace", "", "The namespace for secrets in which cluster-scoped resources are found.") flag.BoolVar(&enableBindingMetadata, "sap-binding-metadata", false, "Enhance binding secrets by SAP binding metadata by default.") @@ -174,7 +174,7 @@ func main() { setupLog.Error(err, "unable to create webhook", "webhook", "ServiceBinding") os.Exit(1) } - //+kubebuilder:scaffold:builder + // +kubebuilder:scaffold:builder if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { setupLog.Error(err, "unable to set up health check") diff --git a/website/content/en/docs/installation/_index.md b/website/content/en/docs/installation/_index.md index 2d2f464..afc17e9 100644 --- a/website/content/en/docs/installation/_index.md +++ b/website/content/en/docs/installation/_index.md @@ -11,7 +11,7 @@ cf-service-operator relies on four custom resource types, the according definiti [here](https://github.com/sap/cf-service-operator/tree/main/crds). These definitions must be deployed before the operator can be started, otherwise it will fail. The core of the cf-service-operator installation is the executable built from this repository -(Docker image `cs-devops.common.repositories.cloud.sap/cf-service-operator`). +(Docker image `ghcr.io/sap/cf-service-operator`). It implements both the controller logic and validating/mutating webhooks for the above custom resource types. A valid deployment consists of: