mirror of
https://github.com/YuzuZensai/netbird-kubernetes-operator.git
synced 2026-09-13 18:59:09 +00:00
This change adds two new resources, NetworkRouter and NetworkResource, which enable clusters to expose Kubernetes services to Netbird. The NetworkRouter is responsible for creating the network, group, setup key and routing peer all of which are unique to the isntance. Along with the deployment of the client in the cluster. The NetworkResource exposes a service by linking to the specific router it wants to expose to. This makes coupling between the resource and network easy to understand. Routers also set a DNS zone which is used to give names to resources based on the name and namespace of the service being exposed. Part of #172 Signed-off-by: Philip Laine <philip.laine@gmail.com>
158 lines
5.6 KiB
Makefile
158 lines
5.6 KiB
Makefile
# Image URL to use all building/pushing image targets
|
|
IMG ?= docker.io/netbirdio/kubernetes-operator:latest
|
|
|
|
# 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
|
|
|
|
# Setting SHELL to bash allows bash commands to be executed by recipes.
|
|
# 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
|
|
|
|
.PHONY: all
|
|
all: build
|
|
|
|
##@ Development
|
|
|
|
.PHONY: manifests
|
|
manifests: ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects.
|
|
go tool controller-gen crd paths="./..." output:crd:artifacts:config=helm/kubernetes-operator/crds
|
|
|
|
.PHONY: generate
|
|
generate: ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations.
|
|
go tool controller-gen applyconfiguration:headerFile="hack/boilerplate.go.txt" object:headerFile="hack/boilerplate.go.txt" paths="./..."
|
|
|
|
.PHONY: fmt
|
|
fmt: ## Run go fmt against code.
|
|
go fmt ./...
|
|
|
|
.PHONY: vet
|
|
vet: ## Run go vet against code.
|
|
go vet ./...
|
|
|
|
.PHONY: test
|
|
test: manifests fmt vet setup-envtest ## Run tests.
|
|
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(LOCALBIN) -p path)" go test -v $$(go list ./... | grep -v /e2e) -coverprofile cover.out
|
|
|
|
.PHONY: test-e2e
|
|
test-e2e: manifests fmt vet ## Run the e2e tests. Expected an isolated environment using Kind.
|
|
@command -v kind >/dev/null 2>&1 || { \
|
|
echo "Kind is not installed. Please install Kind manually."; \
|
|
exit 1; \
|
|
}
|
|
@kind get clusters | grep -q 'kind' || { \
|
|
echo "No Kind cluster is running. Please start a Kind cluster before running the e2e tests."; \
|
|
exit 1; \
|
|
}
|
|
go test ./test/e2e/ -v -ginkgo.v
|
|
|
|
.PHONY: lint
|
|
lint: golangci-lint ## Run golangci-lint linter
|
|
$(GOLANGCI_LINT) run
|
|
|
|
.PHONY: lint-fix
|
|
lint-fix: golangci-lint ## Run golangci-lint linter and perform fixes
|
|
$(GOLANGCI_LINT) run --fix
|
|
|
|
.PHONY: lint-config
|
|
lint-config: golangci-lint ## Verify golangci-lint linter configuration
|
|
$(GOLANGCI_LINT) config verify
|
|
|
|
##@ Build
|
|
|
|
.PHONY: build
|
|
build: manifests fmt vet ## Build manager binary.
|
|
go build -o bin/manager cmd/main.go
|
|
|
|
.PHONY: run
|
|
run: manifests fmt vet ## Run a controller from your host.
|
|
go run ./cmd/main.go
|
|
|
|
.PHONY: docker-build
|
|
docker-build: ## Build docker image with the manager.
|
|
docker build -t ${IMG} .
|
|
|
|
.PHONY: build-installer
|
|
build-installer: manifests ## Generate a consolidated YAML with CRDs and deployment.
|
|
mkdir -p manifests
|
|
$(HELM) template --include-crds kubernetes-operator helm/kubernetes-operator > manifests/install.yaml
|
|
|
|
##@ Deployment
|
|
|
|
ifndef ignore-not-found
|
|
ignore-not-found = false
|
|
endif
|
|
|
|
.PHONY: install
|
|
install: manifests ## Install CRDs into the K8s cluster specified in ~/.kube/config.
|
|
$(KUBECTL) apply --server-side -f helm/kubernetes-operator/crds
|
|
|
|
.PHONY: uninstall
|
|
uninstall: manifests ## Uninstall CRDs from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion.
|
|
$(KUBECTL) delete -f helm/kubernetes-operator/crds
|
|
|
|
.PHONY: deploy
|
|
deploy: manifests ## Deploy controller to the K8s cluster specified in ~/.kube/config.
|
|
$(HELM) install -n netbird --create-namespace kubernetes-operator --set operator.image.tag=$(word 2,$(subst :, ,${IMG})) helm/kubernetes-operator
|
|
|
|
.PHONY: undeploy
|
|
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.
|
|
$(HELM) uninstall -n netbird kubernetes-operator
|
|
|
|
##@ Dependencies
|
|
|
|
## Location to install dependencies to
|
|
LOCALBIN ?= $(shell pwd)/bin
|
|
$(LOCALBIN):
|
|
mkdir -p $(LOCALBIN)
|
|
|
|
## Tool Binaries
|
|
KUBECTL ?= kubectl
|
|
ENVTEST ?= $(LOCALBIN)/setup-envtest
|
|
GOLANGCI_LINT = $(LOCALBIN)/golangci-lint
|
|
HELM ?= helm
|
|
|
|
#ENVTEST_VERSION is the version of controller-runtime release branch to fetch the envtest setup script (i.e. release-0.20)
|
|
ENVTEST_VERSION ?= $(shell go list -m -f "{{ .Version }}" sigs.k8s.io/controller-runtime | awk -F'[v.]' '{printf "release-%d.%d", $$2, $$3}')
|
|
#ENVTEST_K8S_VERSION is the version of Kubernetes to use for setting up ENVTEST binaries (i.e. 1.31)
|
|
ENVTEST_K8S_VERSION ?= $(shell go list -m -f "{{ .Version }}" k8s.io/api | awk -F'[v.]' '{printf "1.%d", $$3}')
|
|
GOLANGCI_LINT_VERSION ?= v1.63.4
|
|
|
|
.PHONY: setup-envtest
|
|
setup-envtest: envtest ## Download the binaries required for ENVTEST in the local bin directory.
|
|
@echo "Setting up envtest binaries for Kubernetes version $(ENVTEST_K8S_VERSION)..."
|
|
@$(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(LOCALBIN) -p path || { \
|
|
echo "Error: Failed to set up envtest binaries for version $(ENVTEST_K8S_VERSION)."; \
|
|
exit 1; \
|
|
}
|
|
|
|
.PHONY: envtest
|
|
envtest: $(ENVTEST) ## Download setup-envtest locally if necessary.
|
|
$(ENVTEST): $(LOCALBIN)
|
|
$(call go-install-tool,$(ENVTEST),sigs.k8s.io/controller-runtime/tools/setup-envtest,$(ENVTEST_VERSION))
|
|
|
|
.PHONY: golangci-lint
|
|
golangci-lint: $(GOLANGCI_LINT) ## Download golangci-lint locally if necessary.
|
|
$(GOLANGCI_LINT): $(LOCALBIN)
|
|
$(call go-install-tool,$(GOLANGCI_LINT),github.com/golangci/golangci-lint/cmd/golangci-lint,$(GOLANGCI_LINT_VERSION))
|
|
|
|
# go-install-tool will 'go install' any package with custom target and name of binary, if it doesn't exist
|
|
# $1 - target path with name of binary
|
|
# $2 - package url which can be installed
|
|
# $3 - specific version of package
|
|
define go-install-tool
|
|
@[ -f "$(1)-$(3)" ] || { \
|
|
set -e; \
|
|
package=$(2)@$(3) ;\
|
|
echo "Downloading $${package}" ;\
|
|
rm -f $(1) || true ;\
|
|
GOBIN=$(LOCALBIN) go install $${package} ;\
|
|
mv $(1) $(1)-$(3) ;\
|
|
} ;\
|
|
ln -sf $(1)-$(3) $(1)
|
|
endef
|