diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..ea180fd75 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +.git +testbin diff --git a/.gitignore b/.gitignore index 6c47f5e08..a82f4113d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +devworkspace-crds +config/crd/bases/workspace.devfile.io_devworkspaces.yaml +testbin +.vscode # Binaries for programs and plugins *.exe @@ -5,11 +9,6 @@ *.dll *.so *.dylib -_output -vendor -devworkspace-crds -config/devfiles -.e2e/ bin # Test binary, build with `go test -c` diff --git a/Makefile b/Makefile index 8b229b52c..df02ae34d 100644 --- a/Makefile +++ b/Makefile @@ -8,19 +8,21 @@ # Contributors: # Red Hat, Inc. - initial API and implementation # + +#### TODOS #### +## - Port over e2e tests. +#### + SHELL := bash .SHELLFLAGS = -ec -.ONESHELL: - -OPERATOR_SDK_VERSION = v0.17.0 -NAMESPACE ?= devworkspace-controller -IMG ?= quay.io/devfile/devworkspace-controller:next -TOOL ?= oc -ROUTING_SUFFIX ?= 192.168.99.100.nip.io -PULL_POLICY ?= Always -WEBHOOK_ENABLED ?= true -DEFAULT_ROUTING ?= basic -ADMIN_CTX ?= "" +# .ONESHELL: + +export NAMESPACE ?= devworkspace-controller +export IMG ?= quay.io/devfile/devworkspace-controller:next +export ROUTING_SUFFIX ?= 192.168.99.100.nip.io +export PULL_POLICY ?= Always +export WEBHOOK_ENABLED ?= true +export DEFAULT_ROUTING ?= basic REGISTRY_ENABLED ?= true DEVWORKSPACE_API_VERSION ?= v1alpha1 @@ -29,13 +31,43 @@ INTERNAL_TMP_DIR=/tmp/devworkspace-controller BUMPED_KUBECONFIG=$(INTERNAL_TMP_DIR)/kubeconfig RELATED_IMAGES_FILE=$(INTERNAL_TMP_DIR)/environment +ifeq ($(shell kubectl api-resources --api-group='route.openshift.io' | grep -o routes),routes) +PLATFORM := openshift +else +PLATFORM := kubernetes +endif + # minikube handling -ifeq ($(shell $(TOOL) config current-context),minikube) - ROUTING_SUFFIX := $(shell minikube ip).nip.io - TOOL := kubectl +ifeq ($(shell kubectl config current-context),minikube) +export ROUTING_SUFFIX := $(shell minikube ip).nip.io +endif + + +# Bootstrapped by Operator-SDK v1.1.0 +# Current Operator version +VERSION ?= 0.0.1 +# Default bundle image tag +BUNDLE_IMG ?= controller-bundle:$(VERSION) +# Options for 'bundle-build' +ifneq ($(origin CHANNELS), undefined) +BUNDLE_CHANNELS := --channels=$(CHANNELS) +endif +ifneq ($(origin DEFAULT_CHANNEL), undefined) +BUNDLE_DEFAULT_CHANNEL := --default-channel=$(DEFAULT_CHANNEL) +endif +BUNDLE_METADATA_OPTS ?= $(BUNDLE_CHANNELS) $(BUNDLE_DEFAULT_CHANNEL) + +# Produce CRDs that work back to Kubernetes 1.11 (no version conversion) +CRD_OPTIONS ?= "crd:trivialVersions=true" + +# 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 +all: manager _print_vars: @echo "Current env vars:" @@ -47,188 +79,19 @@ _print_vars: @echo " DEFAULT_ROUTING=$(DEFAULT_ROUTING)" @echo " REGISTRY_ENABLED=$(REGISTRY_ENABLED)" @echo " DEVWORKSPACE_API_VERSION=$(DEVWORKSPACE_API_VERSION)" - @echo " TOOL=$(TOOL)" - -_set_ctx: -ifneq ($(ADMIN_CTX),"") - $(eval CURRENT_CTX := $(shell $(TOOL) config current-context)) - @echo "Switching current ctx to $(ADMIN_CTX) from $(CURRENT_CTX)" - $(TOOL) config use-context $(ADMIN_CTX) -endif - -_reset_ctx: -ifneq ($(ADMIN_CTX),"") - @echo "Restoring the current context to $(CURRENT_CTX)" - $(TOOL) config use-context $(CURRENT_CTX) -endif _create_namespace: - $(TOOL) create namespace $(NAMESPACE) || true - -_deploy_registry: -ifeq ($(REGISTRY_ENABLED),true) - $(TOOL) apply -f ./deploy/registry/local -n $(NAMESPACE) -ifeq ($(TOOL),oc) - $(TOOL) apply -f ./deploy/registry/local/os -n $(NAMESPACE) -else - sed -i.bak -e "s|192.168.99.100.nip.io|$(ROUTING_SUFFIX)|g" ./deploy/registry/local/k8s/ingress.yaml - $(TOOL) apply -f ./deploy/registry/local/k8s -n $(NAMESPACE) - sed -i.bak -e "s|$(ROUTING_SUFFIX)|192.168.99.100.nip.io|g" ./deploy/registry/local/k8s/ingress.yaml - rm ./deploy/registry/local/k8s/ingress.yaml.bak -endif -endif - -_set_registry_url: -ifeq ($(TOOL),oc) - $(eval PLUGIN_REGISTRY_HOST := $(shell $(TOOL) get route che-plugin-registry -n $(NAMESPACE) -o jsonpath='{.spec.host}' || echo "")) -else - $(eval PLUGIN_REGISTRY_HOST := $(shell $(TOOL) get ingress che-plugin-registry -n $(NAMESPACE) -o jsonpath='{.spec.rules[0].host}' || echo "")) -endif - -# -i.bak is needed for compatibility between OS X and Linux versions of sed -_update_yamls: _set_registry_url - sed -i.bak -e "s|controller.plugin_registry.url: .*|controller.plugin_registry.url: http://$(PLUGIN_REGISTRY_HOST)|g" ./deploy/controller_config.yaml - sed -i.bak -e 's|controller.webhooks.enabled: .*|controller.webhooks.enabled: "$(WEBHOOK_ENABLED)"|g' ./deploy/controller_config.yaml - sed -i.bak -e 's|devworkspace.default_routing_class: .*|devworkspace.default_routing_class: "$(DEFAULT_ROUTING)"|g' ./deploy/controller_config.yaml - sed -i.bak -e 's|devworkspace.routing.cluster_host_suffix: .*|devworkspace.routing.cluster_host_suffix: $(ROUTING_SUFFIX)|g' ./deploy/controller_config.yaml - sed -i.bak -e 's|devworkspace.sidecar.image_pull_policy: .*|devworkspace.sidecar.image_pull_policy: $(PULL_POLICY)|g' ./deploy/controller_config.yaml - rm ./deploy/controller_config.yaml.bak - sed -i.bak -e 's|namespace: $${NAMESPACE}|namespace: $(NAMESPACE)|' ./deploy/role_binding.yaml - sed -i.bak -e "s|image: .*|image: $(IMG)|g" ./deploy/controller.yaml - sed -i.bak -e "s|value: \"quay.io/devfile/devworkspace-controller:next\"|value: $(IMG)|g" ./deploy/controller.yaml - sed -i.bak -e "s|imagePullPolicy: Always|imagePullPolicy: $(PULL_POLICY)|g" ./deploy/controller.yaml - sed -i.bak -e "s|kubectl.kubernetes.io/restartedAt: .*|kubectl.kubernetes.io/restartedAt: '$$(date +%Y-%m-%dT%H:%M:%S%z)'|g" ./deploy/controller.yaml - -_reset_yamls: _set_registry_url - sed -i.bak -e "s|http://$(PLUGIN_REGISTRY_HOST)|http://che-plugin-registry.192.168.99.100.nip.io/v3|g" ./deploy/controller_config.yaml - sed -i.bak -e 's|controller.webhooks.enabled: .*|controller.webhooks.enabled: "true"|g' ./deploy/controller_config.yaml - sed -i.bak -e 's|devworkspace.default_routing_class: .*|devworkspace.default_routing_class: "basic"|g' ./deploy/controller_config.yaml - sed -i.bak -e 's|devworkspace.routing.cluster_host_suffix: .*|devworkspace.routing.cluster_host_suffix: 192.168.99.100.nip.io|g' ./deploy/controller_config.yaml - sed -i.bak -e 's|devworkspace.sidecar.image_pull_policy: .*|devworkspace.sidecar.image_pull_policy: Always|g' ./deploy/controller_config.yaml - rm ./deploy/controller_config.yaml.bak - mv ./deploy/role_binding.yaml.bak ./deploy/role_binding.yaml - sed -i.bak -e "s|image: .*|image: quay.io/devfile/devworkspace-controller:next|g" ./deploy/controller.yaml - # webhook server related image - sed -i.bak -e "s|value: $(IMG)|value: \"quay.io/devfile/devworkspace-controller:next\"|g" ./deploy/controller.yaml - sed -i.bak -e "s|imagePullPolicy: .*|imagePullPolicy: Always|g" ./deploy/controller.yaml - sed -i.bak -e 's|kubectl.kubernetes.io/restartedAt: .*|kubectl.kubernetes.io/restartedAt: ""|g' ./deploy/controller.yaml - rm ./deploy/controller.yaml.bak - -_update_crds: update_devworkspace_crds - $(TOOL) apply -f ./deploy/crds - $(TOOL) apply -f ./devworkspace-crds/deploy/crds - -_update_controller_deps: - $(TOOL) apply -f ./deploy/controller_config.yaml -n $(NAMESPACE) - $(TOOL) apply -f ./deploy/service_account.yaml -n $(NAMESPACE) - $(TOOL) apply -f ./deploy/role.yaml -n $(NAMESPACE) - $(TOOL) apply -f ./deploy/role_binding.yaml -n $(NAMESPACE) - -_apply_controller_cfg: - $(TOOL) apply -f ./deploy -n $(NAMESPACE) - $(TOOL) apply -f ./deploy/controller.yaml -n $(NAMESPACE) - -_do_restart: -ifeq ($(TOOL),oc) - oc patch deployment/devworkspace-controller \ - -n $(NAMESPACE) \ - --patch "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"kubectl.kubernetes.io/restartedAt\":\"$$(date --iso-8601=seconds)\"}}}}}" -else - kubectl rollout restart -n $(NAMESPACE) deployment/devworkspace-controller -endif - -_do_restart_webhook_server: -ifeq ($(TOOL),oc) - oc patch deployment/devworkspace-webhook-server \ - -n $(NAMESPACE) \ - --patch "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"kubectl.kubernetes.io/restartedAt\":\"$$(date --iso-8601=seconds)\"}}}}}" -else - kubectl rollout restart -n $(NAMESPACE) deployment/devworkspace-webhook-server -endif - -_do_uninstall: -# It's safer to delete all workspaces before deleting the controller; otherwise we could -# leave workspaces in a hanging state if we add finalizers. -ifneq ($(shell command -v kubectl 2> /dev/null),) - kubectl delete devworkspaces.workspace.devfile.io --all-namespaces --all | true - kubectl delete devworkspacetemplates.workspace.devfile.io --all-namespaces --all | true -# Have to wait for routings to be deleted in case there are finalizers - kubectl delete workspaceroutings.controller.devfile.io --all-namespaces --all --wait | true -else -ifneq ($(TOOL) get devworkspaces.workspace.devfile.io --all-namespaces,"No resources found.") - $(info To automatically remove all workspaces when uninstalling, ensure kubectl is installed) - $(error Cannot uninstall operator, workspaces still running. Delete all workspaces and workspaceroutings before proceeding) -endif -endif - $(TOOL) delete -f ./deploy -n $(NAMESPACE) --ignore-not-found=true - $(TOOL) delete namespace $(NAMESPACE) --ignore-not-found=true - $(TOOL) delete mutatingwebhookconfigurations controller.devfile.io --ignore-not-found=true - $(TOOL) delete validatingwebhookconfigurations controller.devfile.io --ignore-not-found=true - $(TOOL) delete clusterrole devworkspace-webhook-server --ignore-not-found=true - $(TOOL) delete clusterrolebinding devworkspace-webhook-server --ignore-not-found=true - $(TOOL) delete customresourcedefinitions.apiextensions.k8s.io workspaceroutings.controller.devfile.io --ignore-not-found=true - $(TOOL) delete customresourcedefinitions.apiextensions.k8s.io components.controller.devfile.io --ignore-not-found=true - $(TOOL) delete customresourcedefinitions.apiextensions.k8s.io devworkspaces.workspace.devfile.io --ignore-not-found=true - $(TOOL) delete customresourcedefinitions.apiextensions.k8s.io devworkspacetemplates.workspace.devfile.io --ignore-not-found=true - -_do_e2e_test: - CGO_ENABLED=0 go test -v -c -o bin/devworkspace-controller-e2e ./test/e2e/cmd/workspaces_test.go - ./bin/devworkspace-controller-e2e - -# it's easier to bump whole kubeconfig instead of grabbing cluster URL from the current context -_bump_kubeconfig: - @mkdir -p $(INTERNAL_TMP_DIR) -ifndef KUBECONFIG - $(eval CONFIG_FILE = ${HOME}/.kube/config) -else - $(eval CONFIG_FILE = ${KUBECONFIG}) -endif - cp $(CONFIG_FILE) $(BUMPED_KUBECONFIG) + kubectl create namespace $(NAMESPACE) || true _generate_related_images_env: @mkdir -p $(INTERNAL_TMP_DIR) - cat ./deploy/controller.yaml \ + cat ./config/components/manager/manager.yaml \ | yq -r \ - '.spec.template.spec.containers[].env[] - | select(.name | startswith("RELATED_IMAGE")) - | "export \(.name)=\"$${\(.name):-\(.value)}\""' \ + '.spec.template.spec.containers[].env[] | select(.name | startswith("RELATED_IMAGE")) | "export \(.name)=\"$${\(.name):-\(.value)}\""' \ > $(RELATED_IMAGES_FILE) cat $(RELATED_IMAGES_FILE) -_login_with_devworkspace_sa: - @$(eval SA_TOKEN := $(shell $(TOOL) get secrets -o=json -n $(NAMESPACE) | jq -r '[.items[] | select (.type == "kubernetes.io/service-account-token" and .metadata.annotations."kubernetes.io/service-account.name" == "devworkspace-controller")][0].data.token' | base64 --decode )) - echo "Logging as devworkspace controller SA" - oc login --token=$(SA_TOKEN) --kubeconfig=$(BUMPED_KUBECONFIG) - -### docker: build and push docker image -docker: _print_vars - docker build -t $(IMG) -f ./build/Dockerfile . - docker push $(IMG) - -### info: display info -info: _print_vars - -### deploy: deploy controller to cluster -deploy: _print_vars _set_ctx _create_namespace _deploy_registry _update_yamls _update_crds _apply_controller_cfg _reset_yamls _reset_ctx - -### restart: restart cluster controller deployment -restart: _set_ctx _do_restart _reset_ctx - -### restart: restart cluster controller deployment -restart_webhook_server: _set_ctx _do_restart_webhook_server _reset_ctx - -### rollout: rebuild and push docker image and restart cluster deployment -rollout: docker restart - -### update_cfg: configures already deployed controller according to set env variables -update_cfg: _print_vars _set_ctx _update_yamls _apply_controller_cfg _reset_yamls _reset_ctx - -### update_crds: update custom resource definitions on cluster -update_crds: _set_ctx _update_crds _reset_ctx - -### uninstall: remove namespace and all CRDs from cluster -uninstall: _set_ctx _do_uninstall _reset_ctx - +##### Rules for dealing with devfile/api ### update_devworkspace_api: update version of devworkspace crds in go.mod update_devworkspace_api: go mod edit --require github.com/devfile/api@$(DEVWORKSPACE_API_VERSION) @@ -238,54 +101,71 @@ update_devworkspace_api: ### update_devworkspace_crds: pull latest devworkspace CRDs to ./devworkspace-crds. Note: pulls master branch update_devworkspace_crds: ./update_devworkspace_crds.sh $(DEVWORKSPACE_API_VERSION) - - -### local: set up cluster for local development -local: _print_vars _set_ctx _create_namespace _deploy_registry _set_registry_url _update_yamls _update_crds _update_controller_deps _reset_yamls _reset_ctx - -### generate: generates CRDs and Kubernetes code for custom resource -generate: -ifeq ($(shell operator-sdk version | cut -d , -f 1 | cut -d : -f 2 | cut -d \" -f 2),$(OPERATOR_SDK_VERSION)) - operator-sdk generate k8s - operator-sdk generate crds - patch/patch_crds.sh +###### End rules for dealing with devfile/api + +### test: Run tests +ENVTEST_ASSETS_DIR = $(shell pwd)/testbin +test: generate fmt vet manifests + mkdir -p $(ENVTEST_ASSETS_DIR) + test -f $(ENVTEST_ASSETS_DIR)/setup-envtest.sh || curl -sSLo $(ENVTEST_ASSETS_DIR)/setup-envtest.sh https://raw.githubusercontent.com/kubernetes-sigs/controller-runtime/v0.6.3/hack/setup-envtest.sh + source $(ENVTEST_ASSETS_DIR)/setup-envtest.sh; fetch_envtest_tools $(ENVTEST_ASSETS_DIR); setup_envtest_env $(ENVTEST_ASSETS_DIR); go test ./... -coverprofile cover.out + +### manager: Build manager binary +manager: generate fmt vet + go build -o bin/manager main.go + +### run: Run against the configured Kubernetes cluster in ~/.kube/config +run: _generate_related_images_env + source $(RELATED_IMAGES_FILE) + go run ./main.go + +debug: _generate_related_images_env + source $(RELATED_IMAGES_FILE) + dlv debug --listen=:2345 --headless=true --api-version=2 ./main.go -- + +### install: Install CRDs into a cluster +install: manifests _kustomize _create_namespace + $(KUSTOMIZE) build config/crd | kubectl apply -f - + +#### uninstall: Uninstall CRDs from a cluster +uninstall: manifests _kustomize + $(KUSTOMIZE) build config/crd | kubectl delete -f - + +### deploy: Deploy controller in the configured Kubernetes cluster in ~/.kube/config +deploy: _kustomize _create_namespace deploy_registry + mv config/devel/config.properties config/devel/config.properties.bak + mv config/devel/manager_image_patch.yaml config/devel/manager_image_patch.yaml.bak + envsubst < config/devel/config.properties.bak > config/devel/config.properties + envsubst < config/devel/manager_image_patch.yaml.bak > config/devel/manager_image_patch.yaml + $(KUSTOMIZE) build config/devel | kubectl apply -f - || true + mv config/devel/config.properties.bak config/devel/config.properties + mv config/devel/manager_image_patch.yaml.bak config/devel/manager_image_patch.yaml + +### restart: Restart devworkspace-controller deployment +restart: + kubectl rollout restart -n $(NAMESPACE) deployment/devworkspace-controller-manager + +### uninstall_controller: Remove controller resources from the cluster +uninstall_controller: _kustomize + kustomize build config/devel | kubectl delete --ignore-not-found -f - + +### deploy_registry: Deploy plugin registry +deploy_registry: _create_namespace + kubectl apply -f config/registry/local -n $(NAMESPACE) +ifeq ($(PLATFORM),kubernetes) + envsubst < config/registry/local/k8s/ingress.yaml | kubectl apply -n $(NAMESPACE) -f - else - $(error operator-sdk $(OPERATOR_SDK_VERSION) is expected to be used during CRDs and k8s objects generating while $(shell operator-sdk version | cut -d , -f 1 | cut -d : -f 2 | cut -d \" -f 2) found) -endif - -### start_local: start local instance of controller using operator-sdk -start_local: _bump_kubeconfig _generate_related_images_env _login_with_devworkspace_sa - @source $(RELATED_IMAGES_FILE) -ifeq ($(WEBHOOK_ENABLED),true) - #in cluster mode it comes from Deployment env var - export RELATED_IMAGE_devworkspace_webhook_server=$(IMG) - #in cluster mode it comes from configured SA propogated via env var - export CONTROLLER_SERVICE_ACCOUNT_NAME=devworkspace-controller - export KUBECONFIG=$(BUMPED_KUBECONFIG) -endif - operator-sdk run --local --watch-namespace $(NAMESPACE) 2>&1 | grep --color=always -E '"msg":"[^"]*"|$$' - -### start_local_debug: start local instance of controller with debugging enabled -start_local_debug: _bump_kubeconfig _generate_related_images_env _login_with_devworkspace_sa - @source $(RELATED_IMAGES_FILE) -ifeq ($(WEBHOOK_ENABLED),true) - #in cluster mode it comes from Deployment env var - export RELATED_IMAGE_devworkspace_webhook_server=$(IMG) - #in cluster mode it comes from configured SA propogated via env var - export CONTROLLER_SERVICE_ACCOUNT_NAME=devworkspace-controller - export KUBECONFIG=$(BUMPED_KUBECONFIG) + kubectl apply -f config/registry/local/os -n $(NAMESPACE) endif - operator-sdk run --local --watch-namespace $(NAMESPACE) --enable-delve 2>&1 | grep --color=always -E '"msg":"[^"]*"|$$' -.PHONY: test -### test: run unit tests -test: - go test $(shell go list ./... | grep -v test/e2e) - -### test_e2e: runs e2e test on the cluster set in context. Includes deploying devworkspace-controller, run test workspace, uninstall devworkspace-controller -test_e2e: _print_vars _set_ctx _update_yamls update_devworkspace_crds _do_e2e_test _reset_yamls _reset_ctx +### manifests: Generate manifests e.g. CRD, RBAC etc. +manifests: controller-gen + $(CONTROLLER_GEN) $(CRD_OPTIONS) rbac:roleName=manager-role webhook paths="./..." \ + output:crd:artifacts:config=config/crd/bases \ + output:rbac:artifacts:config=config/components/rbac + patch/patch_crds.sh -### fmt: format all go files in repository +### fmt: Run go fmt against code fmt: ifneq ($(shell command -v goimports 2> /dev/null),) find . -name '*.go' -exec goimports -w {} \; @@ -304,6 +184,67 @@ else $(error addlicense must be installed for this rule: go get -u github.com/google/addlicense) endif +### vet: Run go vet against code +vet: + go vet ./... + +### generate: Generate code +generate: controller-gen + $(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./..." + +### docker-build: Build the docker image +docker-build: + docker build . -t ${IMG} -f build/Dockerfile + +### docker-push: Push the docker image +docker-push: + docker push ${IMG} + +### controller-gen: find or download controller-gen +# download controller-gen if necessary +controller-gen: +ifeq (, $(shell which controller-gen)) + @{ \ + set -e ;\ + CONTROLLER_GEN_TMP_DIR=$$(mktemp -d) ;\ + cd $$CONTROLLER_GEN_TMP_DIR ;\ + go mod init tmp ;\ + go get sigs.k8s.io/controller-tools/cmd/controller-gen@v0.3.0 ;\ + rm -rf $$CONTROLLER_GEN_TMP_DIR ;\ + } +CONTROLLER_GEN=$(GOBIN)/controller-gen +else +CONTROLLER_GEN=$(shell which controller-gen) +endif + +_kustomize: +ifeq (, $(shell which kustomize)) + @{ \ + set -e ;\ + KUSTOMIZE_GEN_TMP_DIR=$$(mktemp -d) ;\ + cd $$KUSTOMIZE_GEN_TMP_DIR ;\ + go mod init tmp ;\ + go get sigs.k8s.io/kustomize/kustomize/v3@v3.5.4 ;\ + rm -rf $$KUSTOMIZE_GEN_TMP_DIR ;\ + } +KUSTOMIZE=$(GOBIN)/kustomize +else +KUSTOMIZE=$(shell which kustomize) +endif + +# Generate bundle manifests and metadata, then validate generated files. +.PHONY: bundle +bundle: manifests + operator-sdk generate kustomize manifests -q + cd config/manager && $(KUSTOMIZE) edit set image controller=$(IMG) + $(KUSTOMIZE) build config/manifests | operator-sdk generate bundle -q --overwrite --version $(VERSION) $(BUNDLE_METADATA_OPTS) + operator-sdk bundle validate ./bundle + +# Build the bundle image. +.PHONY: bundle-build +bundle-build: + docker build -f bundle.Dockerfile -t $(BUNDLE_IMG) . + .PHONY: help ### help: print this message help: Makefile @@ -313,7 +254,6 @@ help: Makefile @echo 'Supported environment variables:' @echo ' IMG - Image used for controller' @echo ' NAMESPACE - Namespace to use for deploying controller' - @echo ' TOOL - CLI tool for interfacing with the cluster: kubectl or oc; if oc is used, deployment is tailored to OpenShift, otherwise Kubernetes' @echo ' ROUTING_SUFFIX - Cluster routing suffix (e.g. $$(minikube ip).nip.io, apps-crc.testing)' @echo ' PULL_POLICY - Image pull policy for controller' @echo ' WEBHOOK_ENABLED - Whether webhooks should be enabled in the deployment' diff --git a/PROJECT b/PROJECT new file mode 100644 index 000000000..66a806132 --- /dev/null +++ b/PROJECT @@ -0,0 +1,18 @@ +domain: devfile.io +layout: go.kubebuilder.io/v2 +multigroup: true +projectName: devworkspace-operator-migration +repo: github.com/devfile/devworkspace-operator +resources: +- group: controller + kind: Component + version: v1alpha1 +- group: controller + kind: WorkspaceRouting + version: v1alpha1 +- group: workspace + kind: DevWorkspace + version: v1alpha1 +version: 3-alpha +plugins: + go.sdk.operatorframework.io/v2-alpha: {} diff --git a/pkg/apis/controller/v1alpha1/common.go b/apis/controller/v1alpha1/common.go similarity index 100% rename from pkg/apis/controller/v1alpha1/common.go rename to apis/controller/v1alpha1/common.go diff --git a/pkg/apis/controller/v1alpha1/component.go b/apis/controller/v1alpha1/component.go similarity index 100% rename from pkg/apis/controller/v1alpha1/component.go rename to apis/controller/v1alpha1/component.go diff --git a/pkg/apis/controller/v1alpha1/component_types.go b/apis/controller/v1alpha1/component_types.go similarity index 100% rename from pkg/apis/controller/v1alpha1/component_types.go rename to apis/controller/v1alpha1/component_types.go diff --git a/pkg/apis/controller/v1alpha1/devfile.go b/apis/controller/v1alpha1/devfile.go similarity index 100% rename from pkg/apis/controller/v1alpha1/devfile.go rename to apis/controller/v1alpha1/devfile.go diff --git a/pkg/apis/controller/v1alpha1/doc.go b/apis/controller/v1alpha1/doc.go similarity index 100% rename from pkg/apis/controller/v1alpha1/doc.go rename to apis/controller/v1alpha1/doc.go diff --git a/pkg/apis/controller/v1alpha1/register.go b/apis/controller/v1alpha1/groupversion_info.go similarity index 64% rename from pkg/apis/controller/v1alpha1/register.go rename to apis/controller/v1alpha1/groupversion_info.go index 2f7e700c0..28fbbbe22 100644 --- a/pkg/apis/controller/v1alpha1/register.go +++ b/apis/controller/v1alpha1/groupversion_info.go @@ -10,10 +10,8 @@ // Red Hat, Inc. - initial API and implementation // -// NOTE: Boilerplate only. Ignore this file. - // Package v1alpha1 contains API Schema definitions for the controller v1alpha1 API group -// +k8s:deepcopy-gen=package,register +// +kubebuilder:object:generate=true // +groupName=controller.devfile.io package v1alpha1 @@ -23,9 +21,12 @@ import ( ) var ( - // SchemeGroupVersion is group version used to register these objects - SchemeGroupVersion = schema.GroupVersion{Group: "controller.devfile.io", Version: "v1alpha1"} + // GroupVersion is group version used to register these objects + GroupVersion = schema.GroupVersion{Group: "controller.devfile.io", Version: "v1alpha1"} // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion} + SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} + + // AddToScheme adds the types in this group-version to the given scheme. + AddToScheme = SchemeBuilder.AddToScheme ) diff --git a/pkg/apis/controller/v1alpha1/runtime.go b/apis/controller/v1alpha1/runtime.go similarity index 100% rename from pkg/apis/controller/v1alpha1/runtime.go rename to apis/controller/v1alpha1/runtime.go diff --git a/pkg/apis/controller/v1alpha1/workspacerouting_types.go b/apis/controller/v1alpha1/workspacerouting_types.go similarity index 100% rename from pkg/apis/controller/v1alpha1/workspacerouting_types.go rename to apis/controller/v1alpha1/workspacerouting_types.go diff --git a/pkg/apis/controller/v1alpha1/zz_generated.deepcopy.go b/apis/controller/v1alpha1/zz_generated.deepcopy.go similarity index 98% rename from pkg/apis/controller/v1alpha1/zz_generated.deepcopy.go rename to apis/controller/v1alpha1/zz_generated.deepcopy.go index 2adf73647..3392eb5c1 100644 --- a/pkg/apis/controller/v1alpha1/zz_generated.deepcopy.go +++ b/apis/controller/v1alpha1/zz_generated.deepcopy.go @@ -1,3 +1,5 @@ +// +build !ignore_autogenerated + // // Copyright (c) 2019-2020 Red Hat, Inc. // This program and the accompanying materials are made @@ -10,9 +12,7 @@ // Red Hat, Inc. - initial API and implementation // -// +build !ignore_autogenerated - -// Code generated by operator-sdk. DO NOT EDIT. +// Code generated by controller-gen. DO NOT EDIT. package v1alpha1 @@ -32,7 +32,6 @@ func (in *CheWorkspaceCommand) DeepCopyInto(out *CheWorkspaceCommand) { (*out)[key] = val } } - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CheWorkspaceCommand. @@ -67,7 +66,6 @@ func (in *CheWorkspaceMachine) DeepCopyInto(out *CheWorkspaceMachine) { *out = new(CheWorkspaceMachineEventType) **out = **in } - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CheWorkspaceMachine. @@ -102,7 +100,6 @@ func (in *CheWorkspaceRuntime) DeepCopyInto(out *CheWorkspaceRuntime) { *out = make([]CheWorkspaceWarning, len(*in)) copy(*out, *in) } - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CheWorkspaceRuntime. @@ -125,7 +122,6 @@ func (in *CheWorkspaceServer) DeepCopyInto(out *CheWorkspaceServer) { (*out)[key] = val } } - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CheWorkspaceServer. @@ -141,7 +137,6 @@ func (in *CheWorkspaceServer) DeepCopy() *CheWorkspaceServer { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CheWorkspaceWarning) DeepCopyInto(out *CheWorkspaceWarning) { *out = *in - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CheWorkspaceWarning. @@ -157,7 +152,6 @@ func (in *CheWorkspaceWarning) DeepCopy() *CheWorkspaceWarning { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CommandActionSpec) DeepCopyInto(out *CommandActionSpec) { *out = *in - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CommandActionSpec. @@ -185,7 +179,6 @@ func (in *CommandSpec) DeepCopyInto(out *CommandSpec) { (*out)[key] = val } } - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CommandSpec. @@ -205,7 +198,6 @@ func (in *Component) DeepCopyInto(out *Component) { in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) in.Status.DeepCopyInto(&out.Status) - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Component. @@ -231,7 +223,6 @@ func (in *ComponentDescription) DeepCopyInto(out *ComponentDescription) { *out = *in in.PodAdditions.DeepCopyInto(&out.PodAdditions) in.ComponentMetadata.DeepCopyInto(&out.ComponentMetadata) - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComponentDescription. @@ -256,7 +247,6 @@ func (in *ComponentList) DeepCopyInto(out *ComponentList) { (*in)[i].DeepCopyInto(&(*out)[i]) } } - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComponentList. @@ -301,7 +291,6 @@ func (in *ComponentMetadata) DeepCopyInto(out *ComponentMetadata) { (*in)[i].DeepCopyInto(&(*out)[i]) } } - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComponentMetadata. @@ -356,7 +345,6 @@ func (in *ComponentSpec) DeepCopyInto(out *ComponentSpec) { (*out)[key] = val } } - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComponentSpec. @@ -384,7 +372,6 @@ func (in *ContainerDescription) DeepCopyInto(out *ContainerDescription) { *out = make([]int, len(*in)) copy(*out, *in) } - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerDescription. @@ -400,7 +387,6 @@ func (in *ContainerDescription) DeepCopy() *ContainerDescription { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DevfileAttributes) DeepCopyInto(out *DevfileAttributes) { *out = *in - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DevfileAttributes. @@ -416,7 +402,6 @@ func (in *DevfileAttributes) DeepCopy() *DevfileAttributes { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DevfileMeta) DeepCopyInto(out *DevfileMeta) { *out = *in - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DevfileMeta. @@ -453,7 +438,6 @@ func (in *DevfileSpec) DeepCopyInto(out *DevfileSpec) { (*in)[i].DeepCopyInto(&(*out)[i]) } } - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DevfileSpec. @@ -476,7 +460,6 @@ func (in *Endpoint) DeepCopyInto(out *Endpoint) { (*out)[key] = val } } - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Endpoint. @@ -497,7 +480,6 @@ func (in EndpointList) DeepCopyInto(out *EndpointList) { for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } - return } } @@ -514,7 +496,6 @@ func (in EndpointList) DeepCopy() EndpointList { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Env) DeepCopyInto(out *Env) { *out = *in - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Env. @@ -537,7 +518,6 @@ func (in *ExposedEndpoint) DeepCopyInto(out *ExposedEndpoint) { (*out)[key] = val } } - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExposedEndpoint. @@ -558,7 +538,6 @@ func (in ExposedEndpointList) DeepCopyInto(out *ExposedEndpointList) { for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } - return } } @@ -629,7 +608,6 @@ func (in *PodAdditions) DeepCopyInto(out *PodAdditions) { (*out)[key] = val } } - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodAdditions. @@ -645,7 +623,6 @@ func (in *PodAdditions) DeepCopy() *PodAdditions { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ProjectSourceSpec) DeepCopyInto(out *ProjectSourceSpec) { *out = *in - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProjectSourceSpec. @@ -662,7 +639,6 @@ func (in *ProjectSourceSpec) DeepCopy() *ProjectSourceSpec { func (in *ProjectSpec) DeepCopyInto(out *ProjectSpec) { *out = *in out.Source = in.Source - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProjectSpec. @@ -678,7 +654,6 @@ func (in *ProjectSpec) DeepCopy() *ProjectSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Volume) DeepCopyInto(out *Volume) { *out = *in - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Volume. @@ -708,7 +683,6 @@ func (in *WorkspaceComponentSpec) DeepCopyInto(out *WorkspaceComponentSpec) { (*in)[i].DeepCopyInto(&(*out)[i]) } } - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkspaceComponentSpec. @@ -731,7 +705,6 @@ func (in *WorkspaceComponentStatus) DeepCopyInto(out *WorkspaceComponentStatus) (*in)[i].DeepCopyInto(&(*out)[i]) } } - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkspaceComponentStatus. @@ -751,7 +724,6 @@ func (in *WorkspaceRouting) DeepCopyInto(out *WorkspaceRouting) { in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) in.Status.DeepCopyInto(&out.Status) - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkspaceRouting. @@ -784,7 +756,6 @@ func (in *WorkspaceRoutingList) DeepCopyInto(out *WorkspaceRoutingList) { (*in)[i].DeepCopyInto(&(*out)[i]) } } - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkspaceRoutingList. @@ -832,7 +803,6 @@ func (in *WorkspaceRoutingSpec) DeepCopyInto(out *WorkspaceRoutingSpec) { (*out)[key] = val } } - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkspaceRoutingSpec. @@ -870,7 +840,6 @@ func (in *WorkspaceRoutingStatus) DeepCopyInto(out *WorkspaceRoutingStatus) { (*out)[key] = outVal } } - return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkspaceRoutingStatus. diff --git a/build/Dockerfile b/build/Dockerfile index 1a78dd849..f17f9d2e1 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -1,29 +1,36 @@ -FROM golang:1.13.7-alpine3.11 as builder +# Build the manager binary +FROM golang:1.13 as builder +RUN go env GOPROXY WORKDIR /devworkspace-operator - -# Populate the module cache based on the go.{mod,sum} files. -COPY go.mod . -COPY go.sum . +# Copy the Go Modules manifests +COPY go.mod go.mod +COPY go.sum go.sum +# cache deps before building and copying source so that we don't need to re-download as much +# and so that source changes don't invalidate our downloaded layer RUN go mod download -# copy the rest of the sources code +# Copy the go source COPY . . + # compile workspace controller binaries -RUN CGO_ENABLED=0 GOOS=linux go build \ - -o _output/bin/devworkspace-controller \ +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build \ + -a -o _output/bin/devworkspace-controller \ -gcflags all=-trimpath=/ \ -asmflags all=-trimpath=/ \ - cmd/manager/main.go + main.go # Compile webhook binaries -RUN CGO_ENABLED=0 GOOS=linux go build \ +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build \ -o _output/bin/webhook-server \ -gcflags all=-trimpath=/ \ -asmflags all=-trimpath=/ \ webhook/main.go +# Use distroless as minimal base image to package the manager binary +# Refer to https://github.com/GoogleContainerTools/distroless for more details FROM registry.access.redhat.com/ubi8-minimal:8.2-349 +WORKDIR / COPY --from=builder /devworkspace-operator/_output/bin/devworkspace-controller /usr/local/bin/devworkspace-controller COPY --from=builder /devworkspace-operator/_output/bin/webhook-server /usr/local/bin/webhook-server COPY --from=builder /devworkspace-operator/internal-registry internal-registry diff --git a/build/rhel.Dockerfile b/build/rhel.Dockerfile index b626c5d7d..7a5b7d2f8 100644 --- a/build/rhel.Dockerfile +++ b/build/rhel.Dockerfile @@ -1,38 +1,43 @@ -# https://access.redhat.com/containers/?tab=tags#/registry.access.redhat.com/rhel8/go-toolset +# Build the manager binary FROM registry.redhat.io/rhel8/go-toolset:1.13.4-27 as builder ENV GOPATH=/go/ - USER root -WORKDIR /devworkspace-operator - -# Populate the module cache based on the go.{mod,sum} files. -COPY go.mod . -COPY go.sum . +WORKDIR /workspace +# Copy the Go Modules manifests +COPY go.mod go.mod +COPY go.sum go.sum +# cache deps before building and copying source so that we don't need to re-download as much +# and so that source changes don't invalidate our downloaded layer RUN go mod download -# copy the rest of the sources code +# Copy the go source COPY . . + # compile workspace controller binaries RUN CGO_ENABLED=0 GOOS=linux go build \ - -o _output/bin/devworkspace-controller \ + -a -o _output/bin/devworkspace-controller \ -gcflags all=-trimpath=/ \ -asmflags all=-trimpath=/ \ cmd/manager/main.go -# https://access.redhat.com/containers/?tab=tags#/registry.access.redhat.com/ubi8-minimal +# Compile webhook binaries +RUN CGO_ENABLED=0 GOOS=linux go build \ + -o _output/bin/webhook-server \ + -gcflags all=-trimpath=/ \ + -asmflags all=-trimpath=/ \ + webhook/main.go + +# Use distroless as minimal base image to package the manager binary +# Refer to https://github.com/GoogleContainerTools/distroless for more details FROM registry.access.redhat.com/ubi8-minimal:8.2-349 +WORKDIR / COPY --from=builder /devworkspace-operator/_output/bin/devworkspace-controller /usr/local/bin/devworkspace-controller +COPY --from=builder /devworkspace-operator/_output/bin/webhook-server /usr/local/bin/webhook-server COPY --from=builder /devworkspace-operator/internal-registry internal-registry -ENV USER_UID=1001 \ - USER_NAME=devworkspace-controller - -COPY build/bin /usr/local/bin -RUN /usr/local/bin/user_setup - -USER ${USER_UID} +USER nonroot:nonroot ENTRYPOINT ["/usr/local/bin/entrypoint"] CMD /usr/local/bin/devworkspace-controller diff --git a/cmd/manager/main.go b/cmd/manager/main.go deleted file mode 100644 index 51b152705..000000000 --- a/cmd/manager/main.go +++ /dev/null @@ -1,230 +0,0 @@ -// -// Copyright (c) 2019-2020 Red Hat, Inc. -// This program and the accompanying materials are made -// available under the terms of the Eclipse Public License 2.0 -// which is available at https://www.eclipse.org/legal/epl-2.0/ -// -// SPDX-License-Identifier: EPL-2.0 -// -// Contributors: -// Red Hat, Inc. - initial API and implementation -// - -package main - -import ( - "context" - "crypto/tls" - "errors" - "flag" - "fmt" - "net/http" - "os" - "runtime" - - operatorConfig "github.com/devfile/devworkspace-operator/pkg/config" - "github.com/devfile/devworkspace-operator/pkg/webhook" - - // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) - _ "k8s.io/client-go/plugin/pkg/client/auth" - "k8s.io/client-go/rest" - - "github.com/devfile/devworkspace-operator/pkg/apis" - "github.com/devfile/devworkspace-operator/pkg/controller" - "github.com/devfile/devworkspace-operator/version" - - "github.com/operator-framework/operator-sdk/pkg/k8sutil" - kubemetrics "github.com/operator-framework/operator-sdk/pkg/kube-metrics" - "github.com/operator-framework/operator-sdk/pkg/leader" - "github.com/operator-framework/operator-sdk/pkg/log/zap" - "github.com/operator-framework/operator-sdk/pkg/metrics" - sdkVersion "github.com/operator-framework/operator-sdk/version" - "github.com/spf13/pflag" - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/intstr" - "sigs.k8s.io/controller-runtime/pkg/client/config" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/manager/signals" -) - -// Change below variables to serve metrics on different host or port. -var ( - metricsHost = "0.0.0.0" - metricsPort int32 = 8383 - operatorMetricsPort int32 = 8686 -) -var log = logf.Log.WithName("cmd") - -func printVersion() { - log.Info(fmt.Sprintf("Operator Version: %s", version.Version)) - log.Info(fmt.Sprintf("Go Version: %s", runtime.Version())) - log.Info(fmt.Sprintf("Go OS/Arch: %s/%s", runtime.GOOS, runtime.GOARCH)) - log.Info(fmt.Sprintf("Version of operator-sdk: %v", sdkVersion.Version)) -} - -func main() { - // Add the zap logger flag set to the CLI. The flag set must - // be added before calling pflag.Parse(). - pflag.CommandLine.AddFlagSet(zap.FlagSet()) - - // Add flags registered by imported packages (e.g. glog and - // controller-runtime) - pflag.CommandLine.AddGoFlagSet(flag.CommandLine) - - pflag.Parse() - - // Use a zap logr.Logger implementation. If none of the zap - // flags are configured (or if the zap flag set is not being - // used), this defaults to a production zap logger. - // - // The logger instantiated here can be changed to any logger - // implementing the logr.Logger interface. This logger will - // be propagated through the whole operator, generating - // uniform and structured logs. - logf.SetLogger(zap.Logger()) - - printVersion() - - namespace, err := k8sutil.GetWatchNamespace() - if err != nil { - log.Error(err, "Failed to get watch namespace") - os.Exit(1) - } - - // Get a config to talk to the apiserver - cfg, err := config.GetConfig() - if err != nil { - log.Error(err, "") - os.Exit(1) - } - - ctx := context.TODO() - // Become the leader before proceeding - err = leader.Become(ctx, "devworkspace-operator-lock") - if err != nil { - log.Error(err, "") - os.Exit(1) - } - - // Create a new Cmd to provide shared dependencies and start components - mgr, err := manager.New(cfg, manager.Options{ - Namespace: namespace, - MetricsBindAddress: fmt.Sprintf("%s:%d", metricsHost, metricsPort), - }) - if err != nil { - log.Error(err, "") - os.Exit(1) - } - - log.Info("Registering Components.") - - // Setup Scheme for all resources - if err := apis.AddToScheme(mgr.GetScheme()); err != nil { - log.Error(err, "") - os.Exit(1) - } - - log.Info("Setting up Controllers.") - - // Setup all Controllers - if err := controller.AddToManager(mgr); err != nil { - log.Error(err, "") - os.Exit(1) - } - - if operatorConfig.ControllerCfg.GetTlsInsecureSkipVerify() == "true" { - log.Info("Warning: TLS InsecureSkipVerify is enabled") - http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true} - } - - // Setup certs for webhook and create seperate webhook server deployment - log.Info("Setting up webhooks") - if err := webhook.SetupWebhooks(ctx, cfg); err != nil { - log.Error(err, "Failed to setup webhooks") - os.Exit(1) - } - - // Add the Metrics Service - log.Info("Expose Metrics Port.") - addMetrics(ctx, cfg) - - log.Info("Starting the Cmd.") - - // Start the Cmd - if err := mgr.Start(signals.SetupSignalHandler()); err != nil { - log.Error(err, "Manager exited non-zero") - os.Exit(1) - } -} - -// addMetrics will create the Services and Service Monitors to allow the operator export the metrics by using -// the Prometheus operator -func addMetrics(ctx context.Context, cfg *rest.Config) { - // Get the namespace the operator is currently deployed in. - operatorNs, err := k8sutil.GetOperatorNamespace() - if err != nil { - if errors.Is(err, k8sutil.ErrRunLocal) { - log.Info("Skipping CR metrics server creation; not running in a cluster.") - return - } - } - - // TODO: See issue https://github.com/eclipse/che/issues/16567 - // if err := serveCRMetrics(cfg, operatorNs); err != nil { - // log.Info("Could not generate and serve custom resource metrics", "error", err.Error()) - // } - - // Add to the below struct any other metrics ports you want to expose. - servicePorts := []v1.ServicePort{ - {Port: metricsPort, Name: metrics.OperatorPortName, Protocol: v1.ProtocolTCP, TargetPort: intstr.IntOrString{Type: intstr.Int, IntVal: metricsPort}}, - {Port: operatorMetricsPort, Name: metrics.CRPortName, Protocol: v1.ProtocolTCP, TargetPort: intstr.IntOrString{Type: intstr.Int, IntVal: operatorMetricsPort}}, - } - - // Create Service object to expose the metrics port(s). - service, err := metrics.CreateMetricsService(ctx, cfg, servicePorts) - if err != nil { - log.Info("Could not create metrics Service", "error", err.Error()) - } - - // CreateServiceMonitors will automatically create the prometheus-operator ServiceMonitor resources - // necessary to configure Prometheus to scrape metrics from this operator. - services := []*v1.Service{service} - - // The ServiceMonitor is created in the same namespace where the operator is deployed - _, err = metrics.CreateServiceMonitors(cfg, operatorNs, services) - if err != nil { - log.Info("Could not create ServiceMonitor object", "error", err.Error()) - // If this operator is deployed to a cluster without the prometheus-operator running, it will return - // ErrServiceMonitorNotPresent, which can be used to safely skip ServiceMonitor creation. - if err == metrics.ErrServiceMonitorNotPresent { - log.Info("Install prometheus-operator in your cluster to create ServiceMonitor objects", "error", err.Error()) - } - } -} - -// serveCRMetrics gets the Operator/CustomResource GVKs and generates metrics based on those types. -// It serves those metrics on "http://metricsHost:operatorMetricsPort". -func serveCRMetrics(cfg *rest.Config, operatorNs string) error { - // The function below returns a list of filtered operator/CR specific GVKs. For more control, override the GVK list below - // with your own custom logic. Note that if you are adding third party API schemas, probably you will need to - // customize this implementation to avoid permissions issues. - filteredGVK, err := k8sutil.GetGVKsFromAddToScheme(apis.AddToScheme) - if err != nil { - return err - } - - // The metrics will be generated from the namespaces which are returned here. - // NOTE that passing nil or an empty list of namespaces in GenerateAndServeCRMetrics will result in an error. - ns, err := kubemetrics.GetNamespacesForMetrics(operatorNs) - if err != nil { - return err - } - - // Generate and serve custom resource specific metrics. - err = kubemetrics.GenerateAndServeCRMetrics(cfg, ns, filteredGVK, metricsHost, operatorMetricsPort) - if err != nil { - return err - } - return nil -} diff --git a/config/components/certmanager/certificate.yaml b/config/components/certmanager/certificate.yaml new file mode 100644 index 000000000..58db114fa --- /dev/null +++ b/config/components/certmanager/certificate.yaml @@ -0,0 +1,26 @@ +# The following manifests contain a self-signed issuer CR and a certificate CR. +# More document can be found at https://docs.cert-manager.io +# WARNING: Targets CertManager 0.11 check https://docs.cert-manager.io/en/latest/tasks/upgrading/index.html for +# breaking changes +apiVersion: cert-manager.io/v1alpha2 +kind: Issuer +metadata: + name: selfsigned-issuer + namespace: system +spec: + selfSigned: {} +--- +apiVersion: cert-manager.io/v1alpha2 +kind: Certificate +metadata: + name: serving-cert # this name should match the one appeared in kustomizeconfig.yaml + namespace: system +spec: + # $(SERVICE_NAME) and $(SERVICE_NAMESPACE) will be substituted by kustomize + dnsNames: + - $(SERVICE_NAME).$(SERVICE_NAMESPACE).svc + - $(SERVICE_NAME).$(SERVICE_NAMESPACE).svc.cluster.local + issuerRef: + kind: Issuer + name: selfsigned-issuer + secretName: webhook-server-cert # this secret will not be prefixed, since it's not managed by kustomize diff --git a/config/components/certmanager/kustomization.yaml b/config/components/certmanager/kustomization.yaml new file mode 100644 index 000000000..bebea5a59 --- /dev/null +++ b/config/components/certmanager/kustomization.yaml @@ -0,0 +1,5 @@ +resources: +- certificate.yaml + +configurations: +- kustomizeconfig.yaml diff --git a/config/components/certmanager/kustomizeconfig.yaml b/config/components/certmanager/kustomizeconfig.yaml new file mode 100644 index 000000000..90d7c313c --- /dev/null +++ b/config/components/certmanager/kustomizeconfig.yaml @@ -0,0 +1,16 @@ +# This configuration is for teaching kustomize how to update name ref and var substitution +nameReference: +- kind: Issuer + group: cert-manager.io + fieldSpecs: + - kind: Certificate + group: cert-manager.io + path: spec/issuerRef/name + +varReference: +- kind: Certificate + group: cert-manager.io + path: spec/commonName +- kind: Certificate + group: cert-manager.io + path: spec/dnsNames diff --git a/config/components/manager/kustomization.yaml b/config/components/manager/kustomization.yaml new file mode 100644 index 000000000..5c5f0b84c --- /dev/null +++ b/config/components/manager/kustomization.yaml @@ -0,0 +1,2 @@ +resources: +- manager.yaml diff --git a/config/components/manager/manager.yaml b/config/components/manager/manager.yaml new file mode 100644 index 000000000..0cbef95ea --- /dev/null +++ b/config/components/manager/manager.yaml @@ -0,0 +1,69 @@ +apiVersion: v1 +kind: Namespace +metadata: + labels: + control-plane: controller-manager + name: system +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: manager + namespace: system + labels: + control-plane: controller-manager +spec: + selector: + matchLabels: + control-plane: controller-manager + replicas: 1 + template: + metadata: + labels: + control-plane: controller-manager + spec: + terminationGracePeriodSeconds: 10 + containers: + - image: quay.io/devfile/devworkspace-controller:next + name: devworkspace-controller + args: + - /usr/local/bin/devworkspace-controller + - --enable-leader-election + resources: + limits: + cpu: 100m + memory: 30Mi + requests: + cpu: 100m + memory: 20Mi + env: + - name: WATCH_NAMESPACE + value: "" + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: "devworkspace-operator" + - name: CONTROLLER_SERVICE_ACCOUNT_NAME + valueFrom: + fieldRef: + fieldPath: spec.serviceAccountName + - name: RELATED_IMAGE_plugin_redhat_developer_web_terminal_4_5_0 + value: "quay.io/wto/web-terminal-exec:1.0" + - name: RELATED_IMAGE_plugin_redhat_developer_web_terminal_nightly + value: "quay.io/eclipse/che-machine-exec:nightly" + - name: RELATED_IMAGE_plugin_redhat_developer_web_terminal_dev_4_5_0 + value: "quay.io/wto/web-terminal-exec:1.0" + - name: RELATED_IMAGE_plugin_redhat_developer_web_terminal_dev_nightly + value: "quay.io/eclipse/che-machine-exec:nightly" + - name: RELATED_IMAGE_plugin_eclipse_cloud_shell_nightly + value: "quay.io/eclipse/che-machine-exec:nightly" + - name: RELATED_IMAGE_web_terminal_tooling + value: "quay.io/wto/web-terminal-tooling:latest" + - name: RELATED_IMAGE_openshift_oauth_proxy + value: "openshift/oauth-proxy:latest" + - name: RELATED_IMAGE_devworkspace_webhook_server + value: quay.io/devfile/devworkspace-controller:next + - name: RELATED_IMAGE_default_tls_secrets_creation_job + value: quay.io/eclipse/che-tls-secret-creator:alpine-3029769 diff --git a/config/components/prometheus/kustomization.yaml b/config/components/prometheus/kustomization.yaml new file mode 100644 index 000000000..ed137168a --- /dev/null +++ b/config/components/prometheus/kustomization.yaml @@ -0,0 +1,2 @@ +resources: +- monitor.yaml diff --git a/config/components/prometheus/monitor.yaml b/config/components/prometheus/monitor.yaml new file mode 100644 index 000000000..9b8047b76 --- /dev/null +++ b/config/components/prometheus/monitor.yaml @@ -0,0 +1,16 @@ + +# Prometheus Monitor Service (Metrics) +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + labels: + control-plane: controller-manager + name: controller-manager-metrics-monitor + namespace: system +spec: + endpoints: + - path: /metrics + port: https + selector: + matchLabels: + control-plane: controller-manager diff --git a/config/components/rbac/auth_proxy_client_clusterrole.yaml b/config/components/rbac/auth_proxy_client_clusterrole.yaml new file mode 100644 index 000000000..7d62534c5 --- /dev/null +++ b/config/components/rbac/auth_proxy_client_clusterrole.yaml @@ -0,0 +1,7 @@ +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRole +metadata: + name: metrics-reader +rules: +- nonResourceURLs: ["/metrics"] + verbs: ["get"] diff --git a/config/components/rbac/auth_proxy_role.yaml b/config/components/rbac/auth_proxy_role.yaml new file mode 100644 index 000000000..618f5e417 --- /dev/null +++ b/config/components/rbac/auth_proxy_role.yaml @@ -0,0 +1,13 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: proxy-role +rules: +- apiGroups: ["authentication.k8s.io"] + resources: + - tokenreviews + verbs: ["create"] +- apiGroups: ["authorization.k8s.io"] + resources: + - subjectaccessreviews + verbs: ["create"] diff --git a/config/components/rbac/auth_proxy_role_binding.yaml b/config/components/rbac/auth_proxy_role_binding.yaml new file mode 100644 index 000000000..48ed1e4b8 --- /dev/null +++ b/config/components/rbac/auth_proxy_role_binding.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: proxy-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: proxy-role +subjects: +- kind: ServiceAccount + name: default + namespace: system diff --git a/config/components/rbac/auth_proxy_service.yaml b/config/components/rbac/auth_proxy_service.yaml new file mode 100644 index 000000000..6cf656be1 --- /dev/null +++ b/config/components/rbac/auth_proxy_service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + control-plane: controller-manager + name: controller-manager-metrics-service + namespace: system +spec: + ports: + - name: https + port: 8443 + targetPort: https + selector: + control-plane: controller-manager diff --git a/deploy/edit-workspaces-cluster-role.yaml b/config/components/rbac/edit-workspaces-cluster-role.yaml similarity index 100% rename from deploy/edit-workspaces-cluster-role.yaml rename to config/components/rbac/edit-workspaces-cluster-role.yaml diff --git a/config/components/rbac/kustomization.yaml b/config/components/rbac/kustomization.yaml new file mode 100644 index 000000000..66a9ffd10 --- /dev/null +++ b/config/components/rbac/kustomization.yaml @@ -0,0 +1,15 @@ +resources: +- role.yaml +- role_binding.yaml +- leader_election_role.yaml +- leader_election_role_binding.yaml +# Cluster-edit and view roles for devworkspaces and related resources +- edit-workspaces-cluster-role.yaml +- view-workspaces-cluster-role.yaml +# Comment the following 4 lines if you want to disable +# the auth proxy (https://github.com/brancz/kube-rbac-proxy) +# which protects your /metrics endpoint. +- auth_proxy_service.yaml +- auth_proxy_role.yaml +- auth_proxy_role_binding.yaml +- auth_proxy_client_clusterrole.yaml diff --git a/config/components/rbac/leader_election_role.yaml b/config/components/rbac/leader_election_role.yaml new file mode 100644 index 000000000..7dc16c420 --- /dev/null +++ b/config/components/rbac/leader_election_role.yaml @@ -0,0 +1,33 @@ +# permissions to do leader election. +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: leader-election-role +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - "" + resources: + - configmaps/status + verbs: + - get + - update + - patch +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch diff --git a/config/components/rbac/leader_election_role_binding.yaml b/config/components/rbac/leader_election_role_binding.yaml new file mode 100644 index 000000000..eed16906f --- /dev/null +++ b/config/components/rbac/leader_election_role_binding.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: leader-election-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: leader-election-role +subjects: +- kind: ServiceAccount + name: default + namespace: system diff --git a/deploy/role.yaml b/config/components/rbac/role.yaml similarity index 67% rename from deploy/role.yaml rename to config/components/rbac/role.yaml index 58f149bba..9135c4f34 100644 --- a/deploy/role.yaml +++ b/config/components/rbac/role.yaml @@ -1,163 +1,180 @@ + --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: - name: devworkspace-controller - labels: - app.kubernetes.io/name: devworkspace-controller - app.kubernetes.io/part-of: devworkspace-operator + creationTimestamp: null + name: manager-role rules: - apiGroups: - "" resources: - - pods - - services - - endpoints - - persistentvolumeclaims - - events - configmaps + - persistentvolumeclaims + - pods - secrets - verbs: - - '*' -- apiGroups: - - "" - resources: - - namespaces - verbs: - - get -- apiGroups: - - "" - resources: - serviceaccounts verbs: - - watch - - list - - get - create - - update + - delete + - get + - list - patch + - update + - watch - apiGroups: - - rbac.authorization.k8s.io + - admissionregistration.k8s.io resources: - - roles - - rolebindings - - clusterrolebindings - - clusterroles + - mutatingwebhookconfigurations + - validatingwebhookconfigurations verbs: - - watch - - list - - get - create + - delete + - get + - list + - patch - update + - watch - apiGroups: - apps - - extensions resources: - deployments - - replicasets verbs: - - '*' + - create + - delete + - get + - list + - patch + - update + - watch - apiGroups: - - extensions + - batch resources: - - ingresses + - jobs verbs: - - '*' + - create + - delete + - get + - update + - watch - apiGroups: - - "" - - route.openshift.io + - controller.devfile.io resources: - - routes + - components verbs: - create - delete - - deleteCollection - get - list - patch - update - watch - apiGroups: - - "" - - route.openshift.io + - controller.devfile.io resources: - - routes/custom-host + - components/status verbs: - - create + - get + - patch + - update - apiGroups: - - "" - - route.openshift.io + - controller.devfile.io resources: - - routes/status + - workspaceroutings verbs: + - create + - delete - get - list + - patch + - update - watch - apiGroups: - - monitoring.coreos.com + - controller.devfile.io resources: - - servicemonitors + - workspaceroutings/status verbs: - get - - create + - patch + - update - apiGroups: - - apps - resourceNames: - - devworkspace-controller + - "" resources: - - deployments/finalizers + - configmap verbs: + - create + - delete + - get + - list + - patch - update + - watch - apiGroups: - - controller.devfile.io + - "" resources: - - '*' + - services verbs: - - '*' + - create + - delete + - get + - list + - patch + - update + - watch - apiGroups: - - workspace.devfile.io + - extensions resources: - - '*' + - ingresses verbs: - - '*' + - create + - delete + - get + - list + - patch + - update + - watch - apiGroups: - - "" + - rbac.authorization.k8s.io resources: - - pods/exec + - clusterrolebindings + - clusterroles + - rolebindings + - roles verbs: - create + - get + - list + - update + - watch - apiGroups: - - admissionregistration.k8s.io + - route.openshift.io resources: - - mutatingwebhookconfigurations - - validatingwebhookconfigurations + - routes verbs: + - create + - delete - get - list - - watch - - create - patch - update + - watch - apiGroups: - - oauth.openshift.io + - workspace.devfile.io resources: - - oauthclients + - devworkspaces verbs: - create - - get - delete + - get - list - patch - update - watch - - deletecollection - apiGroups: - - batch + - workspace.devfile.io resources: - - jobs + - devworkspaces/status verbs: - get - - create - - watch + - patch - update - - delete diff --git a/config/components/rbac/role_binding.yaml b/config/components/rbac/role_binding.yaml new file mode 100644 index 000000000..8f2658702 --- /dev/null +++ b/config/components/rbac/role_binding.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: manager-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: manager-role +subjects: +- kind: ServiceAccount + name: default + namespace: system diff --git a/deploy/view-workspaces-cluster-role.yaml b/config/components/rbac/view-workspaces-cluster-role.yaml similarity index 100% rename from deploy/view-workspaces-cluster-role.yaml rename to config/components/rbac/view-workspaces-cluster-role.yaml diff --git a/config/components/webhook/kustomization.yaml b/config/components/webhook/kustomization.yaml new file mode 100644 index 000000000..9cf26134e --- /dev/null +++ b/config/components/webhook/kustomization.yaml @@ -0,0 +1,6 @@ +resources: +- manifests.yaml +- service.yaml + +configurations: +- kustomizeconfig.yaml diff --git a/config/components/webhook/kustomizeconfig.yaml b/config/components/webhook/kustomizeconfig.yaml new file mode 100644 index 000000000..25e21e3c9 --- /dev/null +++ b/config/components/webhook/kustomizeconfig.yaml @@ -0,0 +1,25 @@ +# the following config is for teaching kustomize where to look at when substituting vars. +# It requires kustomize v2.1.0 or newer to work properly. +nameReference: +- kind: Service + version: v1 + fieldSpecs: + - kind: MutatingWebhookConfiguration + group: admissionregistration.k8s.io + path: webhooks/clientConfig/service/name + - kind: ValidatingWebhookConfiguration + group: admissionregistration.k8s.io + path: webhooks/clientConfig/service/name + +namespace: +- kind: MutatingWebhookConfiguration + group: admissionregistration.k8s.io + path: webhooks/clientConfig/service/namespace + create: true +- kind: ValidatingWebhookConfiguration + group: admissionregistration.k8s.io + path: webhooks/clientConfig/service/namespace + create: true + +varReference: +- path: metadata/annotations diff --git a/config/components/webhook/service.yaml b/config/components/webhook/service.yaml new file mode 100644 index 000000000..31e0f8295 --- /dev/null +++ b/config/components/webhook/service.yaml @@ -0,0 +1,12 @@ + +apiVersion: v1 +kind: Service +metadata: + name: webhook-service + namespace: system +spec: + ports: + - port: 443 + targetPort: 9443 + selector: + control-plane: controller-manager diff --git a/deploy/crds/controller.devfile.io_components_crd.yaml b/config/crd/bases/controller.devfile.io_components.yaml similarity index 99% rename from deploy/crds/controller.devfile.io_components_crd.yaml rename to config/crd/bases/controller.devfile.io_components.yaml index a55f0e057..1b87f6d79 100644 --- a/deploy/crds/controller.devfile.io_components_crd.yaml +++ b/config/crd/bases/controller.devfile.io_components.yaml @@ -1,6 +1,9 @@ apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.3.0 + creationTimestamp: null name: components.controller.devfile.io spec: group: controller.devfile.io @@ -2542,15 +2545,10 @@ spec: GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. type: string gmsaCredentialSpecName: description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. + of the GMSA credential spec to use. type: string runAsUserName: description: The UserName in Windows to run @@ -2559,9 +2557,7 @@ spec: unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes - precedence. This field is beta-level and may - be disabled with the WindowsRunAsUserName - feature flag. + precedence. type: string type: object type: object @@ -2574,7 +2570,7 @@ spec: provide different probe parameters at the beginning of a Pod''s lifecycle, when it might take a long time to load data or warm a cache, than during steady-state - operation. This cannot be updated. This is an alpha + operation. This cannot be updated. This is a beta feature enabled by the StartupProbe feature flag. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' properties: @@ -2741,7 +2737,7 @@ spec: type: boolean volumeDevices: description: volumeDevices is the list of block devices - to be used by the container. This is a beta feature. + to be used by the container. items: description: volumeDevice describes a mapping of a raw block device within a container. @@ -3673,15 +3669,10 @@ spec: GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. type: string gmsaCredentialSpecName: description: GMSACredentialSpecName is the name - of the GMSA credential spec to use. This field - is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. + of the GMSA credential spec to use. type: string runAsUserName: description: The UserName in Windows to run @@ -3690,9 +3681,7 @@ spec: unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes - precedence. This field is beta-level and may - be disabled with the WindowsRunAsUserName - feature flag. + precedence. type: string type: object type: object @@ -3705,7 +3694,7 @@ spec: provide different probe parameters at the beginning of a Pod''s lifecycle, when it might take a long time to load data or warm a cache, than during steady-state - operation. This cannot be updated. This is an alpha + operation. This cannot be updated. This is a beta feature enabled by the StartupProbe feature flag. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' properties: @@ -3872,7 +3861,7 @@ spec: type: boolean volumeDevices: description: volumeDevices is the list of block devices - to be used by the container. This is a beta feature. + to be used by the container. items: description: volumeDevice describes a mapping of a raw block device within a container. @@ -5341,3 +5330,9 @@ spec: - name: v1alpha1 served: true storage: true +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/deploy/crds/controller.devfile.io_workspaceroutings_crd.yaml b/config/crd/bases/controller.devfile.io_workspaceroutings.yaml similarity index 99% rename from deploy/crds/controller.devfile.io_workspaceroutings_crd.yaml rename to config/crd/bases/controller.devfile.io_workspaceroutings.yaml index db8d28719..4ce3e9e92 100644 --- a/deploy/crds/controller.devfile.io_workspaceroutings_crd.yaml +++ b/config/crd/bases/controller.devfile.io_workspaceroutings.yaml @@ -1,6 +1,9 @@ apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.3.0 + creationTimestamp: null name: workspaceroutings.controller.devfile.io spec: group: controller.devfile.io @@ -971,15 +974,11 @@ spec: description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec - named by the GMSACredentialSpecName field. This - field is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. + named by the GMSACredentialSpecName field. type: string gmsaCredentialSpecName: description: GMSACredentialSpecName is the name of - the GMSA credential spec to use. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA - feature flag. + the GMSA credential spec to use. type: string runAsUserName: description: The UserName in Windows to run the entrypoint @@ -987,9 +986,7 @@ spec: in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext - takes precedence. This field is beta-level and may - be disabled with the WindowsRunAsUserName feature - flag. + takes precedence. type: string type: object type: object @@ -1001,7 +998,7 @@ spec: failed. This can be used to provide different probe parameters at the beginning of a Pod''s lifecycle, when it might take a long time to load data or warm a cache, than during steady-state - operation. This cannot be updated. This is an alpha feature + operation. This cannot be updated. This is a beta feature enabled by the StartupProbe feature flag. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' properties: exec: @@ -1160,7 +1157,7 @@ spec: type: boolean volumeDevices: description: volumeDevices is the list of block devices to - be used by the container. This is a beta feature. + be used by the container. items: description: volumeDevice describes a mapping of a raw block device within a container. @@ -2048,15 +2045,11 @@ spec: description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec - named by the GMSACredentialSpecName field. This - field is alpha-level and is only honored by servers - that enable the WindowsGMSA feature flag. + named by the GMSACredentialSpecName field. type: string gmsaCredentialSpecName: description: GMSACredentialSpecName is the name of - the GMSA credential spec to use. This field is alpha-level - and is only honored by servers that enable the WindowsGMSA - feature flag. + the GMSA credential spec to use. type: string runAsUserName: description: The UserName in Windows to run the entrypoint @@ -2064,9 +2057,7 @@ spec: in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext - takes precedence. This field is beta-level and may - be disabled with the WindowsRunAsUserName feature - flag. + takes precedence. type: string type: object type: object @@ -2078,7 +2069,7 @@ spec: failed. This can be used to provide different probe parameters at the beginning of a Pod''s lifecycle, when it might take a long time to load data or warm a cache, than during steady-state - operation. This cannot be updated. This is an alpha feature + operation. This cannot be updated. This is a beta feature enabled by the StartupProbe feature flag. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' properties: exec: @@ -2237,7 +2228,7 @@ spec: type: boolean volumeDevices: description: volumeDevices is the list of block devices to - be used by the container. This is a beta feature. + be used by the container. items: description: volumeDevice describes a mapping of a raw block device within a container. @@ -3605,3 +3596,9 @@ spec: - name: v1alpha1 served: true storage: true +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/config/crd/kustomization.yaml b/config/crd/kustomization.yaml new file mode 100644 index 000000000..7a7c65ebc --- /dev/null +++ b/config/crd/kustomization.yaml @@ -0,0 +1,27 @@ +# This kustomization.yaml is not intended to be run by itself, +# since it depends on service name and namespace that are out of this kustomize package. +# It should be run by config/default +resources: +- bases/controller.devfile.io_components.yaml +- bases/controller.devfile.io_workspaceroutings.yaml +- bases/workspace.devfile.io_devworkspaces.yaml +# +kubebuilder:scaffold:crdkustomizeresource + +patchesStrategicMerge: +# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix. +# patches here are for enabling the conversion webhook for each CRD +#- patches/webhook_in_components.yaml +#- patches/webhook_in_workspaceroutings.yaml +#- patches/webhook_in_devworkspaces.yaml +# +kubebuilder:scaffold:crdkustomizewebhookpatch + +# [CERTMANAGER] To enable webhook, uncomment all the sections with [CERTMANAGER] prefix. +# patches here are for enabling the CA injection for each CRD +#- patches/cainjection_in_components.yaml +#- patches/cainjection_in_workspaceroutings.yaml +#- patches/cainjection_in_devworkspaces.yaml +# +kubebuilder:scaffold:crdkustomizecainjectionpatch + +# the following config is for teaching kustomize how to do kustomization for CRDs. +configurations: +- kustomizeconfig.yaml diff --git a/config/crd/kustomizeconfig.yaml b/config/crd/kustomizeconfig.yaml new file mode 100644 index 000000000..6f83d9a94 --- /dev/null +++ b/config/crd/kustomizeconfig.yaml @@ -0,0 +1,17 @@ +# This file is for teaching kustomize how to substitute name and namespace reference in CRD +nameReference: +- kind: Service + version: v1 + fieldSpecs: + - kind: CustomResourceDefinition + group: apiextensions.k8s.io + path: spec/conversion/webhookClientConfig/service/name + +namespace: +- kind: CustomResourceDefinition + group: apiextensions.k8s.io + path: spec/conversion/webhookClientConfig/service/namespace + create: false + +varReference: +- path: metadata/annotations diff --git a/config/crd/patches/cainjection_in_components.yaml b/config/crd/patches/cainjection_in_components.yaml new file mode 100644 index 000000000..28f9050bc --- /dev/null +++ b/config/crd/patches/cainjection_in_components.yaml @@ -0,0 +1,8 @@ +# The following patch adds a directive for certmanager to inject CA into the CRD +# CRD conversion requires k8s 1.13 or later. +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + annotations: + cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) + name: components.controller.devfile.io diff --git a/config/crd/patches/cainjection_in_devworkspaces.yaml b/config/crd/patches/cainjection_in_devworkspaces.yaml new file mode 100644 index 000000000..e501ffb1f --- /dev/null +++ b/config/crd/patches/cainjection_in_devworkspaces.yaml @@ -0,0 +1,8 @@ +# The following patch adds a directive for certmanager to inject CA into the CRD +# CRD conversion requires k8s 1.13 or later. +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + annotations: + cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) + name: devworkspaces.workspace.devfile.io diff --git a/config/crd/patches/cainjection_in_workspaceroutings.yaml b/config/crd/patches/cainjection_in_workspaceroutings.yaml new file mode 100644 index 000000000..2c934ecd9 --- /dev/null +++ b/config/crd/patches/cainjection_in_workspaceroutings.yaml @@ -0,0 +1,8 @@ +# The following patch adds a directive for certmanager to inject CA into the CRD +# CRD conversion requires k8s 1.13 or later. +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + annotations: + cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) + name: workspaceroutings.controller.devfile.io diff --git a/config/crd/patches/webhook_in_components.yaml b/config/crd/patches/webhook_in_components.yaml new file mode 100644 index 000000000..f9517173c --- /dev/null +++ b/config/crd/patches/webhook_in_components.yaml @@ -0,0 +1,17 @@ +# The following patch enables conversion webhook for CRD +# CRD conversion requires k8s 1.13 or later. +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: components.controller.devfile.io +spec: + conversion: + strategy: Webhook + webhookClientConfig: + # this is "\n" used as a placeholder, otherwise it will be rejected by the apiserver for being blank, + # but we're going to set it later using the cert-manager (or potentially a patch if not using cert-manager) + caBundle: Cg== + service: + namespace: system + name: webhook-service + path: /convert diff --git a/config/crd/patches/webhook_in_devworkspaces.yaml b/config/crd/patches/webhook_in_devworkspaces.yaml new file mode 100644 index 000000000..5814ce563 --- /dev/null +++ b/config/crd/patches/webhook_in_devworkspaces.yaml @@ -0,0 +1,17 @@ +# The following patch enables conversion webhook for CRD +# CRD conversion requires k8s 1.13 or later. +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: devworkspaces.workspace.devfile.io +spec: + conversion: + strategy: Webhook + webhookClientConfig: + # this is "\n" used as a placeholder, otherwise it will be rejected by the apiserver for being blank, + # but we're going to set it later using the cert-manager (or potentially a patch if not using cert-manager) + caBundle: Cg== + service: + namespace: system + name: webhook-service + path: /convert diff --git a/config/crd/patches/webhook_in_workspaceroutings.yaml b/config/crd/patches/webhook_in_workspaceroutings.yaml new file mode 100644 index 000000000..88b8aebdc --- /dev/null +++ b/config/crd/patches/webhook_in_workspaceroutings.yaml @@ -0,0 +1,17 @@ +# The following patch enables conversion webhook for CRD +# CRD conversion requires k8s 1.13 or later. +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: workspaceroutings.controller.devfile.io +spec: + conversion: + strategy: Webhook + webhookClientConfig: + # this is "\n" used as a placeholder, otherwise it will be rejected by the apiserver for being blank, + # but we're going to set it later using the cert-manager (or potentially a patch if not using cert-manager) + caBundle: Cg== + service: + namespace: system + name: webhook-service + path: /convert diff --git a/config/default/kustomization.yaml b/config/default/kustomization.yaml new file mode 100644 index 000000000..03c145951 --- /dev/null +++ b/config/default/kustomization.yaml @@ -0,0 +1,71 @@ +# Adds namespace to all resources. +namespace: devworkspace-operator + +# Value of this field is prepended to the +# names of all resources, e.g. a deployment named +# "wordpress" becomes "alices-wordpress". +# Note that it should also match with the prefix (text before '-') of the namespace +# field above. +namePrefix: devworkspace-controller- + +# Labels to add to all resources and selectors. +commonLabels: + app.kubernetes.io/name: devworkspace-controller + app.kubernetes.io/part-of: devworkspace-operator + +bases: +- ../crd +- ../components/rbac +- ../components/manager +# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in +# crd/kustomization.yaml +#- ../components/webhook +# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. 'WEBHOOK' components are required. +#- ../components/certmanager +# [PROMETHEUS] To enable prometheus monitor, uncomment all sections with 'PROMETHEUS'. +#- ../components/prometheus + +patchesStrategicMerge: + # Protect the /metrics endpoint by putting it behind auth. + # If you want your controller-manager to expose the /metrics + # endpoint w/o any authn/z, please comment the following line. +- manager_auth_proxy_patch.yaml + +# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in +# crd/kustomization.yaml +#- manager_webhook_patch.yaml + +# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. +# Uncomment 'CERTMANAGER' sections in crd/kustomization.yaml to enable the CA injection in the admission webhooks. +# 'CERTMANAGER' needs to be enabled to use ca injection +#- webhookcainjection_patch.yaml + +# the following config is for teaching kustomize how to do var substitution +vars: +# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER' prefix. +#- name: CERTIFICATE_NAMESPACE # namespace of the certificate CR +# objref: +# kind: Certificate +# group: cert-manager.io +# version: v1alpha2 +# name: serving-cert # this name should match the one in certificate.yaml +# fieldref: +# fieldpath: metadata.namespace +#- name: CERTIFICATE_NAME +# objref: +# kind: Certificate +# group: cert-manager.io +# version: v1alpha2 +# name: serving-cert # this name should match the one in certificate.yaml +#- name: SERVICE_NAMESPACE # namespace of the service +# objref: +# kind: Service +# version: v1 +# name: webhook-service +# fieldref: +# fieldpath: metadata.namespace +#- name: SERVICE_NAME +# objref: +# kind: Service +# version: v1 +# name: webhook-service diff --git a/config/default/manager_auth_proxy_patch.yaml b/config/default/manager_auth_proxy_patch.yaml new file mode 100644 index 000000000..138fd7ce4 --- /dev/null +++ b/config/default/manager_auth_proxy_patch.yaml @@ -0,0 +1,26 @@ +# This patch inject a sidecar container which is a HTTP proxy for the +# controller manager, it performs RBAC authorization against the Kubernetes API using SubjectAccessReviews. +apiVersion: apps/v1 +kind: Deployment +metadata: + name: manager + namespace: system +spec: + template: + spec: + containers: + - name: kube-rbac-proxy + image: gcr.io/kubebuilder/kube-rbac-proxy:v0.5.0 + args: + - "--secure-listen-address=0.0.0.0:8443" + - "--upstream=http://127.0.0.1:8080/" + - "--logtostderr=true" + - "--v=10" + ports: + - containerPort: 8443 + name: https + - name: devworkspace-controller + args: + - /usr/local/bin/devworkspace-controller + - "--metrics-addr=127.0.0.1:8080" + - "--enable-leader-election" diff --git a/config/default/manager_webhook_patch.yaml b/config/default/manager_webhook_patch.yaml new file mode 100644 index 000000000..1c7ba316e --- /dev/null +++ b/config/default/manager_webhook_patch.yaml @@ -0,0 +1,23 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: manager + namespace: system +spec: + template: + spec: + containers: + - name: devworkspace-controller + ports: + - containerPort: 9443 + name: webhook-server + protocol: TCP + volumeMounts: + - mountPath: /tmp/k8s-webhook-server/serving-certs + name: cert + readOnly: true + volumes: + - name: cert + secret: + defaultMode: 420 + secretName: webhook-server-cert diff --git a/config/default/webhookcainjection_patch.yaml b/config/default/webhookcainjection_patch.yaml new file mode 100644 index 000000000..7e79bf995 --- /dev/null +++ b/config/default/webhookcainjection_patch.yaml @@ -0,0 +1,15 @@ +# This patch add annotation to admission webhook config and +# the variables $(CERTIFICATE_NAMESPACE) and $(CERTIFICATE_NAME) will be substituted by kustomize. +apiVersion: admissionregistration.k8s.io/v1beta1 +kind: MutatingWebhookConfiguration +metadata: + name: mutating-webhook-configuration + annotations: + cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) +--- +apiVersion: admissionregistration.k8s.io/v1beta1 +kind: ValidatingWebhookConfiguration +metadata: + name: validating-webhook-configuration + annotations: + cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) diff --git a/config/devel/config.properties b/config/devel/config.properties new file mode 100644 index 000000000..62b1f9435 --- /dev/null +++ b/config/devel/config.properties @@ -0,0 +1,10 @@ +devworkspace.routing.cluster_host_suffix=192.168.49.2.nip.io +controller.plugin_registry.url=http://che-plugin-registry.192.168.49.2.nip.io/v3 +controller.plugin_artifacts_broker.image=quay.io/eclipse/che-plugin-artifacts-broker:v3.1.0 +controller.webhooks.enabled=true +devworkspace.default_routing_class=basic +# image pull policy that is applied to all workspace's containers +devworkspace.sidecar.image_pull_policy=Always +devworkspace.api_sidecar.image=quay.io/che-incubator/che-api-sidecar:next +# Do not enable it in production!!! +devworkspace.experimental_features_enabled=true diff --git a/config/devel/kustomization.yaml b/config/devel/kustomization.yaml new file mode 100644 index 000000000..f45c717eb --- /dev/null +++ b/config/devel/kustomization.yaml @@ -0,0 +1,17 @@ +bases: +- ../default + +commonLabels: + app.kubernetes.io/name: devworkspace-controller + app.kubernetes.io/part-of: devworkspace-operator + +generatorOptions: + disableNameSuffixHash: true + +configMapGenerator: +- name: devworkspace-controller + envs: + - config.properties + +patchesStrategicMerge: +- manager_image_patch.yaml diff --git a/config/devel/manager_image_patch.yaml b/config/devel/manager_image_patch.yaml new file mode 100644 index 000000000..c2a74104d --- /dev/null +++ b/config/devel/manager_image_patch.yaml @@ -0,0 +1,12 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: manager + namespace: system +spec: + template: + spec: + containers: + - name: devworkspace-controller + image: docker.io/amisevsk/che-workspace-controller:dev + imagePullPolicy: Always diff --git a/deploy/registry/local/deployment.yaml b/config/registry/local/deployment.yaml similarity index 100% rename from deploy/registry/local/deployment.yaml rename to config/registry/local/deployment.yaml diff --git a/deploy/registry/local/k8s/ingress.yaml b/config/registry/local/k8s/ingress.yaml similarity index 92% rename from deploy/registry/local/k8s/ingress.yaml rename to config/registry/local/k8s/ingress.yaml index 210776363..e4368846b 100644 --- a/deploy/registry/local/k8s/ingress.yaml +++ b/config/registry/local/k8s/ingress.yaml @@ -18,7 +18,7 @@ metadata: app.kubernetes.io/part-of: devworkspace-operator spec: rules: - - host: che-plugin-registry.192.168.99.100.nip.io + - host: che-plugin-registry.${ROUTING_SUFFIX} http: paths: - path: / diff --git a/deploy/registry/local/os/route.yaml b/config/registry/local/os/route.yaml similarity index 100% rename from deploy/registry/local/os/route.yaml rename to config/registry/local/os/route.yaml diff --git a/deploy/registry/local/service.yaml b/config/registry/local/service.yaml similarity index 100% rename from deploy/registry/local/service.yaml rename to config/registry/local/service.yaml diff --git a/pkg/controller/component/cmd_terminal/cmd_terminal.go b/controllers/controller/component/cmd_terminal/cmd_terminal.go similarity index 100% rename from pkg/controller/component/cmd_terminal/cmd_terminal.go rename to controllers/controller/component/cmd_terminal/cmd_terminal.go diff --git a/pkg/controller/component/component_controller.go b/controllers/controller/component/component_controller.go similarity index 55% rename from pkg/controller/component/component_controller.go rename to controllers/controller/component/component_controller.go index 3da06b33c..9deaaf8d8 100644 --- a/pkg/controller/component/component_controller.go +++ b/controllers/controller/component/component_controller.go @@ -17,84 +17,46 @@ import ( "fmt" "github.com/devfile/devworkspace-operator/pkg/adaptor" - "github.com/go-logr/logr" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" corev1 "k8s.io/api/core/v1" + k8sErrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/reconcile" - controllerv1alpha1 "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" - k8sErrors "k8s.io/apimachinery/pkg/api/errors" + "github.com/go-logr/logr" "k8s.io/apimachinery/pkg/runtime" + ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/handler" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - "sigs.k8s.io/controller-runtime/pkg/source" -) -var log = logf.Log.WithName("controller_component") + controllerv1alpha1 "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" +) var configMapDiffOpts = cmp.Options{ cmpopts.IgnoreFields(corev1.ConfigMap{}, "TypeMeta", "ObjectMeta"), } -// Add creates a new Component Controller and adds it to the Manager. The Manager will set fields on the Controller -// and Start it when the Manager is Started. -func Add(mgr manager.Manager) error { - return add(mgr, newReconciler(mgr)) -} - -// newReconciler returns a new reconcile.Reconciler -func newReconciler(mgr manager.Manager) reconcile.Reconciler { - return &ReconcileComponent{client: mgr.GetClient(), scheme: mgr.GetScheme()} -} - -// add adds a new Controller to mgr with r as the reconcile.Reconciler -func add(mgr manager.Manager, r reconcile.Reconciler) error { - // Create a new controller - c, err := controller.New("component-controller", mgr, controller.Options{Reconciler: r}) - if err != nil { - return err - } - - // Watch for changes to primary resource Component - err = c.Watch(&source.Kind{Type: &controllerv1alpha1.Component{}}, &handler.EnqueueRequestForObject{}) - if err != nil { - return err - } - - err = c.Watch(&source.Kind{Type: &corev1.ConfigMap{}}, &handler.EnqueueRequestForOwner{ - IsController: true, - OwnerType: &controllerv1alpha1.Component{}, - }) - - return nil +// ComponentReconciler reconciles a Component object +type ComponentReconciler struct { + client.Client + Log logr.Logger + Scheme *runtime.Scheme } -// blank assignment to verify that ReconcileComponent implements reconcile.Reconciler -var _ reconcile.Reconciler = &ReconcileComponent{} +// +kubebuilder:rbac:groups=controller.devfile.io,resources=components,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=controller.devfile.io,resources=components/status,verbs=get;update;patch +// +kubebuilder:rbac:groups=core,resources=configmap,verbs=get;list;watch;create;update;patch;delete -// ReconcileComponent reconciles a Component object -type ReconcileComponent struct { - // This client, initialized using mgr.Client() above, is a split client - // that reads objects from the cache and writes to the apiserver - client client.Client - scheme *runtime.Scheme -} +func (r *ComponentReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { + ctx := context.Background() -// Reconcile reads that state of the cluster for a Component object and makes changes based on the state read -// and what is in the Component.Spec -func (r *ReconcileComponent) Reconcile(request reconcile.Request) (reconcile.Result, error) { - reqLogger := log.WithValues("Request.Namespace", request.Namespace, "Request.Name", request.Name) + reqLogger := r.Log.WithValues("Request.Namespace", req.Namespace, "Request.Name", req.Name) reqLogger.Info("Reconciling Component") // Fetch the Component instance instance := &controllerv1alpha1.Component{} - err := r.client.Get(context.TODO(), request.NamespacedName, instance) + err := r.Get(ctx, req.NamespacedName, instance) if err != nil { if k8sErrors.IsNotFound(err) { // Request object not found, could have been deleted after reconcile request. @@ -147,8 +109,8 @@ func (r *ReconcileComponent) Reconcile(request reconcile.Request) (reconcile.Res return reconcile.Result{}, r.reconcileStatus(instance, components) } -func (r *ReconcileComponent) reconcileConfigMap(instance *controllerv1alpha1.Component, cm *corev1.ConfigMap, log logr.Logger) (ok bool, err error) { - err = controllerutil.SetControllerReference(instance, cm, r.scheme) +func (r *ComponentReconciler) reconcileConfigMap(instance *controllerv1alpha1.Component, cm *corev1.ConfigMap, log logr.Logger) (ok bool, err error) { + err = controllerutil.SetControllerReference(instance, cm, r.Scheme) if err != nil { return false, err } @@ -157,11 +119,11 @@ func (r *ReconcileComponent) reconcileConfigMap(instance *controllerv1alpha1.Com Namespace: cm.Namespace, Name: cm.Name, } - err = r.client.Get(context.TODO(), namespacedName, clusterConfigMap) + err = r.Get(context.TODO(), namespacedName, clusterConfigMap) if err != nil { if k8sErrors.IsNotFound(err) { log.Info("Creating broker ConfigMap") - err := r.client.Create(context.TODO(), cm) + err := r.Create(context.TODO(), cm) return false, err } return false, err @@ -171,18 +133,25 @@ func (r *ReconcileComponent) reconcileConfigMap(instance *controllerv1alpha1.Com log.Info("Updating broker ConfigMap") log.V(2).Info(fmt.Sprintf("Diff: %s\n", cmp.Diff(cm, clusterConfigMap, configMapDiffOpts))) clusterConfigMap.Data = cm.Data - err := r.client.Update(context.TODO(), clusterConfigMap) + err := r.Update(context.TODO(), clusterConfigMap) return false, err } return true, nil } -func (r *ReconcileComponent) reconcileStatus(instance *controllerv1alpha1.Component, components []controllerv1alpha1.ComponentDescription) error { +func (r *ComponentReconciler) reconcileStatus(instance *controllerv1alpha1.Component, components []controllerv1alpha1.ComponentDescription) error { if instance.Status.Ready && cmp.Equal(instance.Status.ComponentDescriptions, components) { return nil } instance.Status.ComponentDescriptions = components instance.Status.Ready = true - return r.client.Status().Update(context.TODO(), instance) + return r.Status().Update(context.TODO(), instance) +} + +func (r *ComponentReconciler) SetupWithManager(mgr ctrl.Manager) error { + return ctrl.NewControllerManagedBy(mgr). + For(&controllerv1alpha1.Component{}). + Owns(&corev1.ConfigMap{}). + Complete(r) } diff --git a/pkg/controller/workspacerouting/solvers/basic_solver.go b/controllers/controller/workspacerouting/solvers/basic_solver.go similarity index 73% rename from pkg/controller/workspacerouting/solvers/basic_solver.go rename to controllers/controller/workspacerouting/solvers/basic_solver.go index a939bb1e2..fd383c0ac 100644 --- a/pkg/controller/workspacerouting/solvers/basic_solver.go +++ b/controllers/controller/workspacerouting/solvers/basic_solver.go @@ -13,7 +13,7 @@ package solvers import ( - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" + controllerv1alpha1 "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" ) var ingressAnnotations = map[string]string{ @@ -26,7 +26,7 @@ type BasicSolver struct{} var _ RoutingSolver = (*BasicSolver)(nil) -func (s *BasicSolver) GetSpecObjects(spec v1alpha1.WorkspaceRoutingSpec, workspaceMeta WorkspaceMetadata) RoutingObjects { +func (s *BasicSolver) GetSpecObjects(spec controllerv1alpha1.WorkspaceRoutingSpec, workspaceMeta WorkspaceMetadata) RoutingObjects { services := getServicesForEndpoints(spec.Endpoints, workspaceMeta) services = append(services, getDiscoverableServicesForEndpoints(spec.Endpoints, workspaceMeta)...) ingresses, routes := getRoutingForSpec(spec.Endpoints, workspaceMeta) @@ -39,7 +39,7 @@ func (s *BasicSolver) GetSpecObjects(spec v1alpha1.WorkspaceRoutingSpec, workspa } func (s *BasicSolver) GetExposedEndpoints( - endpoints map[string]v1alpha1.EndpointList, - routingObj RoutingObjects) (exposedEndpoints map[string]v1alpha1.ExposedEndpointList, ready bool, err error) { + endpoints map[string]controllerv1alpha1.EndpointList, + routingObj RoutingObjects) (exposedEndpoints map[string]controllerv1alpha1.ExposedEndpointList, ready bool, err error) { return getExposedEndpoints(endpoints, routingObj) } diff --git a/pkg/controller/workspacerouting/solvers/cluster_solver.go b/controllers/controller/workspacerouting/solvers/cluster_solver.go similarity index 81% rename from pkg/controller/workspacerouting/solvers/cluster_solver.go rename to controllers/controller/workspacerouting/solvers/cluster_solver.go index 2d61aaf0d..a4bed7ef2 100644 --- a/pkg/controller/workspacerouting/solvers/cluster_solver.go +++ b/controllers/controller/workspacerouting/solvers/cluster_solver.go @@ -18,7 +18,7 @@ import ( "github.com/devfile/devworkspace-operator/pkg/common" devworkspace "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" + controllerv1alpha1 "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/pkg/config" corev1 "k8s.io/api/core/v1" ) @@ -33,9 +33,9 @@ type ClusterSolver struct { var _ RoutingSolver = (*ClusterSolver)(nil) -func (s *ClusterSolver) GetSpecObjects(spec v1alpha1.WorkspaceRoutingSpec, workspaceMeta WorkspaceMetadata) RoutingObjects { +func (s *ClusterSolver) GetSpecObjects(spec controllerv1alpha1.WorkspaceRoutingSpec, workspaceMeta WorkspaceMetadata) RoutingObjects { services := getServicesForEndpoints(spec.Endpoints, workspaceMeta) - podAdditions := &v1alpha1.PodAdditions{} + podAdditions := &controllerv1alpha1.PodAdditions{} if s.TLS { readOnlyMode := int32(420) for idx, service := range services { @@ -67,21 +67,21 @@ func (s *ClusterSolver) GetSpecObjects(spec v1alpha1.WorkspaceRoutingSpec, works } func (s *ClusterSolver) GetExposedEndpoints( - endpoints map[string]v1alpha1.EndpointList, - routingObj RoutingObjects) (exposedEndpoints map[string]v1alpha1.ExposedEndpointList, ready bool, err error) { + endpoints map[string]controllerv1alpha1.EndpointList, + routingObj RoutingObjects) (exposedEndpoints map[string]controllerv1alpha1.ExposedEndpointList, ready bool, err error) { - exposedEndpoints = map[string]v1alpha1.ExposedEndpointList{} + exposedEndpoints = map[string]controllerv1alpha1.ExposedEndpointList{} for machineName, machineEndpoints := range endpoints { for _, endpoint := range machineEndpoints { - if endpoint.Attributes[string(v1alpha1.PUBLIC_ENDPOINT_ATTRIBUTE)] != "true" { + if endpoint.Attributes[string(controllerv1alpha1.PUBLIC_ENDPOINT_ATTRIBUTE)] != "true" { continue } url, err := resolveServiceHostnameForEndpoint(endpoint, routingObj.Services) if err != nil { return nil, false, err } - exposedEndpoints[machineName] = append(exposedEndpoints[machineName], v1alpha1.ExposedEndpoint{ + exposedEndpoints[machineName] = append(exposedEndpoints[machineName], controllerv1alpha1.ExposedEndpoint{ Name: endpoint.Name, Url: url, Attributes: endpoint.Attributes, diff --git a/pkg/controller/workspacerouting/solvers/common.go b/controllers/controller/workspacerouting/solvers/common.go similarity index 87% rename from pkg/controller/workspacerouting/solvers/common.go rename to controllers/controller/workspacerouting/solvers/common.go index c43a91804..6a808d06e 100644 --- a/pkg/controller/workspacerouting/solvers/common.go +++ b/controllers/controller/workspacerouting/solvers/common.go @@ -14,7 +14,7 @@ package solvers import ( devworkspace "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" + controllerv1alpha1 "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/pkg/common" "github.com/devfile/devworkspace-operator/pkg/config" routeV1 "github.com/openshift/api/route/v1" @@ -31,11 +31,11 @@ type WorkspaceMetadata struct { RoutingSuffix string } -func getDiscoverableServicesForEndpoints(endpoints map[string]v1alpha1.EndpointList, meta WorkspaceMetadata) []corev1.Service { +func getDiscoverableServicesForEndpoints(endpoints map[string]controllerv1alpha1.EndpointList, meta WorkspaceMetadata) []corev1.Service { var services []corev1.Service for _, machineEndpoints := range endpoints { for _, endpoint := range machineEndpoints { - if endpoint.Attributes[string(v1alpha1.DISCOVERABLE_ATTRIBUTE)] == "true" { + if endpoint.Attributes[string(controllerv1alpha1.DISCOVERABLE_ATTRIBUTE)] == "true" { // Create service with name matching endpoint // TODO: This could cause a reconcile conflict if multiple workspaces define the same discoverable endpoint // Also endpoint names may not be valid as service names @@ -68,7 +68,7 @@ func getDiscoverableServicesForEndpoints(endpoints map[string]v1alpha1.EndpointL return services } -func getServicesForEndpoints(endpoints map[string]v1alpha1.EndpointList, meta WorkspaceMetadata) []corev1.Service { +func getServicesForEndpoints(endpoints map[string]controllerv1alpha1.EndpointList, meta WorkspaceMetadata) []corev1.Service { var services []corev1.Service var servicePorts []corev1.ServicePort for _, machineEndpoints := range endpoints { @@ -113,12 +113,12 @@ func getServicesForEndpoints(endpoints map[string]v1alpha1.EndpointList, meta Wo return services } -func getRoutingForSpec(endpoints map[string]v1alpha1.EndpointList, meta WorkspaceMetadata) ([]v1beta1.Ingress, []routeV1.Route) { +func getRoutingForSpec(endpoints map[string]controllerv1alpha1.EndpointList, meta WorkspaceMetadata) ([]v1beta1.Ingress, []routeV1.Route) { var ingresses []v1beta1.Ingress var routes []routeV1.Route for _, machineEndpoints := range endpoints { for _, endpoint := range machineEndpoints { - if endpoint.Attributes[string(v1alpha1.PUBLIC_ENDPOINT_ATTRIBUTE)] != "true" { + if endpoint.Attributes[string(controllerv1alpha1.PUBLIC_ENDPOINT_ATTRIBUTE)] != "true" { continue } if config.ControllerCfg.IsOpenShift() { @@ -168,7 +168,7 @@ func getIngressForEndpoint(endpoint devworkspace.Endpoint, meta WorkspaceMetadat for k, v := range ingressAnnotations { annotations[k] = v } - + ingressPathType := v1beta1.PathTypeImplementationSpecific return v1beta1.Ingress{ ObjectMeta: metav1.ObjectMeta{ Name: common.RouteName(meta.WorkspaceId, endpointName), @@ -190,6 +190,8 @@ func getIngressForEndpoint(endpoint devworkspace.Endpoint, meta WorkspaceMetadat ServiceName: common.ServiceName(meta.WorkspaceId), ServicePort: targetEndpoint, }, + PathType: &ingressPathType, + Path: "/", }, }, }, diff --git a/pkg/controller/workspacerouting/solvers/oauth_proxy_container.go b/controllers/controller/workspacerouting/solvers/oauth_proxy_container.go similarity index 93% rename from pkg/controller/workspacerouting/solvers/oauth_proxy_container.go rename to controllers/controller/workspacerouting/solvers/oauth_proxy_container.go index f907e1add..2c58d58eb 100644 --- a/pkg/controller/workspacerouting/solvers/oauth_proxy_container.go +++ b/controllers/controller/workspacerouting/solvers/oauth_proxy_container.go @@ -18,19 +18,19 @@ import ( "github.com/devfile/devworkspace-operator/internal/images" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" + controllerv1alpha1 "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/pkg/common" "github.com/devfile/devworkspace-operator/pkg/config" corev1 "k8s.io/api/core/v1" ) -func getProxyPodAdditions(proxyEndpoints map[string]proxyEndpoint, meta WorkspaceMetadata) *v1alpha1.PodAdditions { +func getProxyPodAdditions(proxyEndpoints map[string]proxyEndpoint, meta WorkspaceMetadata) *controllerv1alpha1.PodAdditions { tlsSecretVolume := buildSecretVolume(common.OAuthProxySecretName(meta.WorkspaceId)) var proxyContainers []corev1.Container for _, proxyEndpoint := range proxyEndpoints { proxyContainers = append(proxyContainers, getProxyContainerForEndpoint(proxyEndpoint, tlsSecretVolume, meta)) } - return &v1alpha1.PodAdditions{ + return &controllerv1alpha1.PodAdditions{ Containers: proxyContainers, Volumes: []corev1.Volume{tlsSecretVolume}, } diff --git a/pkg/controller/workspacerouting/solvers/openshift_oauth_solver.go b/controllers/controller/workspacerouting/solvers/openshift_oauth_solver.go similarity index 77% rename from pkg/controller/workspacerouting/solvers/openshift_oauth_solver.go rename to controllers/controller/workspacerouting/solvers/openshift_oauth_solver.go index 6b102475e..9a184c6a5 100644 --- a/pkg/controller/workspacerouting/solvers/openshift_oauth_solver.go +++ b/controllers/controller/workspacerouting/solvers/openshift_oauth_solver.go @@ -16,7 +16,7 @@ import ( "fmt" devworkspace "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" + controllerv1alpha1 "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/pkg/common" "github.com/devfile/devworkspace-operator/pkg/config" oauthv1 "github.com/openshift/api/oauth/v1" @@ -35,12 +35,12 @@ type proxyEndpoint struct { publicEndpointHttpPort int64 } -func (s *OpenShiftOAuthSolver) GetSpecObjects(spec v1alpha1.WorkspaceRoutingSpec, workspaceMeta WorkspaceMetadata) RoutingObjects { +func (s *OpenShiftOAuthSolver) GetSpecObjects(spec controllerv1alpha1.WorkspaceRoutingSpec, workspaceMeta WorkspaceMetadata) RoutingObjects { proxy, noProxy := getProxiedEndpoints(spec) defaultIngresses, defaultRoutes := getRoutingForSpec(noProxy, workspaceMeta) portMappings := getProxyEndpointMappings(proxy) - var proxyPorts = map[string]v1alpha1.EndpointList{} + var proxyPorts = map[string]controllerv1alpha1.EndpointList{} for _, proxyEndpoint := range portMappings { proxyPorts[proxyEndpoint.machineName] = append(proxyPorts[proxyEndpoint.machineName], proxyEndpoint.publicEndpoint) } @@ -86,25 +86,25 @@ func (s *OpenShiftOAuthSolver) GetSpecObjects(spec v1alpha1.WorkspaceRoutingSpec } func (s *OpenShiftOAuthSolver) GetExposedEndpoints( - endpoints map[string]v1alpha1.EndpointList, - routingObj RoutingObjects) (exposedEndpoints map[string]v1alpha1.ExposedEndpointList, ready bool, err error) { + endpoints map[string]controllerv1alpha1.EndpointList, + routingObj RoutingObjects) (exposedEndpoints map[string]controllerv1alpha1.ExposedEndpointList, ready bool, err error) { return getExposedEndpoints(endpoints, routingObj) } func (s *OpenShiftOAuthSolver) getProxyRoutes( - endpoints map[string]v1alpha1.EndpointList, + endpoints map[string]controllerv1alpha1.EndpointList, workspaceMeta WorkspaceMetadata, - portMappings map[string]proxyEndpoint) ([]routeV1.Route, *v1alpha1.PodAdditions) { + portMappings map[string]proxyEndpoint) ([]routeV1.Route, *controllerv1alpha1.PodAdditions) { var routes []routeV1.Route - var podAdditions *v1alpha1.PodAdditions + var podAdditions *controllerv1alpha1.PodAdditions for _, machineEndpoints := range endpoints { for _, upstreamEndpoint := range machineEndpoints { proxyEndpoint := portMappings[upstreamEndpoint.Name] endpoint := proxyEndpoint.publicEndpoint var tls *routeV1.TLSConfig = nil - if endpoint.Attributes[string(v1alpha1.SECURE_ENDPOINT_ATTRIBUTE)] == "true" { - if endpoint.Attributes[string(v1alpha1.TYPE_ENDPOINT_ATTRIBUTE)] == "terminal" { + if endpoint.Attributes[string(controllerv1alpha1.SECURE_ENDPOINT_ATTRIBUTE)] == "true" { + if endpoint.Attributes[string(controllerv1alpha1.TYPE_ENDPOINT_ATTRIBUTE)] == "terminal" { tls = &routeV1.TLSConfig{ Termination: routeV1.TLSTerminationEdge, InsecureEdgeTerminationPolicy: routeV1.InsecureEdgeTerminationPolicyRedirect, @@ -129,9 +129,9 @@ func (s *OpenShiftOAuthSolver) getProxyRoutes( return routes, podAdditions } -func getProxiedEndpoints(spec v1alpha1.WorkspaceRoutingSpec) (proxy, noProxy map[string]v1alpha1.EndpointList) { - proxy = map[string]v1alpha1.EndpointList{} - noProxy = map[string]v1alpha1.EndpointList{} +func getProxiedEndpoints(spec controllerv1alpha1.WorkspaceRoutingSpec) (proxy, noProxy map[string]controllerv1alpha1.EndpointList) { + proxy = map[string]controllerv1alpha1.EndpointList{} + noProxy = map[string]controllerv1alpha1.EndpointList{} for machineName, machineEndpoints := range spec.Endpoints { for _, endpoint := range machineEndpoints { if endpointNeedsProxy(endpoint) { @@ -145,7 +145,7 @@ func getProxiedEndpoints(spec v1alpha1.WorkspaceRoutingSpec) (proxy, noProxy map } func getProxyEndpointMappings( - endpoints map[string]v1alpha1.EndpointList) map[string]proxyEndpoint { + endpoints map[string]controllerv1alpha1.EndpointList) map[string]proxyEndpoint { proxyHttpsPort := 4400 proxyHttpPort := int64(4180) @@ -171,9 +171,9 @@ func getProxyEndpointMappings( } func endpointNeedsProxy(endpoint devworkspace.Endpoint) bool { - publicAttr, exists := endpoint.Attributes[string(v1alpha1.PUBLIC_ENDPOINT_ATTRIBUTE)] + publicAttr, exists := endpoint.Attributes[string(controllerv1alpha1.PUBLIC_ENDPOINT_ATTRIBUTE)] endpointIsPublic := !exists || (publicAttr == "true") return endpointIsPublic && - endpoint.Attributes[string(v1alpha1.SECURE_ENDPOINT_ATTRIBUTE)] == "true" && - endpoint.Attributes[string(v1alpha1.TYPE_ENDPOINT_ATTRIBUTE)] != "terminal" + endpoint.Attributes[string(controllerv1alpha1.SECURE_ENDPOINT_ATTRIBUTE)] == "true" && + endpoint.Attributes[string(controllerv1alpha1.TYPE_ENDPOINT_ATTRIBUTE)] != "terminal" } diff --git a/pkg/controller/workspacerouting/solvers/resolve_endpoints.go b/controllers/controller/workspacerouting/solvers/resolve_endpoints.go similarity index 97% rename from pkg/controller/workspacerouting/solvers/resolve_endpoints.go rename to controllers/controller/workspacerouting/solvers/resolve_endpoints.go index ade2f2d70..9238bfded 100644 --- a/pkg/controller/workspacerouting/solvers/resolve_endpoints.go +++ b/controllers/controller/workspacerouting/solvers/resolve_endpoints.go @@ -17,7 +17,7 @@ import ( "net/url" devworkspace "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" - controllerv1alpha1 "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" + controllerv1alpha1 "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/pkg/config" ) diff --git a/pkg/controller/workspacerouting/solvers/solver.go b/controllers/controller/workspacerouting/solvers/solver.go similarity index 61% rename from pkg/controller/workspacerouting/solvers/solver.go rename to controllers/controller/workspacerouting/solvers/solver.go index d7f76c5b6..6f2532b2c 100644 --- a/pkg/controller/workspacerouting/solvers/solver.go +++ b/controllers/controller/workspacerouting/solvers/solver.go @@ -13,8 +13,7 @@ package solvers import ( - //TODO - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" + controllerv1alpha1 "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" oauthv1 "github.com/openshift/api/oauth/v1" routeV1 "github.com/openshift/api/route/v1" v1 "k8s.io/api/core/v1" @@ -25,11 +24,11 @@ type RoutingObjects struct { Services []v1.Service Ingresses []v1beta1.Ingress Routes []routeV1.Route - PodAdditions *v1alpha1.PodAdditions + PodAdditions *controllerv1alpha1.PodAdditions OAuthClient *oauthv1.OAuthClient } type RoutingSolver interface { - GetSpecObjects(spec v1alpha1.WorkspaceRoutingSpec, workspaceMeta WorkspaceMetadata) RoutingObjects - GetExposedEndpoints(endpoints map[string]v1alpha1.EndpointList, routingObj RoutingObjects) (exposedEndpoints map[string]v1alpha1.ExposedEndpointList, ready bool, err error) + GetSpecObjects(spec controllerv1alpha1.WorkspaceRoutingSpec, workspaceMeta WorkspaceMetadata) RoutingObjects + GetExposedEndpoints(endpoints map[string]controllerv1alpha1.EndpointList, routingObj RoutingObjects) (exposedEndpoints map[string]controllerv1alpha1.ExposedEndpointList, ready bool, err error) } diff --git a/pkg/controller/workspacerouting/sync_ingresses.go b/controllers/controller/workspacerouting/sync_ingresses.go similarity index 79% rename from pkg/controller/workspacerouting/sync_ingresses.go rename to controllers/controller/workspacerouting/sync_ingresses.go index ab22010f8..29fc6150d 100644 --- a/pkg/controller/workspacerouting/sync_ingresses.go +++ b/controllers/controller/workspacerouting/sync_ingresses.go @@ -16,7 +16,6 @@ import ( "context" "fmt" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/pkg/config" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -24,13 +23,16 @@ import ( "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "sigs.k8s.io/controller-runtime/pkg/client" + + controllerv1alpha1 "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" ) var ingressDiffOpts = cmp.Options{ cmpopts.IgnoreFields(v1beta1.Ingress{}, "TypeMeta", "ObjectMeta", "Status"), + cmpopts.IgnoreFields(v1beta1.HTTPIngressPath{}, "PathType"), } -func (r *ReconcileWorkspaceRouting) syncIngresses(routing *v1alpha1.WorkspaceRouting, specIngresses []v1beta1.Ingress) (ok bool, clusterIngresses []v1beta1.Ingress, err error) { +func (r *WorkspaceRoutingReconciler) syncIngresses(routing *controllerv1alpha1.WorkspaceRouting, specIngresses []v1beta1.Ingress) (ok bool, clusterIngresses []v1beta1.Ingress, err error) { ingressesInSync := true clusterIngresses, err = r.getClusterIngresses(routing) @@ -40,7 +42,7 @@ func (r *ReconcileWorkspaceRouting) syncIngresses(routing *v1alpha1.WorkspaceRou toDelete := getIngressesToDelete(clusterIngresses, specIngresses) for _, ingress := range toDelete { - err := r.client.Delete(context.TODO(), &ingress) + err := r.Delete(context.TODO(), &ingress) if err != nil { return false, nil, err } @@ -53,14 +55,14 @@ func (r *ReconcileWorkspaceRouting) syncIngresses(routing *v1alpha1.WorkspaceRou if !cmp.Equal(specIngress, clusterIngress, ingressDiffOpts) { // Update ingress's spec clusterIngress.Spec = specIngress.Spec - err := r.client.Update(context.TODO(), &clusterIngress) + err := r.Update(context.TODO(), &clusterIngress) if err != nil && !errors.IsConflict(err) { return false, nil, err } ingressesInSync = false } } else { - err := r.client.Create(context.TODO(), &specIngress) + err := r.Create(context.TODO(), &specIngress) if err != nil { return false, nil, err } @@ -71,7 +73,7 @@ func (r *ReconcileWorkspaceRouting) syncIngresses(routing *v1alpha1.WorkspaceRou return ingressesInSync, clusterIngresses, nil } -func (r *ReconcileWorkspaceRouting) getClusterIngresses(routing *v1alpha1.WorkspaceRouting) ([]v1beta1.Ingress, error) { +func (r *WorkspaceRoutingReconciler) getClusterIngresses(routing *controllerv1alpha1.WorkspaceRouting) ([]v1beta1.Ingress, error) { found := &v1beta1.IngressList{} labelSelector, err := labels.Parse(fmt.Sprintf("%s=%s", config.WorkspaceIDLabel, routing.Spec.WorkspaceId)) if err != nil { @@ -81,7 +83,7 @@ func (r *ReconcileWorkspaceRouting) getClusterIngresses(routing *v1alpha1.Worksp Namespace: routing.Namespace, LabelSelector: labelSelector, } - err = r.client.List(context.TODO(), found, listOptions) + err = r.List(context.TODO(), found, listOptions) if err != nil { return nil, err } diff --git a/pkg/controller/workspacerouting/sync_oauthclients.go b/controllers/controller/workspacerouting/sync_oauthclients.go similarity index 77% rename from pkg/controller/workspacerouting/sync_oauthclients.go rename to controllers/controller/workspacerouting/sync_oauthclients.go index c39cf5443..405cf514d 100644 --- a/pkg/controller/workspacerouting/sync_oauthclients.go +++ b/controllers/controller/workspacerouting/sync_oauthclients.go @@ -16,7 +16,6 @@ import ( "context" "fmt" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/pkg/config" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -24,13 +23,15 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "sigs.k8s.io/controller-runtime/pkg/client" + + controllerv1alpha1 "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" ) var oauthClientDiffOpts = cmp.Options{ cmpopts.IgnoreFields(oauthv1.OAuthClient{}, "TypeMeta", "ObjectMeta"), } -func (r *ReconcileWorkspaceRouting) syncOAuthClient(routing *v1alpha1.WorkspaceRouting, oauthClientSpec *oauthv1.OAuthClient) (ok bool, err error) { +func (r *WorkspaceRoutingReconciler) syncOAuthClient(routing *controllerv1alpha1.WorkspaceRouting, oauthClientSpec *oauthv1.OAuthClient) (ok bool, err error) { if !config.ControllerCfg.IsOpenShift() { return true, nil } @@ -59,7 +60,7 @@ func (r *ReconcileWorkspaceRouting) syncOAuthClient(routing *v1alpha1.WorkspaceR } for _, oauthClient := range toDelete { - err := r.client.Delete(context.TODO(), &oauthClient) + err := r.Delete(context.TODO(), &oauthClient) if err != nil { return false, err } @@ -73,7 +74,7 @@ func (r *ReconcileWorkspaceRouting) syncOAuthClient(routing *v1alpha1.WorkspaceR clusterOAuthClient.Labels = oauthClientSpec.Labels clusterOAuthClient.GrantMethod = oauthClientSpec.GrantMethod clusterOAuthClient.RedirectURIs = oauthClientSpec.RedirectURIs - err := r.client.Update(context.TODO(), clusterOAuthClient) + err := r.Update(context.TODO(), clusterOAuthClient) if err != nil && !apierrors.IsConflict(err) { return false, err } @@ -81,7 +82,7 @@ func (r *ReconcileWorkspaceRouting) syncOAuthClient(routing *v1alpha1.WorkspaceR oauthClientInSync = false } } else { - err = r.client.Create(context.TODO(), oauthClientSpec) + err = r.Create(context.TODO(), oauthClientSpec) if err != nil && apierrors.IsAlreadyExists(err) { return false, nil @@ -92,7 +93,7 @@ func (r *ReconcileWorkspaceRouting) syncOAuthClient(routing *v1alpha1.WorkspaceR return oauthClientInSync, nil } -func (r *ReconcileWorkspaceRouting) getClusterOAuthClients(routing *v1alpha1.WorkspaceRouting) ([]oauthv1.OAuthClient, error) { +func (r *WorkspaceRoutingReconciler) getClusterOAuthClients(routing *controllerv1alpha1.WorkspaceRouting) ([]oauthv1.OAuthClient, error) { found := &oauthv1.OAuthClientList{} labelSelector, err := labels.Parse(fmt.Sprintf("%s=%s", config.WorkspaceIDLabel, routing.Spec.WorkspaceId)) if err != nil { @@ -101,7 +102,7 @@ func (r *ReconcileWorkspaceRouting) getClusterOAuthClients(routing *v1alpha1.Wor listOptions := &client.ListOptions{ LabelSelector: labelSelector, } - err = r.client.List(context.TODO(), found, listOptions) + err = r.List(context.TODO(), found, listOptions) if err != nil { return nil, err } @@ -109,7 +110,7 @@ func (r *ReconcileWorkspaceRouting) getClusterOAuthClients(routing *v1alpha1.Wor return found.Items, nil } -func (r *ReconcileWorkspaceRouting) deleteOAuthClients(routing *v1alpha1.WorkspaceRouting) error { +func (r *WorkspaceRoutingReconciler) deleteOAuthClients(routing *controllerv1alpha1.WorkspaceRouting) error { labelSelector, err := labels.Parse(fmt.Sprintf("%s=%s", config.WorkspaceIDLabel, routing.Spec.WorkspaceId)) if err != nil { return err @@ -119,5 +120,5 @@ func (r *ReconcileWorkspaceRouting) deleteOAuthClients(routing *v1alpha1.Workspa LabelSelector: labelSelector, }, } - return r.client.DeleteAllOf(context.TODO(), &oauthv1.OAuthClient{}, listOptions) + return r.DeleteAllOf(context.TODO(), &oauthv1.OAuthClient{}, listOptions) } diff --git a/pkg/controller/workspacerouting/sync_routes.go b/controllers/controller/workspacerouting/sync_routes.go similarity index 83% rename from pkg/controller/workspacerouting/sync_routes.go rename to controllers/controller/workspacerouting/sync_routes.go index 42f566948..8c4563001 100644 --- a/pkg/controller/workspacerouting/sync_routes.go +++ b/controllers/controller/workspacerouting/sync_routes.go @@ -16,7 +16,6 @@ import ( "context" "fmt" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/pkg/config" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -24,6 +23,8 @@ import ( "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "sigs.k8s.io/controller-runtime/pkg/client" + + controllerv1alpha1 "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" ) var routeDiffOpts = cmp.Options{ @@ -32,7 +33,7 @@ var routeDiffOpts = cmp.Options{ cmpopts.IgnoreFields(routeV1.RouteTargetReference{}, "Weight"), } -func (r *ReconcileWorkspaceRouting) syncRoutes(routing *v1alpha1.WorkspaceRouting, specRoutes []routeV1.Route) (ok bool, clusterRoutes []routeV1.Route, err error) { +func (r *WorkspaceRoutingReconciler) syncRoutes(routing *controllerv1alpha1.WorkspaceRouting, specRoutes []routeV1.Route) (ok bool, clusterRoutes []routeV1.Route, err error) { if !config.ControllerCfg.IsOpenShift() { return true, nil, nil } @@ -46,7 +47,7 @@ func (r *ReconcileWorkspaceRouting) syncRoutes(routing *v1alpha1.WorkspaceRoutin toDelete := getRoutesToDelete(clusterRoutes, specRoutes) for _, route := range toDelete { - err := r.client.Delete(context.TODO(), &route) + err := r.Delete(context.TODO(), &route) if err != nil { return false, nil, err } @@ -59,7 +60,7 @@ func (r *ReconcileWorkspaceRouting) syncRoutes(routing *v1alpha1.WorkspaceRoutin if !cmp.Equal(specRoute, clusterRoute, routeDiffOpts) { // Update route's spec clusterRoute.Spec = specRoute.Spec - err := r.client.Update(context.TODO(), &clusterRoute) + err := r.Update(context.TODO(), &clusterRoute) if err != nil && !errors.IsConflict(err) { return false, nil, err } @@ -67,7 +68,7 @@ func (r *ReconcileWorkspaceRouting) syncRoutes(routing *v1alpha1.WorkspaceRoutin routesInSync = false } } else { - err := r.client.Create(context.TODO(), &specRoute) + err := r.Create(context.TODO(), &specRoute) if err != nil { return false, nil, err } @@ -78,7 +79,7 @@ func (r *ReconcileWorkspaceRouting) syncRoutes(routing *v1alpha1.WorkspaceRoutin return routesInSync, clusterRoutes, nil } -func (r *ReconcileWorkspaceRouting) getClusterRoutes(routing *v1alpha1.WorkspaceRouting) ([]routeV1.Route, error) { +func (r *WorkspaceRoutingReconciler) getClusterRoutes(routing *controllerv1alpha1.WorkspaceRouting) ([]routeV1.Route, error) { found := &routeV1.RouteList{} labelSelector, err := labels.Parse(fmt.Sprintf("%s=%s", config.WorkspaceIDLabel, routing.Spec.WorkspaceId)) if err != nil { @@ -88,7 +89,7 @@ func (r *ReconcileWorkspaceRouting) getClusterRoutes(routing *v1alpha1.Workspace Namespace: routing.Namespace, LabelSelector: labelSelector, } - err = r.client.List(context.TODO(), found, listOptions) + err = r.List(context.TODO(), found, listOptions) if err != nil { return nil, err } diff --git a/pkg/controller/workspacerouting/sync_services.go b/controllers/controller/workspacerouting/sync_services.go similarity index 83% rename from pkg/controller/workspacerouting/sync_services.go rename to controllers/controller/workspacerouting/sync_services.go index 2fa0445cc..c71885107 100644 --- a/pkg/controller/workspacerouting/sync_services.go +++ b/controllers/controller/workspacerouting/sync_services.go @@ -17,7 +17,6 @@ import ( "fmt" "strings" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/pkg/config" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -25,6 +24,8 @@ import ( "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "sigs.k8s.io/controller-runtime/pkg/client" + + controllerv1alpha1 "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" ) var serviceDiffOpts = cmp.Options{ @@ -36,7 +37,7 @@ var serviceDiffOpts = cmp.Options{ }), } -func (r *ReconcileWorkspaceRouting) syncServices(routing *v1alpha1.WorkspaceRouting, specServices []corev1.Service) (ok bool, clusterServices []corev1.Service, err error) { +func (r *WorkspaceRoutingReconciler) syncServices(routing *controllerv1alpha1.WorkspaceRouting, specServices []corev1.Service) (ok bool, clusterServices []corev1.Service, err error) { servicesInSync := true clusterServices, err = r.getClusterServices(routing) @@ -46,7 +47,7 @@ func (r *ReconcileWorkspaceRouting) syncServices(routing *v1alpha1.WorkspaceRout toDelete := getServicesToDelete(clusterServices, specServices) for _, service := range toDelete { - err := r.client.Delete(context.TODO(), &service) + err := r.Delete(context.TODO(), &service) if err != nil { return false, nil, err } @@ -61,14 +62,14 @@ func (r *ReconcileWorkspaceRouting) syncServices(routing *v1alpha1.WorkspaceRout clusterIP := clusterService.Spec.ClusterIP clusterService.Spec = specService.Spec clusterService.Spec.ClusterIP = clusterIP - err := r.client.Update(context.TODO(), &clusterService) + err := r.Update(context.TODO(), &clusterService) if err != nil && !errors.IsConflict(err) { return false, nil, err } servicesInSync = false } } else { - err := r.client.Create(context.TODO(), &specService) + err := r.Create(context.TODO(), &specService) if err != nil { return false, nil, err } @@ -79,7 +80,7 @@ func (r *ReconcileWorkspaceRouting) syncServices(routing *v1alpha1.WorkspaceRout return servicesInSync, clusterServices, nil } -func (r *ReconcileWorkspaceRouting) getClusterServices(routing *v1alpha1.WorkspaceRouting) ([]corev1.Service, error) { +func (r *WorkspaceRoutingReconciler) getClusterServices(routing *controllerv1alpha1.WorkspaceRouting) ([]corev1.Service, error) { found := &corev1.ServiceList{} labelSelector, err := labels.Parse(fmt.Sprintf("%s=%s", config.WorkspaceIDLabel, routing.Spec.WorkspaceId)) if err != nil { @@ -89,7 +90,7 @@ func (r *ReconcileWorkspaceRouting) getClusterServices(routing *v1alpha1.Workspa Namespace: routing.Namespace, LabelSelector: labelSelector, } - err = r.client.List(context.TODO(), found, listOptions) + err = r.List(context.TODO(), found, listOptions) if err != nil { return nil, err } diff --git a/pkg/controller/workspacerouting/workspacerouting_controller.go b/controllers/controller/workspacerouting/workspacerouting_controller.go similarity index 67% rename from pkg/controller/workspacerouting/workspacerouting_controller.go rename to controllers/controller/workspacerouting/workspacerouting_controller.go index 818098214..f252de402 100644 --- a/pkg/controller/workspacerouting/workspacerouting_controller.go +++ b/controllers/controller/workspacerouting/workspacerouting_controller.go @@ -16,110 +16,48 @@ import ( "context" "fmt" - "github.com/devfile/devworkspace-operator/internal/cluster" - controllerv1alpha1 "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" + "github.com/devfile/devworkspace-operator/controllers/controller/workspacerouting/solvers" "github.com/devfile/devworkspace-operator/pkg/config" - "github.com/devfile/devworkspace-operator/pkg/controller/workspacerouting/solvers" - "github.com/go-logr/logr" "github.com/google/go-cmp/cmp" routeV1 "github.com/openshift/api/route/v1" corev1 "k8s.io/api/core/v1" "k8s.io/api/extensions/v1beta1" "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/handler" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/manager" "sigs.k8s.io/controller-runtime/pkg/reconcile" - "sigs.k8s.io/controller-runtime/pkg/source" -) - -const workspaceRoutingFinalizer = "workspacerouting.controller.devfile.io" - -var log = logf.Log.WithName("controller_workspacerouting") - -// Add creates a new WorkspaceRouting Controller and adds it to the Manager. The Manager will set fields on the Controller -// and Start it when the Manager is Started. -func Add(mgr manager.Manager) error { - return add(mgr, newReconciler(mgr)) -} - -// newReconciler returns a new reconcile.Reconciler -func newReconciler(mgr manager.Manager) reconcile.Reconciler { - return &ReconcileWorkspaceRouting{client: mgr.GetClient(), scheme: mgr.GetScheme()} -} -// add adds a new Controller to mgr with r as the reconcile.Reconciler -func add(mgr manager.Manager, r reconcile.Reconciler) error { - // Create a new controller - c, err := controller.New("workspacerouting-controller", mgr, controller.Options{Reconciler: r}) - if err != nil { - return err - } - - // Watch for changes to primary resource WorkspaceRouting - err = c.Watch(&source.Kind{Type: &controllerv1alpha1.WorkspaceRouting{}}, &handler.EnqueueRequestForObject{}) - if err != nil { - return err - } + "github.com/go-logr/logr" + "k8s.io/apimachinery/pkg/runtime" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" - // Watch for changes to secondary resources: Services, Ingresses, and (on OpenShift) Routes. - err = c.Watch(&source.Kind{Type: &corev1.Service{}}, &handler.EnqueueRequestForOwner{ - IsController: true, - OwnerType: &controllerv1alpha1.WorkspaceRouting{}, - }) - if err != nil { - return err - } - err = c.Watch(&source.Kind{Type: &v1beta1.Ingress{}}, &handler.EnqueueRequestForOwner{ - IsController: true, - OwnerType: &controllerv1alpha1.WorkspaceRouting{}, - }) - if err != nil { - return err - } + controllerv1alpha1 "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" +) - isOpenShift, err := cluster.IsOpenShift() - if err != nil { - log.Error(err, "Failed to determine if running in OpenShift") - return err - } - if isOpenShift { - err = c.Watch(&source.Kind{Type: &routeV1.Route{}}, &handler.EnqueueRequestForOwner{ - IsController: true, - OwnerType: &controllerv1alpha1.WorkspaceRouting{}, - }) - if err != nil { - return err - } - } +const workspaceRoutingFinalizer = "workspacerouting.controller.devfile.io" - return nil +// WorkspaceRoutingReconciler reconciles a WorkspaceRouting object +type WorkspaceRoutingReconciler struct { + client.Client + Log logr.Logger + Scheme *runtime.Scheme } -// blank assignment to verify that ReconcileWorkspaceRouting implements reconcile.Reconciler -var _ reconcile.Reconciler = &ReconcileWorkspaceRouting{} +// +kubebuilder:rbac:groups=controller.devfile.io,resources=workspaceroutings,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=controller.devfile.io,resources=workspaceroutings/status,verbs=get;update;patch +// +kubebuilder:rbac:groups=core,resources=services,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=extensions,resources=ingresses,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=route.openshift.io,resources=routes,verbs=get;list;watch;create;update;patch;delete -// ReconcileWorkspaceRouting reconciles a WorkspaceRouting object -type ReconcileWorkspaceRouting struct { - // This client, initialized using mgr.Client() above, is a split client - // that reads objects from the cache and writes to the apiserver - client client.Client - scheme *runtime.Scheme -} +func (r *WorkspaceRoutingReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { + ctx := context.Background() -// Reconcile reads that state of the cluster for a WorkspaceRouting object and makes changes based on the state read -// and what is in the WorkspaceRouting.Spec -func (r *ReconcileWorkspaceRouting) Reconcile(request reconcile.Request) (reconcile.Result, error) { - reqLogger := log.WithValues("Request.Namespace", request.Namespace, "Request.Name", request.Name) + reqLogger := r.Log.WithValues("Request.Namespace", req.Namespace, "Request.Name", req.Name) reqLogger.Info("Reconciling WorkspaceRouting") // Fetch the WorkspaceRouting instance instance := &controllerv1alpha1.WorkspaceRouting{} - err := r.client.Get(context.TODO(), request.NamespacedName, instance) + err := r.Get(ctx, req.NamespacedName, instance) if err != nil { if errors.IsNotFound(err) { // Request object not found, could have been deleted after reconcile request. @@ -146,7 +84,7 @@ func (r *ReconcileWorkspaceRouting) Reconcile(request reconcile.Request) (reconc if err != nil { reqLogger.Error(err, "Could not get solver for routingClass") instance.Status.Phase = controllerv1alpha1.RoutingFailed - statusErr := r.client.Status().Update(context.TODO(), instance) + statusErr := r.Status().Update(ctx, instance) return reconcile.Result{}, statusErr } @@ -165,21 +103,21 @@ func (r *ReconcileWorkspaceRouting) Reconcile(request reconcile.Request) (reconc routingObjects := solver.GetSpecObjects(instance.Spec, workspaceMeta) services := routingObjects.Services for idx := range services { - err := controllerutil.SetControllerReference(instance, &services[idx], r.scheme) + err := controllerutil.SetControllerReference(instance, &services[idx], r.Scheme) if err != nil { return reconcile.Result{}, err } } ingresses := routingObjects.Ingresses for idx := range ingresses { - err := controllerutil.SetControllerReference(instance, &ingresses[idx], r.scheme) + err := controllerutil.SetControllerReference(instance, &ingresses[idx], r.Scheme) if err != nil { return reconcile.Result{}, err } } routes := routingObjects.Routes for idx := range routes { - err := controllerutil.SetControllerReference(instance, &routes[idx], r.scheme) + err := controllerutil.SetControllerReference(instance, &routes[idx], r.Scheme) if err != nil { return reconcile.Result{}, err } @@ -212,7 +150,7 @@ func (r *ReconcileWorkspaceRouting) Reconcile(request reconcile.Request) (reconc if err != nil { reqLogger.Error(err, "Could not get exposed endpoints for workspace") instance.Status.Phase = controllerv1alpha1.RoutingFailed - statusErr := r.client.Status().Update(context.TODO(), instance) + statusErr := r.Status().Update(ctx, instance) return reconcile.Result{}, statusErr } @@ -229,7 +167,7 @@ func (r *ReconcileWorkspaceRouting) Reconcile(request reconcile.Request) (reconc } // setFinalizer ensures a finalizer is set on a workspaceRouting instance; no-op if finalizer is already present. -func (r *ReconcileWorkspaceRouting) setFinalizer(reqLogger logr.Logger, m *controllerv1alpha1.WorkspaceRouting) error { +func (r *WorkspaceRoutingReconciler) setFinalizer(reqLogger logr.Logger, m *controllerv1alpha1.WorkspaceRouting) error { if !isFinalizerNecessary(m) || contains(m.GetFinalizers(), workspaceRoutingFinalizer) { return nil } @@ -237,7 +175,7 @@ func (r *ReconcileWorkspaceRouting) setFinalizer(reqLogger logr.Logger, m *contr m.SetFinalizers(append(m.GetFinalizers(), workspaceRoutingFinalizer)) // Update CR - err := r.client.Update(context.TODO(), m) + err := r.Update(context.TODO(), m) if err != nil { reqLogger.Error(err, "Failed to update WorkspaceRouting with finalizer") return err @@ -245,7 +183,7 @@ func (r *ReconcileWorkspaceRouting) setFinalizer(reqLogger logr.Logger, m *contr return nil } -func (r *ReconcileWorkspaceRouting) finalize(instance *controllerv1alpha1.WorkspaceRouting) error { +func (r *WorkspaceRoutingReconciler) finalize(instance *controllerv1alpha1.WorkspaceRouting) error { if contains(instance.GetFinalizers(), workspaceRoutingFinalizer) { // Run finalization logic for workspaceRoutingFinalizer. If the // finalization logic fails, don't remove the finalizer so @@ -256,7 +194,7 @@ func (r *ReconcileWorkspaceRouting) finalize(instance *controllerv1alpha1.Worksp // Remove workspaceRoutingFinalizer. Once all finalizers have been // removed, the object will be deleted. instance.SetFinalizers(remove(instance.GetFinalizers(), workspaceRoutingFinalizer)) - err := r.client.Update(context.TODO(), instance) + err := r.Update(context.TODO(), instance) if err != nil { return err } @@ -264,7 +202,7 @@ func (r *ReconcileWorkspaceRouting) finalize(instance *controllerv1alpha1.Worksp return nil } -func (r *ReconcileWorkspaceRouting) reconcileStatus( +func (r *WorkspaceRoutingReconciler) reconcileStatus( instance *controllerv1alpha1.WorkspaceRouting, routingObjects solvers.RoutingObjects, exposedEndpoints map[string]controllerv1alpha1.ExposedEndpointList, @@ -272,7 +210,7 @@ func (r *ReconcileWorkspaceRouting) reconcileStatus( if !endpointsReady { instance.Status.Phase = controllerv1alpha1.RoutingPreparing - return r.client.Status().Update(context.TODO(), instance) + return r.Status().Update(context.TODO(), instance) } if instance.Status.Phase == controllerv1alpha1.RoutingReady && cmp.Equal(instance.Status.PodAdditions, routingObjects.PodAdditions) && @@ -282,7 +220,7 @@ func (r *ReconcileWorkspaceRouting) reconcileStatus( instance.Status.Phase = controllerv1alpha1.RoutingReady instance.Status.PodAdditions = routingObjects.PodAdditions instance.Status.ExposedEndpoints = exposedEndpoints - return r.client.Status().Update(context.TODO(), instance) + return r.Status().Update(context.TODO(), instance) } func getSolverForRoutingClass(routingClass controllerv1alpha1.WorkspaceRoutingClass) (solvers.RoutingSolver, error) { @@ -341,3 +279,14 @@ func remove(list []string, s string) []string { } return list } + +func (r *WorkspaceRoutingReconciler) SetupWithManager(mgr ctrl.Manager) error { + builder := ctrl.NewControllerManagedBy(mgr). + For(&controllerv1alpha1.WorkspaceRouting{}). + Owns(&corev1.Service{}). + Owns(&v1beta1.Ingress{}) + if config.ControllerCfg.IsOpenShift() { + builder.Owns(&routeV1.Route{}) + } + return builder.Complete(r) +} diff --git a/pkg/controller/workspace/workspace_controller.go b/controllers/workspace/devworkspace_controller.go similarity index 71% rename from pkg/controller/workspace/workspace_controller.go rename to controllers/workspace/devworkspace_controller.go index 813bc9a1c..8d8dda394 100644 --- a/pkg/controller/workspace/workspace_controller.go +++ b/controllers/workspace/devworkspace_controller.go @@ -10,41 +10,35 @@ // Red Hat, Inc. - initial API and implementation // -package workspace +package controllers import ( "context" "errors" "fmt" - origLog "log" - "os" "strings" "time" - devworkspace "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" + "github.com/apex/log" + controllerv1alpha1 "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/internal/cluster" - controllerv1alpha1 "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/pkg/common" "github.com/devfile/devworkspace-operator/pkg/config" - "github.com/devfile/devworkspace-operator/pkg/controller/workspace/provision" - "github.com/devfile/devworkspace-operator/pkg/controller/workspace/restapis" - "github.com/go-logr/logr" - "github.com/google/uuid" - "github.com/operator-framework/operator-sdk/pkg/k8sutil" appsv1 "k8s.io/api/apps/v1" k8sErrors "k8s.io/apimachinery/pkg/api/errors" + + "github.com/go-logr/logr" + "github.com/google/uuid" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/handler" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/manager" "sigs.k8s.io/controller-runtime/pkg/reconcile" - "sigs.k8s.io/controller-runtime/pkg/source" -) -var log = logf.Log.WithName("controller_workspace") + devworkspace "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" + "github.com/devfile/devworkspace-operator/controllers/workspace/provision" + "github.com/devfile/devworkspace-operator/controllers/workspace/restapis" +) type currentStatus struct { // Map of condition types that are true for the current workspace. Key is valid condition, value is optional @@ -54,117 +48,36 @@ type currentStatus struct { Phase devworkspace.WorkspacePhase } -// Add creates a new Workspace Controller and adds it to the Manager. The Manager will set fields on the Controller -// and Start it when the Manager is Started. -func Add(mgr manager.Manager) error { - return add(mgr, newReconciler(mgr)) -} - -// newReconciler returns a new reconcile.Reconciler -func newReconciler(mgr manager.Manager) *ReconcileWorkspace { - return &ReconcileWorkspace{client: mgr.GetClient(), scheme: mgr.GetScheme()} -} - -// add adds a new Controller to mgr with r as the reconcile.Reconciler -func add(mgr manager.Manager, r *ReconcileWorkspace) error { - // Create a new controller - c, err := controller.New("devworkspace-controller", mgr, controller.Options{Reconciler: r}) - if err != nil { - return err - } - - operatorNamespace, err := k8sutil.GetOperatorNamespace() - if err == nil { - config.ConfigMapReference.Namespace = operatorNamespace - } else if err == k8sutil.ErrRunLocal { - config.ConfigMapReference.Namespace = os.Getenv("WATCH_NAMESPACE") - log.Info(fmt.Sprintf("Running operator in local mode; watching namespace %s", config.ConfigMapReference.Namespace)) - } else if err != k8sutil.ErrNoNamespace { - return err - } - - err = config.WatchControllerConfig(c, mgr) - if err != nil { - return err - } - - // Check if we're running on OpenShift - isOS, err := cluster.IsOpenShift() - if err != nil { - return err - } - config.ControllerCfg.SetIsOpenShift(isOS) - - err = config.ControllerCfg.Validate() - if err != nil { - log.Error(err, "Controller configuration is invalid") - return err - } - - // Watch for changes to primary resource Workspace - err = c.Watch(&source.Kind{Type: &devworkspace.DevWorkspace{}}, &handler.EnqueueRequestForObject{}) - if err != nil { - return err - } - - // Watch for changes to secondary resource Deployments and requeue the owner Workspace - err = c.Watch(&source.Kind{Type: &appsv1.Deployment{}}, &handler.EnqueueRequestForOwner{ - IsController: true, - OwnerType: &devworkspace.DevWorkspace{}, - }) - if err != nil { - return err - } - - // Watch for changes in secondary resource Components and requeue the owner workspace - err = c.Watch(&source.Kind{Type: &controllerv1alpha1.Component{}}, &handler.EnqueueRequestForOwner{ - IsController: true, - OwnerType: &devworkspace.DevWorkspace{}, - }) - - err = c.Watch(&source.Kind{Type: &controllerv1alpha1.WorkspaceRouting{}}, &handler.EnqueueRequestForOwner{ - IsController: true, - OwnerType: &devworkspace.DevWorkspace{}, - }) - - // Redirect standard logging to the reconcile's log - // Necessary as e.g. the plugin broker logs to stdout - origLog.SetOutput(r) - - return nil -} - -// blank assignment to verify that ReconcileWorkspace implements reconcile.Reconciler -var _ reconcile.Reconciler = &ReconcileWorkspace{} - -// ReconcileWorkspace reconciles a Workspace object -type ReconcileWorkspace struct { - // This client, initialized using mgr.Client() above, is a split client - // that reads objects from the cache and writes to the apiserver - client client.Client - scheme *runtime.Scheme +// DevWorkspaceReconciler reconciles a DevWorkspace object +type DevWorkspaceReconciler struct { + client.Client + Log logr.Logger + Scheme *runtime.Scheme } -// Enable redirecting standard log output to the controller's log -func (r *ReconcileWorkspace) Write(p []byte) (n int, err error) { - log.Info(string(p)) - return len(p), nil -} - -// Reconcile reads that state of the cluster for a Workspace object and makes changes based on the state read -// and what is in the Workspace.Spec -func (r *ReconcileWorkspace) Reconcile(request reconcile.Request) (reconcileResult reconcile.Result, err error) { - reqLogger := log.WithValues("Request.Namespace", request.Namespace, "Request.Name", request.Name) +// +kubebuilder:rbac:groups=workspace.devfile.io,resources=devworkspaces,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=workspace.devfile.io,resources=devworkspaces/status,verbs=get;update;patch +// +kubebuilder:rbac:groups=controller.devfile.io,resources=components,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=controller.devfile.io,resources=workspaceroutings/status,verbs=get;update;patch +// +kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups="",resources=pods;serviceaccounts;secrets;configmaps;persistentvolumeclaims,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups="batch",resources=jobs,verbs=get;create;watch;update;delete +// +kubebuilder:rbac:groups=admissionregistration.k8s.io,resources=mutatingwebhookconfigurations;validatingwebhookconfigurations,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=rbac.authorization.k8s.io,resources=roles;rolebindings;clusterroles;clusterrolebindings,verbs=get;list;watch;create;update + +func (r *DevWorkspaceReconciler) Reconcile(req ctrl.Request) (reconcileResult ctrl.Result, err error) { + ctx := context.Background() + reqLogger := r.Log.WithValues("Request.Namespace", req.Namespace, "Request.Name", req.Name) reqLogger.Info("Reconciling Workspace") clusterAPI := provision.ClusterAPI{ - Client: r.client, - Scheme: r.scheme, + Client: r.Client, + Scheme: r.Scheme, Logger: reqLogger, } // Fetch the Workspace instance workspace := &devworkspace.DevWorkspace{} - err = r.client.Get(context.TODO(), request.NamespacedName, workspace) + err = r.Get(ctx, req.NamespacedName, workspace) if err != nil { if k8sErrors.IsNotFound(err) { // Request object not found, could have been deleted after reconcile request. @@ -188,7 +101,7 @@ func (r *ReconcileWorkspace) Reconcile(request reconcile.Request) (reconcileResu return reconcile.Result{}, err } workspace.Status.WorkspaceId = workspaceId - err = r.client.Status().Update(context.TODO(), workspace) + err = r.Status().Update(ctx, workspace) return reconcile.Result{Requeue: true}, err } @@ -250,19 +163,19 @@ func (r *ReconcileWorkspace) Reconcile(request reconcile.Request) (reconcileResu if !restapis.IsCheRestApisConfigured() { reconcileStatus.Phase = devworkspace.WorkspaceStatusFailed reconcileStatus.Conditions[devworkspace.WorkspaceFailedStart] = "Che REST API sidecar is not configured but required for the Theia plugin" - return reconcile.Result{Requeue: false}, errors.New("Che REST API sidecar is not configured but required for used Theia plugin") + return reconcile.Result{Requeue: false}, errors.New("che REST API sidecar is not configured but required for used Theia plugin") } // TODO: first half of provisioning rest-apis cheRestApisComponent := restapis.GetCheRestApisComponent(workspace.Name, workspace.Status.WorkspaceId, workspace.Namespace) componentDescriptions = append(componentDescriptions, cheRestApisComponent) } - pvcStatus := provision.SyncPVC(workspace, componentDescriptions, r.client, reqLogger) + pvcStatus := provision.SyncPVC(workspace, componentDescriptions, r.Client, reqLogger) if pvcStatus.Err != nil || !pvcStatus.Continue { return reconcile.Result{Requeue: true}, err } - rbacStatus := provision.SyncRBAC(workspace, r.client, reqLogger) + rbacStatus := provision.SyncRBAC(workspace, r.Client, reqLogger) if rbacStatus.Err != nil || !rbacStatus.Continue { return reconcile.Result{Requeue: true}, err } @@ -350,14 +263,14 @@ func (r *ReconcileWorkspace) Reconcile(request reconcile.Request) (reconcileResu return reconcile.Result{}, nil } -func (r *ReconcileWorkspace) stopWorkspace(workspace *devworkspace.DevWorkspace, logger logr.Logger) (reconcile.Result, error) { +func (r *DevWorkspaceReconciler) stopWorkspace(workspace *devworkspace.DevWorkspace, logger logr.Logger) (reconcile.Result, error) { workspaceDeployment := &appsv1.Deployment{} namespaceName := types.NamespacedName{ Name: common.DeploymentName(workspace.Status.WorkspaceId), Namespace: workspace.Namespace, } status := ¤tStatus{} - err := r.client.Get(context.TODO(), namespaceName, workspaceDeployment) + err := r.Get(context.TODO(), namespaceName, workspaceDeployment) if err != nil { if k8sErrors.IsNotFound(err) { status.Phase = devworkspace.WorkspaceStatusStopped @@ -373,7 +286,7 @@ func (r *ReconcileWorkspace) stopWorkspace(workspace *devworkspace.DevWorkspace, patch := client.MergeFrom(workspaceDeployment.DeepCopy()) var replicasZero int32 = 0 workspaceDeployment.Spec.Replicas = &replicasZero - err = r.client.Patch(context.TODO(), workspaceDeployment, patch) + err = r.Patch(context.TODO(), workspaceDeployment, patch) if err != nil && !k8sErrors.IsConflict(err) { return reconcile.Result{}, err } @@ -394,3 +307,35 @@ func getWorkspaceId(instance *devworkspace.DevWorkspace) (string, error) { } return "workspace" + strings.Join(strings.Split(uid.String(), "-")[0:3], ""), nil } + +func (r *DevWorkspaceReconciler) SetupWithManager(mgr ctrl.Manager) error { + // TODO: Set up indexing https://book.kubebuilder.io/cronjob-tutorial/controller-implementation.html#setup + + // TODO: temp value; remove configmap altogether in favor of env vars + config.ConfigMapReference.Namespace = "devworkspace-operator" + + err := config.WatchControllerConfig(mgr) + if err != nil { + return err + } + + // Check if we're running on OpenShift + isOS, err := cluster.IsOpenShift() + if err != nil { + return err + } + config.ControllerCfg.SetIsOpenShift(isOS) + + err = config.ControllerCfg.Validate() + if err != nil { + log.Errorf("Controller configuration is invalid: %s", err) + return err + } + + return ctrl.NewControllerManagedBy(mgr). + For(&devworkspace.DevWorkspace{}). + Owns(&appsv1.Deployment{}). + Owns(&controllerv1alpha1.Component{}). + Owns(&controllerv1alpha1.WorkspaceRouting{}). + Complete(r) +} diff --git a/pkg/controller/workspace/env/common_env_vars.go b/controllers/workspace/env/common_env_vars.go similarity index 100% rename from pkg/controller/workspace/env/common_env_vars.go rename to controllers/workspace/env/common_env_vars.go diff --git a/pkg/controller/workspace/provision/components.go b/controllers/workspace/provision/components.go similarity index 97% rename from pkg/controller/workspace/provision/components.go rename to controllers/workspace/provision/components.go index 4ea78691f..ca116128c 100644 --- a/pkg/controller/workspace/provision/components.go +++ b/controllers/workspace/provision/components.go @@ -18,10 +18,10 @@ import ( "fmt" devworkspace "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" + "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" + "github.com/devfile/devworkspace-operator/controllers/controller/component/cmd_terminal" "github.com/devfile/devworkspace-operator/pkg/adaptor" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/pkg/config" - "github.com/devfile/devworkspace-operator/pkg/controller/component/cmd_terminal" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" k8sErrors "k8s.io/apimachinery/pkg/api/errors" diff --git a/pkg/controller/workspace/provision/data_types.go b/controllers/workspace/provision/data_types.go similarity index 100% rename from pkg/controller/workspace/provision/data_types.go rename to controllers/workspace/provision/data_types.go diff --git a/pkg/controller/workspace/provision/deployment.go b/controllers/workspace/provision/deployment.go similarity index 98% rename from pkg/controller/workspace/provision/deployment.go rename to controllers/workspace/provision/deployment.go index ad9bf21ce..888d9f8e1 100644 --- a/pkg/controller/workspace/provision/deployment.go +++ b/controllers/workspace/provision/deployment.go @@ -21,9 +21,9 @@ import ( "github.com/devfile/devworkspace-operator/pkg/common" devworkspace "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" + "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" + "github.com/devfile/devworkspace-operator/controllers/workspace/env" "github.com/devfile/devworkspace-operator/pkg/config" - "github.com/devfile/devworkspace-operator/pkg/controller/workspace/env" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" appsv1 "k8s.io/api/apps/v1" diff --git a/pkg/controller/workspace/provision/object.go b/controllers/workspace/provision/object.go similarity index 100% rename from pkg/controller/workspace/provision/object.go rename to controllers/workspace/provision/object.go diff --git a/pkg/controller/workspace/provision/pvc.go b/controllers/workspace/provision/pvc.go similarity index 97% rename from pkg/controller/workspace/provision/pvc.go rename to controllers/workspace/provision/pvc.go index 507298297..0a6cc2f8b 100644 --- a/pkg/controller/workspace/provision/pvc.go +++ b/controllers/workspace/provision/pvc.go @@ -14,7 +14,7 @@ package provision import ( devworkspace "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" + "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/pkg/config" "github.com/go-logr/logr" corev1 "k8s.io/api/core/v1" diff --git a/pkg/controller/workspace/provision/rbac.go b/controllers/workspace/provision/rbac.go similarity index 100% rename from pkg/controller/workspace/provision/rbac.go rename to controllers/workspace/provision/rbac.go diff --git a/pkg/controller/workspace/provision/routing.go b/controllers/workspace/provision/routing.go similarity index 98% rename from pkg/controller/workspace/provision/routing.go rename to controllers/workspace/provision/routing.go index 781ac9f13..431fa1e99 100644 --- a/pkg/controller/workspace/provision/routing.go +++ b/controllers/workspace/provision/routing.go @@ -17,7 +17,7 @@ import ( "fmt" devworkspace "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" + "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/pkg/config" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" diff --git a/pkg/controller/workspace/provision/serviceaccount.go b/controllers/workspace/provision/serviceaccount.go similarity index 100% rename from pkg/controller/workspace/provision/serviceaccount.go rename to controllers/workspace/provision/serviceaccount.go diff --git a/pkg/controller/workspace/restapis/component.go b/controllers/workspace/restapis/component.go similarity index 97% rename from pkg/controller/workspace/restapis/component.go rename to controllers/workspace/restapis/component.go index 206f08b20..c00d5706b 100644 --- a/pkg/controller/workspace/restapis/component.go +++ b/controllers/workspace/restapis/component.go @@ -16,7 +16,7 @@ import ( "strings" devworkspace "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" - controllerv1alpha1 "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" + controllerv1alpha1 "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/pkg/common" "github.com/devfile/devworkspace-operator/pkg/config" corev1 "k8s.io/api/core/v1" diff --git a/pkg/controller/workspace/restapis/configmap.go b/controllers/workspace/restapis/configmap.go similarity index 97% rename from pkg/controller/workspace/restapis/configmap.go rename to controllers/workspace/restapis/configmap.go index 63743e3cf..052994cb5 100644 --- a/pkg/controller/workspace/restapis/configmap.go +++ b/controllers/workspace/restapis/configmap.go @@ -17,10 +17,10 @@ import ( "encoding/json" devworkspace "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" + "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" + "github.com/devfile/devworkspace-operator/controllers/workspace/provision" "github.com/devfile/devworkspace-operator/pkg/common" "github.com/devfile/devworkspace-operator/pkg/config" - "github.com/devfile/devworkspace-operator/pkg/controller/workspace/provision" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "gopkg.in/yaml.v2" diff --git a/pkg/controller/workspace/restapis/devfilev1.go b/controllers/workspace/restapis/devfilev1.go similarity index 98% rename from pkg/controller/workspace/restapis/devfilev1.go rename to controllers/workspace/restapis/devfilev1.go index eb550dd3d..80d846225 100644 --- a/pkg/controller/workspace/restapis/devfilev1.go +++ b/controllers/workspace/restapis/devfilev1.go @@ -16,9 +16,8 @@ import ( "errors" "strings" - //TODO devworkspace "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" - workspaceApi "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" + workspaceApi "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/pkg/config" ) diff --git a/pkg/controller/workspace/status.go b/controllers/workspace/status.go similarity index 90% rename from pkg/controller/workspace/status.go rename to controllers/workspace/status.go index 8286a8f47..82184e3dd 100644 --- a/pkg/controller/workspace/status.go +++ b/controllers/workspace/status.go @@ -10,7 +10,7 @@ // Red Hat, Inc. - initial API and implementation // -package workspace +package controllers import ( "context" @@ -24,8 +24,8 @@ import ( "github.com/go-logr/logr" devworkspace "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" - "github.com/devfile/devworkspace-operator/pkg/controller/workspace/provision" + "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" + "github.com/devfile/devworkspace-operator/controllers/workspace/provision" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kubeclock "k8s.io/apimachinery/pkg/util/clock" @@ -46,7 +46,7 @@ var healthHttpClient = &http.Client{ // updateWorkspaceStatus updates the current workspace's status field with conditions and phase from the passed in status. // Parameters for result and error are returned unmodified, unless error is nil and another error is encountered while // updating the status. -func (r *ReconcileWorkspace) updateWorkspaceStatus(workspace *devworkspace.DevWorkspace, logger logr.Logger, status *currentStatus, reconcileResult reconcile.Result, reconcileError error) (reconcile.Result, error) { +func (r *DevWorkspaceReconciler) updateWorkspaceStatus(workspace *devworkspace.DevWorkspace, logger logr.Logger, status *currentStatus, reconcileResult reconcile.Result, reconcileError error) (reconcile.Result, error) { workspace.Status.Phase = status.Phase currTransitionTime := metav1.Time{Time: clock.Now()} for conditionType, conditionMsg := range status.Conditions { @@ -80,7 +80,7 @@ func (r *ReconcileWorkspace) updateWorkspaceStatus(workspace *devworkspace.DevWo return strings.Compare(string(workspace.Status.Conditions[i].Type), string(workspace.Status.Conditions[j].Type)) > 0 }) - err := r.client.Status().Update(context.TODO(), workspace) + err := r.Status().Update(context.TODO(), workspace) if err != nil { logger.Info(fmt.Sprintf("Error updating workspace status: %s", err)) if reconcileError == nil { diff --git a/pkg/controller/workspace/validation.go b/controllers/workspace/validation.go similarity index 92% rename from pkg/controller/workspace/validation.go rename to controllers/workspace/validation.go index a38c18a8c..9182d213e 100644 --- a/pkg/controller/workspace/validation.go +++ b/controllers/workspace/validation.go @@ -10,7 +10,7 @@ // Red Hat, Inc. - initial API and implementation // -package workspace +package controllers import ( "fmt" @@ -25,7 +25,7 @@ import ( // default. // // If error is not nil, a user-readable message is returned that can be propagated to the user to explain the issue. -func (r *ReconcileWorkspace) validateCreatorTimestamp(workspace *devworkspace.DevWorkspace) (msg string, err error) { +func (r *DevWorkspaceReconciler) validateCreatorTimestamp(workspace *devworkspace.DevWorkspace) (msg string, err error) { if config.ControllerCfg.GetWebhooksEnabled() != "true" { return "", nil } @@ -34,7 +34,7 @@ func (r *ReconcileWorkspace) validateCreatorTimestamp(workspace *devworkspace.De fmt.Errorf("devworkspace does not have creator label applied") } - webhooksTimestamp, err := webhook.GetWebhooksCreationTimestamp(r.client) + webhooksTimestamp, err := webhook.GetWebhooksCreationTimestamp(r.Client) if err != nil { return "Could not read devworkspace webhooks on cluster. Contact an administrator " + "to check logs and fix Operator installation.", diff --git a/deploy/controller.yaml b/deploy/controller.yaml deleted file mode 100644 index 23d9475da..000000000 --- a/deploy/controller.yaml +++ /dev/null @@ -1,57 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: devworkspace-controller - labels: - app.kubernetes.io/name: devworkspace-controller - app.kubernetes.io/part-of: devworkspace-operator -spec: - replicas: 1 - selector: - matchLabels: - app.kubernetes.io/name: devworkspace-controller - app.kubernetes.io/part-of: devworkspace-operator - template: - metadata: - labels: - app.kubernetes.io/name: devworkspace-controller - app.kubernetes.io/part-of: devworkspace-operator - annotations: - kubectl.kubernetes.io/restartedAt: "" - spec: - serviceAccountName: devworkspace-controller - containers: - - name: devworkspace-controller - image: quay.io/devfile/devworkspace-controller:next - imagePullPolicy: Always - env: - - name: WATCH_NAMESPACE - value: "" - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: OPERATOR_NAME - value: "devworkspace-operator" - - name: CONTROLLER_SERVICE_ACCOUNT_NAME - valueFrom: - fieldRef: - fieldPath: spec.serviceAccountName - - name: RELATED_IMAGE_plugin_redhat_developer_web_terminal_4_5_0 - value: "quay.io/wto/web-terminal-exec:1.0" - - name: RELATED_IMAGE_plugin_redhat_developer_web_terminal_nightly - value: "quay.io/eclipse/che-machine-exec:nightly" - - name: RELATED_IMAGE_plugin_redhat_developer_web_terminal_dev_4_5_0 - value: "quay.io/wto/web-terminal-exec:1.0" - - name: RELATED_IMAGE_plugin_redhat_developer_web_terminal_dev_nightly - value: "quay.io/eclipse/che-machine-exec:nightly" - - name: RELATED_IMAGE_plugin_eclipse_cloud_shell_nightly - value: "quay.io/eclipse/che-machine-exec:nightly" - - name: RELATED_IMAGE_web_terminal_tooling - value: "quay.io/wto/web-terminal-tooling:latest" - - name: RELATED_IMAGE_openshift_oauth_proxy - value: "openshift/oauth-proxy:latest" - - name: RELATED_IMAGE_devworkspace_webhook_server - value: quay.io/devfile/devworkspace-controller:next - - name: RELATED_IMAGE_default_tls_secrets_creation_job - value: quay.io/eclipse/che-tls-secret-creator:alpine-3029769 diff --git a/deploy/controller_config.yaml b/deploy/controller_config.yaml deleted file mode 100644 index c06318830..000000000 --- a/deploy/controller_config.yaml +++ /dev/null @@ -1,19 +0,0 @@ ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: devworkspace-controller - labels: - app.kubernetes.io/name: devworkspace-controller - app.kubernetes.io/part-of: devworkspace-operator -data: - devworkspace.routing.cluster_host_suffix: 192.168.99.100.nip.io - controller.plugin_registry.url: http://che-plugin-registry.192.168.99.100.nip.io/v3 - controller.plugin_artifacts_broker.image: quay.io/eclipse/che-plugin-artifacts-broker:v3.1.0 - controller.webhooks.enabled: "true" - devworkspace.default_routing_class: "basic" - # image pull policy that is applied to all workspace's containers - devworkspace.sidecar.image_pull_policy: Always - devworkspace.api_sidecar.image: quay.io/che-incubator/che-api-sidecar:next - # Do not enable it in production!!! - devworkspace.experimental_features_enabled: "true" diff --git a/deploy/crds/samples/web-terminal.yaml b/deploy/crds/samples/web-terminal.yaml deleted file mode 100644 index a01c1aff8..000000000 --- a/deploy/crds/samples/web-terminal.yaml +++ /dev/null @@ -1,16 +0,0 @@ -kind: DevWorkspace -apiVersion: workspace.devfile.io/v1alpha1 -metadata: - name: web-terminal - annotations: - controller.devfile.io/restricted-access: "true" - labels: - console.openshift.io/terminal: "true" -spec: - started: true - routingClass: 'web-terminal' - template: - components: - - plugin: - name: web-terminal - id: redhat-developer/web-terminal/4.5.0 diff --git a/deploy/role_binding.yaml b/deploy/role_binding.yaml deleted file mode 100644 index 04982427c..000000000 --- a/deploy/role_binding.yaml +++ /dev/null @@ -1,17 +0,0 @@ ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: devworkspace-controller - labels: - app.kubernetes.io/name: devworkspace-controller - app.kubernetes.io/part-of: devworkspace-operator -subjects: -- kind: ServiceAccount - name: devworkspace-controller - # Namespace must be replaced with controller's namespace - namespace: ${NAMESPACE} -roleRef: - kind: ClusterRole - name: devworkspace-controller - apiGroup: rbac.authorization.k8s.io diff --git a/deploy/service_account.yaml b/deploy/service_account.yaml deleted file mode 100644 index 09e11fbfd..000000000 --- a/deploy/service_account.yaml +++ /dev/null @@ -1,8 +0,0 @@ ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: devworkspace-controller - labels: - app.kubernetes.io/name: devworkspace-controller - app.kubernetes.io/part-of: devworkspace-operator diff --git a/go.mod b/go.mod index 5b5de77db..e910b65ba 100644 --- a/go.mod +++ b/go.mod @@ -1,35 +1,27 @@ module github.com/devfile/devworkspace-operator -go 1.12 +go 1.13 -// Che Plugin Broker v3.1.1 -require github.com/eclipse/che-plugin-broker v3.4.0+incompatible - -// Devfile 2.0 APIs -require github.com/devfile/api v0.0.0-20200826083800-9e2280a95680 - -// Operator Framework 0.17.x require ( - github.com/eclipse/che-go-jsonrpc v0.0.0-20181205102516-87cdb8da2597 // indirect + github.com/apex/log v1.9.0 + github.com/devfile/api v0.0.0-20200826083800-9e2280a95680 + github.com/eclipse/che-go-jsonrpc v0.0.0-20200317130110-931966b891fe // indirect + github.com/eclipse/che-plugin-broker v3.4.0+incompatible github.com/go-logr/logr v0.1.0 github.com/google/go-cmp v0.4.0 github.com/google/uuid v1.1.1 + github.com/onsi/ginkgo v1.12.1 + github.com/onsi/gomega v1.10.1 github.com/openshift/api v0.0.0-20200205133042-34f0ec8dab87 - gopkg.in/yaml.v2 v2.2.8 -) - -require ( - github.com/onsi/ginkgo v1.11.0 - github.com/onsi/gomega v1.8.1 github.com/operator-framework/operator-sdk v0.17.0 - github.com/spf13/pflag v1.0.5 - k8s.io/api v0.17.4 - k8s.io/apimachinery v0.17.4 + gopkg.in/yaml.v2 v2.3.0 + k8s.io/api v0.18.6 + k8s.io/apimachinery v0.18.6 k8s.io/client-go v12.0.0+incompatible - sigs.k8s.io/controller-runtime v0.5.2 + sigs.k8s.io/controller-runtime v0.6.2 ) -replace ( - github.com/Azure/go-autorest => github.com/Azure/go-autorest v13.3.2+incompatible // Required by OLM - k8s.io/client-go => k8s.io/client-go v0.17.4 // Required by prometheus-operator -) +// devfile/api requires v12.0.0+incompatible but this causes issues with go commands +replace k8s.io/client-go => k8s.io/client-go v0.18.6 + +replace github.com/devfile/api => github.com/amisevsk/devworkspace-api v0.0.0-20201020205654-257362dba943 diff --git a/go.sum b/go.sum index e37cfb16d..8e284a41a 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,9 @@ bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= bou.ke/monkey v1.0.1/go.mod h1:FgHuK96Rv2Nlf+0u1OOVDpCMdsWyOFmeeketDHE7LIg= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw= +cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= @@ -23,32 +23,23 @@ github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiU github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v23.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v36.1.0+incompatible h1:smHlbChr/JDmsyUqELZXLs0YIgpXecIGdUibuc2983s= github.com/Azure/azure-sdk-for-go v36.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-autorest v13.3.2+incompatible h1:VxzPyuhtnlBOzc4IWCZHqpyH2d+QMLQEuy3wREyY4oc= -github.com/Azure/go-autorest v13.3.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v11.2.8+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.3-0.20191028180845-3492b2aff503 h1:uUhdsDMg2GbFLF5GfQPtLMWd5vdDZSfqvqQp3waafxQ= github.com/Azure/go-autorest/autorest v0.9.3-0.20191028180845-3492b2aff503/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.1-0.20191028180845-3492b2aff503 h1:Hxqlh1uAA8aGpa1dFhDNhll7U/rkWtG8ZItFvRMr7l0= github.com/Azure/go-autorest/autorest/adal v0.8.1-0.20191028180845-3492b2aff503/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/to v0.3.1-0.20191028180845-3492b2aff503 h1:2McfZNaDqGPjv2pddK547PENIk4HV+NT7gvqRq4L0us= github.com/Azure/go-autorest/autorest/to v0.3.1-0.20191028180845-3492b2aff503/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= -github.com/Azure/go-autorest/autorest/validation v0.2.1-0.20191028180845-3492b2aff503 h1:RBrGlrkPWapMcLp1M6ywCqyYKOAT5ERI6lYFvGKOThE= github.com/Azure/go-autorest/autorest/validation v0.2.1-0.20191028180845-3492b2aff503/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= -github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -70,12 +61,9 @@ github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.6/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= @@ -87,9 +75,16 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/aliyun/aliyun-oss-go-sdk v2.0.4+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= +github.com/amisevsk/devworkspace-api v0.0.0-20201020205654-257362dba943 h1:j2GT1RrInQEUYJvrLYbhL5DjTb7OiLIEkwMtdNhC5Hk= +github.com/amisevsk/devworkspace-api v0.0.0-20201020205654-257362dba943/go.mod h1:TxJXWHjwATjDSGdheFL+iI/Sk533HuwsDA3nVBQa8c8= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apex/log v1.9.0 h1:FHtw/xuaM8AgmvDDTI9fiwoAL25Sq2cxojnZICUU8l0= +github.com/apex/log v1.9.0/go.mod h1:m82fZlWIuiWzWP04XCTXmnX0xRkYYbCdYn8jbJeLBEA= +github.com/apex/logs v1.0.0/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= +github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= +github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -101,11 +96,12 @@ github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:l github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -166,7 +162,6 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/prometheus-operator v0.38.0 h1:gF2xYIfO09XLFdyEecND46uihQ2KTaDwTozRZpXLtN4= github.com/coreos/prometheus-operator v0.38.0/go.mod h1:xZC7/TgeC0/mBaJk+1H9dbHaiEvLYHgX6Mi1h40UPh8= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= @@ -189,10 +184,7 @@ github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1 github.com/deislabs/oras v0.8.1/go.mod h1:Mx0rMSbBNaNfY9hjpccEnxkOqJL6KGjtxNHPLC4G4As= github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/devfile/api v0.0.0-20200826083800-9e2280a95680 h1:k0EQhg/bRtYEvx4lLgl1iCiH8tfKhPToQ5RMJWBDO8c= -github.com/devfile/api v0.0.0-20200826083800-9e2280a95680/go.mod h1:TxJXWHjwATjDSGdheFL+iI/Sk533HuwsDA3nVBQa8c8= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= @@ -219,8 +211,8 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/eclipse/che-go-jsonrpc v0.0.0-20181205102516-87cdb8da2597 h1:OWSaGPBUlwGHxQS8Dsib2GX20FS77VD4iCoA4djdA08= -github.com/eclipse/che-go-jsonrpc v0.0.0-20181205102516-87cdb8da2597/go.mod h1:6xlEQ1tM4Ago8A2jPjTrHy60Oy7Kv28DcefZPZMlwWE= +github.com/eclipse/che-go-jsonrpc v0.0.0-20200317130110-931966b891fe h1:uqz8WTED2rcprip+Z7IVOmfg8Eq/6UgKum50GEY2O3c= +github.com/eclipse/che-go-jsonrpc v0.0.0-20200317130110-931966b891fe/go.mod h1:6xlEQ1tM4Ago8A2jPjTrHy60Oy7Kv28DcefZPZMlwWE= github.com/eclipse/che-plugin-broker v3.4.0+incompatible h1:5jV67XReIZqkTTMzaEMblgIta5AJST4xmU5lXAvHEh4= github.com/eclipse/che-plugin-broker v3.4.0+incompatible/go.mod h1:V5mZYiAFCw8aQ3VCCs6a4FwO7qeVOLixY2baT6bMJI8= github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= @@ -230,14 +222,13 @@ github.com/elastic/go-sysinfo v1.1.1/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6 github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.0.0-20190203023257-5858425f7550/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.1.0+incompatible h1:K1MDoo4AZ4wU0GIU/fPmtZg7VpzLjCxu+UwBD1FvwOc= github.com/evanphx/json-patch v4.1.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= @@ -248,12 +239,12 @@ github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwo github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/structtag v1.1.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= @@ -267,6 +258,7 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/zapr v0.1.0 h1:h+WVe9j6HAA01niTJPA/kKH0i7e0rLZBCwauQFcRE54= github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-logr/zapr v0.1.1 h1:qXBXPDdNncunGs7XeEpsJt8wCjYBygluzfdLO0G5baE= github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= @@ -281,20 +273,16 @@ github.com/go-openapi/errors v0.17.2/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQH github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.17.0 h1:nH6xp8XdXHx8dqveo0ZuJBluCO2qGrPbDNZ0dwoRHP0= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.17.2/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.17.0 h1:yJW3HCkTHg7NOA+gZ83IPHzUSnUzGXhGmsdiCcMexbA= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.17.2/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.17.2/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= @@ -312,7 +300,6 @@ github.com/go-openapi/spec v0.17.2/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsd github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.4 h1:ixzUSnHTd6hCemgtAJgluaTSGYpLNpJY4mA2DIkdOAo= github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.17.2/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= @@ -321,13 +308,10 @@ github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+Z github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.17.0 h1:iqrgMg7Q7SvtbWLlltPrkMs0UBJI6oTSs79JFRUi880= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.17.2 h1:K/ycE/XTUDFltNHSO32cGRUhrVGJD64o8WgAIZNyc3k= github.com/go-openapi/swag v0.17.2/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/validate v0.17.2/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= @@ -351,14 +335,12 @@ github.com/gofrs/flock v0.7.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14j github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang-migrate/migrate/v4 v4.6.2/go.mod h1:JYi6reN3+Z734VZ0akNuyOJNcrg45ZL7LDBMW3WGJL0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= @@ -370,12 +352,16 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -383,10 +369,8 @@ github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAO github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8= github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= @@ -395,15 +379,15 @@ github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+u github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190723021845-34ac40c74b70/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= @@ -413,15 +397,13 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.2.0 h1:l6N3VoaVzTncYYW+9yOz2LJJammFZGBO13sqgEhpy9g= +github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gophercloud/gophercloud v0.2.0 h1:lD2Bce2xBAMNNcFZ0dObTpXkGLlVIb33RPVUNVpw6ic= github.com/gophercloud/gophercloud v0.2.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gophercloud/gophercloud v0.3.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gophercloud/gophercloud v0.6.0 h1:Xb2lcqZtml1XjgYZxbeayEemq7ASbeTp09m36gQFpEU= github.com/gophercloud/gophercloud v0.6.0/go.mod h1:GICNByuaEBibcjmjvI7QvYJSZEbGkcYwAR7EZK2WMqM= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20191106031601-ce3c9ade29de/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -472,11 +454,11 @@ github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= @@ -486,14 +468,14 @@ github.com/hashicorp/memberlist v0.1.5/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.8.5/go.mod h1:UpNcs7fFbpKIyZaUuSW6EPiH+eZC7OuyFD+wc1oal+k= github.com/helm/helm-2to3 v0.5.1/go.mod h1:AXFpQX2cSQpss+47ROPEeu7Sm4+CRJ1jKWCEQdHP3/c= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= github.com/iancoleman/strcase v0.0.0-20190422225806-e506e3ef7365/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= +github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb v1.7.7/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= @@ -508,15 +490,16 @@ github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52Cu github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jsonnet-bundler/jsonnet-bundler v0.2.0/go.mod h1:/by7P/OoohkI3q4CgSFqcoFsVY+IaNbzOVDknEsKDeU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -528,13 +511,13 @@ github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0L github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= @@ -551,24 +534,24 @@ github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z github.com/lovoo/gcloud-opentracing v0.3.0/go.mod h1:ZFqk2y38kMDDikZPAK7ynTTGuyt17nSPdS3K5e+ZTBY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/maorfr/helm-plugin-utils v0.0.0-20200216074820-36d2fcf6ae86/go.mod h1:p3gwmRSFqbWw6plBpR0sKl3n3vpu8kX70gvCJKMvvCA= github.com/markbates/inflect v1.0.4/go.mod h1:1fR9+pO2KHEO9ZRtto13gDwwZaAKstQzferVeWqbgNs= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/martinlindhe/base36 v1.0.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20191113090002-7c0f6868bffe/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.6/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -581,6 +564,7 @@ github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsO github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.15/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.22/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= @@ -621,6 +605,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v0.0.0-20170117200651-66bb6560562f/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -628,25 +614,23 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1 h1:C5Dqfs/LeauYDX0jJXIe2SWmwCbGzx9yF8C8xy3Lh34= github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -682,10 +666,8 @@ github.com/otiai10/mint v1.2.4/go.mod h1:d+b7n/0R3tdyUYYylALXpWQ/kTN+QobSq/4SRGB github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -716,7 +698,6 @@ github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= @@ -737,13 +718,13 @@ github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.6/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.0.11 h1:DhHlBtkHWPYi8O2y31JkK0TF+DGM+51OopZjH/Ia5qI= +github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/prometheus v0.0.0-20180315085919-58e2a31db8de/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= github.com/prometheus/prometheus v1.8.2-0.20200110114423-1e64d757f711/go.mod h1:7U90zPoLkWjEIQcy/rweQla82OCTUzxVHE51G3OhJbI= github.com/prometheus/prometheus v2.3.2+incompatible/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= @@ -752,6 +733,7 @@ github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqn github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/robfig/cron v0.0.0-20170526150127-736158dc09e1/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -775,16 +757,17 @@ github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJ github.com/shurcooL/vfsgen v0.0.0-20180825020608-02ddb050ef6b/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -799,28 +782,33 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6 github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/thanos-io/thanos v0.11.0/go.mod h1:N/Yes7J68KqvmY+xM6J5CJqEvWIvKSR5sqGtmuD6wDc= github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= +github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= +github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= +github.com/tj/go-buffer v1.1.0/go.mod h1:iyiJpfFcR2B9sXu7KvjbT9fpM4mOelRSDTbntVj52Uc= +github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= +github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= +github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= @@ -899,7 +887,6 @@ golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4 h1:ydJNl0ENAG67pFbB+9tfhiL2pYqLhfoaZFw/cjLhY4A= golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -960,7 +947,6 @@ golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc h1:gkKoSkUmnU6bpS/VhkuO27bzQeSA51uaEfbOW5dNb68= golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -970,15 +956,15 @@ golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -989,7 +975,6 @@ golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1010,7 +995,6 @@ golang.org/x/sys v0.0.0-20190426135247-a129542de9ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190515120540-06a5c4944438 h1:khxRGsvPk4n2y8I/mLLjp7e5dMTJmH75wvqS6nMwUtY= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1021,26 +1005,31 @@ golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191113165036-4c7a9d0fe056/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 h1:ywK/j/KkyTHcdyYSZNXGjMwgmDSfjglYZ3vStQ/gSCU= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180805044716-cb6730876b98/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db h1:6/JqlYfC1CCaLnGceQTI+sDGhC9UBSPAsBqI0Gun6kU= golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= @@ -1089,7 +1078,6 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200115044656-831fdb1e1868/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200327195553-82bb89366a1e h1:qCZ8SbsZMjT0OuDPCEBxgLZic4NMj8Gj4vNXiTVRAaA= golang.org/x/tools v0.0.0-20200327195553-82bb89366a1e/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= @@ -1112,7 +1100,6 @@ google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1146,20 +1133,24 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= @@ -1178,17 +1169,19 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.1.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c h1:grhR+C34yXImVGp7EzNk+DTIk+323eIUWOmEevy6bDo= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= helm.sh/helm/v3 v3.1.0/go.mod h1:WYsFJuMASa/4XUqLyv54s0U/f3mlAaRErGmyy4z921g= helm.sh/helm/v3 v3.1.2/go.mod h1:WYsFJuMASa/4XUqLyv54s0U/f3mlAaRErGmyy4z921g= @@ -1209,15 +1202,17 @@ k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI= k8s.io/api v0.17.1/go.mod h1:zxiAc5y8Ngn4fmhWUtSxuUlkfz1ixT7j9wESokELzOg= k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= k8s.io/api v0.17.3/go.mod h1:YZ0OTkuw7ipbe305fMpIdf3GLXZKRigjtZaV5gzC2J0= -k8s.io/api v0.17.4 h1:HbwOhDapkguO8lTAE8OX3hdF2qp8GtpC9CW/MQATXXo= k8s.io/api v0.17.4/go.mod h1:5qxx6vjmwUVG2nHQTKGlLts8Tbok8PzHl4vHtVFuZCA= +k8s.io/api v0.18.6 h1:osqrAXbOQjkKIWDTjrqxWQ3w0GkKb1KA1XkUGHHYpeE= +k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI= k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783/go.mod h1:xvae1SZB3E17UpV59AWc271W/Ph25N+bjPyR63X6tPY= k8s.io/apiextensions-apiserver v0.16.7/go.mod h1:6xYRp4trGp6eT5WZ6tPi/TB2nfWQCzwUvBlpg8iswe0= k8s.io/apiextensions-apiserver v0.17.0/go.mod h1:XiIFUakZywkUl54fVXa7QTEHcqQz9HG55nHd1DCoHj8= k8s.io/apiextensions-apiserver v0.17.2/go.mod h1:4KdMpjkEjjDI2pPfBA15OscyNldHWdBCfsWMDWAmSTs= k8s.io/apiextensions-apiserver v0.17.3/go.mod h1:CJbCyMfkKftAd/X/V6OTHYhVn7zXnDdnkUjS1h0GTeY= -k8s.io/apiextensions-apiserver v0.17.4 h1:ZKFnw3cJrGZ/9s6y+DerTF4FL+dmK0a04A++7JkmMho= k8s.io/apiextensions-apiserver v0.17.4/go.mod h1:rCbbbaFS/s3Qau3/1HbPlHblrWpFivoaLYccCffvQGI= +k8s.io/apiextensions-apiserver v0.18.6 h1:vDlk7cyFsDyfwn2rNAO2DbmUbvXy5yT5GE3rrqOzaMo= +k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M= k8s.io/apimachinery v0.0.0-20190612205821-1799e75a0719/go.mod h1:I4A+glKBHiTgiEjQiCCQfCAIcIMFGt291SmsvcrFzJA= k8s.io/apimachinery v0.0.0-20190809020650-423f5d784010/go.mod h1:Waf/xTS2FGRrgXCkO5FP3XxTOWh0qLf2QhL1qFZZ/R8= k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655/go.mod h1:nL6pwRT8NgfF8TT68DBI8uEePRt89cSvoXUVqbkWHq4= @@ -1227,20 +1222,22 @@ k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZ k8s.io/apimachinery v0.17.1/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= k8s.io/apimachinery v0.17.3/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= -k8s.io/apimachinery v0.17.4 h1:UzM+38cPUJnzqSQ+E1PY4YxMHIzQyCg29LOoGfo79Zw= k8s.io/apimachinery v0.17.4/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= +k8s.io/apimachinery v0.18.6 h1:RtFHnfGNfd1N0LeSrKCUznz5xtUP1elRGvHJbL3Ntag= +k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= k8s.io/apiserver v0.0.0-20190918160949-bfa5e2e684ad/go.mod h1:XPCXEwhjaFN29a8NldXA901ElnKeKLrLtREO9ZhFyhg= k8s.io/apiserver v0.16.7/go.mod h1:/5zSatF30/L9zYfMTl55jzzOnx7r/gGv5a5wtRp8yAw= k8s.io/apiserver v0.17.0/go.mod h1:ABM+9x/prjINN6iiffRVNCBR2Wk7uY4z+EtEGZD48cg= k8s.io/apiserver v0.17.2/go.mod h1:lBmw/TtQdtxvrTk0e2cgtOxHizXI+d0mmGQURIHQZlo= k8s.io/apiserver v0.17.3/go.mod h1:iJtsPpu1ZpEnHaNawpSV0nYTGBhhX2dUlnn7/QS7QiY= k8s.io/apiserver v0.17.4/go.mod h1:5ZDQ6Xr5MNBxyi3iUZXS84QOhZl+W7Oq2us/29c0j9I= +k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg= k8s.io/autoscaler v0.0.0-20190607113959-1b4f1855cb8e/go.mod h1:QEXezc9uKPT91dwqhSJq3GNI3B1HxFRQHiku9kmrsSA= k8s.io/cli-runtime v0.17.2/go.mod h1:aa8t9ziyQdbkuizkNLAw3qe3srSyWh9zlSB7zTqRNPI= k8s.io/cli-runtime v0.17.3/go.mod h1:X7idckYphH4SZflgNpOOViSxetiMj6xI0viMAjM81TA= k8s.io/cli-runtime v0.17.4/go.mod h1:IVW4zrKKx/8gBgNNkhiUIc7nZbVVNhc1+HcQh+PiNHc= -k8s.io/client-go v0.17.4 h1:VVdVbpTY70jiNHS1eiFkUt7ZIJX3txd29nDxxXH4en8= -k8s.io/client-go v0.17.4/go.mod h1:ouF6o5pz3is8qU0/qYL2RnoxOPqgfuidYLowytyLJmc= +k8s.io/client-go v0.18.6 h1:I+oWqJbibLSGsZj8Xs8F0aWVXJVIoUHWaaJV3kUN/Zw= +k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q= k8s.io/code-generator v0.0.0-20190912054826-cd179ad6a269/go.mod h1:V5BD6M4CyaN5m+VthcclXWsVcT1Hu+glwa1bi3MIsyE= k8s.io/code-generator v0.16.7/go.mod h1:wFdrXdVi/UC+xIfLi+4l9elsTT/uEF61IfcN2wOLULQ= k8s.io/code-generator v0.17.0/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= @@ -1248,37 +1245,40 @@ k8s.io/code-generator v0.17.1/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+ k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= k8s.io/code-generator v0.17.3/go.mod h1:l8BLVwASXQZTo2xamW5mQNFCe1XPiAesVq7Y1t7PiQQ= k8s.io/code-generator v0.17.4/go.mod h1:l8BLVwASXQZTo2xamW5mQNFCe1XPiAesVq7Y1t7PiQQ= +k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= k8s.io/component-base v0.0.0-20190918160511-547f6c5d7090/go.mod h1:933PBGtQFJky3TEwYx4aEPZ4IxqhWh3R6DCmzqIn1hA= k8s.io/component-base v0.16.7/go.mod h1:ikdyfezOFMu5O0qJjy/Y9eXwj+fV3pVwdmt0ulVcIR0= k8s.io/component-base v0.17.0/go.mod h1:rKuRAokNMY2nn2A6LP/MiwpoaMRHpfRnrPaUJJj1Yoc= k8s.io/component-base v0.17.2/go.mod h1:zMPW3g5aH7cHJpKYQ/ZsGMcgbsA/VyhEugF3QT1awLs= k8s.io/component-base v0.17.3/go.mod h1:GeQf4BrgelWm64PXkIXiPh/XS0hnO42d9gx9BtbZRp8= k8s.io/component-base v0.17.4/go.mod h1:5BRqHMbbQPm2kKu35v3G+CpVq4K0RJKC7TRioF0I9lE= +k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20191010091904-7fa3014cb28f/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/helm v2.16.3+incompatible/go.mod h1:LZzlS4LQBHfciFOurYBFkCMTaZ0D1l+p0teMg7TSULI= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.3 h1:niceAagH1tzskmaie/icWd7ci1wbG7Bf2c6YGcQv+3c= k8s.io/klog v0.3.3/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.0.0 h1:Foj74zO6RbjjP4hBEKjnYtjjAhGg4jNynUdYF6fJrok= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/kube-aggregator v0.17.3/go.mod h1:1dMwMFQbmH76RKF0614L7dNenMl3dwnUJuOOyZ3GMXA= k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20190320154901-5e45bb682580/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-state-metrics v1.7.2 h1:6vdtgXrrRRMSgnyDmgua+qvgCYv954JNfxXAtDkeLVQ= +k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6 h1:Oh3Mzx5pJ+yIumsAD0MOECPVeXsVot0UkiaCGVyfGQY= +k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= k8s.io/kube-state-metrics v1.7.2/go.mod h1:U2Y6DRi07sS85rmVPmBFlmv+2peBcL8IWGjM+IjYA/E= k8s.io/kubectl v0.17.2/go.mod h1:y4rfLV0n6aPmvbRCqZQjvOp3ezxsFgpqL+zF5jH/lxk= k8s.io/kubectl v0.17.3/go.mod h1:NUn4IBY7f7yCMwSop2HCXlw/MVYP4HJBiUmOR3n9w28= k8s.io/kubectl v0.17.4/go.mod h1:im5QWmh6fvtmJkkNm4HToLe8z9aM3jihYK5X/wOybcY= -k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/metrics v0.17.2/go.mod h1:3TkNHET4ROd+NfzNxkjoVfQ0Ob4iZnaHmSEA4vYpwLw= k8s.io/metrics v0.17.3/go.mod h1:HEJGy1fhHOjHggW9rMDBJBD3YuGroH3Y1pnIRw9FFaI= @@ -1286,8 +1286,10 @@ k8s.io/metrics v0.17.4/go.mod h1:6rylW2iD3M9VppnEAAtJASY1XS8Pt9tcYh+tHxBeV3I= k8s.io/utils v0.0.0-20190308190857-21c4ce38f2a7/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20191114200735-6ca3b61696b6 h1:p0Ai3qVtkbCG/Af26dBmU0E1W58NID3hSSh7cMyylpM= k8s.io/utils v0.0.0-20191114200735-6ca3b61696b6/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200603063816-c1c6865ac451 h1:v8ud2Up6QK1lNOKFgiIVrZdMg7MpmSnvtrOieolJKoE= +k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= @@ -1295,8 +1297,10 @@ modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= -sigs.k8s.io/controller-runtime v0.5.2 h1:pyXbUfoTo+HA3jeIfr0vgi+1WtmNh0CwlcnQGLXwsSw= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= sigs.k8s.io/controller-runtime v0.5.2/go.mod h1:JZUwSMVbxDupo0lTJSSFP5pimEyxGynROImSsqIOx1A= +sigs.k8s.io/controller-runtime v0.6.2 h1:jkAnfdTYBpFwlmBn3pS5HFO06SfxvnTZ1p5PeEF/zAA= +sigs.k8s.io/controller-runtime v0.6.2/go.mod h1:vhcq/rlnENJ09SIRp3EveTaZ0yqH526hjf9iJdbUJ/E= sigs.k8s.io/controller-tools v0.2.4/go.mod h1:m/ztfQNocGYBgTTCmFdnK94uVvgxeZeE3LtJvd/jIzA= sigs.k8s.io/controller-tools v0.2.8/go.mod h1:9VKHPszmf2DHz/QmHkcfZoewO6BL7pPs9uAiBVsaJSE= sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= @@ -1305,6 +1309,10 @@ sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca/go.mod h1:I sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= sigs.k8s.io/structured-merge-diff v1.0.2 h1:WiMoyniAVAYm03w+ImfF9IE2G23GLR/SwDnQyaNZvPk= sigs.k8s.io/structured-merge-diff v1.0.2/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= -sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI= diff --git a/pkg/apis/controller/group.go b/hack/boilerplate.go.txt similarity index 57% rename from pkg/apis/controller/group.go rename to hack/boilerplate.go.txt index e1ed56967..def1c07e8 100644 --- a/pkg/apis/controller/group.go +++ b/hack/boilerplate.go.txt @@ -9,10 +9,3 @@ // Contributors: // Red Hat, Inc. - initial API and implementation // - -// Package controller contains controller API versions. -// -// This file ensures Go source parsers acknowledge the controller package -// and any child packages. It can be removed if any other Go source files are -// added to this package. -package controller diff --git a/internal/controller/client.go b/internal/controller/client.go deleted file mode 100644 index 6801aee75..000000000 --- a/internal/controller/client.go +++ /dev/null @@ -1,33 +0,0 @@ -// -// Copyright (c) 2019-2020 Red Hat, Inc. -// This program and the accompanying materials are made -// available under the terms of the Eclipse Public License 2.0 -// which is available at https://www.eclipse.org/legal/epl-2.0/ -// -// SPDX-License-Identifier: EPL-2.0 -// -// Contributors: -// Red Hat, Inc. - initial API and implementation -// -package controller - -import ( - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/config" -) - -// CreateClient creates Controller client with default config -// or returns error if any happens -func CreateClient() (client.Client, error) { - cfg, err := config.GetConfig() - if err != nil { - return nil, err - } - - c, err := client.New(cfg, client.Options{}) - if err != nil { - return nil, err - } - - return c, nil -} diff --git a/internal/controller/ownerref.go b/internal/controller/ownerref.go deleted file mode 100644 index 8a469241f..000000000 --- a/internal/controller/ownerref.go +++ /dev/null @@ -1,129 +0,0 @@ -// -// Copyright (c) 2019-2020 Red Hat, Inc. -// This program and the accompanying materials are made -// available under the terms of the Eclipse Public License 2.0 -// which is available at https://www.eclipse.org/legal/epl-2.0/ -// -// SPDX-License-Identifier: EPL-2.0 -// -// Contributors: -// Red Hat, Inc. - initial API and implementation -package controller - -import ( - "context" - - "github.com/operator-framework/operator-sdk/pkg/k8sutil" - appsv1 "k8s.io/api/apps/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/types" - crclient "sigs.k8s.io/controller-runtime/pkg/client" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" -) - -var Log = logf.Log.WithName("ownerref") - -//FindControllerOwner returns OwnerReferent that owns controller process -//it starts searching from the current pod and then resolves owners recursively -//until object without owner is not found -func FindControllerOwner(ctx context.Context, client crclient.Client) (*metav1.OwnerReference, error) { - ns, err := k8sutil.GetOperatorNamespace() - if err != nil { - return nil, err - } - - // Get current Pod the operator is running in - pod, err := k8sutil.GetPod(ctx, client, ns) - if err != nil { - return nil, err - } - podOwnerRefs := metav1.NewControllerRef(pod, pod.GroupVersionKind()) - // Get Owner that the Pod belongs to - ownerRef := metav1.GetControllerOf(pod) - finalOwnerRef, err := findFinalOwnerRef(ctx, client, ns, ownerRef) - if err != nil { - return nil, err - } - if finalOwnerRef != nil { - return finalOwnerRef, nil - } - - return podOwnerRefs, nil -} - -// findFinalOwnerRef tries to locate the final controller/owner based on the owner reference provided. -func findFinalOwnerRef(ctx context.Context, client crclient.Client, ns string, ownerRef *metav1.OwnerReference) (*metav1.OwnerReference, error) { - if ownerRef == nil { - return nil, nil - } - - obj := &unstructured.Unstructured{} - obj.SetAPIVersion(ownerRef.APIVersion) - obj.SetKind(ownerRef.Kind) - err := client.Get(ctx, types.NamespacedName{Namespace: ns, Name: ownerRef.Name}, obj) - if err != nil { - return nil, err - } - newOwnerRef := metav1.GetControllerOf(obj) - if newOwnerRef != nil { - return findFinalOwnerRef(ctx, client, ns, newOwnerRef) - } - - Log.V(1).Info("Pods owner found", "Kind", ownerRef.Kind, "Name", ownerRef.Name, "Namespace", ns) - return ownerRef, nil -} - -// FindControllerDeployment gets the deployment of the deployed controller -func FindControllerDeployment(ctx context.Context, client crclient.Client) (*appsv1.Deployment, error) { - ns, err := k8sutil.GetOperatorNamespace() - if err != nil { - return nil, err - } - - // Get current Pod the operator is running in - pod, err := k8sutil.GetPod(ctx, client, ns) - if err != nil { - return nil, err - } - - deployment, err := findDeployment(ctx, client, ns, pod) - if err != nil { - return nil, err - } - if deployment != nil { - return deployment, nil - } - - // Default to returning Pod as the Owner - return nil, nil -} - -// findDeployment tries to locate the final controller/owner based on the owner reference provided. -func findDeployment(ctx context.Context, client crclient.Client, ns string, metaObj metav1.Object) (*appsv1.Deployment, error) { - ownerRef := metav1.GetControllerOf(metaObj) - - if ownerRef == nil { - return nil, nil - } - - if ownerRef.Kind == "Deployment" { - d := &appsv1.Deployment{} - err := client.Get(ctx, types.NamespacedName{Namespace: ns, Name: ownerRef.Name}, d) - d.APIVersion = ownerRef.APIVersion - d.Kind = ownerRef.Kind - if err != nil { - return nil, err - } - return d, nil - } - obj := &unstructured.Unstructured{} - obj.SetAPIVersion(ownerRef.APIVersion) - obj.SetKind(ownerRef.Kind) - err := client.Get(ctx, types.NamespacedName{Namespace: ns, Name: ownerRef.Name}, obj) - if err != nil { - return nil, err - } - - return findDeployment(ctx, client, ns, obj) -} diff --git a/main.go b/main.go new file mode 100644 index 000000000..81cdbd15a --- /dev/null +++ b/main.go @@ -0,0 +1,118 @@ +// +// Copyright (c) 2019-2020 Red Hat, Inc. +// This program and the accompanying materials are made +// available under the terms of the Eclipse Public License 2.0 +// which is available at https://www.eclipse.org/legal/epl-2.0/ +// +// SPDX-License-Identifier: EPL-2.0 +// +// Contributors: +// Red Hat, Inc. - initial API and implementation +// + +package main + +import ( + "context" + "flag" + "os" + + "github.com/devfile/devworkspace-operator/controllers/controller/component" + "github.com/devfile/devworkspace-operator/controllers/controller/workspacerouting" + "github.com/devfile/devworkspace-operator/pkg/webhook" + + "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" + _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client/config" + "sigs.k8s.io/controller-runtime/pkg/log/zap" + + workspacev1alpha1 "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" + controllerv1alpha1 "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" + workspacecontroller "github.com/devfile/devworkspace-operator/controllers/workspace" + // +kubebuilder:scaffold:imports +) + +var ( + scheme = runtime.NewScheme() + setupLog = ctrl.Log.WithName("setup") +) + +func init() { + utilruntime.Must(clientgoscheme.AddToScheme(scheme)) + + utilruntime.Must(controllerv1alpha1.AddToScheme(scheme)) + utilruntime.Must(workspacev1alpha1.AddToScheme(scheme)) + // +kubebuilder:scaffold:scheme +} + +func main() { + var metricsAddr string + var enableLeaderElection bool + flag.StringVar(&metricsAddr, "metrics-addr", ":8080", "The address the metric endpoint binds to.") + flag.BoolVar(&enableLeaderElection, "enable-leader-election", false, + "Enable leader election for controller manager. "+ + "Enabling this will ensure there is only one active controller manager.") + flag.Parse() + + ctrl.SetLogger(zap.New(zap.UseDevMode(true))) + + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ + Scheme: scheme, + MetricsBindAddress: metricsAddr, + Port: 9443, + LeaderElection: enableLeaderElection, + LeaderElectionID: "8d217f93.devfile.io", + }) + if err != nil { + setupLog.Error(err, "unable to start manager") + os.Exit(1) + } + + if err = (&component.ComponentReconciler{ + Client: mgr.GetClient(), + Log: ctrl.Log.WithName("controllers").WithName("Component"), + Scheme: mgr.GetScheme(), + }).SetupWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create controller", "controller", "Component") + os.Exit(1) + } + if err = (&workspacerouting.WorkspaceRoutingReconciler{ + Client: mgr.GetClient(), + Log: ctrl.Log.WithName("controllers").WithName("WorkspaceRouting"), + Scheme: mgr.GetScheme(), + }).SetupWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create controller", "controller", "WorkspaceRouting") + os.Exit(1) + } + if err = (&workspacecontroller.DevWorkspaceReconciler{ + Client: mgr.GetClient(), + Log: ctrl.Log.WithName("controllers").WithName("DevWorkspace"), + Scheme: mgr.GetScheme(), + }).SetupWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create controller", "controller", "DevWorkspace") + os.Exit(1) + } + // +kubebuilder:scaffold:builder + + // Get a config to talk to the apiserver + cfg, err := config.GetConfig() + if err != nil { + setupLog.Error(err, "") + os.Exit(1) + } + + setupLog.Info("setting up webhooks") + if err := webhook.SetupWebhooks(context.Background(), cfg); err != nil { + setupLog.Error(err, "failed to setup webhooks") + os.Exit(1) + } + + setupLog.Info("starting manager") + if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { + setupLog.Error(err, "problem running manager") + os.Exit(1) + } +} diff --git a/patch/patch_crds.sh b/patch/patch_crds.sh index 9f500acc5..296be1139 100755 --- a/patch/patch_crds.sh +++ b/patch/patch_crds.sh @@ -20,8 +20,8 @@ set -e -COMPONENTS_CRD_PATH="deploy/crds/controller.devfile.io_components_crd.yaml" -ROUTINGS_CRD_PATH="deploy/crds/controller.devfile.io_workspaceroutings_crd.yaml" +COMPONENTS_CRD_PATH="config/crd/bases/controller.devfile.io_components.yaml" +ROUTINGS_CRD_PATH="config/crd/bases/controller.devfile.io_workspaceroutings.yaml" # CRD path from root to status field, in jq filter format STATUS_PATH='.spec.validation.openAPIV3Schema.properties["status"]' diff --git a/pkg/adaptor/artifacts_broker.go b/pkg/adaptor/artifacts_broker.go index 005a181ad..79015f80b 100644 --- a/pkg/adaptor/artifacts_broker.go +++ b/pkg/adaptor/artifacts_broker.go @@ -17,7 +17,7 @@ import ( "fmt" devworkspace "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" + "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/pkg/common" "github.com/devfile/devworkspace-operator/pkg/config" "github.com/eclipse/che-plugin-broker/model" diff --git a/pkg/adaptor/dockerimage.go b/pkg/adaptor/dockerimage.go index 9e374cd23..28c1df00e 100644 --- a/pkg/adaptor/dockerimage.go +++ b/pkg/adaptor/dockerimage.go @@ -17,7 +17,7 @@ import ( "strings" devworkspace "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" + "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/pkg/common" "github.com/devfile/devworkspace-operator/pkg/config" corev1 "k8s.io/api/core/v1" diff --git a/pkg/adaptor/plugin.go b/pkg/adaptor/plugin.go index 753d741bb..b53912b81 100644 --- a/pkg/adaptor/plugin.go +++ b/pkg/adaptor/plugin.go @@ -20,7 +20,7 @@ import ( "github.com/devfile/devworkspace-operator/pkg/adaptor/plugin_patch" devworkspace "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" + "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/pkg/common" "github.com/devfile/devworkspace-operator/pkg/config" diff --git a/pkg/apis/addtoscheme_controller_v1alpha1.go b/pkg/apis/addtoscheme_controller_v1alpha1.go deleted file mode 100644 index 0b3c7f757..000000000 --- a/pkg/apis/addtoscheme_controller_v1alpha1.go +++ /dev/null @@ -1,35 +0,0 @@ -// -// Copyright (c) 2019-2020 Red Hat, Inc. -// This program and the accompanying materials are made -// available under the terms of the Eclipse Public License 2.0 -// which is available at https://www.eclipse.org/legal/epl-2.0/ -// -// SPDX-License-Identifier: EPL-2.0 -// -// Contributors: -// Red Hat, Inc. - initial API and implementation -// - -package apis - -import ( - devworkspace "github.com/devfile/api/pkg/apis/workspaces/v1alpha1" - "github.com/devfile/devworkspace-operator/internal/cluster" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" - oauthv1 "github.com/openshift/api/oauth/v1" - routeV1 "github.com/openshift/api/route/v1" - templateV1 "github.com/openshift/api/template/v1" -) - -func init() { - // Register the types with the Scheme so the components can map objects to GroupVersionKinds and back - AddToSchemes = append(AddToSchemes, v1alpha1.SchemeBuilder.AddToScheme) - AddToSchemes = append(AddToSchemes, devworkspace.SchemeBuilder.AddToScheme) - if isOS, err := cluster.IsOpenShift(); isOS && err == nil { - AddToSchemes = append(AddToSchemes, - routeV1.Install, - templateV1.Install, - oauthv1.Install, - ) - } -} diff --git a/pkg/apis/apis.go b/pkg/apis/apis.go deleted file mode 100644 index b73982abf..000000000 --- a/pkg/apis/apis.go +++ /dev/null @@ -1,25 +0,0 @@ -// -// Copyright (c) 2019-2020 Red Hat, Inc. -// This program and the accompanying materials are made -// available under the terms of the Eclipse Public License 2.0 -// which is available at https://www.eclipse.org/legal/epl-2.0/ -// -// SPDX-License-Identifier: EPL-2.0 -// -// Contributors: -// Red Hat, Inc. - initial API and implementation -// - -package apis - -import ( - "k8s.io/apimachinery/pkg/runtime" -) - -// AddToSchemes may be used to add all resources defined in the project to a Scheme -var AddToSchemes runtime.SchemeBuilder - -// AddToScheme adds all Resources to the Scheme -func AddToScheme(s *runtime.Scheme) error { - return AddToSchemes.AddToScheme(s) -} diff --git a/pkg/config/config.go b/pkg/config/config.go index 49b0a44b5..9e327bd1a 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -18,25 +18,19 @@ import ( "os" "strings" + "github.com/devfile/devworkspace-operator/apis/controller/v1alpha1" "github.com/devfile/devworkspace-operator/internal/cluster" - "github.com/devfile/devworkspace-operator/pkg/apis/controller/v1alpha1" logf "sigs.k8s.io/controller-runtime/pkg/log" + "fmt" + routeV1 "github.com/openshift/api/route/v1" corev1 "k8s.io/api/core/v1" k8sErrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/event" - "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/predicate" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - "sigs.k8s.io/controller-runtime/pkg/source" - - "fmt" ) var ControllerCfg ControllerConfig @@ -170,7 +164,7 @@ func updateConfigMap(client client.Client, meta metav1.Object, obj runtime.Objec ControllerCfg.update(configMap) } -func WatchControllerConfig(ctr controller.Controller, mgr manager.Manager) error { +func WatchControllerConfig(mgr manager.Manager) error { customConfig := false configMapName, found := os.LookupEnv(ConfigMapNameEnvVar) if found && len(configMapName) > 0 { @@ -225,27 +219,29 @@ func WatchControllerConfig(ctr controller.Controller, mgr manager.Manager) error updateConfigMap(nonCachedClient, configMap.GetObjectMeta(), configMap) - var emptyMapper handler.ToRequestsFunc = func(obj handler.MapObject) []reconcile.Request { - return []reconcile.Request{} - } - err = ctr.Watch(&source.Kind{Type: &corev1.ConfigMap{}}, &handler.EnqueueRequestsFromMapFunc{ - ToRequests: emptyMapper, - }, predicate.Funcs{ - UpdateFunc: func(evt event.UpdateEvent) bool { - updateConfigMap(mgr.GetClient(), evt.MetaNew, evt.ObjectNew) - return false - }, - CreateFunc: func(evt event.CreateEvent) bool { - updateConfigMap(mgr.GetClient(), evt.Meta, evt.Object) - return false - }, - DeleteFunc: func(evt event.DeleteEvent) bool { - return false - }, - GenericFunc: func(evt event.GenericEvent) bool { - return false - }, - }) + // TODO: Workaround since we don't have a controller here; we should remove configmap and use + // env vars instead. + //var emptyMapper handler.ToRequestsFunc = func(obj handler.MapObject) []reconcile.Request { + // return []reconcile.Request{} + //} + //err = ctr.Watch(&source.Kind{Type: &corev1.ConfigMap{}}, &handler.EnqueueRequestsFromMapFunc{ + // ToRequests: emptyMapper, + //}, predicate.Funcs{ + // UpdateFunc: func(evt event.UpdateEvent) bool { + // updateConfigMap(mgr.GetClient(), evt.MetaNew, evt.ObjectNew) + // return false + // }, + // CreateFunc: func(evt event.CreateEvent) bool { + // updateConfigMap(mgr.GetClient(), evt.Meta, evt.Object) + // return false + // }, + // DeleteFunc: func(evt event.DeleteEvent) bool { + // return false + // }, + // GenericFunc: func(evt event.GenericEvent) bool { + // return false + // }, + //}) return err } diff --git a/pkg/controller/add_component.go b/pkg/controller/add_component.go deleted file mode 100644 index 299666c53..000000000 --- a/pkg/controller/add_component.go +++ /dev/null @@ -1,22 +0,0 @@ -// -// Copyright (c) 2019-2020 Red Hat, Inc. -// This program and the accompanying materials are made -// available under the terms of the Eclipse Public License 2.0 -// which is available at https://www.eclipse.org/legal/epl-2.0/ -// -// SPDX-License-Identifier: EPL-2.0 -// -// Contributors: -// Red Hat, Inc. - initial API and implementation -// - -package controller - -import ( - "github.com/devfile/devworkspace-operator/pkg/controller/component" -) - -func init() { - // AddToManagerFuncs is a list of functions to create controllers and add them to a manager. - AddToManagerFuncs = append(AddToManagerFuncs, component.Add) -} diff --git a/pkg/controller/add_workspace.go b/pkg/controller/add_workspace.go deleted file mode 100644 index 5d2831273..000000000 --- a/pkg/controller/add_workspace.go +++ /dev/null @@ -1,22 +0,0 @@ -// -// Copyright (c) 2019-2020 Red Hat, Inc. -// This program and the accompanying materials are made -// available under the terms of the Eclipse Public License 2.0 -// which is available at https://www.eclipse.org/legal/epl-2.0/ -// -// SPDX-License-Identifier: EPL-2.0 -// -// Contributors: -// Red Hat, Inc. - initial API and implementation -// - -package controller - -import ( - "github.com/devfile/devworkspace-operator/pkg/controller/workspace" -) - -func init() { - // AddToManagerFuncs is a list of functions to create controllers and add them to a manager. - AddToManagerFuncs = append(AddToManagerFuncs, workspace.Add) -} diff --git a/pkg/controller/add_workspacerouting.go b/pkg/controller/add_workspacerouting.go deleted file mode 100644 index a5ef733fe..000000000 --- a/pkg/controller/add_workspacerouting.go +++ /dev/null @@ -1,22 +0,0 @@ -// -// Copyright (c) 2019-2020 Red Hat, Inc. -// This program and the accompanying materials are made -// available under the terms of the Eclipse Public License 2.0 -// which is available at https://www.eclipse.org/legal/epl-2.0/ -// -// SPDX-License-Identifier: EPL-2.0 -// -// Contributors: -// Red Hat, Inc. - initial API and implementation -// - -package controller - -import ( - "github.com/devfile/devworkspace-operator/pkg/controller/workspacerouting" -) - -func init() { - // AddToManagerFuncs is a list of functions to create controllers and add them to a manager. - AddToManagerFuncs = append(AddToManagerFuncs, workspacerouting.Add) -} diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go deleted file mode 100644 index 3248be337..000000000 --- a/pkg/controller/controller.go +++ /dev/null @@ -1,30 +0,0 @@ -// -// Copyright (c) 2019-2020 Red Hat, Inc. -// This program and the accompanying materials are made -// available under the terms of the Eclipse Public License 2.0 -// which is available at https://www.eclipse.org/legal/epl-2.0/ -// -// SPDX-License-Identifier: EPL-2.0 -// -// Contributors: -// Red Hat, Inc. - initial API and implementation -// - -package controller - -import ( - "sigs.k8s.io/controller-runtime/pkg/manager" -) - -// AddToManagerFuncs is a list of functions to add all Controllers to the Manager -var AddToManagerFuncs []func(manager.Manager) error - -// AddToManager adds all Controllers to the Manager -func AddToManager(m manager.Manager) error { - for _, f := range AddToManagerFuncs { - if err := f(m); err != nil { - return err - } - } - return nil -} diff --git a/update_devworkspace_crds.sh b/update_devworkspace_crds.sh index 6fd6d7ce3..b8dd27827 100755 --- a/update_devworkspace_crds.sh +++ b/update_devworkspace_crds.sh @@ -10,29 +10,33 @@ # Red Hat, Inc. - initial API and implementation # -set -e +set -ex DEVWORKSPACE_API_VERSION=${1:-v1alpha1} -mkdir -p devworkspace-crds -cd devworkspace-crds -if [ ! -d ./.git ]; then - git init - git remote add origin -f https://github.com/devfile/api.git - git config core.sparsecheckout true - echo "deploy/crds/*" > .git/info/sparse-checkout -else - git remote set-url origin https://github.com/devfile/api.git -fi -git fetch --tags -p origin +SCRIPT_DIR=$(cd "$(dirname "$0")" || exit; pwd) +TMP_DIR=$(mktemp -d) +echo "Downloading devfile/api CRDs to $TMP_DIR" + +cd $TMP_DIR +# mkdir -p devworkspace-crds +# cd devworkspace-crds +git init +git remote add origin https://github.com/devfile/api.git +git config core.sparsecheckout true +echo "deploy/crds/*" > .git/info/sparse-checkout +git fetch --quiet --tags -p origin if git show-ref --verify refs/tags/"${DEVWORKSPACE_API_VERSION}" --quiet; then echo 'DevWorkspace API is specified from tag' - git checkout tags/"${DEVWORKSPACE_API_VERSION}" + git checkout --quiet tags/"${DEVWORKSPACE_API_VERSION}" elif git rev-parse --verify "${DEVWORKSPACE_API_VERSION}"; then echo 'DevWorkspace API is specified from branch' - git checkout "${DEVWORKSPACE_API_VERSION}" && git reset --hard origin/"${DEVWORKSPACE_API_VERSION}" + git checkout --quiet "${DEVWORKSPACE_API_VERSION}" && git reset --hard origin/"${DEVWORKSPACE_API_VERSION}" else echo 'DevWorkspace API is specified from revision' - git checkout "${DEVWORKSPACE_API_VERSION}" + git checkout --quiet "${DEVWORKSPACE_API_VERSION}" fi +cp deploy/crds/workspace.devfile.io_devworkspaces_crd.yaml \ + $SCRIPT_DIR/config/crd/bases/workspace.devfile.io_devworkspaces.yaml +cd $SCRIPT_DIR \ No newline at end of file diff --git a/webhook/workspace/config.go b/webhook/workspace/config.go index 184f8bd39..bbbdb44c4 100644 --- a/webhook/workspace/config.go +++ b/webhook/workspace/config.go @@ -17,11 +17,11 @@ import ( "fmt" "github.com/devfile/devworkspace-operator/webhook/server" + clientConfig "sigs.k8s.io/controller-runtime/pkg/client/config" "github.com/devfile/devworkspace-operator/pkg/config" corev1 "k8s.io/api/core/v1" - "github.com/devfile/devworkspace-operator/internal/controller" "github.com/operator-framework/operator-sdk/pkg/k8sutil" "k8s.io/api/admissionregistration/v1beta1" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -33,7 +33,7 @@ import ( //Configure configures mutate/validating webhooks that provides exec access into workspace for creator only func Configure(ctx context.Context) error { log.Info("Configuring workspace webhooks") - c, err := controller.CreateClient() + c, err := createClient() if err != nil { return err } @@ -150,3 +150,19 @@ func controllerSAUID(ctx context.Context, c client.Client) (string, string, erro fullSAName := fmt.Sprintf("system:serviceaccount:%s:%s", namespace, saName) return string(sa.UID), fullSAName, nil } + +// createClient creates Controller client with default config +// or returns error if any happens +func createClient() (client.Client, error) { + cfg, err := clientConfig.GetConfig() + if err != nil { + return nil, err + } + + c, err := client.New(cfg, client.Options{}) + if err != nil { + return nil, err + } + + return c, nil +}