Skip to content
This repository was archived by the owner on Apr 24, 2024. It is now read-only.

Commit 910e0c4

Browse files
make: add an end-to-end test
Signed-off-by: Steve Kuznetsov <[email protected]>
1 parent b095739 commit 910e0c4

File tree

3 files changed

+365
-54
lines changed

3 files changed

+365
-54
lines changed

Makefile

Lines changed: 124 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,50 @@
1+
##@ Build Dependencies
2+
3+
## Location to install dependencies to
4+
LOCALBIN ?= $(shell pwd)/bin
5+
6+
## Tool Binaries
7+
KUSTOMIZE ?= $(LOCALBIN)/kustomize
8+
CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen
9+
ENVTEST ?= $(LOCALBIN)/setup-envtest
10+
KCP ?= $(LOCALBIN)/kcp
11+
KUBECTL_KCP ?= $(LOCALBIN)/kubectl-kcp
12+
13+
## Tool Versions
14+
KUSTOMIZE_VERSION ?= v3.8.7
15+
CONTROLLER_TOOLS_VERSION ?= v0.8.0
16+
KCP_VERSION ?= 0.7.5
17+
18+
KUSTOMIZE_INSTALL_SCRIPT ?= "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"
19+
$(KUSTOMIZE):
20+
mkdir -p $(LOCALBIN)
21+
curl -s $(KUSTOMIZE_INSTALL_SCRIPT) | bash -s -- $(subst v,,$(KUSTOMIZE_VERSION)) $(LOCALBIN)
22+
touch $(KUSTOMIZE) # we download an "old" file, so make will re-download to refresh it unless we make it newer than the owning dir
23+
24+
$(CONTROLLER_GEN):
25+
mkdir -p $(LOCALBIN)
26+
GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-tools/cmd/controller-gen@$(CONTROLLER_TOOLS_VERSION)
27+
28+
OS ?= $(shell go env GOOS )
29+
ARCH ?= $(shell go env GOARCH )
30+
31+
$(KCP): ## Download kcp locally if necessary.
32+
mkdir -p $(LOCALBIN)
33+
wget -qO- https://github.com/kcp-dev/kcp/releases/download/v$(KCP_VERSION)/kcp_$(KCP_VERSION)_$(OS)_$(ARCH).tar.gz | tar -xvzf - bin/kcp --directory $(LOCALBIN)/../
34+
touch $(KCP) # we download an "old" file, so make will re-download to refresh it unless we make it newer than the owning dir
35+
36+
$(KUBECTL_KCP): ## Download kcp kubectl plugins locally if necessary.
37+
mkdir -p $(LOCALBIN)
38+
wget -qO- https://github.com/kcp-dev/kcp/releases/download/v$(KCP_VERSION)/kubectl-kcp-plugin_$(KCP_VERSION)_$(OS)_$(ARCH).tar.gz | tar -xvzf - bin --directory $(LOCALBIN)/../
39+
touch $(KUBECTL_KCP) # we download an "old" file, so make will re-download to refresh it unless we make it newer than the owning dir
40+
41+
$(ENVTEST):
42+
mkdir -p $(LOCALBIN)
43+
GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest
144

2-
# Image URL to use all building/pushing image targets
3-
IMG ?= controller:latest
45+
# Image registry and URL to use all building/pushing image targets
46+
REGISTRY ?= localhost
47+
IMG ?= controller:test
448
# ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary.
549
ENVTEST_K8S_VERSION = 1.23
650

@@ -15,7 +59,7 @@ endif
1559
# This is a requirement for 'setup-envtest.sh' in the test target.
1660
# Options are set to exit when a recipe line exits non-zero or a piped command fails.
1761
SHELL = /usr/bin/env bash -o pipefail
18-
.SHELLFLAGS = -ec
62+
.SHELLFLAGS = -ecx
1963

2064
.PHONY: all
2165
all: build
@@ -43,15 +87,15 @@ help: ## Display this help.
4387
##@ Development
4488

4589
.PHONY: manifests
46-
manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects.
90+
manifests: $(CONTROLLER_GEN) ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects.
4791
$(CONTROLLER_GEN) rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases
4892

4993
.PHONY: apiresourceschemas
50-
apiresourceschemas: kustomize ## Convert CRDs from config/crds to APIResourceSchemas. Specify APIEXPORT_PREFIX as needed.
94+
apiresourceschemas: $(KUSTOMIZE) ## Convert CRDs from config/crds to APIResourceSchemas. Specify APIEXPORT_PREFIX as needed.
5195
$(KUSTOMIZE) build config/crd | kubectl kcp crd snapshot -f - --prefix $(APIEXPORT_PREFIX) > config/kcp/$(APIEXPORT_PREFIX).apiresourceschemas.yaml
5296

5397
.PHONY: generate
54-
generate: controller-gen ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations.
98+
generate: $(CONTROLLER_GEN) ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations.
5599
$(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./..."
56100

57101
.PHONY: fmt
@@ -63,9 +107,67 @@ vet: ## Run go vet against code.
63107
go vet ./...
64108

65109
.PHONY: test
66-
test: manifests generate fmt vet envtest ## Run tests.
110+
test: manifests generate fmt vet $(ENVTEST) ## Run tests.
67111
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./... -coverprofile cover.out
68112

113+
ARTIFACT_DIR ?= .test
114+
115+
.PHONY: test-e2e
116+
test-e2e: $(ARTIFACT_DIR)/kind.kubeconfig kcp-synctarget ready-deployment
117+
go test ./test/e2e/...
118+
119+
.PHONY: ready-deployment
120+
ready-deployment: KUBECONFIG = $(ARTIFACT_DIR)/kcp.kubeconfig
121+
ready-deployment: kind-image install deploy
122+
$(KCP_KUBECTL) --namespace "controller-runtime-example-system" rollout status deployment/controller-runtime-example-controller-manager
123+
124+
.PHONY: kind-image
125+
kind-image: docker-build
126+
kind load docker-image $(REGISTRY)/$(IMG) --name controller-runtime-example
127+
128+
$(ARTIFACT_DIR)/kind.kubeconfig: $(ARTIFACT_DIR)
129+
@if ! kind get clusters --quiet | grep --quiet controller-runtime-example; then kind create cluster --name controller-runtime-example; fi
130+
kind get kubeconfig --name controller-runtime-example > $(ARTIFACT_DIR)/kind.kubeconfig
131+
132+
$(ARTIFACT_DIR):
133+
mkdir -p $(ARTIFACT_DIR)
134+
135+
KCP_KUBECTL ?= PATH=$(LOCALBIN):$(PATH) KUBECONFIG=$(ARTIFACT_DIR)/kcp.kubeconfig kubectl
136+
KIND_KUBECTL ?= kubectl --kubeconfig $(ARTIFACT_DIR)/kind.kubeconfig
137+
138+
.PHONY: kcp-synctarget
139+
kcp-synctarget: kcp-workspace $(ARTIFACT_DIR)/syncer.yaml
140+
$(KIND_KUBECTL) apply -f $(ARTIFACT_DIR)/syncer.yaml
141+
$(eval DEPLOYMENT_NAME = $(shell yq 'select(.kind=="Deployment") | .metadata.name' --raw-output < $(ARTIFACT_DIR)/syncer.yaml ))
142+
$(eval DEPLOYMENT_NAMESPACE = $(shell yq 'select(.kind=="Deployment") | .metadata.namespace' --raw-output < $(ARTIFACT_DIR)/syncer.yaml ))
143+
$(KIND_KUBECTL) --namespace $(DEPLOYMENT_NAMESPACE) rollout status deployment/$(DEPLOYMENT_NAME)
144+
@if [[ ! -s $(ARTIFACT_DIR)/syncer.log ]]; then ( $(KIND_KUBECTL) --namespace $(DEPLOYMENT_NAMESPACE) logs deployment/$(DEPLOYMENT_NAME) -f >$(ARTIFACT_DIR)/syncer.log 2>&1 & ); fi
145+
$(KCP_KUBECTL) wait --for=condition=Ready synctarget/controller-runtime
146+
147+
$(ARTIFACT_DIR)/syncer.yaml:
148+
$(KCP_KUBECTL) kcp workload sync controller-runtime --resources services --syncer-image ghcr.io/kcp-dev/kcp/syncer:v$(KCP_VERSION) --output-file $(ARTIFACT_DIR)/syncer.yaml
149+
150+
.PHONY: kcp-workspace
151+
kcp-workspace: $(KUBECTL_KCP) kcp-server
152+
$(KCP_KUBECTL) kcp workspace use '~'
153+
@if ! $(KCP_KUBECTL) kcp workspace use controller-runtime-example; then $(KCP_KUBECTL) kcp workspace create controller-runtime-example --type universal --enter; fi
154+
155+
.PHONY: kcp-server
156+
kcp-server: $(KCP) $(ARTIFACT_DIR)/kcp
157+
@if [[ ! -s $(ARTIFACT_DIR)/kcp.log ]]; then ( $(KCP) start --root-directory $(ARTIFACT_DIR)/kcp --kubeconfig-path $(ARTIFACT_DIR)/kcp.kubeconfig >$(ARTIFACT_DIR)/kcp.log 2>&1 & ); fi
158+
@while true; do if [[ ! -s $(ARTIFACT_DIR)/kcp.kubeconfig ]]; then sleep 0.2; else break; fi; done
159+
@while true; do if ! kubectl --kubeconfig $(ARTIFACT_DIR)/kcp.kubeconfig get --raw /readyz >$(ARTIFACT_DIR)/kcp.probe.log 2>&1; then sleep 0.2; else break; fi; done
160+
161+
$(ARTIFACT_DIR)/kcp:
162+
mkdir -p $(ARTIFACT_DIR)/kcp
163+
164+
.PHONY: test-e2e-cleanup
165+
test-e2e-cleanup:
166+
kind delete cluster --name controller-runtime-example || true
167+
rm -rf $(ARTIFACT_DIR) || true
168+
pkill -sigterm kcp || true
169+
pkill -sigterm kubectl || true
170+
69171
##@ Build
70172

71173
.PHONY: build
@@ -81,68 +183,38 @@ run: manifests generate fmt vet ## Run a controller from your host.
81183

82184
.PHONY: docker-build
83185
docker-build: build ## Build docker image with the manager.
84-
docker build -t ${IMG} .
186+
docker build -t ${REGISTRY}/${IMG} .
85187

86188
.PHONY: docker-push
87189
docker-push: ## Push docker image with the manager.
88-
docker push ${IMG}
190+
docker push ${REGISTRY}/${IMG}
89191

90192
##@ Deployment
91193

92194
ifndef ignore-not-found
93195
ignore-not-found = false
94196
endif
95197

198+
KUBECONFIG ?= $(shell realpath ~/.kube/config )
199+
96200
.PHONY: install
97-
install: manifests kustomize ## Install APIResourceSchemas and APIExport into kcp (using $KUBECONFIG or ~/.kube/config).
98-
$(KUSTOMIZE) build config/kcp | kubectl apply -f -
201+
install: manifests $(KUSTOMIZE) ## Install APIResourceSchemas and APIExport into kcp (using $KUBECONFIG or ~/.kube/config).
202+
$(KUSTOMIZE) build config/kcp | kubectl --kubeconfig $(KUBECONFIG) apply -f -
99203

100204
.PHONY: uninstall
101-
uninstall: manifests kustomize ## Uninstall APIResourceSchemas and APIExport from kcp (using $KUBECONFIG or ~/.kube/config). Call with ignore-not-found=true to ignore resource not found errors during deletion.
102-
$(KUSTOMIZE) build config/kcp | kubectl delete --ignore-not-found=$(ignore-not-found) -f -
205+
uninstall: manifests $(KUSTOMIZE) ## Uninstall APIResourceSchemas and APIExport from kcp (using $KUBECONFIG or ~/.kube/config). Call with ignore-not-found=true to ignore resource not found errors during deletion.
206+
$(KUSTOMIZE) build config/kcp | kubectl --kubeconfig $(KUBECONFIG) delete --ignore-not-found=$(ignore-not-found) -f -
103207

104208
.PHONY: deploy-crd
105-
deploy-crd: manifests kustomize ## Deploy controller
106-
cd config/manager && $(KUSTOMIZE) edit set image controller=${IMG}
107-
$(KUSTOMIZE) build config/default-crd | kubectl apply -f - || true
209+
deploy-crd: manifests $(KUSTOMIZE) ## Deploy controller
210+
cd config/manager && $(KUSTOMIZE) edit set image controller=${REGISTRY}/${IMG}
211+
$(KUSTOMIZE) build config/default-crd | kubectl --kubeconfig $(KUBECONFIG) apply -f - || true
108212

109213
.PHONY: deploy
110-
deploy: manifests kustomize ## Deploy controller
111-
cd config/manager && $(KUSTOMIZE) edit set image controller=${IMG}
112-
$(KUSTOMIZE) build config/default | kubectl apply -f -
214+
deploy: manifests $(KUSTOMIZE) ## Deploy controller
215+
cd config/manager && $(KUSTOMIZE) edit set image controller=${REGISTRY}/${IMG}
216+
$(KUSTOMIZE) build config/default | kubectl --kubeconfig $(KUBECONFIG) apply -f -
113217

114218
.PHONY: undeploy
115219
undeploy: ## Undeploy controller. Call with ignore-not-found=true to ignore resource not found errors during deletion.
116-
$(KUSTOMIZE) build config/default | kubectl delete --ignore-not-found=$(ignore-not-found) -f -
117-
118-
##@ Build Dependencies
119-
120-
## Location to install dependencies to
121-
LOCALBIN ?= $(shell pwd)/bin
122-
$(LOCALBIN):
123-
mkdir -p $(LOCALBIN)
124-
125-
## Tool Binaries
126-
KUSTOMIZE ?= $(LOCALBIN)/kustomize
127-
CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen
128-
ENVTEST ?= $(LOCALBIN)/setup-envtest
129-
130-
## Tool Versions
131-
KUSTOMIZE_VERSION ?= v3.8.7
132-
CONTROLLER_TOOLS_VERSION ?= v0.8.0
133-
134-
KUSTOMIZE_INSTALL_SCRIPT ?= "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"
135-
.PHONY: kustomize
136-
kustomize: $(KUSTOMIZE) ## Download kustomize locally if necessary.
137-
$(KUSTOMIZE): $(LOCALBIN)
138-
curl -s $(KUSTOMIZE_INSTALL_SCRIPT) | bash -s -- $(subst v,,$(KUSTOMIZE_VERSION)) $(LOCALBIN)
139-
140-
.PHONY: controller-gen
141-
controller-gen: $(CONTROLLER_GEN) ## Download controller-gen locally if necessary.
142-
$(CONTROLLER_GEN): $(LOCALBIN)
143-
GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-tools/cmd/controller-gen@$(CONTROLLER_TOOLS_VERSION)
144-
145-
.PHONY: envtest
146-
envtest: $(ENVTEST) ## Download envtest-setup locally if necessary.
147-
$(ENVTEST): $(LOCALBIN)
148-
GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest
220+
$(KUSTOMIZE) build config/default | kubectl --kubeconfig $(KUBECONFIG) delete --ignore-not-found=$(ignore-not-found) -f -

config/manager/kustomization.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ apiVersion: kustomize.config.k8s.io/v1beta1
1212
kind: Kustomization
1313
images:
1414
- name: controller
15-
newName: controller
16-
newTag: latest
15+
newName: localhost/controller
16+
newTag: test

0 commit comments

Comments
 (0)