-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
235 lines (177 loc) · 11.2 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
# 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
MKFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
PROJECT_PATH := $(patsubst %/,%,$(dir $(MKFILE_PATH)))
KIND_CLUSTER_NAME ?= kamwiel-cluster
# Produce CRDs that work back to Kubernetes 1.11 (no version conversion)
CRD_OPTIONS ?= "crd:trivialVersions=true,preserveUnknownFields=false"
CLUSTER_NAMESPACE ?= kamwiel
KIND_IMAGE ?= kindest/node:v1.19.1
KAMWIEL_IMG ?= kamwiel:local
KAMWIEL_PORT ?= 3000
KUADRANT_VERSION=v0.0.1-pre3
AUTHORINO_VERSION=v0.4.0
AUTHORINO_IMAGE ?= quay.io/3scale/authorino:v0.4.0
AUTHORINO_DEPLOYMENT ?= namespaced-notls
AUTHORINO_REPLICAS ?= 1
API_KEY_NAME ?= kamwiel-apikey-1
API_KEY ?= $(eval API_KEY := $(shell openssl rand -hex 32))$(API_KEY)
GITHUB_ENDPOINT ?= https://api.github.com/repos/3scale-labs/kamrad/dispatches
GITHUB_TOKEN ?= REPLACE_WITH_YOUR_GH_TOKEN
FULL_STATIC ?= false
# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)
ifeq (,$(shell go env GOBIN))
GOBIN=$(shell go env GOPATH)/bin
else
GOBIN=$(shell go env GOBIN)
endif
all: help build
##@ General
# The help target prints out all targets with their descriptions organized
# beneath their categories.
help: ## Display this help.
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
##@ Development
manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects.
$(CONTROLLER_GEN) $(CRD_OPTIONS) rbac:roleName=manager-role webhook paths="./..." output:crd:artifacts:config=config/crd/bases
generate: controller-gen ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations.
$(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./..."
generate-kuadrant-manifest: kustomize ## Generates Kuadrant CRDs.
$(eval TMP := $(shell mktemp -d))
cd $(TMP); git clone --depth 1 --branch $(KUADRANT_VERSION) https://github.com/kuadrant/kuadrant-controller.git
cd $(TMP)/kuadrant-controller; make kustomize; $(KUSTOMIZE) build config/crd -o $(PROJECT_PATH)/examples/kuadrant/autogenerated/kuadrant-manifest.yaml
-rm -rf $(TMP)
generate-authorino-manifest: kustomize ## Generates Authorino CRDs, RBAC, etc.
$(eval TMP := $(shell mktemp -d))
cd $(TMP); git clone --depth 1 --branch $(AUTHORINO_VERSION) https://github.com/kuadrant/authorino.git
cd $(TMP)/authorino; make kustomize; $(KUSTOMIZE) build install -o $(PROJECT_PATH)/examples/authorino/autogenerated/authorino-manifest.yaml
$(KUSTOMIZE) build $(TMP)/authorino/deploy/overlays/$(AUTHORINO_DEPLOYMENT) | kubectl -n $(CLUSTER_NAMESPACE) apply -f -
-rm -rf $(TMP)
fmt: ## Run go fmt against code.
go fmt ./...
vet: ## Run go vet against code.
go vet ./...
test: test-unit test-integration ## Run all tests.
test-unit: fmt vet ## Run Unit tests.
go test ./... -coverprofile cover.out -tags unit -v -timeout 0
test-integration: manifests generate fmt vet envtest ## Run Integration tests.
KUBEBUILDER_ASSETS='$(strip $(shell $(ENVTEST) use -p path 1.21.2))' go test ./... -coverprofile cover.out -tags integration -ginkgo.v -ginkgo.progress -v -timeout 0
##@ Build
build: fmt vet ## Build Kamwiel binary
go build -o bin/kamwiel main.go
run: manifests generate fmt vet ## Run kamwiel from your host.
PORT=$(KAMWIEL_PORT) go run ./main.go
docker-build: test ## Build kamwiel docker image
docker build . -t $(KAMWIEL_IMG)
docker-push: ## Push kamwiel image to docker repo
docker push $(KAMWIEL_IMG)
local-build-and-push: ## Build an image locally and push it to the registry of the Kind-started local K8s cluster
ifneq (1, $(SKIP_LOCAL_BUILD))
$(eval KAMWIEL_IMG = kamwiel:local)
$(MAKE) docker-build KAMWIEL_IMG=$(KAMWIEL_IMG)
$(MAKE) local-push KAMWIEL_IMG=$(KAMWIEL_IMG)
endif
##@ Deployment
namespace: ## Create namespace for kamwiel
kubectl create namespace $(CLUSTER_NAMESPACE)
# install: manifests kustomize install-manifest install-kuadrant-manifest install-authorino-manifest install-example-config ## Install Kuadrant and Authorino manifest, and samples into the K8s cluster specified in ~/.kube/config.
# $(KUSTOMIZE) build config/crd | kubectl -n $(CLUSTER_NAMESPACE) apply -f -
install: install-kuadrant-manifest install-authorino-manifest install-example-config ## Install Kuadrant and Authorino manifest, and samples into the K8s cluster specified in ~/.kube/config.
install-kuadrant-manifest: ## Install example kuadrant CRDs, Services, etc
kubectl -n $(CLUSTER_NAMESPACE) apply -f examples/kuadrant/autogenerated/kuadrant-manifest.yaml
install-authorino-manifest: ## Install example authorino CRDs, Services, etc
kubectl -n $(CLUSTER_NAMESPACE) apply -f examples/authorino/autogenerated/authorino-manifest.yaml
install-example-config: ## Install Authorino protection and Kuadrant API Product samples
kubectl -n $(CLUSTER_NAMESPACE) apply -f examples/authorino-protection.yaml
kubectl -n $(CLUSTER_NAMESPACE) apply -f examples/kuadrant/samples/api_samples.yaml
uninstall: manifests kustomize ## Uninstall CRDs from the K8s cluster specified in ~/.kube/config.
$(KUSTOMIZE) build config/crd | kubectl delete -f -
kubectl -n $(CLUSTER_NAMESPACE) delete -f examples/kuadrant/autogenerated/kuadrant-manifest.yaml
kubectl -n $(CLUSTER_NAMESPACE) delete -f examples/authorino/autogenerated/authorino-manifest.yaml
kubectl -n $(CLUSTER_NAMESPACE) delete -f examples/authorino-protection.yaml
kubectl -n $(CLUSTER_NAMESPACE) delete -f examples/kuadrant/samples/api_samples.yaml
install-jobs: manifests kustomize ## Install CronJobs (i.e.: Webhook)
GITHUB_ENDPOINT=$(GITHUB_ENDPOINT) GITHUB_TOKEN=$(GITHUB_TOKEN) $(KUSTOMIZE) build config/jobs | kubectl -n $(CLUSTER_NAMESPACE) apply -f -
cert-manager: ## Install a CertManager to the Kubernetes cluster
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.4.0/cert-manager.yaml
kubectl -n cert-manager wait --timeout=300s --for=condition=Available deployments --all
deploy: kustomize ## Deploy Kamwiel to the K8s cluster specified in ~/.kube/config.
cd config/manager && $(KUSTOMIZE) edit set image controller=$(KAMWIEL_IMG) && $(KUSTOMIZE) edit set namespace $(CLUSTER_NAMESPACE)
$(KUSTOMIZE) build config/default | kubectl -n $(CLUSTER_NAMESPACE) apply -f -
deploy-authorino: kustomize ## Deploy Authorino.
$(eval TMP := $(shell mktemp -d))
cd $(TMP); git clone --depth 1 --branch $(AUTHORINO_VERSION) https://github.com/kuadrant/authorino.git
cd $(TMP)/authorino/deploy/base && $(KUSTOMIZE) edit set image authorino=$(AUTHORINO_IMAGE) && $(KUSTOMIZE) edit set namespace $(CLUSTER_NAMESPACE) && $(KUSTOMIZE) edit set replicas authorino-controller-manager=$(AUTHORINO_REPLICAS)
cd $(TMP)/authorino/deploy/overlays/$(AUTHORINO_DEPLOYMENT) && $(KUSTOMIZE) edit set namespace $(CLUSTER_NAMESPACE)
cd $(TMP)/authorino/ && $(KUSTOMIZE) build deploy/overlays/$(AUTHORINO_DEPLOYMENT) | kubectl -n $(CLUSTER_NAMESPACE) apply -f -
-rm -rf $(TMP)
deploy-envoy: ## Deploy Envoy
kubectl -n $(CLUSTER_NAMESPACE) apply -f examples/envoy-deployment.yaml
undeploy: ## Undeploy controller from the K8s cluster specified in ~/.kube/config.
$(KUSTOMIZE) build config/default | kubectl delete -f -
create-apikey: ## Create a new api key in the cluster, API_KEY_NAME env specifies the identifier of the key
@{ \
echo "***************************************************************************"; \
echo '{"apiVersion": "v1", "kind": "Secret", "metadata": {"name": "$(API_KEY_NAME)", "labels": { "authorino.3scale.net/managed-by": "authorino", "custom-label": "friends" } }, "stringData": { "api_key": "$(API_KEY)" }, "type": "Opaque"}' | kubectl -n $(CLUSTER_NAMESPACE) apply -f - ; \
echo "API KEY successfully created with name: ${API_KEY_NAME} and value: ${API_KEY}"; \
echo "***************************************************************************"; \
echo; \
}
local-cluster-up: kind local-cleanup ## Start a local Kubernetes cluster using Kind
kind create cluster --name $(KIND_CLUSTER_NAME) --image $(KIND_IMAGE) --config ./utils/kind-cluster.yaml
local-push: kind ## Push a local container image of Kamwiel to the registry of the Kind-started local Kubernetes cluster
kind load docker-image $(KAMWIEL_IMG) --name $(KIND_CLUSTER_NAME)
local-deploy: deploy ## Deploy Kamwiel and Sets the imagePullPolicy to 'IfNotPresent' so it doesn't try to pull the image again (just pushed into the server registry)
kubectl -n $(CLUSTER_NAMESPACE) patch deployment kamwiel-controller-manager -p '{"spec": {"template": {"spec":{"containers":[{"name": "manager", "imagePullPolicy":"IfNotPresent"}]}}}}'
local-rollout: docker-build local-push ## Rebuild, push the docker image and redeploy Kamwiel to kind
kubectl -n $(CLUSTER_NAMESPACE) rollout restart deployment.apps/kamwiel-controller-manager
local-setup: local-cluster-up local-build-and-push namespace install deploy deploy-envoy deploy-authorino create-apikey ## Set up a test/dev local Kubernetes server loaded up with a freshly built Kamwiel image plus dependencies
ifeq (true, $(FULL_STATIC))
$(MAKE) install-jobs GITHUB_ENDPOINT=$(GITHUB_ENDPOINT) GITHUB_TOKEN=$(GITHUB_TOKEN)
endif
kubectl -n $(CLUSTER_NAMESPACE) wait --timeout=500s --for=condition=Available deployments --all
@{ \
echo "Now you can export the envoy service by doing:"; \
echo "kubectl port-forward --namespace $(CLUSTER_NAMESPACE) deployment/envoy 8000:8000 &"; \
echo "After that, you can curl kamwiel with the created API KEY like:"; \
echo "curl -H 'X-API-KEY: $(API_KEY)' http://kamwiel-authorino.127.0.0.1.nip.io:8000/ping -v"; \
echo ;\
echo "***************************************************************************"; \
echo "************************** Voilà, profit!!! *******************************"; \
echo "***************************************************************************"; \
}
local-cleanup: kind ## Deletes the local Kubernetes cluster started using Kind
kind delete cluster --name $(KIND_CLUSTER_NAME)
##@ Tooling
# 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
CONTROLLER_GEN = $(shell pwd)/bin/controller-gen
controller-gen: ## Download controller-gen locally if necessary.
$(call go-get-tool,$(CONTROLLER_GEN),sigs.k8s.io/controller-tools/cmd/controller-gen@v0.6.1)
KUSTOMIZE = $(shell pwd)/bin/kustomize
kustomize: ## Download kustomize locally if necessary.
$(call go-get-tool,$(KUSTOMIZE),sigs.k8s.io/kustomize/kustomize/v3@v3.8.7)
KIND = $(shell pwd)/bin/kind
kind: ## Download kind locally if necessary.
$(call go-get-tool,$(KIND),sigs.k8s.io/kind@v0.11.1)
envtest: ## Download envtest-setup locally if necessary.
ifeq (, $(shell which setup-envtest))
go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest
ENVTEST=$(GOBIN)/setup-envtest
else
ENVTEST=$(shell which setup-envtest)
endif