diff --git a/exp/cluster-api-provider-kubekey/Makefile b/exp/cluster-api-provider-kubekey/Makefile index 3e2ff4d1..e8fc21ca 100644 --- a/exp/cluster-api-provider-kubekey/Makefile +++ b/exp/cluster-api-provider-kubekey/Makefile @@ -35,9 +35,7 @@ TOOLS_BIN_DIR := $(abspath $(TOOLS_DIR)/$(BIN_DIR)) E2E_FRAMEWORK_DIR := $(TEST_DIR)/framework GO_INSTALL := ./scripts/go_install.sh -TAG ?= dev -ARCH ?= $(shell go env GOARCH) -ALL_ARCH = amd64 arm arm64 ppc64le s390x +export PATH := $(abspath $(TOOLS_BIN_DIR)):$(PATH) # # Binaries. @@ -83,15 +81,18 @@ TAG ?= dev ARCH ?= $(shell go env GOARCH) ALL_ARCH = amd64 arm arm64 ppc64le s390x +# Allow overriding the imagePullPolicy +PULL_POLICY ?= Always + # Set build time variables including version details LDFLAGS := $(shell hack/version.sh) .PHONY: all -all: build +all: test managers .PHONY: help help: ## Display this help. - @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\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) + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n\nTargets:\n"} /^[0-9A-Za-z_-]+:.*?##/ { printf " \033[36m%-45s\033[0m %s\n", $$1, $$2 } /^\$$\([0-9A-Za-z_-]+\):.*?##/ { gsub("_","-", $$1); printf " \033[36m%-45s\033[0m %s\n", tolower(substr($$1, 3, length($$1)-7)), $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) ## -------------------------------------- ## Generate / Manifests @@ -99,13 +100,41 @@ help: ## Display this help. ##@ generate: -.PHONY: manifests -manifests: $(CONTROLLER_GEN) ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects. - $(CONTROLLER_GEN) rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases +ALL_GENERATE_MODULES = capkk .PHONY: generate -generate: $(CONTROLLER_GEN) ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations. - $(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./..." +generate: ## Run all generate-manifests-*, generate-go-deepcopy-* targets + $(MAKE) generate-modules generate-manifests generate-go-deepcopy + +.PHONY: generate-manifests +generate-manifests: ## Run all generate-manifest-* targets + $(MAKE) $(addprefix generate-manifests-,$(ALL_GENERATE_MODULES)) + +.PHONY: generate-manifests-capkk +generate-manifests-capkk: $(CONTROLLER_GEN) $(KUSTOMIZE) ## Generate manifests e.g. CRD, RBAC etc. for core + $(MAKE) clean-generated-yaml SRC_DIRS="./config/crd/bases" + $(CONTROLLER_GEN) \ + paths=./api/... \ + crd:crdVersions=v1 \ + rbac:roleName=manager-role \ + output:crd:dir=./config/crd/bases \ + output:webhook:dir=./config/webhook \ + webhook + +.PHONY: generate-go-deepcopy +generate-go-deepcopy: ## Run all generate-go-deepcopy-* targets + $(MAKE) $(addprefix generate-go-deepcopy-,$(ALL_GENERATE_MODULES)) + +.PHONY: generate-go-deepcopy-capkk +generate-go-deepcopy-capkk: $(CONTROLLER_GEN) ## Generate deepcopy go code for core + $(MAKE) clean-generated-deepcopy SRC_DIRS="./api" + $(CONTROLLER_GEN) \ + object:headerFile=./hack/boilerplate.go.txt \ + paths=./api/... \ + +.PHONY: generate-modules +generate-modules: ## Run go mod tidy to ensure modules are up to date + go mod tidy ## -------------------------------------- ## Lint / Verify @@ -145,103 +174,6 @@ verify-gen: generate ## Verify go generated files are up to date echo "generated files are out of date, run make generate"; exit 1; \ fi -##@ Build - -.PHONY: build -build: generate fmt vet ## Build manager binary. - go build -o bin/manager main.go - -.PHONY: run -run: manifests generate fmt vet ## Run a controller from your host. - go run ./main.go - -.PHONY: docker-build -docker-build: ## Build docker image with the manager. - docker build -t ${IMG} . - -.PHONY: docker-push -docker-push: ## Push docker image with the manager. - docker push ${IMG} - -##@ Deployment - -ifndef ignore-not-found - ignore-not-found = false -endif - -.PHONY: install -install: manifests kustomize ## Install CRDs into the K8s cluster specified in ~/.kube/config. - $(KUSTOMIZE) build config/crd | kubectl apply -f - - -.PHONY: uninstall -uninstall: manifests kustomize ## Uninstall CRDs 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/crd | kubectl delete --ignore-not-found=$(ignore-not-found) -f - - -.PHONY: deploy -deploy: manifests kustomize ## Deploy controller to the K8s cluster specified in ~/.kube/config. - cd config/manager && $(KUSTOMIZE) edit set image controller=${IMG} - $(KUSTOMIZE) build config/default | kubectl apply -f - - -.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. - $(KUSTOMIZE) build config/default | kubectl delete --ignore-not-found=$(ignore-not-found) -f - - -.PHONY: bundle -bundle: manifests kustomize ## Generate bundle manifests and metadata, then validate generated files. - operator-sdk generate kustomize manifests -q - cd config/manager && $(KUSTOMIZE) edit set image controller=$(IMG) - $(KUSTOMIZE) build config/manifests | operator-sdk generate bundle $(BUNDLE_GEN_FLAGS) - operator-sdk bundle validate ./bundle - -.PHONY: bundle-build -bundle-build: ## Build the bundle image. - docker build -f bundle.Dockerfile -t $(BUNDLE_IMG) . - -.PHONY: bundle-push -bundle-push: ## Push the bundle image. - $(MAKE) docker-push IMG=$(BUNDLE_IMG) - -.PHONY: opm -OPM = ./bin/opm -opm: ## Download opm locally if necessary. -ifeq (,$(wildcard $(OPM))) -ifeq (,$(shell which opm 2>/dev/null)) - @{ \ - set -e ;\ - mkdir -p $(dir $(OPM)) ;\ - OS=$(shell go env GOOS) && ARCH=$(shell go env GOARCH) && \ - curl -sSLo $(OPM) https://github.com/operator-framework/operator-registry/releases/download/v1.19.1/$${OS}-$${ARCH}-opm ;\ - chmod +x $(OPM) ;\ - } -else -OPM = $(shell which opm) -endif -endif - -# A comma-separated list of bundle images (e.g. make catalog-build BUNDLE_IMGS=example.com/operator-bundle:v0.1.0,example.com/operator-bundle:v0.2.0). -# These images MUST exist in a registry and be pull-able. -BUNDLE_IMGS ?= $(BUNDLE_IMG) - -# The image tag given to the resulting catalog image (e.g. make catalog-build CATALOG_IMG=example.com/operator-catalog:v0.2.0). -CATALOG_IMG ?= $(IMAGE_TAG_BASE)-catalog:v$(VERSION) - -# Set CATALOG_BASE_IMG to an existing catalog image tag to add $BUNDLE_IMGS to that image. -ifneq ($(origin CATALOG_BASE_IMG), undefined) -FROM_INDEX_OPT := --from-index $(CATALOG_BASE_IMG) -endif - -# Build a catalog image by adding bundle images to an empty catalog using the operator package manager tool, 'opm'. -# This recipe invokes 'opm' in 'semver' bundle add mode. For more information on add modes, see: -# https://github.com/operator-framework/community-operators/blob/7f1438c/docs/packaging-operator.md#updating-your-existing-operator -.PHONY: catalog-build -catalog-build: opm ## Build a catalog image. - $(OPM) index add --container-tool docker --mode semver --tag $(CATALOG_IMG) --bundles $(BUNDLE_IMGS) $(FROM_INDEX_OPT) - -# Push the catalog image. -.PHONY: catalog-push -catalog-push: ## Push a catalog image. - $(MAKE) docker-push IMG=$(CATALOG_IMG) - ## -------------------------------------- ## Binaries ## -------------------------------------- @@ -282,6 +214,34 @@ docker-build-e2e: ## Build the docker image for capkk $(MAKE) set-manifest-image MANIFEST_IMG=$(CAPKK_CONTROLLER_IMG) MANIFEST_TAG="e2e" TARGET_RESOURCE="./config/default/manager_image_patch.yaml" $(MAKE) set-manifest-pull-policy PULL_POLICY=IfNotPresent TARGET_RESOURCE="./config/default/manager_pull_policy.yaml" +## -------------------------------------- +## Deployment +## -------------------------------------- + +##@ deployment + +ifndef ignore-not-found + ignore-not-found = false +endif + +.PHONY: install +install: generate $(KUSTOMIZE) ## Install CRDs into the K8s cluster specified in ~/.kube/config. + $(KUSTOMIZE) build config/crd | kubectl apply -f - + +.PHONY: uninstall +uninstall: generate $(KUSTOMIZE) ## Uninstall CRDs 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/crd | kubectl delete --ignore-not-found=$(ignore-not-found) -f - + +.PHONY: deploy +deploy: generate $(KUSTOMIZE) ## Deploy controller to the K8s cluster specified in ~/.kube/config. + cd config/manager && $(KUSTOMIZE) edit set image controller=$(CAPKK_CONTROLLER_IMG)-$(ARCH):$(TAG) + $(KUSTOMIZE) build config/default | kubectl apply -f - + +.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. + $(KUSTOMIZE) build config/default | kubectl delete --ignore-not-found=$(ignore-not-found) -f - + + ## -------------------------------------- ## Testing ## -------------------------------------- @@ -334,6 +294,33 @@ set-manifest-image: $(info Updating kustomize image patch file for manager resource) sed -i'' -e 's@image: .*@image: '"${MANIFEST_IMG}:$(MANIFEST_TAG)"'@' $(TARGET_RESOURCE) +## -------------------------------------- +## Cleanup / Verification +## -------------------------------------- + +##@ clean: + +.PHONY: clean +clean: ## Remove all generated files + $(MAKE) clean-bin + +.PHONY: clean-bin +clean-bin: ## Remove all generated binaries + rm -rf $(BIN_DIR) + rm -rf $(TOOLS_BIN_DIR) + +.PHONY: clean-release-git +clean-release-git: ## Restores the git files usually modified during a release + git restore ./*manager_image_patch.yaml ./*manager_pull_policy.yaml + +.PHONY: clean-generated-yaml +clean-generated-yaml: ## Remove files generated by conversion-gen from the mentioned dirs. Example SRC_DIRS="./api/v1beta1" + (IFS=','; for i in $(SRC_DIRS); do find $$i -type f -name '*.yaml' -exec rm -f {} \;; done) + +.PHONY: clean-generated-deepcopy +clean-generated-deepcopy: ## Remove files generated by conversion-gen from the mentioned dirs. Example SRC_DIRS="./api/v1beta1" + (IFS=','; for i in $(SRC_DIRS); do find $$i -type f -name 'zz_generated.deepcopy*' -exec rm -f {} \;; done) + ## -------------------------------------- ## Hack / Tools ## -------------------------------------- @@ -370,4 +357,4 @@ $(SETUP_ENVTEST): # Build setup-envtest from tools folder. $(GOLANGCI_LINT): ../../.github/workflows/golangci-lint.yml # Download golangci-lint using hack script into tools folder. hack/ensure-golangci-lint.sh \ -b $(TOOLS_BIN_DIR) \ - $(shell cat .github/workflows/golangci-lint.yml | grep [[:space:]]version | sed 's/.*version: //') \ No newline at end of file + $(shell cat .github/workflows/golangci-lint.yml | grep [[:space:]]version | sed 's/.*version: //') diff --git a/exp/cluster-api-provider-kubekey/api/v1beta1/groupversion_info.go b/exp/cluster-api-provider-kubekey/api/v1beta1/groupversion_info.go index 956b213c..0e411b4a 100644 --- a/exp/cluster-api-provider-kubekey/api/v1beta1/groupversion_info.go +++ b/exp/cluster-api-provider-kubekey/api/v1beta1/groupversion_info.go @@ -1,5 +1,5 @@ /* -Copyright 2022. +Copyright 2022 The KubeSphere Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/exp/cluster-api-provider-kubekey/api/v1beta1/kkcluster_types.go b/exp/cluster-api-provider-kubekey/api/v1beta1/kkcluster_types.go index dc599919..4197c1d5 100644 --- a/exp/cluster-api-provider-kubekey/api/v1beta1/kkcluster_types.go +++ b/exp/cluster-api-provider-kubekey/api/v1beta1/kkcluster_types.go @@ -1,5 +1,5 @@ /* -Copyright 2022. +Copyright 2022 The KubeSphere Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/exp/cluster-api-provider-kubekey/api/v1beta1/kkcluster_webhook.go b/exp/cluster-api-provider-kubekey/api/v1beta1/kkcluster_webhook.go index f5266ec4..72719b4f 100644 --- a/exp/cluster-api-provider-kubekey/api/v1beta1/kkcluster_webhook.go +++ b/exp/cluster-api-provider-kubekey/api/v1beta1/kkcluster_webhook.go @@ -1,5 +1,5 @@ /* -Copyright 2022. +Copyright 2022 The KubeSphere Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/exp/cluster-api-provider-kubekey/api/v1beta1/kkclustertemplate_types.go b/exp/cluster-api-provider-kubekey/api/v1beta1/kkclustertemplate_types.go index bc403d21..a20f1228 100644 --- a/exp/cluster-api-provider-kubekey/api/v1beta1/kkclustertemplate_types.go +++ b/exp/cluster-api-provider-kubekey/api/v1beta1/kkclustertemplate_types.go @@ -1,5 +1,5 @@ /* -Copyright 2022. +Copyright 2022 The KubeSphere Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/exp/cluster-api-provider-kubekey/api/v1beta1/kkclustertemplate_webhook.go b/exp/cluster-api-provider-kubekey/api/v1beta1/kkclustertemplate_webhook.go index 6a27b10c..ef98a9bf 100644 --- a/exp/cluster-api-provider-kubekey/api/v1beta1/kkclustertemplate_webhook.go +++ b/exp/cluster-api-provider-kubekey/api/v1beta1/kkclustertemplate_webhook.go @@ -1,5 +1,5 @@ /* -Copyright 2022. +Copyright 2022 The KubeSphere Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/exp/cluster-api-provider-kubekey/api/v1beta1/kkinstance_types.go b/exp/cluster-api-provider-kubekey/api/v1beta1/kkinstance_types.go index 7760293b..2c8d2dd6 100644 --- a/exp/cluster-api-provider-kubekey/api/v1beta1/kkinstance_types.go +++ b/exp/cluster-api-provider-kubekey/api/v1beta1/kkinstance_types.go @@ -1,5 +1,5 @@ /* -Copyright 2022. +Copyright 2022 The KubeSphere Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/exp/cluster-api-provider-kubekey/api/v1beta1/kkmachine_types.go b/exp/cluster-api-provider-kubekey/api/v1beta1/kkmachine_types.go index fb05e86c..11ae6d85 100644 --- a/exp/cluster-api-provider-kubekey/api/v1beta1/kkmachine_types.go +++ b/exp/cluster-api-provider-kubekey/api/v1beta1/kkmachine_types.go @@ -1,5 +1,5 @@ /* -Copyright 2022. +Copyright 2022 The KubeSphere Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/exp/cluster-api-provider-kubekey/api/v1beta1/kkmachinetemplate_types.go b/exp/cluster-api-provider-kubekey/api/v1beta1/kkmachinetemplate_types.go index 24f76543..ef6f1087 100644 --- a/exp/cluster-api-provider-kubekey/api/v1beta1/kkmachinetemplate_types.go +++ b/exp/cluster-api-provider-kubekey/api/v1beta1/kkmachinetemplate_types.go @@ -1,5 +1,5 @@ /* -Copyright 2022. +Copyright 2022 The KubeSphere Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/exp/cluster-api-provider-kubekey/api/v1beta1/zz_generated.deepcopy.go b/exp/cluster-api-provider-kubekey/api/v1beta1/zz_generated.deepcopy.go index e231067d..fd341bf8 100644 --- a/exp/cluster-api-provider-kubekey/api/v1beta1/zz_generated.deepcopy.go +++ b/exp/cluster-api-provider-kubekey/api/v1beta1/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright 2022. +Copyright 2022 The KubeSphere Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/exp/cluster-api-provider-kubekey/controllers/kkcluster_controller.go b/exp/cluster-api-provider-kubekey/controllers/kkcluster_controller.go index dee2f41e..1b533308 100644 --- a/exp/cluster-api-provider-kubekey/controllers/kkcluster_controller.go +++ b/exp/cluster-api-provider-kubekey/controllers/kkcluster_controller.go @@ -1,5 +1,5 @@ /* -Copyright 2022. +Copyright 2022 The KubeSphere Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/exp/cluster-api-provider-kubekey/controllers/kkinstance_controller.go b/exp/cluster-api-provider-kubekey/controllers/kkinstance_controller.go index 16985304..1e7bac04 100644 --- a/exp/cluster-api-provider-kubekey/controllers/kkinstance_controller.go +++ b/exp/cluster-api-provider-kubekey/controllers/kkinstance_controller.go @@ -1,5 +1,5 @@ /* -Copyright 2022. +Copyright 2022 The KubeSphere Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/exp/cluster-api-provider-kubekey/controllers/kkmachine_controller.go b/exp/cluster-api-provider-kubekey/controllers/kkmachine_controller.go index 69f3dd52..3ee4df85 100644 --- a/exp/cluster-api-provider-kubekey/controllers/kkmachine_controller.go +++ b/exp/cluster-api-provider-kubekey/controllers/kkmachine_controller.go @@ -1,5 +1,5 @@ /* -Copyright 2022. +Copyright 2022 The KubeSphere Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/exp/cluster-api-provider-kubekey/hack/boilerplate.go.txt b/exp/cluster-api-provider-kubekey/hack/boilerplate.go.txt index 29c55ecd..62802d18 100644 --- a/exp/cluster-api-provider-kubekey/hack/boilerplate.go.txt +++ b/exp/cluster-api-provider-kubekey/hack/boilerplate.go.txt @@ -1,5 +1,5 @@ /* -Copyright 2022. +Copyright 2022 The KubeSphere Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/exp/cluster-api-provider-kubekey/main.go b/exp/cluster-api-provider-kubekey/main.go index 5f13a02c..43d753ac 100644 --- a/exp/cluster-api-provider-kubekey/main.go +++ b/exp/cluster-api-provider-kubekey/main.go @@ -1,5 +1,5 @@ /* -Copyright 2022. +Copyright 2022 The KubeSphere Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/exp/cluster-api-provider-kubekey/test/e2e/config/e2e_conf.yaml b/exp/cluster-api-provider-kubekey/test/e2e/config/e2e_conf.yaml index b862beca..1c5b237d 100644 --- a/exp/cluster-api-provider-kubekey/test/e2e/config/e2e_conf.yaml +++ b/exp/cluster-api-provider-kubekey/test/e2e/config/e2e_conf.yaml @@ -14,11 +14,11 @@ images: loadBehavior: tryLoad - name: quay.io/jetstack/cert-manager-controller:v1.8.2 loadBehavior: tryLoad - - name: k8s.gcr.io/cluster-api/cluster-api-controller:v1.2.0 + - name: k8s.gcr.io/cluster-api/cluster-api-controller:v1.2.1 loadBehavior: tryLoad - - name: k8s.gcr.io/cluster-api/kubeadm-bootstrap-controller:v1.2.0 + - name: k8s.gcr.io/cluster-api/kubeadm-bootstrap-controller:v1.2.1 loadBehavior: tryLoad - - name: k8s.gcr.io/cluster-api/kubeadm-control-plane-controller:v1.2.0 + - name: k8s.gcr.io/cluster-api/kubeadm-control-plane-controller:v1.2.1 loadBehavior: tryLoad - name: ghcr.io/kube-vip/kube-vip:v0.5.0 loadBehavior: tryLoad @@ -27,8 +27,8 @@ providers: - name: cluster-api type: CoreProvider versions: - - name: v1.2.0 # latest published release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only. - value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.2.0/core-components.yaml" + - name: v1.2.1 # latest published release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only. + value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.2.1/core-components.yaml" type: "url" contract: v1beta1 files: @@ -43,8 +43,8 @@ providers: files: - sourcePath: "../data/shared/v1beta1/metadata.yaml" versions: - - name: v1.2.0 # latest published release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only. - value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.2.0/bootstrap-components.yaml" + - name: v1.2.1 # latest published release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only. + value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.2.1/bootstrap-components.yaml" type: "url" contract: v1beta1 files: @@ -59,8 +59,8 @@ providers: files: - sourcePath: "../data/shared/v1beta1/metadata.yaml" versions: - - name: v1.2.0 # latest published release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only. - value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.2.0/control-plane-components.yaml" + - name: v1.2.1 # latest published release in the v1beta1 series; this is used for v1beta1 --> main clusterctl upgrades test only. + value: "https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.2.1/control-plane-components.yaml" type: "url" contract: v1beta1 files: