From 3fdc9df5cc114de916a2cc204e57d9a33b8017e0 Mon Sep 17 00:00:00 2001 From: machinly Date: Tue, 27 Feb 2024 21:51:34 +0800 Subject: [PATCH] remove pika operator (#2405) Co-authored-by: Xin.Zh --- .github/workflows/operator.yml | 40 - README.md | 46 +- README_CN.md | 48 +- build.sh | 10 - tools/pika_operator/.dockerignore | 4 - tools/pika_operator/.gitignore | 26 - tools/pika_operator/Dockerfile | 33 - tools/pika_operator/Makefile | 257 ---- tools/pika_operator/PROJECT | 19 - tools/pika_operator/README.md | 153 --- .../pika_operator/api/v1alpha1/additional.go | 35 - .../api/v1alpha1/groupversion_info.go | 27 - .../pika_operator/api/v1alpha1/pika_types.go | 133 --- .../api/v1alpha1/zz_generated.deepcopy.go | 151 --- .../crd/bases/pika.openatom.org_pikas.yaml | 1032 ----------------- .../config/crd/kustomization.yaml | 21 - .../config/crd/kustomizeconfig.yaml | 19 - .../crd/patches/cainjection_in_pikas.yaml | 7 - .../config/crd/patches/webhook_in_pikas.yaml | 16 - .../config/default/kustomization.yaml | 72 -- .../default/manager_auth_proxy_patch.yaml | 56 - .../config/default/manager_config_patch.yaml | 10 - .../config/manager/kustomization.yaml | 8 - .../pika_operator/config/manager/manager.yaml | 102 -- .../config/manifests/kustomization.yaml | 27 - .../config/prometheus/kustomization.yaml | 2 - .../config/prometheus/monitor.yaml | 26 - .../rbac/auth_proxy_client_clusterrole.yaml | 16 - .../config/rbac/auth_proxy_role.yaml | 24 - .../config/rbac/auth_proxy_role_binding.yaml | 19 - .../config/rbac/auth_proxy_service.yaml | 21 - .../config/rbac/kustomization.yaml | 18 - .../config/rbac/leader_election_role.yaml | 44 - .../rbac/leader_election_role_binding.yaml | 19 - .../config/rbac/pika_editor_role.yaml | 31 - .../config/rbac/pika_viewer_role.yaml | 27 - tools/pika_operator/config/rbac/role.yaml | 75 -- .../config/rbac/role_binding.yaml | 19 - .../config/rbac/service_account.yaml | 12 - .../config/samples/kustomization.yaml | 4 - .../config/samples/pika_v1alpha1_pika.yaml | 12 - .../config/scorecard/bases/config.yaml | 7 - .../config/scorecard/kustomization.yaml | 16 - .../scorecard/patches/basic.config.yaml | 10 - .../config/scorecard/patches/olm.config.yaml | 50 - .../controllers/factory/default.go | 16 - .../controllers/factory/finalize/common.go | 34 - .../factory/k8stools/annotations.go | 18 - .../controllers/factory/k8stools/service.go | 23 - .../factory/k8stools/statefulset.go | 23 - .../pika_operator/controllers/factory/pika.go | 312 ----- .../controllers/factory/pika_test.go | 603 ---------- .../controllers/pika_controller.go | 108 -- .../controllers/pika_controller_test.go | 108 -- tools/pika_operator/controllers/suite_test.go | 71 -- .../examples/pika-minikube/pika-cm.yaml | 168 --- .../examples/pika-minikube/pika-pika.yaml | 9 - .../examples/pika-pvc/pika-cm.yaml | 168 --- .../examples/pika-pvc/pika-pika.yaml | 9 - .../examples/pika-sample/pika-pika.yaml | 5 - tools/pika_operator/go.mod | 75 -- tools/pika_operator/go.sum | 628 ---------- tools/pika_operator/hack/boilerplate.go.txt | 6 - tools/pika_operator/integration.mk | 61 - tools/pika_operator/main.go | 106 -- tools/pika_operator/test/e2e/e2e.go | 10 - tools/pika_operator/test/e2e/e2e_test.go | 14 - tools/pika_operator/test/e2e/scaffold/k8s.go | 36 - .../test/e2e/scaffold/kubectl.go | 40 - .../test/e2e/scaffold/scaffold.go | 95 -- .../test/e2e/test-standalone/standalone.go | 52 - tools/pika_operator/test/e2e/utils/cmd.go | 39 - .../pika_operator/test/e2e/utils/cmd_test.go | 95 -- .../pika_operator/test/e2e/utils/tmp_file.go | 31 - .../test/e2e/utils/tmp_file_test.go | 40 - 75 files changed, 7 insertions(+), 5800 deletions(-) delete mode 100644 .github/workflows/operator.yml delete mode 100644 tools/pika_operator/.dockerignore delete mode 100644 tools/pika_operator/.gitignore delete mode 100644 tools/pika_operator/Dockerfile delete mode 100644 tools/pika_operator/Makefile delete mode 100644 tools/pika_operator/PROJECT delete mode 100644 tools/pika_operator/README.md delete mode 100644 tools/pika_operator/api/v1alpha1/additional.go delete mode 100644 tools/pika_operator/api/v1alpha1/groupversion_info.go delete mode 100644 tools/pika_operator/api/v1alpha1/pika_types.go delete mode 100644 tools/pika_operator/api/v1alpha1/zz_generated.deepcopy.go delete mode 100644 tools/pika_operator/config/crd/bases/pika.openatom.org_pikas.yaml delete mode 100644 tools/pika_operator/config/crd/kustomization.yaml delete mode 100644 tools/pika_operator/config/crd/kustomizeconfig.yaml delete mode 100644 tools/pika_operator/config/crd/patches/cainjection_in_pikas.yaml delete mode 100644 tools/pika_operator/config/crd/patches/webhook_in_pikas.yaml delete mode 100644 tools/pika_operator/config/default/kustomization.yaml delete mode 100644 tools/pika_operator/config/default/manager_auth_proxy_patch.yaml delete mode 100644 tools/pika_operator/config/default/manager_config_patch.yaml delete mode 100644 tools/pika_operator/config/manager/kustomization.yaml delete mode 100644 tools/pika_operator/config/manager/manager.yaml delete mode 100644 tools/pika_operator/config/manifests/kustomization.yaml delete mode 100644 tools/pika_operator/config/prometheus/kustomization.yaml delete mode 100644 tools/pika_operator/config/prometheus/monitor.yaml delete mode 100644 tools/pika_operator/config/rbac/auth_proxy_client_clusterrole.yaml delete mode 100644 tools/pika_operator/config/rbac/auth_proxy_role.yaml delete mode 100644 tools/pika_operator/config/rbac/auth_proxy_role_binding.yaml delete mode 100644 tools/pika_operator/config/rbac/auth_proxy_service.yaml delete mode 100644 tools/pika_operator/config/rbac/kustomization.yaml delete mode 100644 tools/pika_operator/config/rbac/leader_election_role.yaml delete mode 100644 tools/pika_operator/config/rbac/leader_election_role_binding.yaml delete mode 100644 tools/pika_operator/config/rbac/pika_editor_role.yaml delete mode 100644 tools/pika_operator/config/rbac/pika_viewer_role.yaml delete mode 100644 tools/pika_operator/config/rbac/role.yaml delete mode 100644 tools/pika_operator/config/rbac/role_binding.yaml delete mode 100644 tools/pika_operator/config/rbac/service_account.yaml delete mode 100644 tools/pika_operator/config/samples/kustomization.yaml delete mode 100644 tools/pika_operator/config/samples/pika_v1alpha1_pika.yaml delete mode 100644 tools/pika_operator/config/scorecard/bases/config.yaml delete mode 100644 tools/pika_operator/config/scorecard/kustomization.yaml delete mode 100644 tools/pika_operator/config/scorecard/patches/basic.config.yaml delete mode 100644 tools/pika_operator/config/scorecard/patches/olm.config.yaml delete mode 100644 tools/pika_operator/controllers/factory/default.go delete mode 100644 tools/pika_operator/controllers/factory/finalize/common.go delete mode 100644 tools/pika_operator/controllers/factory/k8stools/annotations.go delete mode 100644 tools/pika_operator/controllers/factory/k8stools/service.go delete mode 100644 tools/pika_operator/controllers/factory/k8stools/statefulset.go delete mode 100644 tools/pika_operator/controllers/factory/pika.go delete mode 100644 tools/pika_operator/controllers/factory/pika_test.go delete mode 100644 tools/pika_operator/controllers/pika_controller.go delete mode 100644 tools/pika_operator/controllers/pika_controller_test.go delete mode 100644 tools/pika_operator/controllers/suite_test.go delete mode 100644 tools/pika_operator/examples/pika-minikube/pika-cm.yaml delete mode 100644 tools/pika_operator/examples/pika-minikube/pika-pika.yaml delete mode 100644 tools/pika_operator/examples/pika-pvc/pika-cm.yaml delete mode 100644 tools/pika_operator/examples/pika-pvc/pika-pika.yaml delete mode 100644 tools/pika_operator/examples/pika-sample/pika-pika.yaml delete mode 100644 tools/pika_operator/go.mod delete mode 100644 tools/pika_operator/go.sum delete mode 100644 tools/pika_operator/hack/boilerplate.go.txt delete mode 100644 tools/pika_operator/integration.mk delete mode 100644 tools/pika_operator/main.go delete mode 100644 tools/pika_operator/test/e2e/e2e.go delete mode 100644 tools/pika_operator/test/e2e/e2e_test.go delete mode 100644 tools/pika_operator/test/e2e/scaffold/k8s.go delete mode 100644 tools/pika_operator/test/e2e/scaffold/kubectl.go delete mode 100644 tools/pika_operator/test/e2e/scaffold/scaffold.go delete mode 100644 tools/pika_operator/test/e2e/test-standalone/standalone.go delete mode 100644 tools/pika_operator/test/e2e/utils/cmd.go delete mode 100644 tools/pika_operator/test/e2e/utils/cmd_test.go delete mode 100644 tools/pika_operator/test/e2e/utils/tmp_file.go delete mode 100644 tools/pika_operator/test/e2e/utils/tmp_file_test.go diff --git a/.github/workflows/operator.yml b/.github/workflows/operator.yml deleted file mode 100644 index b8fb05833a..0000000000 --- a/.github/workflows/operator.yml +++ /dev/null @@ -1,40 +0,0 @@ -# This workflow will build a golang project -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go - -name: Operator - -on: - push: - branches: [ "unstable", "3.5" ] - pull_request: - branches: [ "unstable", "3.5" ] - -jobs: - - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - name: Set up Go - uses: actions/setup-go@v3 - with: - go-version: 1.19 - - - name: start minikube - id: minikube - uses: medyagh/setup-minikube@master - with: - kubernetes-version: v1.25.3 - - - name: Build - run: | - cd tools/pika_operator && make - - - name: Unit Test - run: | - cd tools/pika_operator && make test - - - name: E2E Test - run: | - cd tools/pika_operator && make e2e-test-local diff --git a/README.md b/README.md index 79356d1614..a3a097b58e 100644 --- a/README.md +++ b/README.md @@ -162,7 +162,7 @@ Users can directly download the latest binary version package from [releases](ht cd output && make ``` - Other components, such as codis and pika_operator, can also be compiled using build.sh. + Other components, such as codis, can also be compiled using build.sh. ```bash # Compile codis, default target, build-all @@ -171,8 +171,6 @@ Users can directly download the latest binary version package from [releases](ht # Compile codis, but only build codis-proxy ./build.sh codis codis-proxy - # Compile pika_operator - ./build.sh operator ``` * #### 2.4 Start Pika @@ -235,47 +233,8 @@ Users can directly download the latest binary version package from [releases](ht ./build_docker.sh -p linux/amd64 -t private_registry/pika:latest ``` -* #### 3.3 Deployment with Pika-operator - - Using pika-operator simplifies the deployment of a single-instance pika in a Kubernetes environment. +* #### 3.3 Running with docker-compose - >Note: Do not use this feature in a production environment. - - Local installation: - - 1. Install [MiniKube](https://minikube.sigs.k8s.io/docs/start/) - - 2. Deploy Pika-operator - - ```bash - cd tools/pika_operator - make minikube-up # run this if you don't have a minikube cluster - make local-deploy - ``` - - 3. Create a Pika instance - - ```bash - cd tools/pika_operator - kubectl apply -f examples/pika-sample/ - ``` - - 4. Check the Pika status - - ```bash - kubectl get pika pika-sample - ``` - - 5. Get Pika instance information - - ```bash - kubectl run pika-sample-test \ - --image redis -it --rm --restart=Never \ - -- /usr/local/bin/redis-cli -h pika-sample -p 9221 info - ``` - - -* #### 3.4 Running with docker-compose docker-compose.yaml ```yaml pikadb: @@ -295,7 +254,6 @@ docker-compose.yaml restart: always ``` - ## Performance test * Thanks [deep011](https://github.com/deep011) for providing performance test results. diff --git a/README_CN.md b/README_CN.md index 460ff999b7..831e4e57f5 100644 --- a/README_CN.md +++ b/README_CN.md @@ -156,7 +156,7 @@ Pika 力求在完全兼容 Redis 协议、 继承 Redis 便捷运维设计的前 cd output && make ``` - 其他子组件,如 `codis` 和 `pika_operator` 也可以用 `build.sh` 进行编译。 + 其他子组件,如 `codis` 也可以用 `build.sh` 进行编译。 ```bash # 编译 codis, 默认 target,build-all @@ -164,9 +164,6 @@ Pika 力求在完全兼容 Redis 协议、 继承 Redis 便捷运维设计的前 # 编译 codis, 但只构建 codis-proxy ./build.sh codis codis-proxy - - # 编译 pika_operator - ./build.sh operator ``` * #### 2.4 启动 Pika @@ -229,45 +226,10 @@ Pika 力求在完全兼容 Redis 协议、 继承 Redis 便捷运维设计的前 ./build_docker.sh -p linux/amd64 -t private_registry/pika:latest ``` -* #### 3.3 使用 pika-operator 部署 - - 使用 `pika-operator` 可以简单地在 Kubernetes 环境中部署单实例 `pika` 。 - >注:__请勿在生产环境中使用此功能__。 - - 本地安装: - - 1. 安装 [MiniKube](https://minikube.sigs.k8s.io/docs/start/) - - 2. 部署 Pika-operator - - ```bash - cd tools/pika_operator - make minikube-up # run this if you don't have a minikube cluster - make local-deploy - ``` - - 3. 创建 Pika 实例 - - ```bash - cd tools/pika_operator - kubectl apply -f examples/pika-sample/ - ``` - - 4. 检查 Pika 状态 - - ```bash - kubectl get pika pika-sample - ``` - - 5. 获取 Pika 实例信息 - - ```bash - kubectl run pika-sample-test \ - --image redis -it --rm --restart=Never \ - -- /usr/local/bin/redis-cli -h pika-sample -p 9221 info - ``` * #### 3.4 使用 docker-compose + docker-compose.yaml + ```yaml pikadb: image: pikadb/pika:lastest @@ -284,6 +246,7 @@ Pika 力求在完全兼容 Redis 协议、 继承 Redis 便捷运维设计的前 privileged: true restart: always ``` + ## Pika 未来工作规划 ### 1、Pika 单机版 @@ -298,8 +261,7 @@ Pika 力求在完全兼容 Redis 协议、 继承 Redis 便捷运维设计的前 * 1. 提升 Slot 迁移速度, 提升 Operator 扩缩容的效率 * 2. 升级 Codis-proxy -* 3. Pika-operator -* 4. Codis-proxy性能指标监控 +* 3. Codis-proxy性能指标监控 ## Pika 发版特性时间轴 diff --git a/build.sh b/build.sh index adb3384b8c..6b3f320b63 100755 --- a/build.sh +++ b/build.sh @@ -63,16 +63,6 @@ if [[ "${ARGS[0]}" = "codis" ]]; then exit 0 fi -if [[ "${ARGS[0]}" = "operator" ]]; then - pushd tools/pika_operator - if [[ "${CLEAN_BUILD}" = "true" ]]; then - rm -rf bin - fi - make -j ${CPU_CORE} "${ARGS[@]:1}" - popd - exit 0 -fi - source ./utils/Get_OS_Version.sh function version_compare() { diff --git a/tools/pika_operator/.dockerignore b/tools/pika_operator/.dockerignore deleted file mode 100644 index 0f046820f1..0000000000 --- a/tools/pika_operator/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -# More info: https://docs.docker.com/engine/reference/builder/#dockerignore-file -# Ignore build and test binaries. -bin/ -testbin/ diff --git a/tools/pika_operator/.gitignore b/tools/pika_operator/.gitignore deleted file mode 100644 index e917e5cefe..0000000000 --- a/tools/pika_operator/.gitignore +++ /dev/null @@ -1,26 +0,0 @@ - -# Binaries for programs and plugins -*.exe -*.exe~ -*.dll -*.so -*.dylib -bin -testbin/* -Dockerfile.cross - -# Test binary, build with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -# Kubernetes Generated files - skip generated files, except for vendored files - -!vendor/**/zz_generated.* - -# editor and IDE paraphernalia -.idea -*.swp -*.swo -*~ diff --git a/tools/pika_operator/Dockerfile b/tools/pika_operator/Dockerfile deleted file mode 100644 index 8f9cca18eb..0000000000 --- a/tools/pika_operator/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -# Build the manager binary -FROM golang:1.19 as builder -ARG TARGETOS -ARG TARGETARCH - -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 go source -COPY main.go main.go -COPY api/ api/ -COPY controllers/ controllers/ - -# Build -# the GOARCH has not a default value to allow the binary be built according to the host where the command -# was called. For example, if we call make docker-build in a local env which has the Apple Silicon M1 SO -# the docker BUILDPLATFORM arg will be linux/arm64 when for Apple x86 it will be linux/amd64. Therefore, -# by leaving it empty we can ensure that the container and binary shipped on it will have the same platform. -RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -a -o manager main.go - -# Use distroless as minimal base image to package the manager binary -# Refer to https://github.com/GoogleContainerTools/distroless for more details -FROM gcr.io/distroless/static:nonroot -WORKDIR / -COPY --from=builder /workspace/manager . -USER 65532:65532 - -ENTRYPOINT ["/manager"] diff --git a/tools/pika_operator/Makefile b/tools/pika_operator/Makefile deleted file mode 100644 index 4fe07367ca..0000000000 --- a/tools/pika_operator/Makefile +++ /dev/null @@ -1,257 +0,0 @@ -# VERSION defines the project version for the bundle. -# Update this value when you upgrade the version of your project. -# To re-generate a bundle for another specific version without changing the standard setup, you can: -# - use the VERSION as arg of the bundle target (e.g make bundle VERSION=0.0.2) -# - use environment variables to overwrite this value (e.g export VERSION=0.0.2) -VERSION ?= 0.0.1 - -# CHANNELS define the bundle channels used in the bundle. -# Add a new line here if you would like to change its default config. (E.g CHANNELS = "candidate,fast,stable") -# To re-generate a bundle for other specific channels without changing the standard setup, you can: -# - use the CHANNELS as arg of the bundle target (e.g make bundle CHANNELS=candidate,fast,stable) -# - use environment variables to overwrite this value (e.g export CHANNELS="candidate,fast,stable") -ifneq ($(origin CHANNELS), undefined) -BUNDLE_CHANNELS := --channels=$(CHANNELS) -endif - -# DEFAULT_CHANNEL defines the default channel used in the bundle. -# Add a new line here if you would like to change its default config. (E.g DEFAULT_CHANNEL = "stable") -# To re-generate a bundle for any other default channel without changing the default setup, you can: -# - use the DEFAULT_CHANNEL as arg of the bundle target (e.g make bundle DEFAULT_CHANNEL=stable) -# - use environment variables to overwrite this value (e.g export DEFAULT_CHANNEL="stable") -ifneq ($(origin DEFAULT_CHANNEL), undefined) -BUNDLE_DEFAULT_CHANNEL := --default-channel=$(DEFAULT_CHANNEL) -endif -BUNDLE_METADATA_OPTS ?= $(BUNDLE_CHANNELS) $(BUNDLE_DEFAULT_CHANNEL) - -# IMAGE_TAG_BASE defines the docker.io namespace and part of the image name for remote images. -# This variable is used to construct full image tags for bundle and catalog images. -# -# For example, running 'make bundle-build bundle-push catalog-build catalog-push' will build and push both -# openatom.org/pika-operator-bundle:$VERSION and openatom.org/pika-operator-catalog:$VERSION. -IMAGE_TAG_BASE ?= openatom.org/pika-operator - -# BUNDLE_IMG defines the image:tag used for the bundle. -# You can use it as an arg. (E.g make bundle-build BUNDLE_IMG=/:) -BUNDLE_IMG ?= $(IMAGE_TAG_BASE)-bundle:v$(VERSION) - -# BUNDLE_GEN_FLAGS are the flags passed to the operator-sdk generate bundle command -BUNDLE_GEN_FLAGS ?= -q --overwrite --version $(VERSION) $(BUNDLE_METADATA_OPTS) - -# USE_IMAGE_DIGESTS defines if images are resolved via tags or digests -# You can enable this value if you would like to use SHA Based Digests -# To enable set flag to true -USE_IMAGE_DIGESTS ?= false -ifeq ($(USE_IMAGE_DIGESTS), true) - BUNDLE_GEN_FLAGS += --use-image-digests -endif - -# Image URL to use all building/pushing image targets -IMG ?= controller:latest -# ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary. -ENVTEST_K8S_VERSION = 1.25.0 - -# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) -ifeq (,$(shell go env GOBIN)) -GOBIN=$(shell go env GOPATH)/bin -else -GOBIN=$(shell go env GOBIN) -endif - -# Setting SHELL to bash allows bash commands to be executed by recipes. -# Options are set to exit when a recipe line exits non-zero or a piped command fails. -SHELL = /usr/bin/env bash -o pipefail -.SHELLFLAGS = -ec - -.PHONY: all -all: build - -##@ General - -# The help target prints out all targets with their descriptions organized -# beneath their categories. The categories are represented by '##@' and the -# target descriptions by '##'. The awk commands is responsible for reading the -# entire set of makefiles included in this invocation, looking for lines of the -# file as xyz: ## something, and then pretty-format the target and help. Then, -# if there's a line with ##@ something, that gets pretty-printed as a category. -# More info on the usage of ANSI control characters for terminal formatting: -# https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters -# More info on the awk command: -# http://linuxcommand.org/lc3_adv_awk.php - -.PHONY: help -help: ## Display this help. - @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) - -##@ Development - -.PHONY: manifests -manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects. - $(CONTROLLER_GEN) rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases - -.PHONY: generate -generate: controller-gen ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations. - $(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./..." - -.PHONY: fmt -fmt: ## Run go fmt against code. - go fmt ./... - -.PHONY: vet -vet: ## Run go vet against code. - go vet ./... - -.PHONY: test -test: manifests generate fmt vet envtest ## Run tests. - KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(LOCALBIN) -p path)" go test ./... -coverprofile cover.out - -##@ Build - -.PHONY: build -build: generate fmt vet ## Build manager binary. - go build -o bin/manager main.go - -.PHONY: run -run: manifests generate fmt vet ## Run a controller from your host. - go run ./main.go - -# If you wish built the manager image targeting other platforms you can use the --platform flag. -# (i.e. docker build --platform linux/arm64 ). However, you must enable docker buildKit for it. -# More info: https://docs.docker.com/develop/develop-images/build_enhancements/ -.PHONY: docker-build -docker-build: test ## Build docker image with the manager. - docker build -t ${IMG} . - -.PHONY: docker-push -docker-push: ## Push docker image with the manager. - docker push ${IMG} - -# PLATFORMS defines the target platforms for the manager image be build to provide support to multiple -# architectures. (i.e. make docker-buildx IMG=myregistry/mypoperator:0.0.1). To use this option you need to: -# - able to use docker buildx . More info: https://docs.docker.com/build/buildx/ -# - have enable BuildKit, More info: https://docs.docker.com/develop/develop-images/build_enhancements/ -# - be able to push the image for your registry (i.e. if you do not inform a valid value via IMG=> than the export will fail) -# To properly provided solutions that supports more than one platform you should use this option. -PLATFORMS ?= linux/arm64,linux/amd64,linux/s390x,linux/ppc64le -.PHONY: docker-buildx -docker-buildx: test ## Build and push docker image for the manager for cross-platform support - # copy existing Dockerfile and insert --platform=${BUILDPLATFORM} into Dockerfile.cross, and preserve the original Dockerfile - sed -e '1 s/\(^FROM\)/FROM --platform=\$$\{BUILDPLATFORM\}/; t' -e ' 1,// s//FROM --platform=\$$\{BUILDPLATFORM\}/' Dockerfile > Dockerfile.cross - - docker buildx create --name project-v3-builder - docker buildx use project-v3-builder - - docker buildx build --push --platform=$(PLATFORMS) --tag ${IMG} -f Dockerfile.cross - - docker buildx rm project-v3-builder - rm Dockerfile.cross - -##@ Deployment - -ifndef ignore-not-found - ignore-not-found = false -endif - -.PHONY: install -install: manifests kustomize ## Install CRDs into the K8s cluster specified in ~/.kube/config. - $(KUSTOMIZE) build config/crd | kubectl apply -f - - -.PHONY: uninstall -uninstall: manifests kustomize ## Uninstall CRDs from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion. - $(KUSTOMIZE) build config/crd | kubectl delete --ignore-not-found=$(ignore-not-found) -f - - -.PHONY: deploy -deploy: manifests kustomize ## Deploy controller to the K8s cluster specified in ~/.kube/config. - cd config/manager && $(KUSTOMIZE) edit set image controller=${IMG} - $(KUSTOMIZE) build config/default | kubectl apply -f - - -.PHONY: undeploy -undeploy: ## Undeploy controller from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion. - $(KUSTOMIZE) build config/default | kubectl delete --ignore-not-found=$(ignore-not-found) -f - - -##@ Build Dependencies - -## Location to install dependencies to -LOCALBIN ?= $(shell pwd)/bin -$(LOCALBIN): - mkdir -p $(LOCALBIN) - -## Tool Binaries -KUSTOMIZE ?= $(LOCALBIN)/kustomize -CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen -ENVTEST ?= $(LOCALBIN)/setup-envtest - -## Tool Versions -KUSTOMIZE_VERSION ?= v3.8.7 -CONTROLLER_TOOLS_VERSION ?= v0.10.0 - -KUSTOMIZE_INSTALL_SCRIPT ?= "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" -.PHONY: kustomize -kustomize: $(KUSTOMIZE) ## Download kustomize locally if necessary. -$(KUSTOMIZE): $(LOCALBIN) - test -s $(LOCALBIN)/kustomize || { curl -Ss $(KUSTOMIZE_INSTALL_SCRIPT) | bash -s -- $(subst v,,$(KUSTOMIZE_VERSION)) $(LOCALBIN); } - -.PHONY: controller-gen -controller-gen: $(CONTROLLER_GEN) ## Download controller-gen locally if necessary. -$(CONTROLLER_GEN): $(LOCALBIN) - test -s $(LOCALBIN)/controller-gen || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-tools/cmd/controller-gen@$(CONTROLLER_TOOLS_VERSION) - -.PHONY: envtest -envtest: $(ENVTEST) ## Download envtest-setup locally if necessary. -$(ENVTEST): $(LOCALBIN) - test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest - -.PHONY: bundle -bundle: manifests kustomize ## Generate bundle manifests and metadata, then validate generated files. - operator-sdk generate kustomize manifests -q - cd config/manager && $(KUSTOMIZE) edit set image controller=$(IMG) - $(KUSTOMIZE) build config/manifests | operator-sdk generate bundle $(BUNDLE_GEN_FLAGS) - operator-sdk bundle validate ./bundle - -.PHONY: bundle-build -bundle-build: ## Build the bundle image. - docker build -f bundle.Dockerfile -t $(BUNDLE_IMG) . - -.PHONY: bundle-push -bundle-push: ## Push the bundle image. - $(MAKE) docker-push IMG=$(BUNDLE_IMG) - -.PHONY: opm -OPM = ./bin/opm -opm: ## Download opm locally if necessary. -ifeq (,$(wildcard $(OPM))) -ifeq (,$(shell which opm 2>/dev/null)) - @{ \ - set -e ;\ - mkdir -p $(dir $(OPM)) ;\ - OS=$(shell go env GOOS) && ARCH=$(shell go env GOARCH) && \ - curl -sSLo $(OPM) https://github.com/operator-framework/operator-registry/releases/download/v1.23.0/$${OS}-$${ARCH}-opm ;\ - chmod +x $(OPM) ;\ - } -else -OPM = $(shell which opm) -endif -endif - -# A comma-separated list of bundle images (e.g. make catalog-build BUNDLE_IMGS=example.com/operator-bundle:v0.1.0,example.com/operator-bundle:v0.2.0). -# These images MUST exist in a registry and be pull-able. -BUNDLE_IMGS ?= $(BUNDLE_IMG) - -# The image tag given to the resulting catalog image (e.g. make catalog-build CATALOG_IMG=example.com/operator-catalog:v0.2.0). -CATALOG_IMG ?= $(IMAGE_TAG_BASE)-catalog:v$(VERSION) - -# Set CATALOG_BASE_IMG to an existing catalog image tag to add $BUNDLE_IMGS to that image. -ifneq ($(origin CATALOG_BASE_IMG), undefined) -FROM_INDEX_OPT := --from-index $(CATALOG_BASE_IMG) -endif - -# Build a catalog image by adding bundle images to an empty catalog using the operator package manager tool, 'opm'. -# This recipe invokes 'opm' in 'semver' bundle add mode. For more information on add modes, see: -# https://github.com/operator-framework/community-operators/blob/7f1438c/docs/packaging-operator.md#updating-your-existing-operator -.PHONY: catalog-build -catalog-build: opm ## Build a catalog image. - $(OPM) index add --container-tool docker --mode semver --tag $(CATALOG_IMG) --bundles $(BUNDLE_IMGS) $(FROM_INDEX_OPT) - -# Push the catalog image. -.PHONY: catalog-push -catalog-push: ## Push a catalog image. - $(MAKE) docker-push IMG=$(CATALOG_IMG) - -include integration.mk diff --git a/tools/pika_operator/PROJECT b/tools/pika_operator/PROJECT deleted file mode 100644 index e700f94884..0000000000 --- a/tools/pika_operator/PROJECT +++ /dev/null @@ -1,19 +0,0 @@ -domain: openatom.org -layout: -- go.kubebuilder.io/v3 -plugins: - manifests.sdk.operatorframework.io/v2: {} - scorecard.sdk.operatorframework.io/v2: {} -projectName: pika-operator -repo: github.com/OpenAtomFoundation/pika/operator -resources: -- api: - crdVersion: v1 - namespaced: true - controller: true - domain: openatom.org - group: pika - kind: Pika - path: github.com/OpenAtomFoundation/pika/operator/api/v1alpha1 - version: v1alpha1 -version: "3" diff --git a/tools/pika_operator/README.md b/tools/pika_operator/README.md deleted file mode 100644 index b5fd5c10d5..0000000000 --- a/tools/pika_operator/README.md +++ /dev/null @@ -1,153 +0,0 @@ -# pika-operator - -pika-operator is a Kubernetes operator for managing Pika. - -## Description - -This operator is responsible for managing the lifecycle of Pika. -It is responsible for creating and managing the following resources: - -- StatefulSet -- Service -- PersistentVolumeClaim - -## Getting Started - -You’ll need a Kubernetes cluster to run against. You can use [MiniKube](https://minikube.sigs.k8s.io) -or [KIND](https://kind.sigs.k8s.io) to get a local cluster for testing, or run against a remote cluster. - -**Note:** Your controller will automatically use the current context in your kubeconfig file (i.e. whatever -cluster `kubectl cluster-info` shows). - -### Running locally with MiniKube - -1. Install [MiniKube](https://minikube.sigs.k8s.io/docs/start/) - -2. Start a local cluster: - -```sh -make minikube-up # run this if you don't have a minikube cluster -make local-deploy -``` - -Or if you want to use a development pika image: - -```sh -make local-deploy PIKA_IMAGE= -``` - -If you see some message like the following, it means that the pika-operator is running successfully: - -```sh -************ TEST PIKA ************ -kubectl run pika-minikub-test ... -pika_version:3.5.0 -pika_git_sha:bd30511bf82038c2c6531b3d84872c9825fe836a -pika_build_compile_date: Dec 1 2020 -```` - -### Running on the cluster - -1. Install Instances of Custom Resources: - -```sh -kubectl apply -f config/samples/ -``` - -2. Build and push your image to the location specified by `IMG`: - -```sh -make docker-build docker-push IMG=/pika-operator:tag -``` - -3. Deploy the controller to the cluster with the image specified by `IMG`: - -```sh -make deploy IMG=/pika-operator:tag -``` - -### Run Pika Instance - -1. Create a Pika instance: - -```sh -kubectl apply -f examples/pika-sample/ -``` - -2. Check the status of the Pika instance: - -```sh -kubectl get pika pika-sample -``` - -3. Connection to the Pika instance: - -```sh -kubectl run pika-sample-test --image redis -it --rm --restart=Never \ - -- /usr/local/bin/redis-cli -h pika-sample -p 9221 info -``` - -### Uninstall CRDs - -To delete the CRDs from the cluster: - -```sh -make uninstall -``` - -### Undeploy controller - -UnDeploy the controller to the cluster: - -```sh -make undeploy -``` - -## Contributing - -This project is still in its early stages and contributions are welcome. Please feel free to open issues and PRs. -Please see this [issue](https://github.com/OpenAtomFoundation/pika/issues/1236) to discuss the design of the operator. - -### How it works - -This project aims to follow the -Kubernetes [Operator pattern](https://kubernetes.io/docs/concepts/extend-kubernetes/operator/) - -It uses [Controllers](https://kubernetes.io/docs/concepts/architecture/controller/) -which provides a reconcile function responsible for synchronizing resources untile the desired state is reached on the -cluster - -### Test It Out - -1. Install the CRDs into the cluster: - -```sh -make install -``` - -2. Run your controller (this will run in the foreground, so switch to a new terminal if you want to leave it running): - -```sh -make run -``` - -**NOTE:** You can also run this in one step by running: `make install run` - -### Modifying the API definitions - -If you are editing the API definitions, generate the manifests such as CRs or CRDs using: - -```sh -make manifests -``` - -**NOTE:** Run `make --help` for more information on all potential `make` targets - -More information can be found via the [Kubebuilder Documentation](https://book.kubebuilder.io/introduction.html) - -## License - -Copyright (c) 2023-present, Qihoo, Inc. All rights reserved. -This source code is licensed under the BSD-style license found in the -LICENSE file in the root directory of this source tree. An additional grant -of patent rights can be found in the PATENTS file in the same directory. diff --git a/tools/pika_operator/api/v1alpha1/additional.go b/tools/pika_operator/api/v1alpha1/additional.go deleted file mode 100644 index 79b3552db1..0000000000 --- a/tools/pika_operator/api/v1alpha1/additional.go +++ /dev/null @@ -1,35 +0,0 @@ -/* -Copyright (c) 2023-present, Qihoo, Inc. All rights reserved. -This source code is licensed under the BSD-style license found in the -LICENSE file in the root directory of this source tree. An additional grant -of patent rights can be found in the PATENTS file in the same directory. -*/ - -package v1alpha1 - -const ( - // FinalizerName name of our finalizer. - FinalizerName = "pika.pika.openatom.org/finalizer" -) - -// IsContainsFinalizer check if finalizers is set. -func IsContainsFinalizer(src []string, finalizer string) bool { - for _, s := range src { - if s == finalizer { - return true - } - } - return false -} - -// RemoveFinalizer - removes given finalizer from finalizers list. -func RemoveFinalizer(src []string, finalizer string) []string { - dst := src[:0] - for _, s := range src { - if s == finalizer { - continue - } - dst = append(dst, s) - } - return dst -} diff --git a/tools/pika_operator/api/v1alpha1/groupversion_info.go b/tools/pika_operator/api/v1alpha1/groupversion_info.go deleted file mode 100644 index b8d980b7aa..0000000000 --- a/tools/pika_operator/api/v1alpha1/groupversion_info.go +++ /dev/null @@ -1,27 +0,0 @@ -/* -Copyright (c) 2023-present, Qihoo, Inc. All rights reserved. -This source code is licensed under the BSD-style license found in the -LICENSE file in the root directory of this source tree. An additional grant -of patent rights can be found in the PATENTS file in the same directory. -*/ - -// Package v1alpha1 contains API Schema definitions for the pika v1alpha1 API group -// +kubebuilder:object:generate=true -// +groupName=pika.openatom.org -package v1alpha1 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/scheme" -) - -var ( - // GroupVersion is group version used to register these objects - GroupVersion = schema.GroupVersion{Group: "pika.openatom.org", Version: "v1alpha1"} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} - - // AddToScheme adds the types in this group-version to the given scheme. - AddToScheme = SchemeBuilder.AddToScheme -) diff --git a/tools/pika_operator/api/v1alpha1/pika_types.go b/tools/pika_operator/api/v1alpha1/pika_types.go deleted file mode 100644 index 0181424863..0000000000 --- a/tools/pika_operator/api/v1alpha1/pika_types.go +++ /dev/null @@ -1,133 +0,0 @@ -/* -Copyright (c) 2023-present, Qihoo, Inc. All rights reserved. -This source code is licensed under the BSD-style license found in the -LICENSE file in the root directory of this source tree. An additional grant -of patent rights can be found in the PATENTS file in the same directory. -*/ - -package v1alpha1 - -import ( - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! -// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. - -// PikaSpec defines the desired state of Pika -// +k8s:openapi-gen=true -type PikaSpec struct { - // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster - // Important: Run "make" to regenerate code after modifying this file - - // Image - the image to use for the pika - // +optional - Image string `json:"image,omitempty"` - // ImagePullPolicy is the policy to use when pulling images - // see https://kubernetes.io/docs/concepts/containers/images/#image-pull-policy for more details - // +optional - ImagePullPolicy v1.PullPolicy `json:"imagePullPolicy,omitempty"` - - // StorageType is the type of storage used by the cluster. The default is emptyDir. - // +kubebuilder:validation:Enum=emptyDir;hostPath;pvc - // +optional - StorageType string `json:"storageType,omitempty"` - - // HostPath is the path to the host directory used for the hostPath storage type. - // +optional - HostPath string `json:"hostPath,omitempty"` - - // HostPathType is the type of the hostPath. The default is DirectoryOrCreate. - // see https://kubernetes.io/docs/concepts/storage/volumes/#hostpath for more details - // +kubebuilder:validation:Enum=DirectoryOrCreate;Directory;FileOrCreate;File;Socket;CharDevice;BlockDevice - // +optional - HostPathType *v1.HostPathType `json:"hostPathType,omitempty"` - - // StorageClassName is the name of the storage class used by the persistentVolumeClaim storage type. - // if not set, the default storage class is used. - // see https://kubernetes.io/docs/concepts/storage/storage-classes/ for more details - // +optional - StorageClassName string `json:"storageClassName,omitempty"` - - // StorageSize is the size of the persistentVolumeClaim storage type. - // see https://kubernetes.io/docs/concepts/storage/persistent-volumes/#capacity for more details - // +kubebuilder:validation:Pattern=^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$ - // +optional - StorageSize string `json:"storageSize,omitempty"` - - // StorageAnnotations is the annotations used by the persistentVolumeClaim storage type. - // see https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims for more details - // +optional - StorageAnnotations map[string]string `json:"storageAnnotations,omitempty"` - - // ServiceType is the type of the service used by the cluster. The default is ClusterIP. - // see https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types for more details - // +kubebuilder:validation:Enum=ClusterIP;NodePort;LoadBalancer;ExternalName - // +optional - ServiceType string `json:"serviceType,omitempty"` - - // ServicePort is the port of the service used by the cluster. The default is 9221. - // this will only change the service port, not the pika port. - // change it to 6379 if you want to use pika as a redis service. - // +optional - ServicePort int32 `json:"servicePort,omitempty"` - - // ServiceAnnotations is the annotations used by the service. - // use this to add annotations like service.beta.kubernetes.io/aws-load-balancer-internal: - // +optional - ServiceAnnotations map[string]string `json:"serviceAnnotations,omitempty"` - - // Resources is the resource requests and limits for the pika container. - // see https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ for more details - // +optional - Resources v1.ResourceRequirements `json:"resources,omitempty"` - // Tolerations is the tolerations used by the pika pods. - // see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ for more details - // +optional - Tolerations []v1.Toleration `json:"tolerations,omitempty"` - // Affinity is the affinity used by the pika pods. - // see https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity for more details - // +optional - Affinity *v1.Affinity `json:"affinity,omitempty"` - // NodeSelector is the nodeSelector used by the pika pods. - // see https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector for more details - // +optional - NodeSelector map[string]string `json:"nodeSelector,omitempty"` - - // PikaExternalConfig is configmap name of the pika extern config. - // The config will be mounted to /pika/conf/ , default is config file item is pika.conf. - // +optional - PikaExternalConfig *string `json:"pikaExternalConfig,omitempty"` -} - -// PikaStatus defines the observed state of Pika -type PikaStatus struct { - // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster - // Important: Run "make" to regenerate code after modifying this file -} - -//+kubebuilder:object:root=true -//+kubebuilder:subresource:status - -// Pika is the Schema for the pikas API -type Pika struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec PikaSpec `json:"spec,omitempty"` - Status PikaStatus `json:"status,omitempty"` -} - -//+kubebuilder:object:root=true - -// PikaList contains a list of Pika -type PikaList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []Pika `json:"items"` -} - -func init() { - SchemeBuilder.Register(&Pika{}, &PikaList{}) -} diff --git a/tools/pika_operator/api/v1alpha1/zz_generated.deepcopy.go b/tools/pika_operator/api/v1alpha1/zz_generated.deepcopy.go deleted file mode 100644 index f1b8b25e64..0000000000 --- a/tools/pika_operator/api/v1alpha1/zz_generated.deepcopy.go +++ /dev/null @@ -1,151 +0,0 @@ -//go:build !ignore_autogenerated -// +build !ignore_autogenerated - -/* -Copyright (c) 2023-present, Qihoo, Inc. All rights reserved. -This source code is licensed under the BSD-style license found in the -LICENSE file in the root directory of this source tree. An additional grant -of patent rights can be found in the PATENTS file in the same directory. -*/ - -// Code generated by controller-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - "k8s.io/api/core/v1" - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Pika) DeepCopyInto(out *Pika) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Pika. -func (in *Pika) DeepCopy() *Pika { - if in == nil { - return nil - } - out := new(Pika) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Pika) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PikaList) DeepCopyInto(out *PikaList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]Pika, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PikaList. -func (in *PikaList) DeepCopy() *PikaList { - if in == nil { - return nil - } - out := new(PikaList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *PikaList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PikaSpec) DeepCopyInto(out *PikaSpec) { - *out = *in - if in.HostPathType != nil { - in, out := &in.HostPathType, &out.HostPathType - *out = new(v1.HostPathType) - **out = **in - } - if in.StorageAnnotations != nil { - in, out := &in.StorageAnnotations, &out.StorageAnnotations - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.ServiceAnnotations != nil { - in, out := &in.ServiceAnnotations, &out.ServiceAnnotations - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - in.Resources.DeepCopyInto(&out.Resources) - if in.Tolerations != nil { - in, out := &in.Tolerations, &out.Tolerations - *out = make([]v1.Toleration, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.Affinity != nil { - in, out := &in.Affinity, &out.Affinity - *out = new(v1.Affinity) - (*in).DeepCopyInto(*out) - } - if in.NodeSelector != nil { - in, out := &in.NodeSelector, &out.NodeSelector - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.PikaExternalConfig != nil { - in, out := &in.PikaExternalConfig, &out.PikaExternalConfig - *out = new(string) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PikaSpec. -func (in *PikaSpec) DeepCopy() *PikaSpec { - if in == nil { - return nil - } - out := new(PikaSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PikaStatus) DeepCopyInto(out *PikaStatus) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PikaStatus. -func (in *PikaStatus) DeepCopy() *PikaStatus { - if in == nil { - return nil - } - out := new(PikaStatus) - in.DeepCopyInto(out) - return out -} diff --git a/tools/pika_operator/config/crd/bases/pika.openatom.org_pikas.yaml b/tools/pika_operator/config/crd/bases/pika.openatom.org_pikas.yaml deleted file mode 100644 index e92b824b3d..0000000000 --- a/tools/pika_operator/config/crd/bases/pika.openatom.org_pikas.yaml +++ /dev/null @@ -1,1032 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.10.0 - creationTimestamp: null - name: pikas.pika.openatom.org -spec: - group: pika.openatom.org - names: - kind: Pika - listKind: PikaList - plural: pikas - singular: pika - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: Pika is the Schema for the pikas API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: PikaSpec defines the desired state of Pika - properties: - affinity: - description: Affinity is the affinity used by the pika pods. see https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity - for more details - properties: - nodeAffinity: - description: Describes node affinity scheduling rules for the - pod. - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to - nodes that satisfy the affinity expressions specified by - this field, but it may choose a node that violates one or - more of the expressions. The node that is most preferred - is the one with the greatest sum of weights, i.e. for each - node that meets all of the scheduling requirements (resource - request, requiredDuringScheduling affinity expressions, - etc.), compute a sum by iterating through the elements of - this field and adding "weight" to the sum if the node matches - the corresponding matchExpressions; the node(s) with the - highest sum are the most preferred. - items: - description: An empty preferred scheduling term matches - all objects with implicit weight 0 (i.e. it's a no-op). - A null preferred scheduling term matches no objects (i.e. - is also a no-op). - properties: - preference: - description: A node selector term, associated with the - corresponding weight. - properties: - matchExpressions: - description: A list of node selector requirements - by node's labels. - items: - description: A node selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - values: - description: An array of string values. If - the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values array - must be empty. If the operator is Gt or - Lt, the values array must have a single - element, which will be interpreted as an - integer. This array is replaced during a - strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchFields: - description: A list of node selector requirements - by node's fields. - items: - description: A node selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - values: - description: An array of string values. If - the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values array - must be empty. If the operator is Gt or - Lt, the values array must have a single - element, which will be interpreted as an - integer. This array is replaced during a - strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - type: object - x-kubernetes-map-type: atomic - weight: - description: Weight associated with matching the corresponding - nodeSelectorTerm, in the range 1-100. - format: int32 - type: integer - required: - - preference - - weight - type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this - field are not met at scheduling time, the pod will not be - scheduled onto the node. If the affinity requirements specified - by this field cease to be met at some point during pod execution - (e.g. due to an update), the system may or may not try to - eventually evict the pod from its node. - properties: - nodeSelectorTerms: - description: Required. A list of node selector terms. - The terms are ORed. - items: - description: A null or empty node selector term matches - no objects. The requirements of them are ANDed. The - TopologySelectorTerm type implements a subset of the - NodeSelectorTerm. - properties: - matchExpressions: - description: A list of node selector requirements - by node's labels. - items: - description: A node selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - values: - description: An array of string values. If - the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values array - must be empty. If the operator is Gt or - Lt, the values array must have a single - element, which will be interpreted as an - integer. This array is replaced during a - strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchFields: - description: A list of node selector requirements - by node's fields. - items: - description: A node selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: The label key that the selector - applies to. - type: string - operator: - description: Represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists, DoesNotExist. Gt, and - Lt. - type: string - values: - description: An array of string values. If - the operator is In or NotIn, the values - array must be non-empty. If the operator - is Exists or DoesNotExist, the values array - must be empty. If the operator is Gt or - Lt, the values array must have a single - element, which will be interpreted as an - integer. This array is replaced during a - strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - type: object - x-kubernetes-map-type: atomic - type: array - required: - - nodeSelectorTerms - type: object - x-kubernetes-map-type: atomic - type: object - podAffinity: - description: Describes pod affinity scheduling rules (e.g. co-locate - this pod in the same node, zone, etc. as some other pod(s)). - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to - nodes that satisfy the affinity expressions specified by - this field, but it may choose a node that violates one or - more of the expressions. The node that is most preferred - is the one with the greatest sum of weights, i.e. for each - node that meets all of the scheduling requirements (resource - request, requiredDuringScheduling affinity expressions, - etc.), compute a sum by iterating through the elements of - this field and adding "weight" to the sum if the node has - pods which matches the corresponding podAffinityTerm; the - node(s) with the highest sum are the most preferred. - items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred node(s) - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated - with the corresponding weight. - properties: - labelSelector: - description: A label query over a set of resources, - in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: A label selector requirement - is a selector that contains values, a key, - and an operator that relates the key and - values. - properties: - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only "value". - The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces - that the term applies to. The term is applied - to the union of the namespaces selected by this - field and the ones listed in the namespaces field. - null selector and null or empty namespaces list - means "this pod's namespace". An empty selector - ({}) matches all namespaces. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: A label selector requirement - is a selector that contains values, a key, - and an operator that relates the key and - values. - properties: - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only "value". - The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list - of namespace names that the term applies to. The - term is applied to the union of the namespaces - listed in this field and the ones selected by - namespaceSelector. null or empty namespaces list - and null namespaceSelector means "this pod's namespace". - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods - matching the labelSelector in the specified namespaces, - where co-located is defined as running on a node - whose value of the label with key topologyKey - matches that of any node on which any of the selected - pods is running. Empty topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - weight: - description: weight associated with matching the corresponding - podAffinityTerm, in the range 1-100. - format: int32 - type: integer - required: - - podAffinityTerm - - weight - type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this - field are not met at scheduling time, the pod will not be - scheduled onto the node. If the affinity requirements specified - by this field cease to be met at some point during pod execution - (e.g. due to a pod label update), the system may or may - not try to eventually evict the pod from its node. When - there are multiple elements, the lists of nodes corresponding - to each podAffinityTerm are intersected, i.e. all terms - must be satisfied. - items: - description: Defines a set of pods (namely those matching - the labelSelector relative to the given namespace(s)) - that this pod should be co-located (affinity) or not co-located - (anti-affinity) with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on which a pod of the set of - pods is running - properties: - labelSelector: - description: A label query over a set of resources, - in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. If the - operator is Exists or DoesNotExist, the - values array must be empty. This array is - replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is "In", - and the values array contains only "value". The - requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces - that the term applies to. The term is applied to the - union of the namespaces selected by this field and - the ones listed in the namespaces field. null selector - and null or empty namespaces list means "this pod's - namespace". An empty selector ({}) matches all namespaces. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. If the - operator is Exists or DoesNotExist, the - values array must be empty. This array is - replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is "In", - and the values array contains only "value". The - requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list of namespace - names that the term applies to. The term is applied - to the union of the namespaces listed in this field - and the ones selected by namespaceSelector. null or - empty namespaces list and null namespaceSelector means - "this pod's namespace". - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods matching - the labelSelector in the specified namespaces, where - co-located is defined as running on a node whose value - of the label with key topologyKey matches that of - any node on which any of the selected pods is running. - Empty topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - type: array - type: object - podAntiAffinity: - description: Describes pod anti-affinity scheduling rules (e.g. - avoid putting this pod in the same node, zone, etc. as some - other pod(s)). - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to - nodes that satisfy the anti-affinity expressions specified - by this field, but it may choose a node that violates one - or more of the expressions. The node that is most preferred - is the one with the greatest sum of weights, i.e. for each - node that meets all of the scheduling requirements (resource - request, requiredDuringScheduling anti-affinity expressions, - etc.), compute a sum by iterating through the elements of - this field and adding "weight" to the sum if the node has - pods which matches the corresponding podAffinityTerm; the - node(s) with the highest sum are the most preferred. - items: - description: The weights of all of the matched WeightedPodAffinityTerm - fields are added per-node to find the most preferred node(s) - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated - with the corresponding weight. - properties: - labelSelector: - description: A label query over a set of resources, - in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: A label selector requirement - is a selector that contains values, a key, - and an operator that relates the key and - values. - properties: - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only "value". - The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces - that the term applies to. The term is applied - to the union of the namespaces selected by this - field and the ones listed in the namespaces field. - null selector and null or empty namespaces list - means "this pod's namespace". An empty selector - ({}) matches all namespaces. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: A label selector requirement - is a selector that contains values, a key, - and an operator that relates the key and - values. - properties: - key: - description: key is the label key that - the selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and - DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. - If the operator is Exists or DoesNotExist, - the values array must be empty. This - array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is - "In", and the values array contains only "value". - The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list - of namespace names that the term applies to. The - term is applied to the union of the namespaces - listed in this field and the ones selected by - namespaceSelector. null or empty namespaces list - and null namespaceSelector means "this pod's namespace". - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods - matching the labelSelector in the specified namespaces, - where co-located is defined as running on a node - whose value of the label with key topologyKey - matches that of any node on which any of the selected - pods is running. Empty topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - weight: - description: weight associated with matching the corresponding - podAffinityTerm, in the range 1-100. - format: int32 - type: integer - required: - - podAffinityTerm - - weight - type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified by - this field are not met at scheduling time, the pod will - not be scheduled onto the node. If the anti-affinity requirements - specified by this field cease to be met at some point during - pod execution (e.g. due to a pod label update), the system - may or may not try to eventually evict the pod from its - node. When there are multiple elements, the lists of nodes - corresponding to each podAffinityTerm are intersected, i.e. - all terms must be satisfied. - items: - description: Defines a set of pods (namely those matching - the labelSelector relative to the given namespace(s)) - that this pod should be co-located (affinity) or not co-located - (anti-affinity) with, where co-located is defined as running - on a node whose value of the label with key - matches that of any node on which a pod of the set of - pods is running - properties: - labelSelector: - description: A label query over a set of resources, - in this case pods. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. If the - operator is Exists or DoesNotExist, the - values array must be empty. This array is - replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is "In", - and the values array contains only "value". The - requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces - that the term applies to. The term is applied to the - union of the namespaces selected by this field and - the ones listed in the namespaces field. null selector - and null or empty namespaces list means "this pod's - namespace". An empty selector ({}) matches all namespaces. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a - selector that contains values, a key, and an - operator that relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are - In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. If the - operator is Exists or DoesNotExist, the - values array must be empty. This array is - replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is "In", - and the values array contains only "value". The - requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list of namespace - names that the term applies to. The term is applied - to the union of the namespaces listed in this field - and the ones selected by namespaceSelector. null or - empty namespaces list and null namespaceSelector means - "this pod's namespace". - items: - type: string - type: array - topologyKey: - description: This pod should be co-located (affinity) - or not co-located (anti-affinity) with the pods matching - the labelSelector in the specified namespaces, where - co-located is defined as running on a node whose value - of the label with key topologyKey matches that of - any node on which any of the selected pods is running. - Empty topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - type: array - type: object - type: object - hostPath: - description: HostPath is the path to the host directory used for the - hostPath storage type. - type: string - hostPathType: - description: HostPathType is the type of the hostPath. The default - is DirectoryOrCreate. see https://kubernetes.io/docs/concepts/storage/volumes/#hostpath - for more details - enum: - - DirectoryOrCreate - - Directory - - FileOrCreate - - File - - Socket - - CharDevice - - BlockDevice - type: string - image: - description: Image - the image to use for the pika - type: string - imagePullPolicy: - description: ImagePullPolicy is the policy to use when pulling images - see https://kubernetes.io/docs/concepts/containers/images/#image-pull-policy - for more details - type: string - nodeSelector: - additionalProperties: - type: string - description: NodeSelector is the nodeSelector used by the pika pods. - see https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector - for more details - type: object - pikaExternalConfig: - description: PikaExternalConfig is configmap name of the pika extern - config. The config will be mounted to /pika/conf/ , default is config - file item is pika.conf. - type: string - resources: - description: Resources is the resource requests and limits for the - pika container. see https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ - for more details - properties: - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Limits describes the maximum amount of compute resources - allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Requests describes the minimum amount of compute - resources required. If Requests is omitted for a container, - it defaults to Limits if that is explicitly specified, otherwise - to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - type: object - serviceAnnotations: - additionalProperties: - type: string - description: 'ServiceAnnotations is the annotations used by the service. - use this to add annotations like service.beta.kubernetes.io/aws-load-balancer-internal:' - type: object - servicePort: - description: ServicePort is the port of the service used by the cluster. - The default is 9221. this will only change the service port, not - the pika port. change it to 6379 if you want to use pika as a redis - service. - format: int32 - type: integer - serviceType: - description: ServiceType is the type of the service used by the cluster. - The default is ClusterIP. see https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types - for more details - enum: - - ClusterIP - - NodePort - - LoadBalancer - - ExternalName - type: string - storageAnnotations: - additionalProperties: - type: string - description: StorageAnnotations is the annotations used by the persistentVolumeClaim - storage type. see https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims - for more details - type: object - storageClassName: - description: StorageClassName is the name of the storage class used - by the persistentVolumeClaim storage type. if not set, the default - storage class is used. see https://kubernetes.io/docs/concepts/storage/storage-classes/ - for more details - type: string - storageSize: - description: StorageSize is the size of the persistentVolumeClaim - storage type. see https://kubernetes.io/docs/concepts/storage/persistent-volumes/#capacity - for more details - pattern: ^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$ - type: string - storageType: - description: StorageType is the type of storage used by the cluster. - The default is emptyDir. - enum: - - emptyDir - - hostPath - - pvc - type: string - tolerations: - description: Tolerations is the tolerations used by the pika pods. - see https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - for more details - items: - description: The pod this Toleration is attached to tolerates any - taint that matches the triple using the matching - operator . - properties: - effect: - description: Effect indicates the taint effect to match. Empty - means match all taint effects. When specified, allowed values - are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Key is the taint key that the toleration applies - to. Empty means match all taint keys. If the key is empty, - operator must be Exists; this combination means to match all - values and all keys. - type: string - operator: - description: Operator represents a key's relationship to the - value. Valid operators are Exists and Equal. Defaults to Equal. - Exists is equivalent to wildcard for value, so that a pod - can tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period of time - the toleration (which must be of effect NoExecute, otherwise - this field is ignored) tolerates the taint. By default, it - is not set, which means tolerate the taint forever (do not - evict). Zero and negative values will be treated as 0 (evict - immediately) by the system. - format: int64 - type: integer - value: - description: Value is the taint value the toleration matches - to. If the operator is Exists, the value should be empty, - otherwise just a regular string. - type: string - type: object - type: array - type: object - status: - description: PikaStatus defines the observed state of Pika - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/tools/pika_operator/config/crd/kustomization.yaml b/tools/pika_operator/config/crd/kustomization.yaml deleted file mode 100644 index 9a918c6d86..0000000000 --- a/tools/pika_operator/config/crd/kustomization.yaml +++ /dev/null @@ -1,21 +0,0 @@ -# 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/pika.openatom.org_pikas.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_pikas.yaml -#+kubebuilder:scaffold:crdkustomizewebhookpatch - -# [CERTMANAGER] To enable cert-manager, uncomment all the sections with [CERTMANAGER] prefix. -# patches here are for enabling the CA injection for each CRD -#- patches/cainjection_in_pikas.yaml -#+kubebuilder:scaffold:crdkustomizecainjectionpatch - -# the following config is for teaching kustomize how to do kustomization for CRDs. -configurations: -- kustomizeconfig.yaml diff --git a/tools/pika_operator/config/crd/kustomizeconfig.yaml b/tools/pika_operator/config/crd/kustomizeconfig.yaml deleted file mode 100644 index ec5c150a9d..0000000000 --- a/tools/pika_operator/config/crd/kustomizeconfig.yaml +++ /dev/null @@ -1,19 +0,0 @@ -# This file is for teaching kustomize how to substitute name and namespace reference in CRD -nameReference: -- kind: Service - version: v1 - fieldSpecs: - - kind: CustomResourceDefinition - version: v1 - group: apiextensions.k8s.io - path: spec/conversion/webhook/clientConfig/service/name - -namespace: -- kind: CustomResourceDefinition - version: v1 - group: apiextensions.k8s.io - path: spec/conversion/webhook/clientConfig/service/namespace - create: false - -varReference: -- path: metadata/annotations diff --git a/tools/pika_operator/config/crd/patches/cainjection_in_pikas.yaml b/tools/pika_operator/config/crd/patches/cainjection_in_pikas.yaml deleted file mode 100644 index cf22e99d4a..0000000000 --- a/tools/pika_operator/config/crd/patches/cainjection_in_pikas.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# The following patch adds a directive for certmanager to inject CA into the CRD -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) - name: pikas.pika.openatom.org diff --git a/tools/pika_operator/config/crd/patches/webhook_in_pikas.yaml b/tools/pika_operator/config/crd/patches/webhook_in_pikas.yaml deleted file mode 100644 index bd59052be6..0000000000 --- a/tools/pika_operator/config/crd/patches/webhook_in_pikas.yaml +++ /dev/null @@ -1,16 +0,0 @@ -# The following patch enables a conversion webhook for the CRD -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: pikas.pika.openatom.org -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - service: - namespace: system - name: webhook-service - path: /convert - conversionReviewVersions: - - v1 diff --git a/tools/pika_operator/config/default/kustomization.yaml b/tools/pika_operator/config/default/kustomization.yaml deleted file mode 100644 index 623ab08018..0000000000 --- a/tools/pika_operator/config/default/kustomization.yaml +++ /dev/null @@ -1,72 +0,0 @@ -# Adds namespace to all resources. -namespace: pika-operator-system - -# 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: pika-operator- - -# Labels to add to all resources and selectors. -#commonLabels: -# someName: someValue - -bases: -- ../crd -- ../rbac -- ../manager -# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in -# crd/kustomization.yaml -#- ../webhook -# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. 'WEBHOOK' components are required. -#- ../certmanager -# [PROMETHEUS] To enable prometheus monitor, uncomment all sections with 'PROMETHEUS'. -#- ../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: v1 -# 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: v1 -# 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/tools/pika_operator/config/default/manager_auth_proxy_patch.yaml b/tools/pika_operator/config/default/manager_auth_proxy_patch.yaml deleted file mode 100644 index 17b2dc11e4..0000000000 --- a/tools/pika_operator/config/default/manager_auth_proxy_patch.yaml +++ /dev/null @@ -1,56 +0,0 @@ -# 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: controller-manager - namespace: system -spec: - template: - spec: - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: kubernetes.io/arch - operator: In - values: - - amd64 - - arm64 - - ppc64le - - s390x - - key: kubernetes.io/os - operator: In - values: - - linux - containers: - - name: kube-rbac-proxy - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - "ALL" - image: gcr.io/kubebuilder/kube-rbac-proxy:v0.13.0 - imagePullPolicy: IfNotPresent - args: - - "--secure-listen-address=0.0.0.0:8443" - - "--upstream=http://127.0.0.1:8080/" - - "--logtostderr=true" - - "--v=0" - ports: - - containerPort: 8443 - protocol: TCP - name: https - resources: - limits: - cpu: 500m - memory: 128Mi - requests: - cpu: 5m - memory: 64Mi - - name: manager - args: - - "--health-probe-bind-address=:8081" - - "--metrics-bind-address=127.0.0.1:8080" - - "--leader-elect" diff --git a/tools/pika_operator/config/default/manager_config_patch.yaml b/tools/pika_operator/config/default/manager_config_patch.yaml deleted file mode 100644 index f6f5891692..0000000000 --- a/tools/pika_operator/config/default/manager_config_patch.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: controller-manager - namespace: system -spec: - template: - spec: - containers: - - name: manager diff --git a/tools/pika_operator/config/manager/kustomization.yaml b/tools/pika_operator/config/manager/kustomization.yaml deleted file mode 100644 index ad13e96b3f..0000000000 --- a/tools/pika_operator/config/manager/kustomization.yaml +++ /dev/null @@ -1,8 +0,0 @@ -resources: -- manager.yaml -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization -images: -- name: controller - newName: controller - newTag: latest diff --git a/tools/pika_operator/config/manager/manager.yaml b/tools/pika_operator/config/manager/manager.yaml deleted file mode 100644 index 707e8a90a8..0000000000 --- a/tools/pika_operator/config/manager/manager.yaml +++ /dev/null @@ -1,102 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - control-plane: controller-manager - app.kubernetes.io/name: namespace - app.kubernetes.io/instance: system - app.kubernetes.io/component: manager - app.kubernetes.io/created-by: pika-operator - app.kubernetes.io/part-of: pika-operator - app.kubernetes.io/managed-by: kustomize - name: system ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: controller-manager - namespace: system - labels: - control-plane: controller-manager - app.kubernetes.io/name: deployment - app.kubernetes.io/instance: controller-manager - app.kubernetes.io/component: manager - app.kubernetes.io/created-by: pika-operator - app.kubernetes.io/part-of: pika-operator - app.kubernetes.io/managed-by: kustomize -spec: - selector: - matchLabels: - control-plane: controller-manager - replicas: 1 - template: - metadata: - annotations: - kubectl.kubernetes.io/default-container: manager - labels: - control-plane: controller-manager - spec: - # TODO(user): Uncomment the following code to configure the nodeAffinity expression - # according to the platforms which are supported by your solution. - # It is considered best practice to support multiple architectures. You can - # build your manager image using the makefile target docker-buildx. - # affinity: - # nodeAffinity: - # requiredDuringSchedulingIgnoredDuringExecution: - # nodeSelectorTerms: - # - matchExpressions: - # - key: kubernetes.io/arch - # operator: In - # values: - # - amd64 - # - arm64 - # - ppc64le - # - s390x - # - key: kubernetes.io/os - # operator: In - # values: - # - linux - securityContext: - runAsNonRoot: true - # TODO(user): For common cases that do not require escalating privileges - # it is recommended to ensure that all your Pods/Containers are restrictive. - # More info: https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted - # Please uncomment the following code if your project does NOT have to work on old Kubernetes - # versions < 1.19 or on vendors versions which do NOT support this field by default (i.e. Openshift < 4.11 ). - # seccompProfile: - # type: RuntimeDefault - containers: - - command: - - /manager - args: - - --leader-elect - image: controller:latest - name: manager - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - "ALL" - livenessProbe: - httpGet: - path: /healthz - port: 8081 - initialDelaySeconds: 15 - periodSeconds: 20 - readinessProbe: - httpGet: - path: /readyz - port: 8081 - initialDelaySeconds: 5 - periodSeconds: 10 - # TODO(user): Configure the resources accordingly based on the project requirements. - # More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - resources: - limits: - cpu: 500m - memory: 128Mi - requests: - cpu: 10m - memory: 64Mi - serviceAccountName: controller-manager - terminationGracePeriodSeconds: 10 diff --git a/tools/pika_operator/config/manifests/kustomization.yaml b/tools/pika_operator/config/manifests/kustomization.yaml deleted file mode 100644 index ef55036a33..0000000000 --- a/tools/pika_operator/config/manifests/kustomization.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# These resources constitute the fully configured set of manifests -# used to generate the 'manifests/' directory in a bundle. -resources: -- bases/pika-operator.clusterserviceversion.yaml -- ../default -- ../samples -- ../scorecard - -# [WEBHOOK] To enable webhooks, uncomment all the sections with [WEBHOOK] prefix. -# Do NOT uncomment sections with prefix [CERTMANAGER], as OLM does not support cert-manager. -# These patches remove the unnecessary "cert" volume and its manager container volumeMount. -#patchesJson6902: -#- target: -# group: apps -# version: v1 -# kind: Deployment -# name: controller-manager -# namespace: system -# patch: |- -# # Remove the manager container's "cert" volumeMount, since OLM will create and mount a set of certs. -# # Update the indices in this path if adding or removing containers/volumeMounts in the manager's Deployment. -# - op: remove -# path: /spec/template/spec/containers/1/volumeMounts/0 -# # Remove the "cert" volume, since OLM will create and mount a set of certs. -# # Update the indices in this path if adding or removing volumes in the manager's Deployment. -# - op: remove -# path: /spec/template/spec/volumes/0 diff --git a/tools/pika_operator/config/prometheus/kustomization.yaml b/tools/pika_operator/config/prometheus/kustomization.yaml deleted file mode 100644 index ed137168a1..0000000000 --- a/tools/pika_operator/config/prometheus/kustomization.yaml +++ /dev/null @@ -1,2 +0,0 @@ -resources: -- monitor.yaml diff --git a/tools/pika_operator/config/prometheus/monitor.yaml b/tools/pika_operator/config/prometheus/monitor.yaml deleted file mode 100644 index 87cb4ed240..0000000000 --- a/tools/pika_operator/config/prometheus/monitor.yaml +++ /dev/null @@ -1,26 +0,0 @@ - -# Prometheus Monitor Service (Metrics) -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - labels: - control-plane: controller-manager - app.kubernetes.io/name: servicemonitor - app.kubernetes.io/instance: controller-manager-metrics-monitor - app.kubernetes.io/component: metrics - app.kubernetes.io/created-by: pika-operator - app.kubernetes.io/part-of: pika-operator - app.kubernetes.io/managed-by: kustomize - name: controller-manager-metrics-monitor - namespace: system -spec: - endpoints: - - path: /metrics - port: https - scheme: https - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token - tlsConfig: - insecureSkipVerify: true - selector: - matchLabels: - control-plane: controller-manager diff --git a/tools/pika_operator/config/rbac/auth_proxy_client_clusterrole.yaml b/tools/pika_operator/config/rbac/auth_proxy_client_clusterrole.yaml deleted file mode 100644 index 9f9cebd37c..0000000000 --- a/tools/pika_operator/config/rbac/auth_proxy_client_clusterrole.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/name: clusterrole - app.kubernetes.io/instance: metrics-reader - app.kubernetes.io/component: kube-rbac-proxy - app.kubernetes.io/created-by: pika-operator - app.kubernetes.io/part-of: pika-operator - app.kubernetes.io/managed-by: kustomize - name: metrics-reader -rules: -- nonResourceURLs: - - "/metrics" - verbs: - - get diff --git a/tools/pika_operator/config/rbac/auth_proxy_role.yaml b/tools/pika_operator/config/rbac/auth_proxy_role.yaml deleted file mode 100644 index 779cf5b987..0000000000 --- a/tools/pika_operator/config/rbac/auth_proxy_role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/name: clusterrole - app.kubernetes.io/instance: proxy-role - app.kubernetes.io/component: kube-rbac-proxy - app.kubernetes.io/created-by: pika-operator - app.kubernetes.io/part-of: pika-operator - app.kubernetes.io/managed-by: kustomize - name: proxy-role -rules: -- apiGroups: - - authentication.k8s.io - resources: - - tokenreviews - verbs: - - create -- apiGroups: - - authorization.k8s.io - resources: - - subjectaccessreviews - verbs: - - create diff --git a/tools/pika_operator/config/rbac/auth_proxy_role_binding.yaml b/tools/pika_operator/config/rbac/auth_proxy_role_binding.yaml deleted file mode 100644 index 1c32ab467b..0000000000 --- a/tools/pika_operator/config/rbac/auth_proxy_role_binding.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app.kubernetes.io/name: clusterrolebinding - app.kubernetes.io/instance: proxy-rolebinding - app.kubernetes.io/component: kube-rbac-proxy - app.kubernetes.io/created-by: pika-operator - app.kubernetes.io/part-of: pika-operator - app.kubernetes.io/managed-by: kustomize - name: proxy-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: proxy-role -subjects: -- kind: ServiceAccount - name: controller-manager - namespace: system diff --git a/tools/pika_operator/config/rbac/auth_proxy_service.yaml b/tools/pika_operator/config/rbac/auth_proxy_service.yaml deleted file mode 100644 index 9e2c71749e..0000000000 --- a/tools/pika_operator/config/rbac/auth_proxy_service.yaml +++ /dev/null @@ -1,21 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - labels: - control-plane: controller-manager - app.kubernetes.io/name: service - app.kubernetes.io/instance: controller-manager-metrics-service - app.kubernetes.io/component: kube-rbac-proxy - app.kubernetes.io/created-by: pika-operator - app.kubernetes.io/part-of: pika-operator - app.kubernetes.io/managed-by: kustomize - name: controller-manager-metrics-service - namespace: system -spec: - ports: - - name: https - port: 8443 - protocol: TCP - targetPort: https - selector: - control-plane: controller-manager diff --git a/tools/pika_operator/config/rbac/kustomization.yaml b/tools/pika_operator/config/rbac/kustomization.yaml deleted file mode 100644 index 731832a6ac..0000000000 --- a/tools/pika_operator/config/rbac/kustomization.yaml +++ /dev/null @@ -1,18 +0,0 @@ -resources: -# All RBAC will be applied under this service account in -# the deployment namespace. You may comment out this resource -# if your manager will use a service account that exists at -# runtime. Be sure to update RoleBinding and ClusterRoleBinding -# subjects if changing service account names. -- service_account.yaml -- role.yaml -- role_binding.yaml -- leader_election_role.yaml -- leader_election_role_binding.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/tools/pika_operator/config/rbac/leader_election_role.yaml b/tools/pika_operator/config/rbac/leader_election_role.yaml deleted file mode 100644 index 26939e981f..0000000000 --- a/tools/pika_operator/config/rbac/leader_election_role.yaml +++ /dev/null @@ -1,44 +0,0 @@ -# permissions to do leader election. -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - app.kubernetes.io/name: role - app.kubernetes.io/instance: leader-election-role - app.kubernetes.io/component: rbac - app.kubernetes.io/created-by: pika-operator - app.kubernetes.io/part-of: pika-operator - app.kubernetes.io/managed-by: kustomize - name: leader-election-role -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - "" - resources: - - events - verbs: - - create - - patch diff --git a/tools/pika_operator/config/rbac/leader_election_role_binding.yaml b/tools/pika_operator/config/rbac/leader_election_role_binding.yaml deleted file mode 100644 index e15a8de8ed..0000000000 --- a/tools/pika_operator/config/rbac/leader_election_role_binding.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - app.kubernetes.io/name: rolebinding - app.kubernetes.io/instance: leader-election-rolebinding - app.kubernetes.io/component: rbac - app.kubernetes.io/created-by: pika-operator - app.kubernetes.io/part-of: pika-operator - app.kubernetes.io/managed-by: kustomize - name: leader-election-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: leader-election-role -subjects: -- kind: ServiceAccount - name: controller-manager - namespace: system diff --git a/tools/pika_operator/config/rbac/pika_editor_role.yaml b/tools/pika_operator/config/rbac/pika_editor_role.yaml deleted file mode 100644 index f3b887061c..0000000000 --- a/tools/pika_operator/config/rbac/pika_editor_role.yaml +++ /dev/null @@ -1,31 +0,0 @@ -# permissions for end users to edit pikas. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/name: clusterrole - app.kubernetes.io/instance: pika-editor-role - app.kubernetes.io/component: rbac - app.kubernetes.io/created-by: pika-operator - app.kubernetes.io/part-of: pika-operator - app.kubernetes.io/managed-by: kustomize - name: pika-editor-role -rules: -- apiGroups: - - pika.openatom.org - resources: - - pikas - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - pika.openatom.org - resources: - - pikas/status - verbs: - - get diff --git a/tools/pika_operator/config/rbac/pika_viewer_role.yaml b/tools/pika_operator/config/rbac/pika_viewer_role.yaml deleted file mode 100644 index 5f0082be3e..0000000000 --- a/tools/pika_operator/config/rbac/pika_viewer_role.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# permissions for end users to view pikas. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/name: clusterrole - app.kubernetes.io/instance: pika-viewer-role - app.kubernetes.io/component: rbac - app.kubernetes.io/created-by: pika-operator - app.kubernetes.io/part-of: pika-operator - app.kubernetes.io/managed-by: kustomize - name: pika-viewer-role -rules: -- apiGroups: - - pika.openatom.org - resources: - - pikas - verbs: - - get - - list - - watch -- apiGroups: - - pika.openatom.org - resources: - - pikas/status - verbs: - - get diff --git a/tools/pika_operator/config/rbac/role.yaml b/tools/pika_operator/config/rbac/role.yaml deleted file mode 100644 index 06dd845b84..0000000000 --- a/tools/pika_operator/config/rbac/role.yaml +++ /dev/null @@ -1,75 +0,0 @@ ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - creationTimestamp: null - name: manager-role -rules: -- apiGroups: - - apps - resources: - - statefulsets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - watch -- apiGroups: - - "" - resources: - - pods - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - services - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - pika.openatom.org - resources: - - pikas - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - pika.openatom.org - resources: - - pikas/finalizers - verbs: - - update -- apiGroups: - - pika.openatom.org - resources: - - pikas/status - verbs: - - get - - patch - - update diff --git a/tools/pika_operator/config/rbac/role_binding.yaml b/tools/pika_operator/config/rbac/role_binding.yaml deleted file mode 100644 index 5d6e4ff76e..0000000000 --- a/tools/pika_operator/config/rbac/role_binding.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app.kubernetes.io/name: clusterrolebinding - app.kubernetes.io/instance: manager-rolebinding - app.kubernetes.io/component: rbac - app.kubernetes.io/created-by: pika-operator - app.kubernetes.io/part-of: pika-operator - app.kubernetes.io/managed-by: kustomize - name: manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: manager-role -subjects: -- kind: ServiceAccount - name: controller-manager - namespace: system diff --git a/tools/pika_operator/config/rbac/service_account.yaml b/tools/pika_operator/config/rbac/service_account.yaml deleted file mode 100644 index 1bc6c95604..0000000000 --- a/tools/pika_operator/config/rbac/service_account.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app.kubernetes.io/name: serviceaccount - app.kubernetes.io/instance: controller-manager - app.kubernetes.io/component: rbac - app.kubernetes.io/created-by: pika-operator - app.kubernetes.io/part-of: pika-operator - app.kubernetes.io/managed-by: kustomize - name: controller-manager - namespace: system diff --git a/tools/pika_operator/config/samples/kustomization.yaml b/tools/pika_operator/config/samples/kustomization.yaml deleted file mode 100644 index 47fa4a977f..0000000000 --- a/tools/pika_operator/config/samples/kustomization.yaml +++ /dev/null @@ -1,4 +0,0 @@ -## Append samples you want in your CSV to this file as resources ## -resources: -- pika_v1alpha1_pika.yaml -#+kubebuilder:scaffold:manifestskustomizesamples diff --git a/tools/pika_operator/config/samples/pika_v1alpha1_pika.yaml b/tools/pika_operator/config/samples/pika_v1alpha1_pika.yaml deleted file mode 100644 index 63b9a94078..0000000000 --- a/tools/pika_operator/config/samples/pika_v1alpha1_pika.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - labels: - app.kubernetes.io/name: pika - app.kubernetes.io/instance: pika-sample - app.kubernetes.io/part-of: pika-operator - app.kubernetes.io/managed-by: kustomize - app.kubernetes.io/created-by: pika-operator - name: pika-sample -spec: - # TODO(user): Add fields here diff --git a/tools/pika_operator/config/scorecard/bases/config.yaml b/tools/pika_operator/config/scorecard/bases/config.yaml deleted file mode 100644 index c77047841e..0000000000 --- a/tools/pika_operator/config/scorecard/bases/config.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: scorecard.operatorframework.io/v1alpha3 -kind: Configuration -metadata: - name: config -stages: -- parallel: true - tests: [] diff --git a/tools/pika_operator/config/scorecard/kustomization.yaml b/tools/pika_operator/config/scorecard/kustomization.yaml deleted file mode 100644 index 50cd2d084e..0000000000 --- a/tools/pika_operator/config/scorecard/kustomization.yaml +++ /dev/null @@ -1,16 +0,0 @@ -resources: -- bases/config.yaml -patchesJson6902: -- path: patches/basic.config.yaml - target: - group: scorecard.operatorframework.io - version: v1alpha3 - kind: Configuration - name: config -- path: patches/olm.config.yaml - target: - group: scorecard.operatorframework.io - version: v1alpha3 - kind: Configuration - name: config -#+kubebuilder:scaffold:patchesJson6902 diff --git a/tools/pika_operator/config/scorecard/patches/basic.config.yaml b/tools/pika_operator/config/scorecard/patches/basic.config.yaml deleted file mode 100644 index ccd4bf738f..0000000000 --- a/tools/pika_operator/config/scorecard/patches/basic.config.yaml +++ /dev/null @@ -1,10 +0,0 @@ -- op: add - path: /stages/0/tests/- - value: - entrypoint: - - scorecard-test - - basic-check-spec - image: quay.io/operator-framework/scorecard-test:v1.26.0 - labels: - suite: basic - test: basic-check-spec-test diff --git a/tools/pika_operator/config/scorecard/patches/olm.config.yaml b/tools/pika_operator/config/scorecard/patches/olm.config.yaml deleted file mode 100644 index 06d9686766..0000000000 --- a/tools/pika_operator/config/scorecard/patches/olm.config.yaml +++ /dev/null @@ -1,50 +0,0 @@ -- op: add - path: /stages/0/tests/- - value: - entrypoint: - - scorecard-test - - olm-bundle-validation - image: quay.io/operator-framework/scorecard-test:v1.26.0 - labels: - suite: olm - test: olm-bundle-validation-test -- op: add - path: /stages/0/tests/- - value: - entrypoint: - - scorecard-test - - olm-crds-have-validation - image: quay.io/operator-framework/scorecard-test:v1.26.0 - labels: - suite: olm - test: olm-crds-have-validation-test -- op: add - path: /stages/0/tests/- - value: - entrypoint: - - scorecard-test - - olm-crds-have-resources - image: quay.io/operator-framework/scorecard-test:v1.26.0 - labels: - suite: olm - test: olm-crds-have-resources-test -- op: add - path: /stages/0/tests/- - value: - entrypoint: - - scorecard-test - - olm-spec-descriptors - image: quay.io/operator-framework/scorecard-test:v1.26.0 - labels: - suite: olm - test: olm-spec-descriptors-test -- op: add - path: /stages/0/tests/- - value: - entrypoint: - - scorecard-test - - olm-status-descriptors - image: quay.io/operator-framework/scorecard-test:v1.26.0 - labels: - suite: olm - test: olm-status-descriptors-test diff --git a/tools/pika_operator/controllers/factory/default.go b/tools/pika_operator/controllers/factory/default.go deleted file mode 100644 index 12400ef667..0000000000 --- a/tools/pika_operator/controllers/factory/default.go +++ /dev/null @@ -1,16 +0,0 @@ -package factory - -import v1 "k8s.io/api/core/v1" - -const ( - // DefaultPikaKubernetesImage is the default image for pika-instance - DefaultPikaKubernetesImage = "pikadb/pika:v3.5.0" - // DefaultPikaKubernetesImagePullPolicy is the default image pull policy for pika-instance - DefaultPikaKubernetesImagePullPolicy = v1.PullIfNotPresent - // DefaultPikaStorageType is the default storage type for pika-instance - DefaultPikaStorageType = "emptyDir" - // DefaultPikaServiceType is the default service type for pika-instance - DefaultPikaServiceType = v1.ServiceTypeClusterIP - // DefaultPikaServicePort is the default service port for pika-instance - DefaultPikaServicePort int32 = 9221 -) diff --git a/tools/pika_operator/controllers/factory/finalize/common.go b/tools/pika_operator/controllers/factory/finalize/common.go deleted file mode 100644 index 37f41f221f..0000000000 --- a/tools/pika_operator/controllers/factory/finalize/common.go +++ /dev/null @@ -1,34 +0,0 @@ -package finalize - -import ( - "context" - pikav1alpha1 "github.com/OpenAtomFoundation/pika/operator/api/v1alpha1" - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -// AddFinalizer adds finalizer to instance if needed. -func AddFinalizer(ctx context.Context, rclient client.Client, instance client.Object) error { - if !pikav1alpha1.IsContainsFinalizer(instance.GetFinalizers(), pikav1alpha1.FinalizerName) { - instance.SetFinalizers(append(instance.GetFinalizers(), pikav1alpha1.FinalizerName)) - return rclient.Update(ctx, instance) - } - return nil -} - -// RemoveFinalizeObjByName removes finalizer from object by name -func RemoveFinalizeObjByName(ctx context.Context, rclient client.Client, obj client.Object, name, namespace string) error { - if err := rclient.Get(ctx, types.NamespacedName{Name: name, Namespace: namespace}, obj); err != nil { - if errors.IsNotFound(err) { - return nil - } - return err - } - - if !pikav1alpha1.IsContainsFinalizer(obj.GetFinalizers(), pikav1alpha1.FinalizerName) { - return nil - } - obj.SetFinalizers(pikav1alpha1.RemoveFinalizer(obj.GetFinalizers(), pikav1alpha1.FinalizerName)) - return rclient.Update(ctx, obj) -} diff --git a/tools/pika_operator/controllers/factory/k8stools/annotations.go b/tools/pika_operator/controllers/factory/k8stools/annotations.go deleted file mode 100644 index 19b41b5465..0000000000 --- a/tools/pika_operator/controllers/factory/k8stools/annotations.go +++ /dev/null @@ -1,18 +0,0 @@ -package k8stools - -import "strings" - -// MergeAnnotations adds annotations with kubernetes.io/ to the current map from prev -// It's needed for kubectl restart, correct updates -// such annotations managed by kubernetes controller and shouldn't be changed by operator -func MergeAnnotations(prev, current map[string]string) map[string]string { - for ck, cv := range prev { - if strings.Contains(ck, "kubernetes.io/") { - if current == nil { - current = make(map[string]string) - } - current[ck] = cv - } - } - return current -} diff --git a/tools/pika_operator/controllers/factory/k8stools/service.go b/tools/pika_operator/controllers/factory/k8stools/service.go deleted file mode 100644 index 1c6ebad853..0000000000 --- a/tools/pika_operator/controllers/factory/k8stools/service.go +++ /dev/null @@ -1,23 +0,0 @@ -package k8stools - -import ( - "context" - "fmt" - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -// HandleServiceUpdate updates or creates Service -func HandleServiceUpdate(ctx context.Context, rclient client.Client, service *v1.Service) error { - if err := rclient.Create(ctx, service); err != nil { - if !errors.IsAlreadyExists(err) { - return fmt.Errorf("cannot create service: %w", err) - } - // update - if err := rclient.Update(ctx, service); err != nil { - return fmt.Errorf("cannot update service: %w", err) - } - } - return nil -} diff --git a/tools/pika_operator/controllers/factory/k8stools/statefulset.go b/tools/pika_operator/controllers/factory/k8stools/statefulset.go deleted file mode 100644 index 7e818e4115..0000000000 --- a/tools/pika_operator/controllers/factory/k8stools/statefulset.go +++ /dev/null @@ -1,23 +0,0 @@ -package k8stools - -import ( - "context" - "fmt" - appsv1 "k8s.io/api/apps/v1" - "k8s.io/apimachinery/pkg/api/errors" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -// HandleSTSUpdate updates or creates StatefulSet -func HandleSTSUpdate(ctx context.Context, rclient client.Client, stsObj *appsv1.StatefulSet) error { - if err := rclient.Create(ctx, stsObj); err != nil { - if !errors.IsAlreadyExists(err) { - return fmt.Errorf("cannot create statefulset: %w", err) - } - // update - if err := rclient.Update(ctx, stsObj); err != nil { - return fmt.Errorf("cannot update statefulset: %w", err) - } - } - return nil -} diff --git a/tools/pika_operator/controllers/factory/pika.go b/tools/pika_operator/controllers/factory/pika.go deleted file mode 100644 index e398781755..0000000000 --- a/tools/pika_operator/controllers/factory/pika.go +++ /dev/null @@ -1,312 +0,0 @@ -package factory - -import ( - "context" - "fmt" - pikav1alpha1 "github.com/OpenAtomFoundation/pika/operator/api/v1alpha1" - "github.com/OpenAtomFoundation/pika/operator/controllers/factory/finalize" - "github.com/OpenAtomFoundation/pika/operator/controllers/factory/k8stools" - appsv1 "k8s.io/api/apps/v1" - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/intstr" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -// CreateOrUpdatePikaStandalone creates or updates pika standalone instance -func CreateOrUpdatePikaStandalone(ctx context.Context, rclient client.Client, instance *pikav1alpha1.Pika) (*appsv1.StatefulSet, error) { - instance = instance.DeepCopy() - fillDefaultPikaStandalone(instance) - stsObj, err := makePikaSTS(instance) - if err != nil { - return nil, fmt.Errorf("cannot generate new sts for pika standalone: %w", err) - } - - if err := k8stools.HandleSTSUpdate(ctx, rclient, stsObj); err != nil { - return nil, err - } - - return stsObj, nil -} - -// CreateOrUpdatePikaStandaloneService creates or updates pika standalone service -func CreateOrUpdatePikaStandaloneService(ctx context.Context, rclient client.Client, instance *pikav1alpha1.Pika) (*v1.Service, error) { - instance = instance.DeepCopy() - fillDefaultPikaStandalone(instance) - svcObj, err := makePikaSvc(instance) - if err != nil { - return nil, fmt.Errorf("cannot generate new service for pika standalone: %w", err) - } - - if err := k8stools.HandleServiceUpdate(ctx, rclient, svcObj); err != nil { - return nil, err - } - - return svcObj, nil -} - -// OnPikaStandaloneDelete clear finalizer on pika standalone -func OnPikaStandaloneDelete(ctx context.Context, rclient client.Client, instance *pikav1alpha1.Pika) error { - // remove sts finalizer - if err := finalize.RemoveFinalizeObjByName(ctx, rclient, &appsv1.StatefulSet{}, - pikaSTSName(instance), instance.Namespace); err != nil { - return err - } - - // remove svc finalizer - if err := finalize.RemoveFinalizeObjByName(ctx, rclient, &v1.Service{}, - pikaSvcName(instance), instance.Namespace); err != nil { - return err - } - - return finalize.RemoveFinalizeObjByName(ctx, rclient, instance, instance.Name, instance.Namespace) - -} - -func fillDefaultPikaStandalone(instance *pikav1alpha1.Pika) { - if instance.Spec.Image == "" { - instance.Spec.Image = DefaultPikaKubernetesImage - } - - if instance.Spec.ImagePullPolicy == "" { - instance.Spec.ImagePullPolicy = DefaultPikaKubernetesImagePullPolicy - } - - if instance.Spec.StorageType == "" { - instance.Spec.StorageType = DefaultPikaStorageType - } - - if instance.Spec.ServiceType == "" { - instance.Spec.ServiceType = string(DefaultPikaServiceType) - } - - if instance.Spec.ServicePort == 0 { - instance.Spec.ServicePort = DefaultPikaServicePort - } - -} - -func makePikaSTS(instance *pikav1alpha1.Pika) (*appsv1.StatefulSet, error) { - var replica int32 = 1 - labels := makePikaLabels(instance) - annotations := instance.Annotations - - // metadata - meta := ctrl.ObjectMeta{ - Name: pikaSTSName(instance), - Namespace: instance.Namespace, - Annotations: annotations, - Finalizers: []string{ - pikav1alpha1.FinalizerName, - }, - } - - // pod spec - podSpec, err := makePikaPodSpec(instance) - if err != nil { - return nil, err - } - - // volume claim templates - var volumeClaimTemplates []v1.PersistentVolumeClaim - if instance.Spec.StorageType == "pvc" { - volumeClaimTemplates, err = makePikaPVCs(instance) - if err != nil { - return nil, err - } - } - - stsObj := &appsv1.StatefulSet{ - ObjectMeta: meta, - Spec: appsv1.StatefulSetSpec{ - Replicas: &replica, - ServiceName: pikaHeadlessSvcName(instance), - Selector: &metav1.LabelSelector{ - MatchLabels: labels, - }, - Template: v1.PodTemplateSpec{ - ObjectMeta: ctrl.ObjectMeta{ - Labels: labels, - }, - Spec: podSpec, - }, - VolumeClaimTemplates: volumeClaimTemplates, - }, - } - - return stsObj, nil -} - -func makePikaSvc(instance *pikav1alpha1.Pika) (*v1.Service, error) { - labels := makePikaLabels(instance) - annotations := instance.Annotations - annotations = k8stools.MergeAnnotations(annotations, instance.Spec.ServiceAnnotations) - - meta := ctrl.ObjectMeta{ - Name: pikaSTSName(instance), - Namespace: instance.Namespace, - Annotations: annotations, - Finalizers: []string{ - pikav1alpha1.FinalizerName, - }, - } - - svcObj := &v1.Service{ - ObjectMeta: meta, - Spec: v1.ServiceSpec{ - Ports: []v1.ServicePort{ - { - Name: "tcp", - Port: instance.Spec.ServicePort, - TargetPort: intstr.FromString("tcp"), - }, - }, - Selector: labels, - Type: v1.ServiceType(instance.Spec.ServiceType), - }, - } - - return svcObj, nil -} - -func makePikaLabels(instance *pikav1alpha1.Pika) map[string]string { - labels := map[string]string{ - "app": instance.Name, - } - for k, v := range instance.Labels { - labels[k] = v - } - return labels -} - -func makePikaPodSpec(instance *pikav1alpha1.Pika) (v1.PodSpec, error) { - var Volumes []v1.Volume - - switch instance.Spec.StorageType { - case "emptyDir": - Volumes = append(Volumes, v1.Volume{ - Name: "pika-data", - VolumeSource: v1.VolumeSource{ - EmptyDir: &v1.EmptyDirVolumeSource{}, - }, - }) - case "hostPath": - hostPathType := v1.HostPathDirectoryOrCreate - if instance.Spec.HostPathType != nil { - hostPathType = *instance.Spec.HostPathType - } - Volumes = append(Volumes, v1.Volume{ - Name: "pika-data", - VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{ - Path: instance.Spec.HostPath, - Type: &hostPathType, - }, - }, - }) - case "pvc": - // When use pvc, the volume should be empty , - // because the pvc will be created by volumeClaimTemplates in statefulSet, - // and the volume will be added automatically - // For more details, see https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-template - default: - return v1.PodSpec{}, fmt.Errorf("storageType %s not support", instance.Spec.StorageType) - } - - VolumeMount := []v1.VolumeMount{ - { - Name: "pika-data", - MountPath: "/data", - }, - } - - // use external config if set - if instance.Spec.PikaExternalConfig != nil { - Volumes = append(Volumes, v1.Volume{ - Name: "pika-config", - VolumeSource: v1.VolumeSource{ - ConfigMap: &v1.ConfigMapVolumeSource{ - LocalObjectReference: v1.LocalObjectReference{ - Name: *instance.Spec.PikaExternalConfig, - }, - }, - }, - }) - - VolumeMount = append(VolumeMount, v1.VolumeMount{ - Name: "pika-config", - MountPath: "/pika/conf/", - }) - } - - return v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "pika", - Image: instance.Spec.Image, - ImagePullPolicy: instance.Spec.ImagePullPolicy, - Ports: []v1.ContainerPort{ - { - Name: "tcp", - ContainerPort: 9221, - }, - }, - Resources: instance.Spec.Resources, - VolumeMounts: VolumeMount, - }, - }, - Volumes: Volumes, - Affinity: instance.Spec.Affinity, - Tolerations: instance.Spec.Tolerations, - NodeSelector: instance.Spec.NodeSelector, - }, nil -} - -func makePikaPVCs(instance *pikav1alpha1.Pika) ([]v1.PersistentVolumeClaim, error) { - if instance.Spec.StorageType != "pvc" { - return nil, fmt.Errorf("storage type %s not support", instance.Spec.StorageType) - } - volumeSize, err := resource.ParseQuantity(instance.Spec.StorageSize) - if err != nil { - return nil, fmt.Errorf("cannot parse storage size: %s, err: %w", instance.Spec.StorageSize, err) - } - - var storageClassName *string - if instance.Spec.StorageClassName == "" { - storageClassName = nil - } else { - storageClassName = &instance.Spec.StorageClassName - } - - return []v1.PersistentVolumeClaim{{ - ObjectMeta: ctrl.ObjectMeta{ - Name: "pika-data", - Annotations: instance.Spec.StorageAnnotations, - }, - Spec: v1.PersistentVolumeClaimSpec{ - StorageClassName: storageClassName, - AccessModes: []v1.PersistentVolumeAccessMode{ - v1.ReadWriteOnce, - }, - Resources: v1.ResourceRequirements{ - Requests: v1.ResourceList{ - v1.ResourceStorage: volumeSize, - }, - }, - }, - }}, nil -} - -func pikaSTSName(instance *pikav1alpha1.Pika) string { - return instance.Name -} - -func pikaSvcName(instance *pikav1alpha1.Pika) string { - return instance.Name -} - -func pikaHeadlessSvcName(instance *pikav1alpha1.Pika) string { - return instance.Name + "-headless" -} diff --git a/tools/pika_operator/controllers/factory/pika_test.go b/tools/pika_operator/controllers/factory/pika_test.go deleted file mode 100644 index 19c437d017..0000000000 --- a/tools/pika_operator/controllers/factory/pika_test.go +++ /dev/null @@ -1,603 +0,0 @@ -package factory - -import ( - pikav1alpha1 "github.com/OpenAtomFoundation/pika/operator/api/v1alpha1" - "github.com/stretchr/testify/assert" - appsv1 "k8s.io/api/apps/v1" - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/intstr" - "k8s.io/apimachinery/pkg/util/yaml" - "testing" -) - -var ( - basePodSpec = v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "pika", - Image: DefaultPikaKubernetesImage, - ImagePullPolicy: DefaultPikaKubernetesImagePullPolicy, - Ports: []v1.ContainerPort{ - { - ContainerPort: DefaultPikaServicePort, - Name: "tcp", - }, - }, - Resources: v1.ResourceRequirements{}, - VolumeMounts: []v1.VolumeMount{ - { - Name: "pika-data", - MountPath: "/data", - }, - }, - }, - }, - Volumes: []v1.Volume{ - { - Name: "pika-data", - VolumeSource: v1.VolumeSource{ - EmptyDir: &v1.EmptyDirVolumeSource{}, - }, - }, - }, - } - - baseSTS = appsv1.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "pika", - Finalizers: []string{ - "pika.pika.openatom.org/finalizer", - }, - }, - Spec: appsv1.StatefulSetSpec{ - Replicas: &[]int32{1}[0], - Selector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "app": "pika", - }, - }, - ServiceName: "pika-headless", - Template: v1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{ - "app": "pika", - }, - }, - Spec: basePodSpec, - }, - }, - } - - baseSvc = v1.Service{ - ObjectMeta: metav1.ObjectMeta{ - Name: "pika", - Finalizers: []string{ - "pika.pika.openatom.org/finalizer", - }, - }, - Spec: v1.ServiceSpec{ - Ports: []v1.ServicePort{ - { - Name: "tcp", - Port: DefaultPikaServicePort, - TargetPort: intstr.FromString("tcp"), - }, - }, - Selector: map[string]string{ - "app": "pika", - }, - Type: v1.ServiceTypeClusterIP, - }, - } -) - -func parseYaml(t *testing.T, pikaEmptyYaml string) *pikav1alpha1.Pika { - customInstance := &pikav1alpha1.Pika{} - err := yaml.Unmarshal([]byte(pikaEmptyYaml), customInstance) - assert.NotNil(t, customInstance) - assert.NoError(t, err) - return customInstance -} - -func Test_fillDefaultPikaStandalone(t *testing.T) { - // test default values - pikaEmptyYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika -` - emptyInstance := parseYaml(t, pikaEmptyYaml) - fillDefaultPikaStandalone(emptyInstance) - assert.Equal(t, emptyInstance.Name, "pika") - assert.Equal(t, emptyInstance.Spec.Image, DefaultPikaKubernetesImage) - assert.Equal(t, emptyInstance.Spec.ImagePullPolicy, DefaultPikaKubernetesImagePullPolicy) - assert.Equal(t, emptyInstance.Spec.StorageType, DefaultPikaStorageType) - assert.Equal(t, emptyInstance.Spec.ServiceType, string(DefaultPikaServiceType)) - assert.Equal(t, emptyInstance.Spec.ServicePort, DefaultPikaServicePort) - - // test custom values - pikaCustomYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika-custom -spec: - image: "pika:latest" - imagePullPolicy: "Always" - storageType: "pvc" - storageClassName: "nfs-client" - storageSize: "10Gi" - serviceType: "NodePort" - servicePort: 6379 -` - - customInstance := parseYaml(t, pikaCustomYaml) - - fillDefaultPikaStandalone(customInstance) - assert.Equal(t, customInstance.Name, "pika-custom") - assert.Equal(t, customInstance.Spec.Image, "pika:latest") - assert.Equal(t, customInstance.Spec.ImagePullPolicy, v1.PullAlways) - assert.Equal(t, customInstance.Spec.StorageType, "pvc") - assert.Equal(t, customInstance.Spec.ServiceType, string(v1.ServiceTypeNodePort)) - assert.Equal(t, customInstance.Spec.ServicePort, int32(6379)) -} - -func Test_makePikaLabels(t *testing.T) { - // test empty labels - pikaEmptyYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika -` - emptyInstance := parseYaml(t, pikaEmptyYaml) - - labels := makePikaLabels(emptyInstance) - assert.Equal(t, len(labels), 1) - assert.Equal(t, labels["app"], "pika") - - // test custom labels including app label - pikaCustomYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika-custom - labels: - app: "pika" - custom: "custom" -` - - customInstance := parseYaml(t, pikaCustomYaml) - labels = makePikaLabels(customInstance) - assert.Equal(t, labels, customInstance.Labels) -} - -func Test_makePikaPVCs(t *testing.T) { - - // test empty - pikaEmptyYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika -` - emptyInstance := parseYaml(t, pikaEmptyYaml) - fillDefaultPikaStandalone(emptyInstance) - pvcs, err := makePikaPVCs(emptyInstance) - assert.EqualError(t, err, "storage type emptyDir not support") - assert.Nil(t, pvcs) - - // test invalid storage size - pikaInvalidStorageSizeYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika-invalid-storage-size -spec: - storageType: "pvc" - storageClassName: "nfs-client" - storageSize: "100g" -` - emptyInstance = parseYaml(t, pikaInvalidStorageSizeYaml) - fillDefaultPikaStandalone(emptyInstance) - pvcs, err = makePikaPVCs(emptyInstance) - assert.EqualError(t, err, "cannot parse storage size: 100g, "+ - "err: quantities must match the regular expression "+ - "'^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$'") - assert.Nil(t, pvcs) - - // test no storage class name - pikaNoStorageClassNameYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika-no-storage-class-name -spec: - storageType: "pvc" - storageSize: "10Gi" -` - noSCInstance := parseYaml(t, pikaNoStorageClassNameYaml) - noSCPvcs := []v1.PersistentVolumeClaim{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "pika-data", - }, - Spec: v1.PersistentVolumeClaimSpec{ - AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce}, - Resources: v1.ResourceRequirements{ - Requests: v1.ResourceList{ - v1.ResourceStorage: resource.MustParse("10Gi"), - }, - }, - StorageClassName: nil, - }, - }, - } - - fillDefaultPikaStandalone(noSCInstance) - pvcs, err = makePikaPVCs(noSCInstance) - assert.NoError(t, err) - assert.Equal(t, noSCPvcs, pvcs) - - // test pvc storage - pikaPVCYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika-pvc -spec: - storageType: "pvc" - storageClassName: "nfs-client" - storageSize: "10Gi" -` - - pvcInstance := parseYaml(t, pikaPVCYaml) - pvcs = []v1.PersistentVolumeClaim{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "pika-data", - }, - Spec: v1.PersistentVolumeClaimSpec{ - AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce}, - Resources: v1.ResourceRequirements{ - Requests: v1.ResourceList{ - v1.ResourceStorage: resource.MustParse("10Gi"), - }, - }, - StorageClassName: &[]string{"nfs-client"}[0], - }, - }, - } - fillDefaultPikaStandalone(pvcInstance) - pvcs, err = makePikaPVCs(pvcInstance) - assert.NoError(t, err) - assert.Equal(t, pvcs, pvcs) - -} - -func Test_makePikaPodSpec(t *testing.T) { - // test empty pika - - pikaEmptyYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika -` - emptyInstance := parseYaml(t, pikaEmptyYaml) - emptyPodSpec := basePodSpec.DeepCopy() - - fillDefaultPikaStandalone(emptyInstance) - podSpec, err := makePikaPodSpec(emptyInstance) - assert.NoError(t, err) - assert.Equal(t, podSpec, *emptyPodSpec) - - // test pvc storage - pikaPVCYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika-pvc -spec: - storageType: "pvc" - storageClassName: "nfs-client" - storageSize: "100Gi" -` - - pvcInstance := parseYaml(t, pikaPVCYaml) - pvcPodSpec := basePodSpec.DeepCopy() - // When use pvc, the volume should be empty , - // because the pvc will be created by volumeClaimTemplates in statefulSet, - // and the volume will be added automatically - // For more details, see https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-template - pvcPodSpec.Volumes = nil - fillDefaultPikaStandalone(pvcInstance) - podSpec, err = makePikaPodSpec(pvcInstance) - assert.NoError(t, err) - assert.Equal(t, podSpec, *pvcPodSpec) - - // test hostPath storage - pikaHostPathYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika-hostPath -spec: - storageType: "hostPath" - hostPath: "/data/pika" -` - hostPathInstance := parseYaml(t, pikaHostPathYaml) - hostPathPodSpec := basePodSpec.DeepCopy() - hostPathType := v1.HostPathDirectoryOrCreate - hostPathPodSpec.Volumes = []v1.Volume{ - { - Name: "pika-data", - VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{ - Path: "/data/pika", - Type: &hostPathType, - }, - }, - }, - } - - fillDefaultPikaStandalone(hostPathInstance) - podSpec, err = makePikaPodSpec(hostPathInstance) - assert.NoError(t, err) - assert.Equal(t, podSpec, *hostPathPodSpec) - - // test invalid storage type - pikaInvalidStorageTypeYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika-invalid-storage-type -spec: - storageType: "invalid" -` - invalidStorageTypeInstance := parseYaml(t, pikaInvalidStorageTypeYaml) - fillDefaultPikaStandalone(invalidStorageTypeInstance) - podSpec, err = makePikaPodSpec(invalidStorageTypeInstance) - assert.EqualError(t, err, "storageType invalid not support") - - // test external pika config - pikaExternalConfigYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika-external-config -spec: - pikaExternalConfig: "pika-config" -` - externalConfigInstance := parseYaml(t, pikaExternalConfigYaml) - externalConfigPodSpec := basePodSpec.DeepCopy() - externalConfigPodSpec.Containers[0].VolumeMounts = append( - externalConfigPodSpec.Containers[0].VolumeMounts, - v1.VolumeMount{ - Name: "pika-config", - MountPath: "/pika/conf/", - }) - externalConfigPodSpec.Volumes = append( - externalConfigPodSpec.Volumes, - v1.Volume{ - Name: "pika-config", - VolumeSource: v1.VolumeSource{ - ConfigMap: &v1.ConfigMapVolumeSource{ - LocalObjectReference: v1.LocalObjectReference{ - Name: "pika-config", - }, - }, - }, - }) - - fillDefaultPikaStandalone(externalConfigInstance) - podSpec, err = makePikaPodSpec(externalConfigInstance) - assert.NoError(t, err) - assert.Equal(t, podSpec, *externalConfigPodSpec) - - // test more kubernetes config - pikaKubeConfigYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika-kubelet-config -spec: - image: "pika:3.3.6" - imagePullPolicy: "Always" - resources: - limits: - cpu: "1" - memory: "1Gi" - requests: - cpu: "1" - memory: "1Gi" - nodeSelector: - custom-label: "custom-node" - tolerations: - - key: "custom-taint" - operator: "Equal" - value: "custom-taint-value" - effect: "NoSchedule" - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: topology.kubernetes.io/zone - operator: In - values: - - antarctica-east1 - - antarctica-west1 - preferredDuringSchedulingIgnoredDuringExecution: - - weight: 1 - preference: - matchExpressions: - - key: another-node-label-key - operator: In - values: - - another-node-label-value -` - kubeConfigInstance := parseYaml(t, pikaKubeConfigYaml) - kubeConfigPodSpec := basePodSpec.DeepCopy() - kubeConfigPodSpec.Containers[0].Image = "pika:3.3.6" - kubeConfigPodSpec.Containers[0].ImagePullPolicy = v1.PullAlways - kubeConfigPodSpec.Containers[0].Resources = v1.ResourceRequirements{ - Limits: v1.ResourceList{ - v1.ResourceCPU: resource.MustParse("1"), - v1.ResourceMemory: resource.MustParse("1Gi"), - }, - Requests: v1.ResourceList{ - v1.ResourceCPU: resource.MustParse("1"), - v1.ResourceMemory: resource.MustParse("1Gi"), - }, - } - kubeConfigPodSpec.NodeSelector = map[string]string{ - "custom-label": "custom-node", - } - kubeConfigPodSpec.Tolerations = []v1.Toleration{ - { - Key: "custom-taint", - Operator: v1.TolerationOpEqual, - Value: "custom-taint-value", - Effect: v1.TaintEffectNoSchedule, - }, - } - kubeConfigPodSpec.Affinity = &v1.Affinity{ - NodeAffinity: &v1.NodeAffinity{ - RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{ - NodeSelectorTerms: []v1.NodeSelectorTerm{ - { - MatchExpressions: []v1.NodeSelectorRequirement{ - { - Key: "topology.kubernetes.io/zone", - Operator: v1.NodeSelectorOpIn, - Values: []string{"antarctica-east1", "antarctica-west1"}, - }, - }, - }, - }, - }, - PreferredDuringSchedulingIgnoredDuringExecution: []v1.PreferredSchedulingTerm{ - { - Weight: 1, - Preference: v1.NodeSelectorTerm{ - MatchExpressions: []v1.NodeSelectorRequirement{ - { - Key: "another-node-label-key", - Operator: v1.NodeSelectorOpIn, - Values: []string{"another-node-label-value"}, - }, - }, - }, - }, - }, - }, - } - - fillDefaultPikaStandalone(kubeConfigInstance) - podSpec, err = makePikaPodSpec(kubeConfigInstance) - assert.NoError(t, err) - assert.Equal(t, podSpec, *kubeConfigPodSpec) -} - -func Test_makePikaSTS(t *testing.T) { - // test empty pika - pikaEmptyYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika -` - pikaEmptyInstance := parseYaml(t, pikaEmptyYaml) - pikaEmptySts := baseSTS.DeepCopy() - fillDefaultPikaStandalone(pikaEmptyInstance) - sts, err := makePikaSTS(pikaEmptyInstance) - assert.NoError(t, err) - assert.Equal(t, sts, pikaEmptySts) - - // test pvc and storage - pikaPvcYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika -spec: - storageType: "pvc" - storageSize: "1Gi" - storageClassName: "nfs-client" - storageAnnotations: - "custom-annotations": "custom" -` - pikaPvcInstance := parseYaml(t, pikaPvcYaml) - pikaPvcSts := baseSTS.DeepCopy() - pikaPvcSts.Spec.Template.Spec.Volumes = nil - pikaPvcSts.Spec.VolumeClaimTemplates = []v1.PersistentVolumeClaim{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "pika-data", - Annotations: map[string]string{ - "custom-annotations": "custom", - }, - }, - Spec: v1.PersistentVolumeClaimSpec{ - AccessModes: []v1.PersistentVolumeAccessMode{ - v1.ReadWriteOnce, - }, - Resources: v1.ResourceRequirements{ - Requests: v1.ResourceList{ - v1.ResourceStorage: resource.MustParse("1Gi"), - }, - }, - StorageClassName: &[]string{"nfs-client"}[0], - }, - }, - } - - fillDefaultPikaStandalone(pikaPvcInstance) - sts, err = makePikaSTS(pikaPvcInstance) - assert.NoError(t, err) - assert.Equal(t, sts, pikaPvcSts) -} - -func Test_makePikaSvc(t *testing.T) { - // test empty pika - pikaEmptyYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika -` - pikaEmptyInstance := parseYaml(t, pikaEmptyYaml) - pikaEmptySvc := baseSvc.DeepCopy() - fillDefaultPikaStandalone(pikaEmptyInstance) - svc, err := makePikaSvc(pikaEmptyInstance) - assert.NoError(t, err) - assert.Equal(t, svc, pikaEmptySvc) - - // test pika service type and annotations - pikaSvcYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika -spec: - serviceType: "NodePort" - serviceAnnotations: - "custom-annotations": "custom" -` - - pikaSvcInstance := parseYaml(t, pikaSvcYaml) - pikaSvcSvc := baseSvc.DeepCopy() - pikaSvcSvc.Spec.Type = v1.ServiceTypeNodePort - pikaSvcSvc.Annotations = map[string]string{ - "custom-annotations": "custom", - } - - fillDefaultPikaStandalone(pikaSvcInstance) - svc, err = makePikaSvc(pikaSvcInstance) - assert.NoError(t, err) - assert.Equal(t, svc, pikaSvcSvc) -} diff --git a/tools/pika_operator/controllers/pika_controller.go b/tools/pika_operator/controllers/pika_controller.go deleted file mode 100644 index e263ad80ca..0000000000 --- a/tools/pika_operator/controllers/pika_controller.go +++ /dev/null @@ -1,108 +0,0 @@ -/* -Copyright (c) 2023-present, Qihoo, Inc. All rights reserved. -This source code is licensed under the BSD-style license found in the -LICENSE file in the root directory of this source tree. An additional grant -of patent rights can be found in the PATENTS file in the same directory. -*/ - -package controllers - -import ( - "context" - pikav1alpha1 "github.com/OpenAtomFoundation/pika/operator/api/v1alpha1" - "github.com/OpenAtomFoundation/pika/operator/controllers/factory" - "github.com/OpenAtomFoundation/pika/operator/controllers/factory/finalize" - appsv1 "k8s.io/api/apps/v1" - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - "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" -) - -// PikaReconciler reconciles a Pika object -type PikaReconciler struct { - client.Client - Scheme *runtime.Scheme -} - -//+kubebuilder:rbac:groups=pika.openatom.org,resources=pikas,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=pika.openatom.org,resources=pikas/status,verbs=get;update;patch -//+kubebuilder:rbac:groups=pika.openatom.org,resources=pikas/finalizers,verbs=update -//+kubebuilder:rbac:groups=core,resources=events,verbs=get;list;watch;create;patch -//+kubebuilder:rbac:groups=core,resources=services,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=apps,resources=statefulsets,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch - -// Reconcile is part of the main kubernetes reconciliation loop which aims to -// move the current state of the cluster closer to the desired state. -// TODO(user): Modify the Reconcile function to compare the state specified by -// the Pika object against the actual cluster state, and then -// perform operations to make the cluster state reflect the state specified by -// the user. -// -// For more details, check Reconcile and its Result here: -// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.13.0/pkg/reconcile -func (r *PikaReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - logger := ctrl.Log.WithValues("namespace", req.Namespace, "name", req.Name) - - logger.Info("Reconciling Pika") - // get pika instance - instance := &pikav1alpha1.Pika{} - err := r.Get(ctx, req.NamespacedName, instance) - if err != nil { - if errors.IsNotFound(err) { - return ctrl.Result{}, nil - } - logger.Error(err, "unable to fetch Pika") - return ctrl.Result{}, err - } - - if !instance.DeletionTimestamp.IsZero() { - if err := factory.OnPikaStandaloneDelete(ctx, r.Client, instance); err != nil { - logger.Error(err, "unable to delete Pika") - return ctrl.Result{}, err - } - logger.Info("delete Pika success") - return ctrl.Result{}, nil - } - - if err := finalize.AddFinalizer(ctx, r.Client, instance); err != nil { - logger.Error(err, "unable to add finalizer") - return ctrl.Result{}, err - } - - // create pika standalone instance - sts, err := factory.CreateOrUpdatePikaStandalone(ctx, r.Client, instance) - if err != nil { - logger.Error(err, "unable to create Pika") - return ctrl.Result{}, err - } - err = ctrl.SetControllerReference(instance, sts, r.Scheme) - if err != nil { - return ctrl.Result{}, err - } - - // create pika standalone service - svc, err := factory.CreateOrUpdatePikaStandaloneService(ctx, r.Client, instance) - if err != nil { - logger.Error(err, "unable to create Pika service") - return ctrl.Result{}, err - } - err = ctrl.SetControllerReference(instance, svc, r.Scheme) - if err != nil { - return ctrl.Result{}, err - } - - return ctrl.Result{}, nil -} - -// SetupWithManager sets up the controller with the Manager. -func (r *PikaReconciler) SetupWithManager(mgr ctrl.Manager) error { - return ctrl.NewControllerManagedBy(mgr). - For(&pikav1alpha1.Pika{}). - Owns(&appsv1.StatefulSet{}).Owns(&v1.Event{}). - WithOptions(controller.Options{MaxConcurrentReconciles: 2}). - Complete(r) -} diff --git a/tools/pika_operator/controllers/pika_controller_test.go b/tools/pika_operator/controllers/pika_controller_test.go deleted file mode 100644 index 981a68bec5..0000000000 --- a/tools/pika_operator/controllers/pika_controller_test.go +++ /dev/null @@ -1,108 +0,0 @@ -/* -Copyright (c) 2023-present, Qihoo, Inc. All rights reserved. -This source code is licensed under the BSD-style license found in the -LICENSE file in the root directory of this source tree. An additional grant -of patent rights can be found in the PATENTS file in the same directory. -*/ - -package controllers - -import ( - "context" - pikav1alpha1 "github.com/OpenAtomFoundation/pika/operator/api/v1alpha1" - "os" - "time" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/controller-runtime/pkg/reconcile" -) - -var _ = Describe("Pika controller", func() { - Context("Pika controller test", func() { - const pikaName = "pika-test" - - ctx := context.Background() - - namespace := &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: pikaName, - Namespace: pikaName, - }, - } - - typeNamespaceName := types.NamespacedName{ - Name: pikaName, - Namespace: pikaName, - } - - BeforeEach(func() { - By("Creating the Namespace to perform the tests") - err := k8sClient.Create(ctx, namespace) - Expect(err).To(Not(HaveOccurred())) - - By("Setting the Image ENV VAR which stores the Operand image") - err = os.Setenv("PIKA_IMAGE", "pikadb/pika:latest") - Expect(err).To(Not(HaveOccurred())) - }) - - AfterEach(func() { - // Attention if you improve this code by adding other context test you MUST - // be aware of the current delete namespace limitations. More info: https://book.kubebuilder.io/reference/envtest.html#testing-considerations - By("Deleting the Namespace to perform the tests") - _ = k8sClient.Delete(ctx, namespace) - - By("Removing the Image ENV VAR which stores the Operand image") - _ = os.Unsetenv("PIKA_IMAGE") - }) - - It("should successfully reconcile a custom resource for Pika ", func() { - By("Creating the custom resource for the Kind Pika") - pika := &pikav1alpha1.Pika{} - err := k8sClient.Get(ctx, typeNamespaceName, pika) - if err != nil && errors.IsNotFound(err) { - // Let's mock our custom resource at the same way that we would - // apply on the cluster the manifest under config/samples - pika := &pikav1alpha1.Pika{ - ObjectMeta: metav1.ObjectMeta{ - Name: pikaName, - Namespace: namespace.Name, - }, - Spec: pikav1alpha1.PikaSpec{}, - } - - err = k8sClient.Create(ctx, pika) - Expect(err).To(Not(HaveOccurred())) - } - - By("Checking if the custom resource was successfully created") - Eventually(func() error { - found := &pikav1alpha1.Pika{} - return k8sClient.Get(ctx, typeNamespaceName, found) - }, time.Minute, time.Second).Should(Succeed()) - - By("Reconciling the custom resource created") - pikaReconciler := &PikaReconciler{ - Client: k8sClient, - Scheme: k8sClient.Scheme(), - } - - _, err = pikaReconciler.Reconcile(ctx, reconcile.Request{ - NamespacedName: typeNamespaceName, - }) - Expect(err).To(Not(HaveOccurred())) - - By("Checking if Deployment was successfully created in the reconciliation") - Eventually(func() error { - found := &appsv1.StatefulSet{} - return k8sClient.Get(ctx, typeNamespaceName, found) - }, time.Minute, time.Second).Should(Succeed()) - }) - - }) -}) diff --git a/tools/pika_operator/controllers/suite_test.go b/tools/pika_operator/controllers/suite_test.go deleted file mode 100644 index 1fc54ac7ab..0000000000 --- a/tools/pika_operator/controllers/suite_test.go +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright (c) 2023-present, Qihoo, Inc. All rights reserved. -This source code is licensed under the BSD-style license found in the -LICENSE file in the root directory of this source tree. An additional grant -of patent rights can be found in the PATENTS file in the same directory. -*/ - -package controllers - -import ( - "path/filepath" - "testing" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - - "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/rest" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/envtest" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/log/zap" - - pikav1alpha1 "github.com/OpenAtomFoundation/pika/operator/api/v1alpha1" - //+kubebuilder:scaffold:imports -) - -// These tests use Ginkgo (BDD-style Go testing framework). Refer to -// http://onsi.github.io/ginkgo/ to learn more about Ginkgo. - -var cfg *rest.Config -var k8sClient client.Client -var testEnv *envtest.Environment - -func TestAPIs(t *testing.T) { - RegisterFailHandler(Fail) - - RunSpecs(t, "Controller Suite") -} - -var _ = BeforeSuite(func() { - logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true))) - - By("bootstrapping test environment") - testEnv = &envtest.Environment{ - CRDDirectoryPaths: []string{filepath.Join("..", "config", "crd", "bases")}, - ErrorIfCRDPathMissing: true, - } - - var err error - // cfg is defined in this file globally. - cfg, err = testEnv.Start() - Expect(err).NotTo(HaveOccurred()) - Expect(cfg).NotTo(BeNil()) - - err = pikav1alpha1.AddToScheme(scheme.Scheme) - Expect(err).NotTo(HaveOccurred()) - - //+kubebuilder:scaffold:scheme - - k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}) - Expect(err).NotTo(HaveOccurred()) - Expect(k8sClient).NotTo(BeNil()) - -}) - -var _ = AfterSuite(func() { - By("tearing down the test environment") - err := testEnv.Stop() - Expect(err).NotTo(HaveOccurred()) -}) diff --git a/tools/pika_operator/examples/pika-minikube/pika-cm.yaml b/tools/pika_operator/examples/pika-minikube/pika-cm.yaml deleted file mode 100644 index 2f9dd9332d..0000000000 --- a/tools/pika_operator/examples/pika-minikube/pika-cm.yaml +++ /dev/null @@ -1,168 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: pika-minikube-config - namespace: default -data: - pika.conf: |- - # Pika port - port : 9221 - # Thread Number - thread-num : 1 - # Thread Pool Size - thread-pool-size : 12 - # Sync Thread Number - sync-thread-num : 6 - # Pika log path - log-path : /data/log/ - # Pika db path - db-path : /data/db/ - # Pika write-buffer-size - write-buffer-size : 268435456 - # size of one block in arena memory allocation. - # If <= 0, a proper value is automatically calculated - # (usually 1/8 of writer-buffer-size, rounded up to a multiple of 4KB) - arena-block-size : - # Pika timeout - timeout : 60 - # Requirepass - requirepass : - # Masterauth - masterauth : - # Userpass - userpass : - # User Blacklist - userblacklist : - # if this option is set to 'classic', that means pika support multiple DB, in - # this mode, option databases enable - # if this option is set to 'sharding', that means pika support multiple Table, you - # can specify slot num for each table, in this mode, option default-slot-num enable - # Pika instance mode [classic | sharding] - instance-mode : classic - # Set the number of databases. The default database is DB 0, you can select - # a different one on a per-connection basis using SELECT where - # dbid is a number between 0 and 'databases' - 1, limited in [1, 8] - databases : 1 - # # The slot number of pika when used with codis. - default-slot-num : 1024 - # replication num defines how many followers in a single raft group, only [0, 1, 2, 3, 4] is valid - replication-num : 0 - # consensus level defines how many confirms does leader get, before commit this log to client, - # only [0, ...replicaiton-num] is valid - consensus-level : 0 - # Dump Prefix - dump-prefix : - # daemonize [yes | no] - #daemonize : yes - # Dump Path - dump-path : /data/dump/ - # Expire-dump-days - dump-expire : 0 - # pidfile Path - pidfile : /var/run/pika.pid - # Max Connection - maxclients : 20000 - # the per file size of sst to compact, default is 20M - target-file-size-base : 20971520 - # Expire-logs-days - expire-logs-days : 7 - # Expire-logs-nums - expire-logs-nums : 10 - # Root-connection-num - root-connection-num : 2 - # Slowlog-write-errorlog - slowlog-write-errorlog : no - # Slowlog-log-slower-than - slowlog-log-slower-than : 10000 - # Slowlog-max-len - slowlog-max-len : 128 - # Pika db sync path - db-sync-path : /data/dbsync/ - # db sync speed(MB) max is set to 1024MB, min is set to 0, and if below 0 or above 1024, the value will be adjust to 1024 - db-sync-speed : -1 - # The slave priority - slave-priority : 100 - # network interface - #network-interface : eth1 - # replication - #slaveof : master-ip:master-port - - # CronTask, format 1: start-end/ratio, like 02-04/60, pika will check to schedule compaction between 2 to 4 o'clock everyday - # if the freesize/disksize > 60%. - # format 2: week/start-end/ratio, like 3/02-04/60, pika will check to schedule compaction between 2 to 4 o'clock - # every wednesday, if the freesize/disksize > 60%. - # NOTICE: if compact-interval is set, compact-cron will be mask and disable. - # - #compact-cron : 3/02-04/60 - - # Compact-interval, format: interval/ratio, like 6/60, pika will check to schedule compaction every 6 hours, - # if the freesize/disksize > 60%. NOTICE:compact-interval is prior than compact-cron; - #compact-interval : - - # the size of flow control window while sync binlog between master and slave.Default is 9000 and the maximum is 90000. - sync-window-size : 9000 - # max value of connection read buffer size: configurable value 67108864(64MB) or 268435456(256MB) or 536870912(512MB) - # default value is 268435456(256MB) - # NOTICE: master and slave should share exactly the same value - max-conn-rbuf-size : 268435456 - - - ################### - ## Critical Settings - ################### - # write_binlog [yes | no] - write-binlog : yes - # binlog file size: default is 100M, limited in [1K, 2G] - # slave binlog file size must be the same with master's - binlog-file-size : 104857600 - # Automatically triggers a small compaction according statistics - # Use the cache to store up to 'max-cache-statistic-keys' keys - # if 'max-cache-statistic-keys' set to '0', that means turn off the statistics function - # it also doesn't automatically trigger a small compact feature - max-cache-statistic-keys : 0 - # When 'delete' or 'overwrite' a specific multi-data structure key 'small-compaction-threshold' times, - # a small compact is triggered automatically, default is 5000, limited in [1, 100000] - small-compaction-threshold : 5000 - # If the total size of all live memtables of all the DBs exceeds - # the limit, a flush will be triggered in the next DB to which the next write - # is issued. - max-write-buffer-size : 10737418240 - # The maximum number of write buffers that are built up in memory for one ColumnFamily in DB. - # The default and the minimum number is 2, so that when 1 write buffer - # is being flushed to storage, new writes can continue to the other write buffer. - # If max-write-buffer-num > 3, writing will be slowed down - # if we are writing to the last write buffer allowed. - max-write-buffer-num : 2 - # Limit some command response size, like Scan, Keys* - max-client-response-size : 1073741824 - # Compression type supported [snappy, zlib, lz4, zstd] - compression : snappy - # max-background-flushes: default is 1, limited in [1, 4] - max-background-flushes : 1 - # max-background-compactions: default is 2, limited in [1, 8] - max-background-compactions : 2 - # max-background-jobs: default is 3, limited in [2, 12] - max-background-jobs : 3 - # maximum value of Rocksdb cached open file descriptors - max-cache-files : 5000 - # max_bytes_for_level_multiplier: default is 10, you can change it to 5 - max-bytes-for-level-multiplier : 10 - # BlockBasedTable block_size, default 4k - # block-size: 4096 - # block LRU cache, default 8M, 0 to disable - # block-cache: 8388608 - # num-shard-bits default -1, the number of bits from cache keys to be use as shard id. - # The cache will be sharded into 2^num_shard_bits shards. - # https://github.com/EighteenZi/rocksdb_wiki/blob/master/Block-Cache.md#lru-cache - # num-shard-bits: -1 - # whether the block cache is shared among the RocksDB instances, default is per CF - # share-block-cache: no - # whether or not index and filter blocks is stored in block cache - # cache-index-and-filter-blocks: no - # pin_l0_filter_and_index_blocks_in_cache [yes | no] - # When `cache-index-and-filter-blocks` is enabled, `pin_l0_filter_and_index_blocks_in_cache` is suggested to be enabled - # pin_l0_filter_and_index_blocks_in_cache : no - # when set to yes, bloomfilter of the last level will not be built - # optimize-filters-for-hits: no - # https://github.com/facebook/rocksdb/wiki/Leveled-Compaction#levels-target-size - # level-compaction-dynamic-level-bytes: no diff --git a/tools/pika_operator/examples/pika-minikube/pika-pika.yaml b/tools/pika_operator/examples/pika-minikube/pika-pika.yaml deleted file mode 100644 index 860baabcc6..0000000000 --- a/tools/pika_operator/examples/pika-minikube/pika-pika.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika-minikube -spec: - image: pika:dev - pikaExternalConfig: pika-minikube-config - storageType: "pvc" - storageSize: "10Gi" diff --git a/tools/pika_operator/examples/pika-pvc/pika-cm.yaml b/tools/pika_operator/examples/pika-pvc/pika-cm.yaml deleted file mode 100644 index 9509bb17df..0000000000 --- a/tools/pika_operator/examples/pika-pvc/pika-cm.yaml +++ /dev/null @@ -1,168 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: pika-config - namespace: default -data: - pika.conf: |- - # Pika port - port : 9221 - # Thread Number - thread-num : 1 - # Thread Pool Size - thread-pool-size : 12 - # Sync Thread Number - sync-thread-num : 6 - # Pika log path - log-path : /data/log/ - # Pika db path - db-path : /data/db/ - # Pika write-buffer-size - write-buffer-size : 268435456 - # size of one block in arena memory allocation. - # If <= 0, a proper value is automatically calculated - # (usually 1/8 of writer-buffer-size, rounded up to a multiple of 4KB) - arena-block-size : - # Pika timeout - timeout : 60 - # Requirepass - requirepass : - # Masterauth - masterauth : - # Userpass - userpass : - # User Blacklist - userblacklist : - # if this option is set to 'classic', that means pika support multiple DB, in - # this mode, option databases enable - # if this option is set to 'sharding', that means pika support multiple Table, you - # can specify slot num for each table, in this mode, option default-slot-num enable - # Pika instance mode [classic | sharding] - instance-mode : classic - # Set the number of databases. The default database is DB 0, you can select - # a different one on a per-connection basis using SELECT where - # dbid is a number between 0 and 'databases' - 1, limited in [1, 8] - databases : 1 - # The slot number of pika when used with codis. - default-slot-num : 1024 - # replication num defines how many followers in a single raft group, only [0, 1, 2, 3, 4] is valid - replication-num : 0 - # consensus level defines how many confirms does leader get, before commit this log to client, - # only [0, ...replicaiton-num] is valid - consensus-level : 0 - # Dump Prefix - dump-prefix : - # daemonize [yes | no] - #daemonize : yes - # Dump Path - dump-path : /data/dump/ - # Expire-dump-days - dump-expire : 0 - # pidfile Path - pidfile : /var/run/pika.pid - # Max Connection - maxclients : 20000 - # the per file size of sst to compact, default is 20M - target-file-size-base : 20971520 - # Expire-logs-days - expire-logs-days : 7 - # Expire-logs-nums - expire-logs-nums : 10 - # Root-connection-num - root-connection-num : 2 - # Slowlog-write-errorlog - slowlog-write-errorlog : no - # Slowlog-log-slower-than - slowlog-log-slower-than : 10000 - # Slowlog-max-len - slowlog-max-len : 128 - # Pika db sync path - db-sync-path : /data/dbsync/ - # db sync speed(MB) max is set to 1024MB, min is set to 0, and if below 0 or above 1024, the value will be adjust to 1024 - db-sync-speed : -1 - # The slave priority - slave-priority : 100 - # network interface - #network-interface : eth1 - # replication - #slaveof : master-ip:master-port - - # CronTask, format 1: start-end/ratio, like 02-04/60, pika will check to schedule compaction between 2 to 4 o'clock everyday - # if the freesize/disksize > 60%. - # format 2: week/start-end/ratio, like 3/02-04/60, pika will check to schedule compaction between 2 to 4 o'clock - # every wednesday, if the freesize/disksize > 60%. - # NOTICE: if compact-interval is set, compact-cron will be mask and disable. - # - #compact-cron : 3/02-04/60 - - # Compact-interval, format: interval/ratio, like 6/60, pika will check to schedule compaction every 6 hours, - # if the freesize/disksize > 60%. NOTICE:compact-interval is prior than compact-cron; - #compact-interval : - - # the size of flow control window while sync binlog between master and slave.Default is 9000 and the maximum is 90000. - sync-window-size : 9000 - # max value of connection read buffer size: configurable value 67108864(64MB) or 268435456(256MB) or 536870912(512MB) - # default value is 268435456(256MB) - # NOTICE: master and slave should share exactly the same value - max-conn-rbuf-size : 268435456 - - - ################### - ## Critical Settings - ################### - # write_binlog [yes | no] - write-binlog : yes - # binlog file size: default is 100M, limited in [1K, 2G] - # slave binlog file size must be the same with master's - binlog-file-size : 104857600 - # Automatically triggers a small compaction according statistics - # Use the cache to store up to 'max-cache-statistic-keys' keys - # if 'max-cache-statistic-keys' set to '0', that means turn off the statistics function - # it also doesn't automatically trigger a small compact feature - max-cache-statistic-keys : 0 - # When 'delete' or 'overwrite' a specific multi-data structure key 'small-compaction-threshold' times, - # a small compact is triggered automatically, default is 5000, limited in [1, 100000] - small-compaction-threshold : 5000 - # If the total size of all live memtables of all the DBs exceeds - # the limit, a flush will be triggered in the next DB to which the next write - # is issued. - max-write-buffer-size : 10737418240 - # The maximum number of write buffers that are built up in memory for one ColumnFamily in DB. - # The default and the minimum number is 2, so that when 1 write buffer - # is being flushed to storage, new writes can continue to the other write buffer. - # If max-write-buffer-num > 3, writing will be slowed down - # if we are writing to the last write buffer allowed. - max-write-buffer-num : 2 - # Limit some command response size, like Scan, Keys* - max-client-response-size : 1073741824 - # Compression type supported [snappy, zlib, lz4, zstd] - compression : snappy - # max-background-flushes: default is 1, limited in [1, 4] - max-background-flushes : 1 - # max-background-compactions: default is 2, limited in [1, 8] - max-background-compactions : 2 - # max-background-jobs: default is 3, limited in [2, 12] - max-background-jobs : 3 - # maximum value of Rocksdb cached open file descriptors - max-cache-files : 5000 - # max_bytes_for_level_multiplier: default is 10, you can change it to 5 - max-bytes-for-level-multiplier : 10 - # BlockBasedTable block_size, default 4k - # block-size: 4096 - # block LRU cache, default 8M, 0 to disable - # block-cache: 8388608 - # num-shard-bits default -1, the number of bits from cache keys to be use as shard id. - # The cache will be sharded into 2^num_shard_bits shards. - # https://github.com/EighteenZi/rocksdb_wiki/blob/master/Block-Cache.md#lru-cache - # num-shard-bits: -1 - # whether the block cache is shared among the RocksDB instances, default is per CF - # share-block-cache: no - # whether or not index and filter blocks is stored in block cache - # cache-index-and-filter-blocks: no - # pin_l0_filter_and_index_blocks_in_cache [yes | no] - # When `cache-index-and-filter-blocks` is enabled, `pin_l0_filter_and_index_blocks_in_cache` is suggested to be enabled - # pin_l0_filter_and_index_blocks_in_cache : no - # when set to yes, bloomfilter of the last level will not be built - # optimize-filters-for-hits: no - # https://github.com/facebook/rocksdb/wiki/Leveled-Compaction#levels-target-size - # level-compaction-dynamic-level-bytes: no diff --git a/tools/pika_operator/examples/pika-pvc/pika-pika.yaml b/tools/pika_operator/examples/pika-pvc/pika-pika.yaml deleted file mode 100644 index 6489571556..0000000000 --- a/tools/pika_operator/examples/pika-pvc/pika-pika.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika-pvc -spec: - pikaExternalConfig: pika-config - storageType: "pvc" - storageClassName: "nfs-client" - storageSize: "10Gi" diff --git a/tools/pika_operator/examples/pika-sample/pika-pika.yaml b/tools/pika_operator/examples/pika-sample/pika-pika.yaml deleted file mode 100644 index 4ad1def221..0000000000 --- a/tools/pika_operator/examples/pika-sample/pika-pika.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika-sample -spec: diff --git a/tools/pika_operator/go.mod b/tools/pika_operator/go.mod deleted file mode 100644 index 82bd53db0d..0000000000 --- a/tools/pika_operator/go.mod +++ /dev/null @@ -1,75 +0,0 @@ -module github.com/OpenAtomFoundation/pika/operator - -go 1.19 - -require ( - github.com/onsi/ginkgo/v2 v2.9.2 - github.com/onsi/gomega v1.27.5 - github.com/stretchr/testify v1.8.2 - k8s.io/api v0.26.3 - k8s.io/apimachinery v0.26.3 - k8s.io/client-go v0.26.3 - sigs.k8s.io/controller-runtime v0.14.5 -) - -require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/logr v1.2.3 // indirect - github.com/go-logr/zapr v1.2.3 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect - github.com/go-openapi/swag v0.19.14 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect - github.com/google/uuid v1.1.2 // indirect - github.com/imdario/mergo v0.3.6 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/mailru/easyjson v0.7.6 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.7.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.26.1 // indirect - k8s.io/component-base v0.26.1 // indirect - k8s.io/klog/v2 v2.80.1 // indirect - k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect - k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) diff --git a/tools/pika_operator/go.sum b/tools/pika_operator/go.sum deleted file mode 100644 index bc757c5598..0000000000 --- a/tools/pika_operator/go.sum +++ /dev/null @@ -1,628 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -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= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -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/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -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= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -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/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -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/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -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/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -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/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -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-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -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/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= -github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -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= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -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.3/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/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -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/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -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.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM= -github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU= -github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts= -github.com/onsi/gomega v1.27.5 h1:T/X6I0RNFw/kTqgfkZPcQ5KU6vCnWNBGdtrIx2dpGeQ= -github.com/onsi/gomega v1.27.5/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -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/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -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/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -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-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -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= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/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.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -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/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -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/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -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.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/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.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.26.3 h1:emf74GIQMTik01Aum9dPP0gAypL8JTLl/lHa4V9RFSU= -k8s.io/api v0.26.3/go.mod h1:PXsqwPMXBSBcL1lJ9CYDKy7kIReUydukS5JiRlxC3qE= -k8s.io/apiextensions-apiserver v0.26.1 h1:cB8h1SRk6e/+i3NOrQgSFij1B2S0Y0wDoNl66bn8RMI= -k8s.io/apiextensions-apiserver v0.26.1/go.mod h1:AptjOSXDGuE0JICx/Em15PaoO7buLwTs0dGleIHixSM= -k8s.io/apimachinery v0.26.3 h1:dQx6PNETJ7nODU3XPtrwkfuubs6w7sX0M8n61zHIV/k= -k8s.io/apimachinery v0.26.3/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= -k8s.io/client-go v0.26.3 h1:k1UY+KXfkxV2ScEL3gilKcF7761xkYsSD6BC9szIu8s= -k8s.io/client-go v0.26.3/go.mod h1:ZPNu9lm8/dbRIPAgteN30RSXea6vrCpFvq+MateTUuQ= -k8s.io/component-base v0.26.1 h1:4ahudpeQXHZL5kko+iDHqLj/FSGAEUnSVO0EBbgDd+4= -k8s.io/component-base v0.26.1/go.mod h1:VHrLR0b58oC035w6YQiBSbtsf0ThuSwXP+p5dD/kAWU= -k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= -k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 h1:KTgPnR10d5zhztWptI952TNtt/4u5h3IzDXkdIMuo2Y= -k8s.io/utils v0.0.0-20221128185143-99ec85e7a448/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/controller-runtime v0.14.5 h1:6xaWFqzT5KuAQ9ufgUaj1G/+C4Y1GRkhrxl+BJ9i+5s= -sigs.k8s.io/controller-runtime v0.14.5/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/tools/pika_operator/hack/boilerplate.go.txt b/tools/pika_operator/hack/boilerplate.go.txt deleted file mode 100644 index 8e060b602d..0000000000 --- a/tools/pika_operator/hack/boilerplate.go.txt +++ /dev/null @@ -1,6 +0,0 @@ -/* -Copyright (c) 2023-present, Qihoo, Inc. All rights reserved. -This source code is licensed under the BSD-style license found in the -LICENSE file in the root directory of this source tree. An additional grant -of patent rights can be found in the PATENTS file in the same directory. -*/ \ No newline at end of file diff --git a/tools/pika_operator/integration.mk b/tools/pika_operator/integration.mk deleted file mode 100644 index 64cf067bcc..0000000000 --- a/tools/pika_operator/integration.mk +++ /dev/null @@ -1,61 +0,0 @@ -##@ MiniKube - -PIKA_IMAGE ?= pikadb/pika:v3.5.0 -PIKA_OPERATOR_IMAGE ?= pika-operator:dev - -LOCAL_CLUSTER_NAME ?= mini-pika -LOCAL_CLUSTER_VERSION ?= v1.25.3 - -.PHONY: minikube-up -minikube-up: ## Start minikube. - @minikube version || (echo "minikube is not installed" && exit 1) - minikube start --kubernetes-version $(LOCAL_CLUSTER_VERSION) - -.PHONY: minikube-reset -minikube-reset: ## Reset minikube. - minikube delete - -.PHONY: set-local-env -set-local-env: ## Set local env. -export IMG=$(PIKA_OPERATOR_IMAGE) - -.PHONY: minikube-image-load -minikube-image-load: ## Load image to minikube. -ifeq ($(shell docker images -q $(PIKA_IMAGE) 2> /dev/null),) - docker pull $(PIKA_IMAGE) -endif - docker tag $(PIKA_IMAGE) pika:dev - minikube image load pika:dev - minikube image load pika-operator:dev - -.PHONY: deploy-pika-sample -deploy-pika-sample: ## Deploy pika-sample. - kubectl apply -f examples/pika-minikube/ - sleep 10 - kubectl wait pods -l app=pika-minikube --for condition=Ready --timeout=90s - kubectl run pika-minikube-test --image redis -it --rm --restart=Never \ - -- /usr/local/bin/redis-cli -h pika-minikube -p 9221 info | grep -E '^pika_' - -.PHONY: uninstall-pika-sample -uninstall-pika-sample: ## Uninstall pika-sample. - kubectl delete -f examples/pika-minikube/ - -##@ Local EnvSetup -local-env-setup: set-local-env docker-build minikube-image-load install deploy - -##@ Local Deploy -.PHONY: local-deploy -local-deploy: local-env-setup deploy-pika-sample - -##@ Local Clean -.PHONY: local-clean -local-clean: uninstall-pika-sample uninstall - -##@ e2e test -.PHONY: e2e-test # You will need to have a k8s cluster up in running to run this target -e2e-test: - go test --tags=integration ./test/e2e/ -v -ginkgo.v - -##@ e2e-test-local: Run e2e test cases (minikube is required) -.PHONY: e2e-test-local -e2e-test-local: local-env-setup e2e-test diff --git a/tools/pika_operator/main.go b/tools/pika_operator/main.go deleted file mode 100644 index a7b796e2d5..0000000000 --- a/tools/pika_operator/main.go +++ /dev/null @@ -1,106 +0,0 @@ -/* -Copyright (c) 2023-present, Qihoo, Inc. All rights reserved. -This source code is licensed under the BSD-style license found in the -LICENSE file in the root directory of this source tree. An additional grant -of patent rights can be found in the PATENTS file in the same directory. -*/ - -package main - -import ( - "flag" - "os" - - // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) - // to ensure that exec-entrypoint and run can make use of them. - _ "k8s.io/client-go/plugin/pkg/client/auth" - - "k8s.io/apimachinery/pkg/runtime" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" - clientgoscheme "k8s.io/client-go/kubernetes/scheme" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/healthz" - "sigs.k8s.io/controller-runtime/pkg/log/zap" - - pikav1alpha1 "github.com/OpenAtomFoundation/pika/operator/api/v1alpha1" - "github.com/OpenAtomFoundation/pika/operator/controllers" - //+kubebuilder:scaffold:imports -) - -var ( - scheme = runtime.NewScheme() - setupLog = ctrl.Log.WithName("setup") -) - -func init() { - utilruntime.Must(clientgoscheme.AddToScheme(scheme)) - - utilruntime.Must(pikav1alpha1.AddToScheme(scheme)) - //+kubebuilder:scaffold:scheme -} - -func main() { - var metricsAddr string - var enableLeaderElection bool - var probeAddr string - flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.") - flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.") - flag.BoolVar(&enableLeaderElection, "leader-elect", false, - "Enable leader election for controller manager. "+ - "Enabling this will ensure there is only one active controller manager.") - opts := zap.Options{ - Development: true, - } - opts.BindFlags(flag.CommandLine) - flag.Parse() - - ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) - - mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - MetricsBindAddress: metricsAddr, - Port: 9443, - HealthProbeBindAddress: probeAddr, - LeaderElection: enableLeaderElection, - LeaderElectionID: "6fe72829.openatom.org", - // LeaderElectionReleaseOnCancel defines if the leader should step down voluntarily - // when the Manager ends. This requires the binary to immediately end when the - // Manager is stopped, otherwise, this setting is unsafe. Setting this significantly - // speeds up voluntary leader transitions as the new leader don't have to wait - // LeaseDuration time first. - // - // In the default scaffold provided, the program ends immediately after - // the manager stops, so would be fine to enable this option. However, - // if you are doing or is intended to do any operation such as perform cleanups - // after the manager stops then its usage might be unsafe. - // LeaderElectionReleaseOnCancel: true, - }) - if err != nil { - setupLog.Error(err, "unable to start manager") - os.Exit(1) - } - - if err = (&controllers.PikaReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - }).SetupWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "Pika") - os.Exit(1) - } - //+kubebuilder:scaffold:builder - - if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { - setupLog.Error(err, "unable to set up health check") - os.Exit(1) - } - if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil { - setupLog.Error(err, "unable to set up ready check") - 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/tools/pika_operator/test/e2e/e2e.go b/tools/pika_operator/test/e2e/e2e.go deleted file mode 100644 index aa4c25eda3..0000000000 --- a/tools/pika_operator/test/e2e/e2e.go +++ /dev/null @@ -1,10 +0,0 @@ -//go:build integration -// +build integration - -package e2e - -import ( - _ "github.com/OpenAtomFoundation/pika/operator/test/e2e/test-standalone" -) - -func runE2E() {} diff --git a/tools/pika_operator/test/e2e/e2e_test.go b/tools/pika_operator/test/e2e/e2e_test.go deleted file mode 100644 index 7e6a859794..0000000000 --- a/tools/pika_operator/test/e2e/e2e_test.go +++ /dev/null @@ -1,14 +0,0 @@ -//go:build integration -// +build integration - -package e2e - -import ( - "github.com/onsi/ginkgo/v2" - "testing" -) - -func TestRunE2E(t *testing.T) { - runE2E() - ginkgo.RunSpecs(t, "pika-operator e2e test suites") -} diff --git a/tools/pika_operator/test/e2e/scaffold/k8s.go b/tools/pika_operator/test/e2e/scaffold/k8s.go deleted file mode 100644 index aa13ee9276..0000000000 --- a/tools/pika_operator/test/e2e/scaffold/k8s.go +++ /dev/null @@ -1,36 +0,0 @@ -package scaffold - -import ( - "context" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// Namespace related functions. - -// CreateNamespace creates a namespace with the Scaffold's namespace name. -func (s *Scaffold) CreateNamespace(ctx context.Context) error { - _, err := s.kubeClient.CoreV1().Namespaces().Create(ctx, &v1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: s.namespace, - }, - }, metav1.CreateOptions{}) - return err -} - -// DeleteNamespace deletes the namespace with the Scaffold's namespace name. -func (s *Scaffold) DeleteNamespace(ctx context.Context) error { - return s.kubeClient.CoreV1().Namespaces().Delete(ctx, s.namespace, metav1.DeleteOptions{}) -} - -// GetNamespaceName returns the namespace name. -func (s *Scaffold) GetNamespaceName() string { - return s.namespace -} - -// GetPodsBySelector returns the pods by the selector. -func (s *Scaffold) GetPodsBySelector(ctx context.Context, selector string) (*v1.PodList, error) { - return s.kubeClient.CoreV1().Pods(s.namespace).List(ctx, metav1.ListOptions{ - LabelSelector: selector, - }) -} diff --git a/tools/pika_operator/test/e2e/scaffold/kubectl.go b/tools/pika_operator/test/e2e/scaffold/kubectl.go deleted file mode 100644 index 8526f19a25..0000000000 --- a/tools/pika_operator/test/e2e/scaffold/kubectl.go +++ /dev/null @@ -1,40 +0,0 @@ -package scaffold - -import ( - "fmt" - "github.com/OpenAtomFoundation/pika/operator/test/e2e/utils" -) - -// kubectl command related functions. - -// GetKubeConfig returns the kubeConfig path. -func (s *Scaffold) GetKubeConfig() string { - return s.kubeConfig -} - -// CreateResourceFromString creates a resource from a string. -func (s *Scaffold) CreateResourceFromString(yamlStr string) error { - tmpFile, err := utils.StoreTmpFile(yamlStr) - if err != nil { - return err - } - return s.KubeApply(tmpFile) -} - -// KubeApply applies a yaml file. -func (s *Scaffold) KubeApply(filePath string) error { - stdout, stderr, err := utils.ExecCmdWithOutput("kubectl", "--kubeconfig", s.kubeConfig, "apply", "-f", filePath, "-n", s.namespace) - if err != nil { - return fmt.Errorf("failed to apply yaml file %s, stdout: \n%s\n, stderr: \n%s\n, err: %v", filePath, stdout, stderr, err) - } - return nil -} - -// KubeDelete deletes a yaml file. -func (s *Scaffold) KubeDelete(filePath string) error { - stdout, stderr, err := utils.ExecCmdWithOutput("kubectl", "delete", "-f", filePath, "-n", s.namespace) - if err != nil { - return fmt.Errorf("failed to delete yaml file %s, stdout: \n%s\n, stderr: \n%s\n, err: %v", filePath, stdout, stderr, err) - } - return nil -} diff --git a/tools/pika_operator/test/e2e/scaffold/scaffold.go b/tools/pika_operator/test/e2e/scaffold/scaffold.go deleted file mode 100644 index e68d3dfd5d..0000000000 --- a/tools/pika_operator/test/e2e/scaffold/scaffold.go +++ /dev/null @@ -1,95 +0,0 @@ -package scaffold - -import ( - "context" - "fmt" - "github.com/onsi/ginkgo/v2" - "github.com/stretchr/testify/assert" - kube "k8s.io/client-go/kubernetes" - "k8s.io/client-go/tools/clientcmd" - "os" - "time" -) - -type TestingT interface { - Errorf(format string, args ...interface{}) -} - -type Options struct { - Name string - kubeConfig string -} - -type Scaffold struct { - opts *Options - namespace string - kubeClient *kube.Clientset - kubeConfig string - t TestingT -} - -// NewScaffold creates a new Scaffold. -func NewScaffold(opts *Options) *Scaffold { - namespace := fmt.Sprintf("pika-e2e-%s-%d", opts.Name, time.Now().UnixNano()) - - kubeConfig := getKubeConfig(opts.kubeConfig) - if kubeConfig == "" { - panic("kubeConfig got empty") - } - - // Create a new clientSet from local kubeConfig - kubeClientSet, err := newKubeClient(kubeConfig) - if err != nil { - panic(err) - } - - return &Scaffold{ - opts: opts, - namespace: namespace, - kubeClient: kubeClientSet, - kubeConfig: kubeConfig, - t: ginkgo.GinkgoT(), - } -} - -// getKubeConfig returns the kubeConfig path. -// order: 1. kubeConfigPath 2. KUBECONFIG 3. $HOME/.kube/config -func getKubeConfig(config string) string { - if config != "" { - return config - } - config = os.Getenv("KUBECONFIG") - if config == "" { - config = os.Getenv("HOME") + "/.kube/config" - } - return config -} - -// newKubeClient creates a new kubeClientSet from kubeConfig. -func newKubeClient(config string) (*kube.Clientset, error) { - kubeConfig, err := clientcmd.BuildConfigFromFlags("", config) - if err != nil { - return nil, err - } - kubeClientSet, err := kube.NewForConfig(kubeConfig) - if err != nil { - return nil, err - } - return kubeClientSet, err -} - -// BeforeSuite runs before the test suite. -func (s *Scaffold) BeforeSuite() error { - ctx := context.Background() - err := s.CreateNamespace(ctx) - assert.Nilf(s.t, err, "failed to create namespace %s, err: %v", s.namespace, err) - return nil -} - -// AfterSuite runs after the test suite. -func (s *Scaffold) AfterSuite() error { - ctx := context.Background() - err := s.DeleteNamespace(ctx) - assert.Nilf(s.t, err, "failed to delete namespace %s, err: %v", s.namespace, err) - return nil -} diff --git a/tools/pika_operator/test/e2e/test-standalone/standalone.go b/tools/pika_operator/test/e2e/test-standalone/standalone.go deleted file mode 100644 index 0d74b9f291..0000000000 --- a/tools/pika_operator/test/e2e/test-standalone/standalone.go +++ /dev/null @@ -1,52 +0,0 @@ -package test_standalone - -import ( - "context" - "github.com/OpenAtomFoundation/pika/operator/test/e2e/scaffold" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - "time" -) - -const ( - name = "standalone" -) - -var _ = Describe("e2e standalone", func() { - s := scaffold.NewScaffold(&scaffold.Options{ - Name: "standalone", - }) - RegisterFailHandler(Fail) - BeforeEach(func() { - By("Creating namespace & deploying default pika operator") - err := s.BeforeSuite() - Expect(err).Should(BeNil()) - }) - AfterEach(func() { - By("Deleting namespace") - err := s.AfterSuite() - Expect(err).Should(BeNil()) - }) - - It("deploy sample pika", func() { - pikaYaml := ` -apiVersion: pika.openatom.org/v1alpha1 -kind: Pika -metadata: - name: pika-sample - labels: - app: pika-sample -spec: -` - ctx := context.Background() - By("Creating sample pika") - err := s.CreateResourceFromString(pikaYaml) - Expect(err).Should(BeNil()) - time.Sleep(3 * time.Second) - By("Get sample pika") - pods, err := s.GetPodsBySelector(ctx, "app=pika-sample") - Expect(err).Should(BeNil()) - Expect(len(pods.Items)).Should(Equal(1)) - }) - -}) diff --git a/tools/pika_operator/test/e2e/utils/cmd.go b/tools/pika_operator/test/e2e/utils/cmd.go deleted file mode 100644 index a0652bfb69..0000000000 --- a/tools/pika_operator/test/e2e/utils/cmd.go +++ /dev/null @@ -1,39 +0,0 @@ -package utils - -import ( - "io" - "os/exec" -) - -// ExecCmdWithOutput executes a command and returns the output. -// return stdoutHas,stderrHas,err -func ExecCmdWithOutput(cmd string, args ...string) (string, string, error) { - cmdSt := exec.Command(cmd, args...) - - stdoutReader, err := cmdSt.StdoutPipe() - if err != nil { - return "", "", err - } - stderrReader, err := cmdSt.StderrPipe() - if err != nil { - return "", "", err - } - - err = cmdSt.Start() - if err != nil { - return "", "", err - } - - stdout, err := io.ReadAll(stdoutReader) - if err != nil { - return "", "", err - } - - stderr, err := io.ReadAll(stderrReader) - if err != nil { - return "", "", err - } - - err = cmdSt.Wait() - return string(stdout), string(stderr), err -} diff --git a/tools/pika_operator/test/e2e/utils/cmd_test.go b/tools/pika_operator/test/e2e/utils/cmd_test.go deleted file mode 100644 index 7694c194a5..0000000000 --- a/tools/pika_operator/test/e2e/utils/cmd_test.go +++ /dev/null @@ -1,95 +0,0 @@ -package utils - -import ( - "strings" - "testing" -) - -func TestExecCmdWithOutput(t *testing.T) { - type args struct { - cmd string - args []string - } - tests := []struct { - name string - args args - stdoutHas string - stderrHas string - wantErr bool - }{ - { - name: "test no command", - args: args{ - cmd: "no_this_command", - args: []string{}, - }, - stdoutHas: "", - stderrHas: "", - wantErr: true, - }, - { - name: "test ls", - args: args{ - cmd: "ls", - args: []string{ - "-l", - "/", - }, - }, - stdoutHas: "usr", - stderrHas: "", - wantErr: false, - }, - { - name: "test ls /no_dir", - args: args{ - cmd: "ls", - args: []string{ - "-l", - "/no_dir", - }, - }, - stdoutHas: "", - stderrHas: "No such file or directory", - wantErr: true, - }, - { - name: "test sleep 3", - args: args{ - cmd: "bash", - args: []string{ - "-c", - "for i in {1..3}; do echo $i; sleep 1; done", - }, - }, - stdoutHas: "1\n2\n3", - stderrHas: "", - wantErr: false, - }, - { - name: "test unknow command", - args: args{ - cmd: "no_this_command", - args: []string{}, - }, - stdoutHas: "", - stderrHas: "", - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - stdout, stderr, err := ExecCmdWithOutput(tt.args.cmd, tt.args.args...) - if (err != nil) != tt.wantErr { - t.Errorf("ExecCmdWithOutput() error = %v, wantErr %v", err, tt.wantErr) - } - - if !strings.Contains(stdout, tt.stdoutHas) { - t.Errorf("ExecCmdWithOutput() stdout = %v, stdoutHas %v", stdout, tt.stdoutHas) - } - if !strings.Contains(stderr, tt.stderrHas) { - t.Errorf("ExecCmdWithOutput() stderr = %v, stdoutHas %v", stderr, tt.stderrHas) - } - }) - } -} diff --git a/tools/pika_operator/test/e2e/utils/tmp_file.go b/tools/pika_operator/test/e2e/utils/tmp_file.go deleted file mode 100644 index d4071a6820..0000000000 --- a/tools/pika_operator/test/e2e/utils/tmp_file.go +++ /dev/null @@ -1,31 +0,0 @@ -package utils - -import ( - "fmt" - "os" - "path" - "time" -) - -// StoreTmpFile stores the content to a temporary file and returns the file path. -func StoreTmpFile(content string) (string, error) { - tmpFileName := fmt.Sprintf("pika-test-tmp-file-%d", time.Now().UnixNano()) - tmpDir := os.TempDir() - tmpFile := path.Join(tmpDir, tmpFileName) - f, err := os.Create(tmpFile) - if err != nil { - return "", err - } - defer func(f *os.File) { - err := f.Close() - if err != nil { - - } - }(f) - - _, err = f.WriteString(content) - if err != nil { - return "", err - } - return tmpFile, nil -} diff --git a/tools/pika_operator/test/e2e/utils/tmp_file_test.go b/tools/pika_operator/test/e2e/utils/tmp_file_test.go deleted file mode 100644 index f2720c4d3a..0000000000 --- a/tools/pika_operator/test/e2e/utils/tmp_file_test.go +++ /dev/null @@ -1,40 +0,0 @@ -package utils - -import ( - "strings" - "testing" -) - -func TestStoreTmpFile(t *testing.T) { - type args struct { - content string - } - tests := []struct { - name string - args args - wantHas string - wantErr bool - }{ - { - name: "test store tmp file", - args: args{ - content: "test", - }, - wantHas: "pika-test-tmp-file-", - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := StoreTmpFile(tt.args.content) - if (err != nil) != tt.wantErr { - t.Errorf("StoreTmpFile() error = %v, wantErr %v", err, tt.wantErr) - return - } - t.Log(got) - if !strings.Contains(got, tt.wantHas) { - t.Errorf("StoreTmpFile() got = %v, wantHas %v", got, tt.wantHas) - } - }) - } -}