1
0
Fork 0
mirror of https://github.com/arangodb/kube-arangodb.git synced 2024-12-14 11:57:37 +00:00

Merge branch 'master' into master

This commit is contained in:
Wyatt Walter 2022-08-29 08:38:48 -05:00 committed by GitHub
commit 91f4e40236
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
781 changed files with 28162 additions and 8752 deletions

3
.gitignore vendored
View file

@ -10,4 +10,5 @@ deps/
**/*.enterprise.go
**/enterprise/**
enterprise.mk
local/
local/
tools/codegen/boilerplate.go.txt

50
.golangci.yaml Normal file
View file

@ -0,0 +1,50 @@
---
run:
issues-exit-code: 3
timeout: 30m
skip-dirs:
- vendor
- .gobuild
- deps
- tools
linters:
disable-all: true
enable:
- deadcode
- gosimple
- govet
- ineffassign
- staticcheck
- structcheck
- typecheck
- unconvert
- unparam
- unused
- varcheck
- importas
- gci
linters-settings:
importas:
no-unaliased: true
alias:
- pkg: k8s.io/api/core/v1
alias: core
- pkg: k8s.io/apimachinery/pkg/apis/meta/v1
alias: meta
- pkg: k8s.io/client-go/kubernetes/typed/core/v1
alias: typedCore
- pkg: k8s.io/api/apps/v1
alias: apps
- pkg: k8s.io/api/batch/v1
alias: batch
- pkg: k8s.io/api/storage/v1
alias: storage
gci:
sections:
- standard
- default
- prefix(github.com/arangodb)
- prefix(github.com/arangodb/kube-arangodb)

View file

@ -1,6 +1,71 @@
# Change Log
## [master](https://github.com/arangodb/kube-arangodb/tree/master) (N/A)
- (Feature) Add ArangoDeployment ServerGroupStatus
- (Feature) (EE) Ordered Member IDs
- (Refactor) Deprecate ForeachServerGroup, ForeachServerInGroups and ForServerGroup functions and refactor code accordingly
- (Bugfix) Memory leaks due to incorrect time.After function usage
- (Feature) Add startup probe for coordinators
- (Feature) Use only connections for healthy members
- (Feature) Set condition to shrink agent volume size
- (Bugfix) Check serving servers
- (Documentation) Add docs on setting timezone for containers
- (Bugfix) Ensure that client cache is initialized before using it
- (Feature) (DBServer Maintenance) Agency adjustments
- (Logging) Internal client trace
- (QA) Member maintenance feature
- (Feature) Extract Pod Details
- (Feature) Add Timezone management
- (Bugfix) Always recreate DBServers if they have a leader on it.
- (Feature) Immutable spec
## [1.2.15](https://github.com/arangodb/kube-arangodb/tree/1.2.15) (2022-07-20)
- (Bugfix) Ensure pod names not too long
- (Refactor) Use cached member's clients
- (Feature) Move PVC resize action to high-priority plan
- (Feature) Remove forgotten ArangoDB jobs during restart
- (Feature) Add support for managed services
- (Feature) Recreation member in the high plan
- (Feature) Add 'crd install' subcommand
- (Bugfix) Fix `internal` metrics mode
- (Bugfix) Create agency dump if auth is disabled
- (Bugfix) Prevent deployment removal in case of invalid K8S API response
## [1.2.14](https://github.com/arangodb/kube-arangodb/tree/1.2.14) (2022-07-14)
- (Feature) Add ArangoSync TLS based rotation
- (Bugfix) Fix labels propagation
- (Feature) Add `ArangoDeployment` CRD auto-installer
- (Feature) Add `ArangoMember` CRD auto-installer
- (Feature) Add `ArangoBackup` CRD auto-installer
- (Feature) Add `ArangoBackupPolicy` CRD auto-installer
- (Feature) Add `ArangoJob` CRD auto-installer
- (Feature) Add RestartPolicyAlways to ArangoDeployment in order to restart ArangoDB on failure
- (Feature) Set a leader in active fail-over mode
- (Feature) Use policy/v1 instead policy/v1beta1
- (Feature) OPS CLI with Arango Task
- (Bugfix) Allow ArangoBackup Creation during Upload state
- (Hotfix) Fix `ArangoDeployment` SubResource in CRD auto-installer
- (Bugfix) Fix Operator Logger NPE
- (Bugfix) Fix License RAW value discovery
- (Refactor) Optimize go.mod entries
- (Feature) Add `ArangoLocalStorage` CRD auto-installer
- (Feature) Add `ArangoDeploymentReplication` CRD auto-installer
- (Bugfix) Allow missing `token` key in License secret
- (Feature) Unify agency access
- (Feature) Change DBServer Cleanup Logic
- (Feature) Set Logger format
- (Bugfix) Ensure Wait actions to be present after AddMember
- (Documentation) Refactor metrics (Part 1)
- (Bugfix) Extend Agency HealthCheck for replace
- (Bugfix) Allow to remove resources (CPU & Memory) on the managed pods
- (Bugfix) Add DistributeShardsLike support
- (Feature) Member restarts metric
- (Bugfix) Infinite loop fix in ArangoD AsyncClient
- (Bugfix) Add Panic Handler
- (Bugfix) Unify yaml packages
- (Feature) Add new GRPC and HTTP API
## [1.2.13](https://github.com/arangodb/kube-arangodb/tree/1.2.13) (2022-06-07)
- (Bugfix) Fix arangosync members state inspection
- (Feature) (ACS) Improve Reconciliation Loop
- (Bugfix) Allow missing Monitoring CRD

View file

@ -15,5 +15,6 @@ ADD ./LICENSE /licenses/LICENSE
ARG RELEASE_MODE=community
ARG TARGETARCH
ADD bin/${RELEASE_MODE}/linux/${TARGETARCH}/arangodb_operator /usr/bin/arangodb_operator
ADD bin/${RELEASE_MODE}/linux/${TARGETARCH}/arangodb_operator_ops /usr/bin/arangodb_operator_ops
ENTRYPOINT [ "/usr/bin/arangodb_operator" ]

View file

@ -25,6 +25,7 @@ RUN apk add --no-cache libc6-compat
ADD ./LICENSE /licenses/LICENSE
ADD bin/${RELEASE_MODE}/linux/${TARGETARCH}/arangodb_operator /usr/bin/arangodb_operator
ADD bin/${RELEASE_MODE}/linux/${TARGETARCH}/arangodb_operator_ops /usr/bin/arangodb_operator_ops
COPY --from=builder /go/bin/dlv /usr/bin/dlv

View file

@ -89,6 +89,14 @@ else
COMPILE_DEBUG_FLAGS :=
endif
PROTOC_VERSION := 21.1
ifeq ($(shell uname),Darwin)
PROTOC_ARCHIVE_SUFFIX := osx-universal_binary
else
PROTOC_ARCHIVE_SUFFIX := linux-x86_64
endif
PROTOC_URL := https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-${PROTOC_ARCHIVE_SUFFIX}.zip
ifeq ($(MANIFESTSUFFIX),-)
# Release setting
MANIFESTSUFFIX :=
@ -146,12 +154,18 @@ BIN := $(BINDIR)/$(BINNAME)
VBIN_LINUX_AMD64 := $(BINDIR)/$(RELEASE_MODE)/linux/amd64/$(BINNAME)
VBIN_LINUX_ARM64 := $(BINDIR)/$(RELEASE_MODE)/linux/arm64/$(BINNAME)
BIN_OPS_NAME := $(PROJECT)_ops
BIN_OPS := $(BINDIR)/$(BIN_OPS_NAME)
VBIN_OPS_LINUX_AMD64 := $(BINDIR)/$(RELEASE_MODE)/linux/amd64/$(BIN_OPS_NAME)
VBIN_OPS_LINUX_ARM64 := $(BINDIR)/$(RELEASE_MODE)/linux/arm64/$(BIN_OPS_NAME)
ifdef VERBOSE
TESTVERBOSEOPTIONS := -v
endif
EXCLUDE_DIRS := vendor .gobuild deps tools
SOURCES_QUERY := find ./ -type f -name '*.go' $(foreach EXCLUDE_DIR,$(EXCLUDE_DIRS), ! -path "*/$(EXCLUDE_DIR)/*")
EXCLUDE_DIRS := vendor .gobuild deps tools pkg/generated/clientset pkg/generated/informers pkg/generated/listers
EXCLUDE_FILES := *generated.deepcopy.go
SOURCES_QUERY := find ./ -type f -name '*.go' ! -name '*.pb.go' $(foreach EXCLUDE_DIR,$(EXCLUDE_DIRS), ! -path "*/$(EXCLUDE_DIR)/*") $(foreach EXCLUDE_FILE,$(EXCLUDE_FILES), ! -path "*/$(EXCLUDE_FILE)")
SOURCES := $(shell $(SOURCES_QUERY))
DASHBOARDSOURCES := $(shell find $(DASHBOARDDIR)/src -name '*.js') $(DASHBOARDDIR)/package.json
LINT_EXCLUDES:=
@ -161,6 +175,7 @@ else
LINT_EXCLUDES+=.*\.enterprise\.go$$
endif
PROTOSOURCES := $(shell find ./ -type f -name '*.proto' $(foreach EXCLUDE_DIR,$(EXCLUDE_DIRS), ! -path "*/$(EXCLUDE_DIR)/*") | sort)
.DEFAULT_GOAL := all
.PHONY: all
@ -177,24 +192,21 @@ allall: all
# Tip: Run `eval $(minikube docker-env)` before calling make if you're developing on minikube.
#
GOLANGCI_ENABLED=deadcode gosimple govet ineffassign staticcheck structcheck typecheck unconvert unparam unused varcheck
#GOLANGCI_ENABLED=gocyclo goconst golint maligned errcheck interfacer megacheck
#GOLANGCI_ENABLED+=dupl - disable dupl check
.PHONY: license-verify
license-verify:
@echo ">> Verify license of files"
@$(GOPATH)/bin/addlicense -f "./tools/codegen/boilerplate.go.txt" -check $(SOURCES)
@$(GOPATH)/bin/addlicense -f "./tools/codegen/license-header.txt" -check $(SOURCES) $(PROTOSOURCES)
.PHONY: fmt
fmt:
@echo ">> Ensuring style of files"
@$(GOPATH)/bin/goimports -w $(SOURCES)
@$(GOPATH)/bin/gci write -s "standard" -s "default" -s "prefix(github.com/arangodb)" -s "prefix(github.com/arangodb/kube-arangodb)" $(SOURCES)
.PHONY: license
license:
@echo ">> Ensuring license of files"
@$(GOPATH)/bin/addlicense -f "./tools/codegen/boilerplate.go.txt" $(SOURCES)
@$(GOPATH)/bin/addlicense -f "./tools/codegen/license-header.txt" $(SOURCES) $(PROTOSOURCES)
.PHONY: fmt-verify
fmt-verify: license-verify
@ -203,11 +215,11 @@ fmt-verify: license-verify
.PHONY: linter
linter:
$(GOPATH)/bin/golangci-lint run --build-tags "$(RELEASE_MODE)" --no-config --issues-exit-code=1 --deadline=30m --exclude-use-default=false \
--disable-all $(foreach EXCLUDE_DIR,$(EXCLUDE_DIRS),--skip-dirs $(EXCLUDE_DIR)) \
$(foreach MODE,$(GOLANGCI_ENABLED),--enable $(MODE)) \
$(foreach LINT_EXCLUDE,$(LINT_EXCLUDES),--exclude '$(LINT_EXCLUDE)') \
./...
$(GOPATH)/bin/golangci-lint run --build-tags "$(RELEASE_MODE)" $(foreach LINT_EXCLUDE,$(LINT_EXCLUDES),--exclude '$(LINT_EXCLUDE)') ./...
.PHONY: linter-fix
linter-fix:
$(GOPATH)/bin/golangci-lint run --fix --build-tags "$(RELEASE_MODE)" $(foreach LINT_EXCLUDE,$(LINT_EXCLUDES),--exclude '$(LINT_EXCLUDE)') ./...
.PHONY: build
build: docker manifests
@ -218,7 +230,7 @@ endif
.PHONY: clean
clean:
rm -Rf $(BIN) $(BINDIR) $(DASHBOARDDIR)/build $(DASHBOARDDIR)/node_modules $(VBIN_LINUX_AMD64) $(VBIN_LINUX_ARM64)
rm -Rf $(BIN) $(BINDIR) $(DASHBOARDDIR)/build $(DASHBOARDDIR)/node_modules $(VBIN_LINUX_AMD64) $(VBIN_LINUX_ARM64) $(VBIN_OPS_LINUX_AMD64) $(VBIN_OPS_LINUX_ARM64)
.PHONY: check-vars
check-vars:
@ -240,6 +252,7 @@ update-generated:
@rm -fr $(ORGDIR)
@mkdir -p $(ORGDIR)
@ln -s -f $(SCRIPTDIR) $(ORGDIR)/kube-arangodb
@sed -e 's/^/\/\/ /' -e 's/ *$$//' $(ROOTDIR)/tools/codegen/license-header.txt > $(ROOTDIR)/tools/codegen/boilerplate.go.txt
GOPATH=$(GOBUILDDIR) $(VENDORDIR)/k8s.io/code-generator/generate-groups.sh \
"all" \
"github.com/arangodb/kube-arangodb/pkg/generated" \
@ -276,14 +289,17 @@ bin-all: $(BIN) $(VBIN_LINUX_AMD64) $(VBIN_LINUX_ARM64)
$(VBIN_LINUX_AMD64): $(SOURCES) dashboard/assets.go VERSION
@mkdir -p $(BINDIR)/$(RELEASE_MODE)/linux/amd64
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build ${GOBUILDARGS} --tags "$(RELEASE_MODE)" $(COMPILE_DEBUG_FLAGS) -installsuffix netgo -ldflags "-X $(REPOPATH)/pkg/version.version=$(VERSION) -X $(REPOPATH)/pkg/version.buildDate=$(BUILDTIME) -X $(REPOPATH)/pkg/version.build=$(COMMIT)" -o $(VBIN_LINUX_AMD64) ./
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build ${GOBUILDARGS} --tags "$(RELEASE_MODE)" $(COMPILE_DEBUG_FLAGS) -installsuffix netgo -ldflags "-X $(REPOPATH)/pkg/version.version=$(VERSION) -X $(REPOPATH)/pkg/version.buildDate=$(BUILDTIME) -X $(REPOPATH)/pkg/version.build=$(COMMIT)" -o $(VBIN_LINUX_AMD64) ./cmd/main
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build ${GOBUILDARGS} --tags "$(RELEASE_MODE)" $(COMPILE_DEBUG_FLAGS) -installsuffix netgo -ldflags "-X $(REPOPATH)/pkg/version.version=$(VERSION) -X $(REPOPATH)/pkg/version.buildDate=$(BUILDTIME) -X $(REPOPATH)/pkg/version.build=$(COMMIT)" -o $(VBIN_OPS_LINUX_AMD64) ./cmd/main-ops
$(VBIN_LINUX_ARM64): $(SOURCES) dashboard/assets.go VERSION
@mkdir -p $(BINDIR)/$(RELEASE_MODE)/linux/arm64
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build ${GOBUILDARGS} --tags "$(RELEASE_MODE)" $(COMPILE_DEBUG_FLAGS) -installsuffix netgo -ldflags "-X $(REPOPATH)/pkg/version.version=$(VERSION) -X $(REPOPATH)/pkg/version.buildDate=$(BUILDTIME) -X $(REPOPATH)/pkg/version.build=$(COMMIT)" -o $(VBIN_LINUX_ARM64) ./
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build ${GOBUILDARGS} --tags "$(RELEASE_MODE)" $(COMPILE_DEBUG_FLAGS) -installsuffix netgo -ldflags "-X $(REPOPATH)/pkg/version.version=$(VERSION) -X $(REPOPATH)/pkg/version.buildDate=$(BUILDTIME) -X $(REPOPATH)/pkg/version.build=$(COMMIT)" -o $(VBIN_LINUX_ARM64) ./cmd/main
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build ${GOBUILDARGS} --tags "$(RELEASE_MODE)" $(COMPILE_DEBUG_FLAGS) -installsuffix netgo -ldflags "-X $(REPOPATH)/pkg/version.version=$(VERSION) -X $(REPOPATH)/pkg/version.buildDate=$(BUILDTIME) -X $(REPOPATH)/pkg/version.build=$(COMMIT)" -o $(VBIN_OPS_LINUX_ARM64) ./cmd/main-ops
$(BIN): $(VBIN_LINUX_AMD64)
@cp "$(VBIN_LINUX_AMD64)" "$(BIN)"
@cp "$(VBIN_OPS_LINUX_AMD64)" "$(BIN_OPS)"
.PHONY: docker
docker: check-vars $(VBIN_LINUX_AMD64) $(VBIN_LINUX_ARM64)
@ -449,13 +465,22 @@ init: tools update-generated $(BIN) vendor
.PHONY: tools
tools: update-vendor
@echo ">> Fetching golangci-lint linter"
@GOBIN=$(GOPATH)/bin go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.42.1
@GOBIN=$(GOPATH)/bin go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.46.2
@echo ">> Fetching goimports"
@GOBIN=$(GOPATH)/bin go install golang.org/x/tools/cmd/goimports@0bb7e5c47b1a31f85d4f173edc878a8e049764a5
@echo ">> Fetching license check"
@GOBIN=$(GOPATH)/bin go install github.com/google/addlicense@6d92264d717064f28b32464f0f9693a5b4ef0239
@echo ">> Fetching GO Assets Builder"
@GOBIN=$(GOPATH)/bin go install github.com/jessevdk/go-assets-builder@b8483521738fd2198ecfc378067a4e8a6079f8e5
@echo ">> Fetching gci"
@GOBIN=$(GOPATH)/bin go install github.com/daixiang0/gci@v0.3.0
@echo ">> Downloading protobuf compiler..."
@curl -L ${PROTOC_URL} -o $(GOPATH)/protoc.zip
@echo ">> Unzipping protobuf compiler..."
@unzip -o $(GOPATH)/protoc.zip -d $(GOPATH)/
@echo ">> Fetching protoc go plugins..."
@GOBIN=$(GOPATH)/bin go install github.com/golang/protobuf/protoc-gen-go@v1.5.2
@GOBIN=$(GOPATH)/bin go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2
.PHONY: vendor
vendor:
@ -523,3 +548,14 @@ check-community:
_check:
@$(MAKE) fmt license-verify linter run-unit-tests bin
generate: generate-internal generate-proto fmt
generate-internal:
ROOT=$(ROOT) go test --count=1 "$(REPOPATH)/internal/..."
generate-proto:
PATH=$(PATH):$(GOBUILDDIR)/bin $(GOBUILDDIR)/bin/protoc -I.:$(GOBUILDDIR)/include/ \
--go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
$(PROTOSOURCES)

View file

@ -67,36 +67,23 @@ covers individual newer features separately.
Feature-wise production readiness table:
| Feature | Operator Version | ArangoDB Version | ArangoDB Edition | State | Enabled | Flag | Remarks |
|-----------------------------------------|------------------|------------------|-----------------------|--------------|---------|--------------------------------------------|--------------------------------------------------------------------------|
| Pod Disruption Budgets | 0.3.10 | Any | Community, Enterprise | Alpha | True | N/A | N/A |
| Pod Disruption Budgets | 0.3.11 | Any | Community, Enterprise | Production | True | N/A | N/A |
| Volume Resizing | 0.3.10 | Any | Community, Enterprise | Alpha | True | N/A | N/A |
| Volume Resizing | 0.3.11 | Any | Community, Enterprise | Production | True | N/A | N/A |
| Disabling of liveness probes | 0.3.10 | Any | Community, Enterprise | Alpha | True | N/A | N/A |
| Disabling of liveness probes | 0.3.11 | Any | Community, Enterprise | Production | True | N/A | N/A |
| Volume Claim Templates | 0.3.11 | Any | Community, Enterprise | Alpha | True | N/A | N/A |
| Volume Claim Templates | 1.0.0 | Any | Community, Enterprise | Production | True | N/A | N/A |
| Prometheus Metrics Exporter | 0.3.11 | Any | Community, Enterprise | Alpha | True | N/A | Prometheus required |
| Prometheus Metrics Exporter | 1.0.0 | Any | Community, Enterprise | Production | True | N/A | Prometheus required |
| Sidecar Containers | 0.3.11 | Any | Community, Enterprise | Alpha | True | N/A | N/A |
| Sidecar Containers | 1.0.0 | Any | Community, Enterprise | Production | True | N/A | N/A |
| Operator Single Mode | 1.0.4 | Any | Community, Enterprise | Production | False | --mode.single | Only 1 instance of Operator allowed in namespace when feature is enabled |
| TLS SNI Support | 1.0.3 | >= 3.7.0 | Enterprise | Production | True | --deployment.feature.tls-sni | N/A |
| TLS Runtime Rotation Support | 1.0.4 | > 3.7.0 | Enterprise | Alpha | False | --deployment.feature.tls-rotation | N/A |
| TLS Runtime Rotation Support | 1.1.0 | > 3.7.0 | Enterprise | Production | True | --deployment.feature.tls-rotation | N/A |
| JWT Rotation Support | 1.0.4 | > 3.7.0 | Enterprise | Alpha | False | --deployment.feature.jwt-rotation | N/A |
| JWT Rotation Support | 1.1.0 | > 3.7.0 | Enterprise | Production | True | --deployment.feature.jwt-rotation | N/A |
| Encryption Key Rotation Support | 1.0.4 | > 3.7.0 | Enterprise | Alpha | False | --deployment.feature.encryption-rotation | N/A |
| Encryption Key Rotation Support | 1.1.0 | > 3.7.0 | Enterprise | Production | True | --deployment.feature.encryption-rotation | N/A |
| Encryption Key Rotation Support | 1.2.0 | > 3.7.0 | Enterprise | NotSupported | False | --deployment.feature.encryption-rotation | N/A |
| Version Check | 1.1.4 | >= 3.7.0 | Community, Enterprise | Alpha | False | --deployment.feature.upgrade-version-check | N/A |
| Operator Maintenance Management Support | 1.0.7 | >= 3.7.0 | Community, Enterprise | Alpha | False | --deployment.feature.maintenance | N/A |
| Operator Maintenance Management Support | 1.2.0 | >= 3.7.0 | Community, Enterprise | Production | True | --deployment.feature.maintenance | N/A |
| Operator Internal Metrics Exporter | 1.1.9 | >= 3.7.0 | Community, Enterprise | Alpha | False | --deployment.feature.metrics-exporter | N/A |
| Operator Internal Metrics Exporter | 1.2.0 | >= 3.7.0 | Community, Enterprise | Production | True | --deployment.feature.metrics-exporter | N/A |
| Operator Internal Metrics Exporter | 1.2.3 | >= 3.7.0 | Community, Enterprise | Production | True | --deployment.feature.metrics-exporter | It is always enabled |
| Operator Ephemeral Volumes | 1.2.2 | >= 3.7.0 | Community, Enterprise | Alpha | False | --deployment.feature.ephemeral-volumes | N/A |
| Feature | Operator Version | ArangoDB Version | ArangoDB Edition | Introduced | State | Enabled | Flag | Remarks |
|-----------------------------------------|------------------|------------------|-----------------------|------------|--------------|---------|--------------------------------------------|--------------------------------------------------------------------------|
| Pod Disruption Budgets | 0.3.11 | Any | Community, Enterprise | 0.3.10 | Production | True | N/A | N/A |
| Volume Resizing | 0.3.11 | Any | Community, Enterprise | 0.3.10 | Production | True | N/A | N/A |
| Disabling of liveness probes | 0.3.11 | Any | Community, Enterprise | 0.3.10 | Production | True | N/A | N/A |
| Volume Claim Templates | 1.0.0 | Any | Community, Enterprise | 0.3.10 | Production | True | N/A | N/A |
| Prometheus Metrics Exporter | 1.0.0 | Any | Community, Enterprise | 0.3.10 | Production | True | N/A | Prometheus required |
| Sidecar Containers | 1.0.0 | Any | Community, Enterprise | 0.3.10 | Production | True | N/A | N/A |
| Operator Single Mode | 1.0.4 | Any | Community, Enterprise | 1.0.4 | Production | False | --mode.single | Only 1 instance of Operator allowed in namespace when feature is enabled |
| TLS SNI Support | 1.0.3 | >= 3.7.0 | Enterprise | 1.0.3 | Production | True | --deployment.feature.tls-sni | N/A |
| TLS Runtime Rotation Support | 1.1.0 | > 3.7.0 | Enterprise | 1.0.4 | Production | True | --deployment.feature.tls-rotation | N/A |
| JWT Rotation Support | 1.1.0 | > 3.7.0 | Enterprise | 1.0.3 | Production | True | --deployment.feature.jwt-rotation | N/A |
| Encryption Key Rotation Support | 1.2.0 | > 3.7.0 | Enterprise | 1.0.3 | NotSupported | False | --deployment.feature.encryption-rotation | N/A |
| Version Check | 1.1.4 | >= 3.6.0 | Community, Enterprise | 1.1.4 | Alpha | False | --deployment.feature.upgrade-version-check | N/A |
| Operator Maintenance Management Support | 1.2.0 | >= 3.6.0 | Community, Enterprise | 1.0.7 | Production | True | --deployment.feature.maintenance | N/A |
| Operator Internal Metrics Exporter | 1.2.0 | >= 3.6.0 | Community, Enterprise | 1.2.0 | Production | True | --deployment.feature.metrics-exporter | N/A |
| Operator Ephemeral Volumes | 1.2.2 | >= 3.7.0 | Community, Enterprise | 1.2.2 | Alpha | False | --deployment.feature.ephemeral-volumes | N/A |
## Release notes for 0.3.16
@ -114,12 +101,12 @@ for details.
## Installation of latest release using Kubectl
```bash
kubectl apply -f https://raw.githubusercontent.com/arangodb/kube-arangodb/1.2.12/manifests/arango-crd.yaml
kubectl apply -f https://raw.githubusercontent.com/arangodb/kube-arangodb/1.2.12/manifests/arango-deployment.yaml
kubectl apply -f https://raw.githubusercontent.com/arangodb/kube-arangodb/1.2.15/manifests/arango-crd.yaml
kubectl apply -f https://raw.githubusercontent.com/arangodb/kube-arangodb/1.2.15/manifests/arango-deployment.yaml
# To use `ArangoLocalStorage`, also run
kubectl apply -f https://raw.githubusercontent.com/arangodb/kube-arangodb/1.2.12/manifests/arango-storage.yaml
kubectl apply -f https://raw.githubusercontent.com/arangodb/kube-arangodb/1.2.15/manifests/arango-storage.yaml
# To use `ArangoDeploymentReplication`, also run
kubectl apply -f https://raw.githubusercontent.com/arangodb/kube-arangodb/1.2.12/manifests/arango-deployment-replication.yaml
kubectl apply -f https://raw.githubusercontent.com/arangodb/kube-arangodb/1.2.15/manifests/arango-deployment-replication.yaml
```
This procedure can also be used for upgrades and will not harm any
@ -151,12 +138,12 @@ upgrades.
```bash
# The following will install the custom resources required by the operators.
helm install https://github.com/arangodb/kube-arangodb/releases/download/1.2.12/kube-arangodb-crd-1.2.12.tgz
helm install https://github.com/arangodb/kube-arangodb/releases/download/1.2.15/kube-arangodb-crd-1.2.15.tgz
# The following will install the operator for `ArangoDeployment` &
# `ArangoDeploymentReplication` resources.
helm install https://github.com/arangodb/kube-arangodb/releases/download/1.2.12/kube-arangodb-1.2.12.tgz
helm install https://github.com/arangodb/kube-arangodb/releases/download/1.2.15/kube-arangodb-1.2.15.tgz
# To use `ArangoLocalStorage`, set field `operator.features.storage` to true
helm install https://github.com/arangodb/kube-arangodb/releases/download/1.2.12/kube-arangodb-1.2.12.tgz --set "operator.features.storage=true"
helm install https://github.com/arangodb/kube-arangodb/releases/download/1.2.15/kube-arangodb-1.2.15.tgz --set "operator.features.storage=true"
```
## Upgrading the operator using Helm
@ -191,9 +178,9 @@ with `helm install` as normal:
```bash
# The following will install the operator for `ArangoDeployment` &
# `ArangoDeploymentReplication` resources.
helm install https://github.com/arangodb/kube-arangodb/releases/download/1.2.12/kube-arangodb-1.2.12.tgz
helm install https://github.com/arangodb/kube-arangodb/releases/download/1.2.15/kube-arangodb-1.2.15.tgz
# To use `ArangoLocalStorage`, set field `operator.features.storage` to true
helm install https://github.com/arangodb/kube-arangodb/releases/download/1.2.12/kube-arangodb-1.2.12.tgz --set "operator.features.storage=true"
helm install https://github.com/arangodb/kube-arangodb/releases/download/1.2.15/kube-arangodb-1.2.15.tgz --set "operator.features.storage=true"
```
## Building

View file

@ -1 +1 @@
1.2.13-preview-1+git
1.2.15+git

View file

@ -1,7 +1,7 @@
---
name: kube-arangodb-crd
version: 1.2.12
version: 1.2.15
description: "ArangoDB Kubernetes Custom Resource Definitions"
tillerVersion: ">2.7"

View file

@ -1,6 +1,6 @@
---
name: kube-arangodb-test
version: 1.2.12
version: 1.2.15
description: "ArangoDB Kubernetes Test Access"

View file

@ -1,7 +1,7 @@
---
name: kube-arangodb
version: 1.2.12
version: 1.2.15
description: "ArangoDB Kubernetes Operator"
tillerVersion: ">2.7"

View file

@ -17,8 +17,15 @@ rules:
resources: ["customresourcedefinitions"]
verbs: ["get", "list", "watch", "update", "delete"]
resourceNames:
- "arangodeployments.database.arangodb.com"
- "arangoclustersynchronizations.database.arangodb.com"
- "arangomembers.database.arangodb.com"
- "arangotasks.database.arangodb.com"
- "arangodeploymentreplications.replication.database.arangodb.com"
- "arangobackups.backup.arangodb.com"
- "arangobackuppolicies.backup.arangodb.com"
- "arangojobs.apps.arangodb.com"
- "arangolocalstorages.storage.arangodb.com"
{{- end }}
{{- end }}

View file

@ -19,6 +19,14 @@ spec:
port: 8528
protocol: TCP
targetPort: 8528
- name: http-api
port: 8628
protocol: TCP
targetPort: 8628
- name: grpc-api
port: 8728
protocol: TCP
targetPort: 8728
selector:
app.kubernetes.io/name: {{ template "kube-arangodb.name" . }}
app.kubernetes.io/managed-by: {{ .Release.Service }}

View file

@ -1,7 +1,7 @@
---
operator:
image: arangodb/kube-arangodb:1.2.12
image: arangodb/kube-arangodb:1.2.15
imagePullPolicy: IfNotPresent
imagePullSecrets: []

View file

@ -33,19 +33,19 @@ import (
"strconv"
"syscall"
"github.com/arangodb/kube-arangodb/pkg/util/globals"
"github.com/spf13/cobra"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
core "k8s.io/api/core/v1"
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/arangodb-helper/go-certificates"
"github.com/arangodb/go-driver/jwt"
"github.com/arangodb/go-driver/v2/connection"
api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
"github.com/arangodb/kube-arangodb/pkg/apis/shared"
"github.com/arangodb/kube-arangodb/pkg/util/constants"
"github.com/arangodb/kube-arangodb/pkg/util/errors"
"github.com/arangodb/kube-arangodb/pkg/util/globals"
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
secretv1 "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/secret/v1"
"github.com/arangodb/kube-arangodb/pkg/util/kclient"
@ -107,31 +107,31 @@ func cmdGetAgencyState(cmd *cobra.Command, _ []string) {
ctx := getInterruptionContext()
d, certCA, auth, err := getDeploymentAndCredentials(ctx, deploymentName)
if err != nil {
cliLog.Fatal().Err(err).Msg("failed to create basic data for the connection")
logger.Err(err).Fatal("failed to create basic data for the connection")
}
if d.Spec.GetMode() != api.DeploymentModeCluster {
cliLog.Fatal().Msgf("agency state does not work for the \"%s\" deployment \"%s\"", d.Spec.GetMode(),
if d.GetAcceptedSpec().GetMode() != api.DeploymentModeCluster {
logger.Fatal("agency state does not work for the \"%s\" deployment \"%s\"", d.GetAcceptedSpec().GetMode(),
d.GetName())
}
dnsName := k8sutil.CreatePodDNSName(d.GetObjectMeta(), api.ServerGroupAgents.AsRole(), d.Status.Members.Agents[0].ID)
endpoint := getArangoEndpoint(d.Spec.IsSecure(), dnsName)
endpoint := getArangoEndpoint(d.GetAcceptedSpec().IsSecure(), dnsName)
conn := createClient([]string{endpoint}, certCA, auth, connection.ApplicationJSON)
leaderID, err := getAgencyLeader(ctx, conn)
if err != nil {
cliLog.Fatal().Err(err).Msg("failed to get leader ID")
logger.Err(err).Fatal("failed to get leader ID")
}
dnsLeaderName := k8sutil.CreatePodDNSName(d.GetObjectMeta(), api.ServerGroupAgents.AsRole(), leaderID)
leaderEndpoint := getArangoEndpoint(d.Spec.IsSecure(), dnsLeaderName)
leaderEndpoint := getArangoEndpoint(d.GetAcceptedSpec().IsSecure(), dnsLeaderName)
conn = createClient([]string{leaderEndpoint}, certCA, auth, connection.PlainText)
body, err := getAgencyState(ctx, conn)
if body != nil {
defer body.Close()
}
if err != nil {
cliLog.Fatal().Err(err).Msg("can not get state of the agency")
logger.Err(err).Fatal("can not get state of the agency")
}
// Print and receive parallelly.
@ -143,22 +143,22 @@ func cmdGetAgencyDump(cmd *cobra.Command, _ []string) {
ctx := getInterruptionContext()
d, certCA, auth, err := getDeploymentAndCredentials(ctx, deploymentName)
if err != nil {
cliLog.Fatal().Err(err).Msg("failed to create basic data for the connection")
logger.Err(err).Fatal("failed to create basic data for the connection")
}
if d.Spec.GetMode() != api.DeploymentModeCluster {
cliLog.Fatal().Msgf("agency dump does not work for the \"%s\" deployment \"%s\"", d.Spec.GetMode(),
if d.GetAcceptedSpec().GetMode() != api.DeploymentModeCluster {
logger.Fatal("agency dump does not work for the \"%s\" deployment \"%s\"", d.GetAcceptedSpec().GetMode(),
d.GetName())
}
endpoint := getArangoEndpoint(d.Spec.IsSecure(), k8sutil.CreateDatabaseClientServiceDNSName(d.GetObjectMeta()))
endpoint := getArangoEndpoint(d.GetAcceptedSpec().IsSecure(), k8sutil.CreateDatabaseClientServiceDNSName(d.GetObjectMeta()))
conn := createClient([]string{endpoint}, certCA, auth, connection.ApplicationJSON)
body, err := getAgencyDump(ctx, conn)
if body != nil {
defer body.Close()
}
if err != nil {
cliLog.Fatal().Err(err).Msg("can not get dump")
logger.Err(err).Fatal("can not get dump")
}
// Print and receive parallelly.
@ -205,16 +205,18 @@ func getDeploymentAndCredentials(ctx context.Context,
}
var secrets = kubeCli.CoreV1().Secrets(d.GetNamespace())
certCA, err = getCACertificate(ctx, secrets, d.Spec.TLS.GetCASecretName())
certCA, err = getCACertificate(ctx, secrets, d.GetAcceptedSpec().TLS.GetCASecretName())
if err != nil {
err = errors.WithMessage(err, "failed to get CA certificate")
return
}
auth, err = getJWTTokenFromSecrets(ctx, secrets, d.Spec.Authentication.GetJWTSecretName())
if err != nil {
err = errors.WithMessage(err, "failed to get JWT token")
return
if d.GetAcceptedSpec().IsAuthenticated() {
auth, err = getJWTTokenFromSecrets(ctx, secrets, d.GetAcceptedSpec().Authentication.GetJWTSecretName())
if err != nil {
err = errors.WithMessage(err, "failed to get JWT token")
return
}
}
return
@ -314,16 +316,16 @@ func getCACertificate(ctx context.Context, secrets secretv1.ReadInterface, name
ctxChild, cancel := globals.GetGlobalTimeouts().Kubernetes().WithTimeout(ctx)
defer cancel()
s, err := secrets.Get(ctxChild, name, metav1.GetOptions{})
s, err := secrets.Get(ctxChild, name, meta.GetOptions{})
if err != nil {
return nil, errors.WithMessage(err, fmt.Sprintf("failed to get secret \"%s\"", name))
}
if data, ok := s.Data[v1.ServiceAccountRootCAKey]; ok {
if data, ok := s.Data[core.ServiceAccountRootCAKey]; ok {
return certificates.LoadCertPool(string(data))
}
return nil, errors.New(fmt.Sprintf("the \"%s\" does not exist in the secret \"%s\"", v1.ServiceAccountRootCAKey,
return nil, errors.New(fmt.Sprintf("the \"%s\" does not exist in the secret \"%s\"", core.ServiceAccountRootCAKey,
name))
}
@ -341,7 +343,7 @@ func getDeployment(ctx context.Context, namespace, deplName string) (api.ArangoD
ctxChild, cancel := globals.GetGlobalTimeouts().Kubernetes().WithTimeout(ctx)
defer cancel()
deployments, err := extCli.DatabaseV1().ArangoDeployments(namespace).List(ctxChild, metav1.ListOptions{})
deployments, err := extCli.DatabaseV1().ArangoDeployments(namespace).List(ctxChild, meta.ListOptions{})
if err != nil {
if api.IsNotFound(err) {
return api.ArangoDeployment{}, errors.WithMessage(err, "there are no deployments")

View file

@ -31,57 +31,50 @@ import (
"strings"
"time"
"github.com/arangodb/kube-arangodb/pkg/util/globals"
"github.com/gin-gonic/gin"
operatorHTTP "github.com/arangodb/kube-arangodb/pkg/util/http"
"github.com/arangodb/kube-arangodb/pkg/version"
"github.com/arangodb/kube-arangodb/pkg/operator/scope"
"github.com/arangodb/kube-arangodb/pkg/deployment/features"
"github.com/rs/zerolog/log"
deploymentApi "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
"github.com/arangodb/kube-arangodb/pkg/util"
utilsError "github.com/arangodb/kube-arangodb/pkg/util/errors"
"github.com/pkg/errors"
"github.com/rs/zerolog"
"github.com/spf13/cobra"
flag "github.com/spf13/pflag"
appsv1 "k8s.io/api/apps/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
apps "k8s.io/api/apps/v1"
core "k8s.io/api/core/v1"
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/kubernetes"
v1core "k8s.io/client-go/kubernetes/typed/core/v1"
typedCore "k8s.io/client-go/kubernetes/typed/core/v1"
"k8s.io/client-go/tools/record"
v1 "k8s.io/api/core/v1"
"k8s.io/klog"
"github.com/arangodb/kube-arangodb/pkg/api"
deploymentApi "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
"github.com/arangodb/kube-arangodb/pkg/crd"
"github.com/arangodb/kube-arangodb/pkg/deployment/features"
"github.com/arangodb/kube-arangodb/pkg/generated/clientset/versioned/scheme"
"github.com/arangodb/kube-arangodb/pkg/logging"
"github.com/arangodb/kube-arangodb/pkg/operator"
"github.com/arangodb/kube-arangodb/pkg/operator/scope"
"github.com/arangodb/kube-arangodb/pkg/server"
"github.com/arangodb/kube-arangodb/pkg/util"
"github.com/arangodb/kube-arangodb/pkg/util/constants"
utilsError "github.com/arangodb/kube-arangodb/pkg/util/errors"
"github.com/arangodb/kube-arangodb/pkg/util/globals"
operatorHTTP "github.com/arangodb/kube-arangodb/pkg/util/http"
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
"github.com/arangodb/kube-arangodb/pkg/util/kclient"
"github.com/arangodb/kube-arangodb/pkg/util/probe"
"github.com/arangodb/kube-arangodb/pkg/util/retry"
"github.com/arangodb/kube-arangodb/pkg/version"
)
const (
defaultServerHost = "0.0.0.0"
defaultServerPort = 8528
defaultAPIHTTPPort = 8628
defaultAPIGRPCPort = 8728
defaultLogLevel = "debug"
defaultAdminSecretName = "arangodb-operator-dashboard"
defaultAPIJWTSecretName = "arangodb-operator-api-jwt"
defaultAPIJWTKeySecretName = "arangodb-operator-api-jwt-key"
defaultAlpineImage = "alpine:3.7"
defaultMetricsExporterImage = "arangodb/arangodb-exporter:0.1.6"
defaultArangoImage = "arangodb/arangodb:latest"
@ -94,14 +87,15 @@ const (
)
var (
logger = logging.Global().RegisterAndGetLogger("root", logging.Info)
eventRecorder = logging.Global().RegisterAndGetLogger("root-event-recorder", logging.Info)
cmdMain = cobra.Command{
Use: "arangodb_operator",
Run: executeMain,
}
logLevels []string
cliLog = logging.NewRootLogger()
logService logging.Service
serverOptions struct {
host string
port int
@ -109,6 +103,14 @@ var (
adminSecretName string // Name of basic authentication secret containing the admin username+password of the dashboard
allowAnonymous bool // If set, anonymous access to dashboard is allowed
}
apiOptions struct {
enabled bool
httpPort int
grpcPort int
jwtSecretName string
jwtKeySecretName string
tlsSecretName string
}
operatorOptions struct {
enableDeployment bool // Run deployment operator
enableDeploymentReplication bool // Run deployment-replication operator
@ -168,13 +170,20 @@ func init() {
f.StringVar(&serverOptions.tlsSecretName, "server.tls-secret-name", "", "Name of secret containing tls.crt & tls.key for HTTPS server (if empty, self-signed certificate is used)")
f.StringVar(&serverOptions.adminSecretName, "server.admin-secret-name", defaultAdminSecretName, "Name of secret containing username + password for login to the dashboard")
f.BoolVar(&serverOptions.allowAnonymous, "server.allow-anonymous-access", false, "Allow anonymous access to the dashboard")
f.StringArrayVar(&logLevels, "log.level", []string{defaultLogLevel}, fmt.Sprintf("Set log levels in format <level> or <logger>=<level>. Possible loggers: %s", strings.Join(logging.LoggerNames(), ", ")))
f.StringArrayVar(&logLevels, "log.level", []string{defaultLogLevel}, fmt.Sprintf("Set log levels in format <level> or <logger>=<level>. Possible loggers: %s", strings.Join(logging.Global().Names(), ", ")))
f.BoolVar(&apiOptions.enabled, "api.enabled", true, "Enable operator HTTP and gRPC API")
f.IntVar(&apiOptions.httpPort, "api.http-port", defaultAPIHTTPPort, "HTTP API port to listen on")
f.IntVar(&apiOptions.grpcPort, "api.grpc-port", defaultAPIGRPCPort, "gRPC API port to listen on")
f.StringVar(&apiOptions.tlsSecretName, "api.tls-secret-name", "", "Name of secret containing tls.crt & tls.key for HTTPS API (if empty, self-signed certificate is used)")
f.StringVar(&apiOptions.jwtSecretName, "api.jwt-secret-name", defaultAPIJWTSecretName, "Name of secret which will contain JWT to authenticate API requests.")
f.StringVar(&apiOptions.jwtKeySecretName, "api.jwt-key-secret-name", defaultAPIJWTKeySecretName, "Name of secret containing key used to sign JWT. If there is no such secret present, value will be saved here")
f.BoolVar(&operatorOptions.enableDeployment, "operator.deployment", false, "Enable to run the ArangoDeployment operator")
f.BoolVar(&operatorOptions.enableDeploymentReplication, "operator.deployment-replication", false, "Enable to run the ArangoDeploymentReplication operator")
f.BoolVar(&operatorOptions.enableStorage, "operator.storage", false, "Enable to run the ArangoLocalStorage operator")
f.BoolVar(&operatorOptions.enableBackup, "operator.backup", false, "Enable to run the ArangoBackup operator")
f.BoolVar(&operatorOptions.enableApps, "operator.apps", false, "Enable to run the ArangoApps operator")
f.BoolVar(&operatorOptions.enableK2KClusterSync, "operator.k2k-cluster-sync", false, "Enable to run the ListSimple operator")
f.MarkDeprecated("operator.k2k-cluster-sync", "Enabled within deployment operator")
f.BoolVar(&operatorOptions.versionOnly, "operator.version", false, "Enable only version endpoint in Operator")
f.StringVar(&operatorOptions.alpineImage, "operator.alpine-image", UBIImageEnv.GetOrDefault(defaultAlpineImage), "Docker image used for alpine containers")
f.MarkDeprecated("operator.alpine-image", "Value is not used anymore")
@ -190,13 +199,15 @@ func init() {
f.DurationVar(&operatorTimeouts.reconciliation, "timeout.reconciliation", globals.DefaultReconciliationTimeout, "The reconciliation timeout to the ArangoDB CR")
f.DurationVar(&shutdownOptions.delay, "shutdown.delay", defaultShutdownDelay, "The delay before running shutdown handlers")
f.DurationVar(&shutdownOptions.timeout, "shutdown.timeout", defaultShutdownTimeout, "Timeout for shutdown handlers")
f.BoolVar(&operatorOptions.scalingIntegrationEnabled, "internal.scaling-integration", true, "Enable Scaling Integration")
f.BoolVar(&operatorOptions.scalingIntegrationEnabled, "internal.scaling-integration", false, "Enable Scaling Integration")
f.Int64Var(&operatorKubernetesOptions.maxBatchSize, "kubernetes.max-batch-size", globals.DefaultKubernetesRequestBatchSize, "Size of batch during objects read")
f.Float32Var(&operatorKubernetesOptions.qps, "kubernetes.qps", kclient.DefaultQPS, "Number of queries per second for k8s API")
f.IntVar(&operatorKubernetesOptions.burst, "kubernetes.burst", kclient.DefaultBurst, "Burst for the k8s API")
f.BoolVar(&crdOptions.install, "crd.install", true, "Install missing CRD if access is possible")
f.IntVar(&operatorBackup.concurrentUploads, "backup-concurrent-uploads", globals.DefaultBackupConcurrentUploads, "Number of concurrent uploads per deployment")
features.Init(&cmdMain)
if err := features.Init(&cmdMain); err != nil {
panic(err.Error())
}
}
func Execute() int {
@ -216,9 +227,6 @@ func executeUsage(cmd *cobra.Command, args []string) {
// Run the operator
func executeMain(cmd *cobra.Command, args []string) {
// Set global logger
log.Logger = logging.NewRootLogger()
// Get environment
namespace := os.Getenv(constants.EnvOperatorPodNamespace)
name := os.Getenv(constants.EnvOperatorPodName)
@ -239,20 +247,23 @@ func executeMain(cmd *cobra.Command, args []string) {
// Prepare log service
var err error
if err := logging.InitGlobalLogger(defaultLogLevel, logLevels); err != nil {
cliLog.Fatal().Err(err).Msg("Failed to initialize log service")
levels, err := logging.ParseLogLevelsFromArgs(logLevels)
if err != nil {
logger.Err(err).Fatal("Unable to parse log level")
}
logService = logging.GlobalLogger()
logging.Global().ApplyLogLevels(levels)
logService.ConfigureRootLogger(func(log zerolog.Logger) zerolog.Logger {
podNameParts := strings.Split(name, "-")
operatorID := podNameParts[len(podNameParts)-1]
cliLog = cliLog.With().Str("operator-id", operatorID).Logger()
return log.With().Str("operator-id", operatorID).Logger()
podNameParts := strings.Split(name, "-")
operatorID := podNameParts[len(podNameParts)-1]
logging.Global().RegisterWrappers(func(in *zerolog.Event) *zerolog.Event {
return in.Str("operator-id", operatorID)
})
klog.SetOutput(logService.MustGetLogger(logging.LoggerNameKLog))
kl := logging.Global().RegisterAndGetLogger("klog", logging.Info)
klog.SetOutput(kl.InfoIO())
klog.Info("nice to meet you")
klog.Flush()
@ -260,46 +271,46 @@ func executeMain(cmd *cobra.Command, args []string) {
if !operatorOptions.enableDeployment && !operatorOptions.enableDeploymentReplication && !operatorOptions.enableStorage &&
!operatorOptions.enableBackup && !operatorOptions.enableApps && !operatorOptions.enableK2KClusterSync {
if !operatorOptions.versionOnly {
cliLog.Fatal().Err(err).Msg("Turn on --operator.deployment, --operator.deployment-replication, --operator.storage, --operator.backup, --operator.apps, --operator.k2k-cluster-sync or any combination of these")
logger.Err(err).Fatal("Turn on --operator.deployment, --operator.deployment-replication, --operator.storage, --operator.backup, --operator.apps, --operator.k2k-cluster-sync or any combination of these")
}
} else if operatorOptions.versionOnly {
cliLog.Fatal().Err(err).Msg("Options --operator.deployment, --operator.deployment-replication, --operator.storage, --operator.backup, --operator.apps, --operator.k2k-cluster-sync cannot be enabled together with --operator.version")
logger.Err(err).Fatal("Options --operator.deployment, --operator.deployment-replication, --operator.storage, --operator.backup, --operator.apps, --operator.k2k-cluster-sync cannot be enabled together with --operator.version")
}
// Log version
cliLog.Info().
logger.
Str("pod-name", name).
Str("pod-namespace", namespace).
Msgf("Starting arangodb-operator (%s), version %s build %s", version.GetVersionV1().Edition.Title(), version.GetVersionV1().Version, version.GetVersionV1().Build)
Info("Starting arangodb-operator (%s), version %s build %s", version.GetVersionV1().Edition.Title(), version.GetVersionV1().Version, version.GetVersionV1().Build)
// Check environment
if !operatorOptions.versionOnly {
if len(namespace) == 0 {
cliLog.Fatal().Msgf("%s environment variable missing", constants.EnvOperatorPodNamespace)
logger.Fatal("%s environment variable missing", constants.EnvOperatorPodNamespace)
}
if len(name) == 0 {
cliLog.Fatal().Msgf("%s environment variable missing", constants.EnvOperatorPodName)
logger.Fatal("%s environment variable missing", constants.EnvOperatorPodName)
}
if len(ip) == 0 {
cliLog.Fatal().Msgf("%s environment variable missing", constants.EnvOperatorPodIP)
logger.Fatal("%s environment variable missing", constants.EnvOperatorPodIP)
}
// Get host name
id, err := os.Hostname()
if err != nil {
cliLog.Fatal().Err(err).Msg("Failed to get hostname")
logger.Err(err).Fatal("Failed to get hostname")
}
client, ok := kclient.GetDefaultFactory().Client()
if !ok {
cliLog.Fatal().Msg("Failed to get client")
logger.Fatal("Failed to get client")
}
if crdOptions.install {
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()
crd.EnsureCRD(ctx, logService.MustGetLogger("crd"), client)
_ = crd.EnsureCRD(ctx, client, true)
}
secrets := client.Kubernetes().CoreV1().Secrets(namespace)
@ -307,11 +318,42 @@ func executeMain(cmd *cobra.Command, args []string) {
// Create operator
cfg, deps, err := newOperatorConfigAndDeps(id+"-"+name, namespace, name)
if err != nil {
cliLog.Fatal().Err(err).Msg("Failed to create operator config & deps")
logger.Err(err).Fatal("Failed to create operator config & deps")
}
o, err := operator.NewOperator(cfg, deps)
if err != nil {
cliLog.Fatal().Err(err).Msg("Failed to create operator")
logger.Err(err).Fatal("Failed to create operator")
}
if apiOptions.enabled {
apiServerCfg := api.ServerConfig{
Namespace: namespace,
ServerName: name,
ServerAltNames: []string{ip},
HTTPAddress: net.JoinHostPort("0.0.0.0", strconv.Itoa(apiOptions.httpPort)),
GRPCAddress: net.JoinHostPort("0.0.0.0", strconv.Itoa(apiOptions.grpcPort)),
TLSSecretName: apiOptions.tlsSecretName,
JWTSecretName: apiOptions.jwtSecretName,
JWTKeySecretName: apiOptions.jwtKeySecretName,
LivelinessProbe: &livenessProbe,
ProbeDeployment: api.ReadinessProbeConfig{
Enabled: cfg.EnableDeployment,
Probe: &deploymentProbe,
},
ProbeDeploymentReplication: api.ReadinessProbeConfig{
Enabled: cfg.EnableDeploymentReplication,
Probe: &deploymentReplicationProbe,
},
ProbeStorage: api.ReadinessProbeConfig{
Enabled: cfg.EnableStorage,
Probe: &storageProbe,
},
}
apiServer, err := api.NewServer(client.Kubernetes().CoreV1(), apiServerCfg)
if err != nil {
logger.Err(err).Fatal("Failed to create API server")
}
go utilsError.LogError(logger, "while running API server", apiServer.Run)
}
listenAddr := net.JoinHostPort(serverOptions.host, strconv.Itoa(serverOptions.port))
@ -325,7 +367,6 @@ func executeMain(cmd *cobra.Command, args []string) {
AdminSecretName: serverOptions.adminSecretName,
AllowAnonymous: serverOptions.allowAnonymous,
}, server.Dependencies{
Log: logService.MustGetLogger(logging.LoggerNameServer),
LivenessProbe: &livenessProbe,
Deployment: server.OperatorDependency{
Enabled: cfg.EnableDeployment,
@ -355,9 +396,9 @@ func executeMain(cmd *cobra.Command, args []string) {
Secrets: secrets,
}); err != nil {
cliLog.Fatal().Err(err).Msg("Failed to create HTTP server")
logger.Err(err).Fatal("Failed to create HTTP server")
} else {
go utilsError.LogError(cliLog, "error while starting service", svr.Run)
go utilsError.LogError(logger, "error while starting server", svr.Run)
}
// startChaos(context.Background(), cfg.KubeCli, cfg.Namespace, chaosLevel)
@ -366,7 +407,7 @@ func executeMain(cmd *cobra.Command, args []string) {
o.Run()
} else {
if err := startVersionProcess(); err != nil {
cliLog.Fatal().Err(err).Msg("Failed to create HTTP server")
logger.Err(err).Fatal("Failed to create HTTP server")
}
}
}
@ -374,7 +415,7 @@ func executeMain(cmd *cobra.Command, args []string) {
func startVersionProcess() error {
// Just expose version
listenAddr := net.JoinHostPort(serverOptions.host, strconv.Itoa(serverOptions.port))
cliLog.Info().Str("addr", listenAddr).Msgf("Starting version endpoint")
logger.Str("addr", listenAddr).Info("Starting version endpoint")
gin.SetMode(gin.ReleaseMode)
r := gin.New()
@ -407,7 +448,7 @@ func newOperatorConfigAndDeps(id, namespace, name string) (operator.Config, oper
return operator.Config{}, operator.Dependencies{}, errors.WithStack(fmt.Errorf("Failed to get my pod's service account: %s", err))
}
eventRecorder := createRecorder(cliLog, client.Kubernetes(), name, namespace)
eventRecorder := createRecorder(client.Kubernetes(), name, namespace)
scope, ok := scope.AsScope(operatorOptions.scope)
if !ok {
@ -435,7 +476,6 @@ func newOperatorConfigAndDeps(id, namespace, name string) (operator.Config, oper
ShutdownTimeout: shutdownOptions.timeout,
}
deps := operator.Dependencies{
LogService: logService,
Client: client,
EventRecorder: eventRecorder,
LivenessProbe: &livenessProbe,
@ -455,12 +495,12 @@ func newOperatorConfigAndDeps(id, namespace, name string) (operator.Config, oper
func getMyPodInfo(kubecli kubernetes.Interface, namespace, name string) (string, string, error) {
var image, sa string
op := func() error {
pod, err := kubecli.CoreV1().Pods(namespace).Get(context.Background(), name, metav1.GetOptions{})
pod, err := kubecli.CoreV1().Pods(namespace).Get(context.Background(), name, meta.GetOptions{})
if err != nil {
cliLog.Error().
logger.
Err(err).
Str("name", name).
Msg("Failed to get operator pod")
Error("Failed to get operator pod")
return errors.WithStack(err)
}
sa = pod.Spec.ServiceAccountName
@ -479,15 +519,15 @@ func getMyPodInfo(kubecli kubernetes.Interface, namespace, name string) (string,
return image, sa, nil
}
func createRecorder(log zerolog.Logger, kubecli kubernetes.Interface, name, namespace string) record.EventRecorder {
func createRecorder(kubecli kubernetes.Interface, name, namespace string) record.EventRecorder {
eventBroadcaster := record.NewBroadcaster()
eventBroadcaster.StartLogging(func(format string, args ...interface{}) {
log.Info().Msgf(format, args...)
eventRecorder.Info(format, args...)
})
eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: v1core.New(kubecli.CoreV1().RESTClient()).Events(namespace)})
eventBroadcaster.StartRecordingToSink(&typedCore.EventSinkImpl{Interface: typedCore.New(kubecli.CoreV1().RESTClient()).Events(namespace)})
combinedScheme := runtime.NewScheme()
scheme.AddToScheme(combinedScheme)
v1.AddToScheme(combinedScheme)
appsv1.AddToScheme(combinedScheme)
return eventBroadcaster.NewRecorder(combinedScheme, v1.EventSource{Component: name})
core.AddToScheme(combinedScheme)
apps.AddToScheme(combinedScheme)
return eventBroadcaster.NewRecorder(combinedScheme, core.EventSource{Component: name})
}

45
cmd/cmd_ops.go Normal file
View file

@ -0,0 +1,45 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package cmd
import (
goflag "flag"
"github.com/spf13/cobra"
flag "github.com/spf13/pflag"
)
var (
cmdOps = cobra.Command{
Use: "arangodb_ops",
Run: executeUsage,
}
)
func ExecuteOps() int {
flag.CommandLine.AddGoFlagSet(goflag.CommandLine)
if err := cmdOps.Execute(); err != nil {
return 1
}
return 0
}

67
cmd/crd.go Normal file
View file

@ -0,0 +1,67 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package cmd
import (
"context"
"os"
"time"
"github.com/spf13/cobra"
"github.com/arangodb/kube-arangodb/pkg/crd"
"github.com/arangodb/kube-arangodb/pkg/util/kclient"
)
var (
cmdCRD = &cobra.Command{
Use: "crd",
Run: executeUsage,
Short: "CRD operations",
}
cmdCRDInstall = &cobra.Command{
Use: "install",
Run: cmdCRDInstallRun,
Short: "Install and update all required CRDs",
}
)
func init() {
cmdMain.AddCommand(cmdCRD)
cmdOps.AddCommand(cmdCRD)
cmdCRD.AddCommand(cmdCRDInstall)
}
func cmdCRDInstallRun(cmd *cobra.Command, args []string) {
client, ok := kclient.GetDefaultFactory().Client()
if !ok {
logger.Fatal("Failed to get client")
}
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()
err := crd.EnsureCRD(ctx, client, false)
if err != nil {
os.Exit(1)
}
}

View file

@ -28,11 +28,11 @@ import (
"syscall"
"time"
"github.com/arangodb/kube-arangodb/pkg/exporter"
"github.com/arangodb/kube-arangodb/pkg/util"
"github.com/rs/zerolog/log"
"github.com/spf13/cobra"
"github.com/arangodb/kube-arangodb/pkg/exporter"
"github.com/arangodb/kube-arangodb/pkg/util"
)
var (

View file

@ -29,19 +29,16 @@ import (
"strconv"
"time"
"github.com/arangodb/kube-arangodb/pkg/handlers/utils"
"github.com/arangodb/kube-arangodb/pkg/util/retry"
"github.com/arangodb/kube-arangodb/pkg/version"
"github.com/spf13/cobra"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/arangodb/kube-arangodb/pkg/apis/shared"
"github.com/arangodb/kube-arangodb/pkg/handlers/utils"
"github.com/arangodb/kube-arangodb/pkg/util/constants"
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
"github.com/arangodb/kube-arangodb/pkg/util/kclient"
"github.com/arangodb/kube-arangodb/pkg/util/retry"
"github.com/arangodb/kube-arangodb/pkg/version"
)
var (
@ -92,43 +89,43 @@ func init() {
cmdLifecycle.AddCommand(cmdLifecycleCopy)
cmdLifecycle.AddCommand(cmdLifecycleProbe)
cmdLifecycle.AddCommand(cmdLifecycleWait)
cmdLifecycle.AddCommand(cmdLifecycleStartup)
cmdLifecycleCopy.Flags().StringVar(&lifecycleCopyOptions.TargetDir, "target", "", "Target directory to copy the executable to")
}
// Wait until all finalizers of the current pod have been removed.
func cmdLifecyclePreStopRunFinalizer(cmd *cobra.Command, args []string) {
cliLog.Info().Msgf("Starting arangodb-operator (%s), lifecycle preStop, version %s build %s", version.GetVersionV1().Edition.Title(), version.GetVersionV1().Version, version.GetVersionV1().Build)
logger.Info("Starting arangodb-operator (%s), lifecycle preStop, version %s build %s", version.GetVersionV1().Edition.Title(), version.GetVersionV1().Version, version.GetVersionV1().Build)
// Get environment
namespace := os.Getenv(constants.EnvOperatorPodNamespace)
if len(namespace) == 0 {
cliLog.Fatal().Msgf("%s environment variable missing", constants.EnvOperatorPodNamespace)
logger.Fatal("%s environment variable missing", constants.EnvOperatorPodNamespace)
}
name := os.Getenv(constants.EnvOperatorPodName)
if len(name) == 0 {
cliLog.Fatal().Msgf("%s environment variable missing", constants.EnvOperatorPodName)
logger.Fatal("%s environment variable missing", constants.EnvOperatorPodName)
}
// Create kubernetes client
client, ok := kclient.GetDefaultFactory().Client()
if !ok {
cliLog.Fatal().Msg("Client not initialised")
logger.Fatal("Client not initialised")
}
pods := client.Kubernetes().CoreV1().Pods(namespace)
recentErrors := 0
for {
p, err := pods.Get(context.Background(), name, metav1.GetOptions{})
p, err := pods.Get(context.Background(), name, meta.GetOptions{})
if k8sutil.IsNotFound(err) {
cliLog.Warn().Msg("Pod not found")
logger.Warn("Pod not found")
return
} else if err != nil {
recentErrors++
cliLog.Error().Err(err).Msg("Failed to get pod")
logger.Err(err).Error("Failed to get pod")
if recentErrors > 20 {
cliLog.Fatal().Err(err).Msg("Too many recent errors")
logger.Err(err).Fatal("Too many recent errors")
return
}
} else {
@ -136,10 +133,10 @@ func cmdLifecyclePreStopRunFinalizer(cmd *cobra.Command, args []string) {
finalizerCount := len(p.GetFinalizers())
if finalizerCount == 0 {
// No more finalizers, we're done
cliLog.Info().Msg("All finalizers gone, we can stop now")
logger.Info("All finalizers gone, we can stop now")
return
}
cliLog.Info().Msgf("Waiting for %d more finalizers to be removed", finalizerCount)
logger.Info("Waiting for %d more finalizers to be removed", finalizerCount)
}
// Wait a bit
time.Sleep(time.Second)
@ -148,17 +145,17 @@ func cmdLifecyclePreStopRunFinalizer(cmd *cobra.Command, args []string) {
// Copy the executable to a given place.
func cmdLifecycleCopyRun(cmd *cobra.Command, args []string) {
cliLog.Info().Msgf("Starting arangodb-operator (%s), lifecycle copy, version %s build %s", version.GetVersionV1().Edition.Title(), version.GetVersionV1().Version, version.GetVersionV1().Build)
logger.Info("Starting arangodb-operator (%s), lifecycle copy, version %s build %s", version.GetVersionV1().Edition.Title(), version.GetVersionV1().Version, version.GetVersionV1().Build)
exePath, err := os.Executable()
if err != nil {
cliLog.Fatal().Err(err).Msg("Failed to get executable path")
logger.Err(err).Fatal("Failed to get executable path")
}
// Open source
rd, err := os.Open(exePath)
if err != nil {
cliLog.Fatal().Err(err).Msg("Failed to open executable file")
logger.Err(err).Fatal("Failed to open executable file")
}
defer rd.Close()
@ -166,20 +163,20 @@ func cmdLifecycleCopyRun(cmd *cobra.Command, args []string) {
targetPath := filepath.Join(lifecycleCopyOptions.TargetDir, filepath.Base(exePath))
wr, err := os.Create(targetPath)
if err != nil {
cliLog.Fatal().Err(err).Msg("Failed to create target file")
logger.Err(err).Fatal("Failed to create target file")
}
defer wr.Close()
if _, err := io.Copy(wr, rd); err != nil {
cliLog.Fatal().Err(err).Msg("Failed to copy")
logger.Err(err).Fatal("Failed to copy")
}
// Set file mode
if err := os.Chmod(targetPath, 0755); err != nil {
cliLog.Fatal().Err(err).Msg("Failed to chmod")
logger.Err(err).Fatal("Failed to chmod")
}
cliLog.Info().Msgf("Executable copied to %s", targetPath)
logger.Info("Executable copied to %s", targetPath)
}
type cmdLifecyclePreStopRunPort struct {
@ -193,17 +190,17 @@ func (c *cmdLifecyclePreStopRunPort) run(cmd *cobra.Command, args []string) erro
// Get environment
namespace := os.Getenv(constants.EnvOperatorPodNamespace)
if len(namespace) == 0 {
cliLog.Fatal().Msgf("%s environment variable missing", constants.EnvOperatorPodNamespace)
logger.Fatal("%s environment variable missing", constants.EnvOperatorPodNamespace)
}
name := os.Getenv(constants.EnvOperatorPodName)
if len(name) == 0 {
cliLog.Fatal().Msgf("%s environment variable missing", constants.EnvOperatorPodName)
logger.Fatal("%s environment variable missing", constants.EnvOperatorPodName)
}
// Create kubernetes client
client, ok := kclient.GetDefaultFactory().Client()
if !ok {
cliLog.Fatal().Msg("Client not initialised")
logger.Fatal("Client not initialised")
}
pods := client.Kubernetes().CoreV1().Pods(namespace)
@ -219,15 +216,15 @@ func (c *cmdLifecyclePreStopRunPort) run(cmd *cobra.Command, args []string) erro
conn.Close()
p, err := pods.Get(context.Background(), name, metav1.GetOptions{})
p, err := pods.Get(context.Background(), name, meta.GetOptions{})
if k8sutil.IsNotFound(err) {
cliLog.Warn().Msg("Pod not found")
logger.Warn("Pod not found")
return nil
} else if err != nil {
recentErrors++
cliLog.Error().Err(err).Msg("Failed to get pod")
logger.Err(err).Error("Failed to get pod")
if recentErrors > 20 {
cliLog.Fatal().Err(err).Msg("Too many recent errors")
logger.Err(err).Fatal("Too many recent errors")
return nil
}
} else {

View file

@ -28,13 +28,15 @@ import (
"os"
"path"
"github.com/arangodb/go-driver/jwt"
"github.com/arangodb/kube-arangodb/pkg/apis/shared"
"github.com/arangodb/kube-arangodb/pkg/deployment/pod"
"github.com/arangodb/kube-arangodb/pkg/util/constants"
"github.com/pkg/errors"
"github.com/rs/zerolog/log"
"github.com/spf13/cobra"
"github.com/arangodb/go-driver/jwt"
"github.com/arangodb/kube-arangodb/pkg/apis/shared"
"github.com/arangodb/kube-arangodb/pkg/deployment/pod"
"github.com/arangodb/kube-arangodb/pkg/util/constants"
)
var (

75
cmd/lifecycle_startup.go Normal file
View file

@ -0,0 +1,75 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package cmd
import (
"errors"
"fmt"
"net/http"
"time"
"github.com/spf13/cobra"
"github.com/arangodb/kube-arangodb/pkg/apis/shared"
)
var cmdLifecycleStartup = &cobra.Command{
Use: "startup",
RunE: cmdLifecycleStartupFunc,
Hidden: true,
}
func cmdLifecycleStartupFunc(cmd *cobra.Command, args []string) error {
var close bool
server := &http.Server{
Addr: fmt.Sprintf(":%d", shared.ArangoPort),
}
handlers := http.NewServeMux()
handlers.HandleFunc("/stop", func(writer http.ResponseWriter, request *http.Request) {
writer.WriteHeader(http.StatusOK)
close = true
})
server.Handler = handlers
go func() {
for {
if close {
break
}
time.Sleep(time.Millisecond)
}
server.Close()
}()
if err := server.ListenAndServe(); err != nil {
if errors.Is(err, http.ErrServerClosed) {
return nil
}
return err
}
return nil
}

View file

@ -26,11 +26,11 @@ import (
"os"
"time"
"github.com/spf13/cobra"
v1 "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
"github.com/arangodb/kube-arangodb/pkg/util"
"github.com/arangodb/kube-arangodb/pkg/util/constants"
"github.com/spf13/cobra"
)
const (
@ -63,26 +63,26 @@ func cmdLifecycleWaitCheck(cmd *cobra.Command, _ []string) {
deploymentName, err := cmd.Flags().GetString(ArgDeploymentName)
if err != nil {
cliLog.Fatal().Err(err).Msg(fmt.Sprintf("error parsing argument: %s", ArgDeploymentName))
logger.Err(err).Fatal("error parsing argument: %s", ArgDeploymentName)
}
watchTimeout, err := cmd.Flags().GetDuration(ArgDeploymentWatchTimeout)
if err != nil {
cliLog.Fatal().Err(err).Msg(fmt.Sprintf("error parsing argument: %s", ArgDeploymentWatchTimeout))
logger.Err(err).Fatal("error parsing argument: %s", ArgDeploymentWatchTimeout)
}
for {
d, err := getDeployment(ctx, os.Getenv(constants.EnvOperatorPodNamespace), deploymentName)
if err != nil {
cliLog.Fatal().Err(err).Msg(fmt.Sprintf("error getting ArangoDeployment: %s", d.Name))
logger.Err(err).Fatal(fmt.Sprintf("error getting ArangoDeployment: %s", d.Name))
}
isUpToDate, err := d.IsUpToDate()
if err != nil {
cliLog.Err(err).Msg(fmt.Sprintf("error checking Status for ArangoDeployment: %s", d.Name))
logger.Err(err).Error(fmt.Sprintf("error checking Status for ArangoDeployment: %s", d.Name))
}
if isUpToDate {
cliLog.Info().Msg(fmt.Sprintf("ArangoDeployment: %s is %s", d.Name, v1.ConditionTypeUpToDate))
logger.Info(fmt.Sprintf("ArangoDeployment: %s is %s", d.Name, v1.ConditionTypeUpToDate))
return
}
@ -90,10 +90,10 @@ func cmdLifecycleWaitCheck(cmd *cobra.Command, _ []string) {
case <-ctx.Done():
return
case <-time.After(WatchCheckInterval):
cliLog.Info().Msg(fmt.Sprintf("ArangoDeployment: %s is not ready yet. Waiting...", d.Name))
logger.Info("ArangoDeployment: %s is not ready yet. Waiting...", d.Name)
continue
case <-time.After(watchTimeout):
cliLog.Error().Msg(fmt.Sprintf("ArangoDeployment: %s is not %s yet - operation timed out!", d.Name, v1.ConditionTypeUpToDate))
logger.Error("ArangoDeployment: %s is not %s yet - operation timed out!", d.Name, v1.ConditionTypeUpToDate)
return
}
}

31
cmd/main-ops/main_ops.go Normal file
View file

@ -0,0 +1,31 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package main
import (
"os"
"github.com/arangodb/kube-arangodb/cmd"
)
func main() {
os.Exit(cmd.ExecuteOps())
}

View file

@ -1,486 +0,0 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package cmd
import (
"context"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"os"
"path"
"strings"
"sync"
"k8s.io/apimachinery/pkg/util/intstr"
deplv1 "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
acli "github.com/arangodb/kube-arangodb/pkg/generated/clientset/versioned"
"github.com/arangodb/kube-arangodb/pkg/util"
"github.com/arangodb/kube-arangodb/pkg/util/constants"
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
"github.com/arangodb/kube-arangodb/pkg/util/kclient"
"github.com/pkg/errors"
"github.com/spf13/cobra"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields"
"k8s.io/client-go/kubernetes"
)
var (
cmdReboot = &cobra.Command{
Use: "reboot",
Run: cmdRebootRun,
Hidden: false,
}
rebootOptions struct {
DeploymentName string
ImageName string
LicenseSecretName string
Coordinators int
}
cmdRebootInspect = &cobra.Command{
Use: "inspect",
Run: cmdRebootInspectRun,
Hidden: true,
}
rebootInspectOptions struct {
TargetDir string
}
)
func init() {
cmdMain.AddCommand(cmdReboot)
cmdReboot.AddCommand(cmdRebootInspect)
cmdReboot.Flags().StringVar(&rebootOptions.DeploymentName, "deployment-name", "rebooted-deployment", "Name of the deployment")
cmdReboot.Flags().StringVar(&rebootOptions.ImageName, "image-name", "arangodb/arangodb:latest", "Image used for the deployment")
cmdReboot.Flags().StringVar(&rebootOptions.LicenseSecretName, "license-secret-name", "", "Name of secret for license key")
cmdReboot.Flags().IntVar(&rebootOptions.Coordinators, "coordinators", 1, "Initial number of coordinators")
cmdRebootInspect.Flags().StringVar(&rebootInspectOptions.TargetDir, "target-dir", "/data", "Path to mounted database directory")
}
type inspectResult struct {
UUID string `json:"uuid,omitempty"`
}
type inspectResponse struct {
Error *string `json:"error,omitempty"`
Result *inspectResult `json:"result,omitempty"`
}
type VolumeInspectResult struct {
UUID string
Claim string
Error error
}
func runVolumeInspector(ctx context.Context, kube kubernetes.Interface, ns, name, image, storageClassName string) (string, string, error) {
deletePVC := true
claimname := "arangodb-reboot-pvc-" + name
pvcspec := corev1.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{
Name: claimname,
Labels: map[string]string{
"app": "arangodb",
"rebooted": "yes",
},
},
Spec: corev1.PersistentVolumeClaimSpec{
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce},
VolumeName: name,
Resources: corev1.ResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceStorage: *resource.NewQuantity(1024*1024*1024, resource.DecimalSI),
},
},
StorageClassName: util.NewString(storageClassName),
},
}
_, err := kube.CoreV1().PersistentVolumeClaims(ns).Create(context.Background(), &pvcspec, metav1.CreateOptions{})
if err != nil {
return "", "", errors.Wrap(err, "failed to create pvc")
}
defer func() {
if deletePVC {
cliLog.Debug().Str("pvc-name", claimname).Msg("deleting pvc")
kube.CoreV1().PersistentVolumeClaims(ns).Delete(context.Background(), claimname, metav1.DeleteOptions{})
}
}()
podname := "arangodb-reboot-pod-" + name
podspec := corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: podname,
},
Spec: corev1.PodSpec{
RestartPolicy: corev1.RestartPolicyNever,
Containers: []corev1.Container{
corev1.Container{
Name: "inspector",
Image: image,
ImagePullPolicy: corev1.PullAlways,
Command: []string{"arangodb_operator"},
Args: []string{"reboot", "inspect"},
Env: []corev1.EnvVar{
corev1.EnvVar{
Name: constants.EnvOperatorPodNamespace,
Value: ns,
},
},
VolumeMounts: []corev1.VolumeMount{
corev1.VolumeMount{
MountPath: "/data",
Name: "data",
},
},
Ports: []corev1.ContainerPort{
corev1.ContainerPort{
ContainerPort: 8080,
},
},
ReadinessProbe: &corev1.Probe{
Handler: corev1.Handler{
HTTPGet: &corev1.HTTPGetAction{
Path: "/info",
Port: intstr.FromInt(8080),
},
},
},
},
},
Volumes: []corev1.Volume{
k8sutil.CreateVolumeWithPersitantVolumeClaim("data", claimname),
},
},
}
_, err = kube.CoreV1().Pods(ns).Create(context.Background(), &podspec, metav1.CreateOptions{})
if err != nil {
return "", "", errors.Wrap(err, "failed to create pod")
}
defer kube.CoreV1().Pods(ns).Delete(context.Background(), podname, metav1.DeleteOptions{})
podwatch, err := kube.CoreV1().Pods(ns).Watch(context.Background(), metav1.ListOptions{FieldSelector: fields.OneTermEqualSelector("metadata.name", podname).String()})
if err != nil {
return "", "", errors.Wrap(err, "failed to watch for pod")
}
defer podwatch.Stop()
// wait until pod is terminated
for {
select {
case <-ctx.Done():
return "", "", ctx.Err()
case ev, ok := <-podwatch.ResultChan():
if !ok {
return "", "", fmt.Errorf("result channel bad")
}
// get the pod
pod, ok := ev.Object.(*corev1.Pod)
if !ok {
return "", "", fmt.Errorf("failed to get pod")
}
switch pod.Status.Phase {
case corev1.PodFailed:
return "", "", fmt.Errorf("pod failed: %s", pod.Status.Reason)
case corev1.PodRunning:
podReady := false
for _, c := range pod.Status.Conditions {
if c.Type == corev1.PodReady && c.Status == corev1.ConditionTrue {
podReady = true
}
}
if !podReady {
continue
}
resp, err := http.Get("http://" + pod.Status.PodIP + ":8080/info")
if err != nil {
return "", "", errors.Wrap(err, "Failed to get info")
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", "", errors.Wrap(err, "failed to read body")
}
var info inspectResponse
if err := json.Unmarshal(body, &info); err != nil {
return "", "", errors.Wrap(err, "failed to unmarshal response")
}
if info.Error != nil {
return "", "", fmt.Errorf("pod returned error: %s", *info.Error)
}
deletePVC = false
return info.Result.UUID, claimname, nil
}
}
}
}
func doVolumeInspection(ctx context.Context, kube kubernetes.Interface, ns, name, storageClassName string, resultChan chan<- VolumeInspectResult, image string) {
// Create Volume Claim
// Create Pod mounting this volume
// Wait for pod to be completed
// Read logs - parse json
// Delete pod
uuid, claim, err := runVolumeInspector(ctx, kube, ns, name, image, storageClassName)
if err != nil {
resultChan <- VolumeInspectResult{Error: err}
}
resultChan <- VolumeInspectResult{UUID: uuid, Claim: claim}
}
func checkVolumeAvailable(kube kubernetes.Interface, vname string) (VolumeInfo, error) {
volume, err := kube.CoreV1().PersistentVolumes().Get(context.Background(), vname, metav1.GetOptions{})
if err != nil {
return VolumeInfo{}, errors.Wrapf(err, "failed to GET volume %s", vname)
}
switch volume.Status.Phase {
case corev1.VolumeAvailable:
break
case corev1.VolumeReleased:
// we have to remove the claim reference
volume.Spec.ClaimRef = nil
if _, err := kube.CoreV1().PersistentVolumes().Update(context.Background(), volume, metav1.UpdateOptions{}); err != nil {
return VolumeInfo{}, errors.Wrapf(err, "failed to remove claim reference")
}
default:
return VolumeInfo{}, fmt.Errorf("Volume %s phase is %s, expected %s", vname, volume.Status.Phase, corev1.VolumeAvailable)
}
return VolumeInfo{StorageClassName: volume.Spec.StorageClassName}, nil
}
type VolumeInfo struct {
StorageClassName string
}
type VolumeListInfo map[string]VolumeInfo
func preflightChecks(kube kubernetes.Interface, volumes []string) (VolumeListInfo, error) {
info := make(VolumeListInfo)
// Check if all values are released
for _, vname := range volumes {
vi, err := checkVolumeAvailable(kube, vname)
if err != nil {
return nil, errors.Wrap(err, "preflight checks failed")
}
info[vname] = vi
}
return info, nil
}
func getMyImage(kube kubernetes.Interface, ns, name string) (string, error) {
pod, err := kube.CoreV1().Pods(ns).Get(context.Background(), name, metav1.GetOptions{})
if err != nil {
return "", err
}
return pod.Spec.Containers[0].Image, nil
}
func createArangoDeployment(cli acli.Interface, ns, deplname, arangoimage string, results map[string]VolumeInspectResult) error {
prmr := make(map[string]VolumeInspectResult)
agnt := make(map[string]VolumeInspectResult)
for vname, info := range results {
if strings.HasPrefix(info.UUID, "PRMR") {
prmr[vname] = info
} else if strings.HasPrefix(info.UUID, "AGNT") {
agnt[vname] = info
} else {
return fmt.Errorf("unknown server type by uuid: %s", info.UUID)
}
}
depl := deplv1.ArangoDeployment{
ObjectMeta: metav1.ObjectMeta{
Name: deplname,
},
Spec: deplv1.DeploymentSpec{
Image: util.NewString(arangoimage),
Coordinators: deplv1.ServerGroupSpec{
Count: util.NewInt(rebootOptions.Coordinators),
},
Agents: deplv1.ServerGroupSpec{
Count: util.NewInt(len(agnt)),
},
DBServers: deplv1.ServerGroupSpec{
Count: util.NewInt(len(prmr)),
},
},
}
if rebootOptions.LicenseSecretName != "" {
depl.Spec.License.SecretName = util.NewString(rebootOptions.LicenseSecretName)
}
for _, info := range agnt {
depl.Status.Members.Agents = append(depl.Status.Members.Agents, deplv1.MemberStatus{
ID: info.UUID,
PersistentVolumeClaimName: info.Claim,
PodName: k8sutil.CreatePodName(deplname, deplv1.ServerGroupAgents.AsRole(), info.UUID, "-rbt"),
})
}
for _, info := range prmr {
depl.Status.Members.DBServers = append(depl.Status.Members.DBServers, deplv1.MemberStatus{
ID: info.UUID,
PersistentVolumeClaimName: info.Claim,
PodName: k8sutil.CreatePodName(deplname, deplv1.ServerGroupDBServers.AsRole(), info.UUID, "-rbt"),
})
}
if _, err := cli.DatabaseV1().ArangoDeployments(ns).Create(context.Background(), &depl, metav1.CreateOptions{}); err != nil {
return errors.Wrap(err, "failed to create ArangoDeployment")
}
return nil
}
func cmdRebootRun(cmd *cobra.Command, args []string) {
volumes := args
namespace := os.Getenv(constants.EnvOperatorPodNamespace)
podname := os.Getenv(constants.EnvOperatorPodName)
// Create kubernetes client
client, ok := kclient.GetDefaultFactory().Client()
if !ok {
cliLog.Fatal().Msg("Failed to get client")
}
kubecli := client.Kubernetes()
extcli := client.Arango()
image, err := getMyImage(kubecli, namespace, podname)
if err != nil {
cliLog.Fatal().Err(err).Msg("failed to get my image")
}
vinfo, err := preflightChecks(kubecli, volumes)
if err != nil {
cliLog.Fatal().Err(err).Msg("preflight checks failed")
}
var wg sync.WaitGroup
ctx := context.Background()
resultChan := make(chan VolumeInspectResult)
received := 0
for _, volumeName := range volumes {
cliLog.Debug().Str("volume", volumeName).Msg("Starting inspection")
wg.Add(1)
go func(vn string) {
defer wg.Done()
doVolumeInspection(ctx, kubecli, namespace, vn, vinfo[vn].StorageClassName, resultChan, image)
}(volumeName)
}
members := make(map[string]VolumeInspectResult)
for {
if received == len(volumes) {
break
}
select {
case res := <-resultChan:
if res.Error != nil {
cliLog.Error().Err(res.Error).Msg("Inspection failed")
} else {
cliLog.Info().Str("claim", res.Claim).Str("uuid", res.UUID).Msg("Inspection completed")
}
members[res.UUID] = res
received++
case <-ctx.Done():
panic(ctx.Err())
}
}
cliLog.Debug().Msg("results complete - generating ArangoDeployment resource")
if err := createArangoDeployment(extcli, namespace, rebootOptions.DeploymentName, rebootOptions.ImageName, members); err != nil {
cliLog.Error().Err(err).Msg("failed to create deployment")
}
cliLog.Info().Msg("ArangoDeployment created.")
// Wait for everyone to be completed
wg.Wait()
}
// inspectDatabaseDirectory inspects the given directory and returns the inspection result or an error
func inspectDatabaseDirectory(dirname string) (*inspectResult, error) {
// Access the database directory and look for the following files
// UUID
uuidfile := path.Join(dirname, "UUID")
uuid, err := ioutil.ReadFile(path.Clean(uuidfile))
if err != nil {
return nil, err
}
return &inspectResult{UUID: strings.TrimSpace(string(uuid))}, nil
}
func cmdRebootInspectRun(cmd *cobra.Command, args []string) {
var response inspectResponse
result, err := inspectDatabaseDirectory(rebootInspectOptions.TargetDir)
if err != nil {
response.Error = util.NewString(err.Error())
}
response.Result = result
json, err := json.Marshal(&response)
if err != nil {
panic(err)
}
http.HandleFunc("/info", func(w http.ResponseWriter, req *http.Request) {
w.Write(json)
})
if http.ListenAndServe(":8080", nil); err != nil {
cliLog.Fatal().Err(err).Msg("Failed to listen and serve")
}
}

View file

@ -26,14 +26,12 @@ import (
"os"
"strconv"
"github.com/arangodb/kube-arangodb/pkg/version"
"github.com/spf13/cobra"
"github.com/arangodb/kube-arangodb/pkg/logging"
"github.com/arangodb/kube-arangodb/pkg/storage/provisioner"
"github.com/arangodb/kube-arangodb/pkg/storage/provisioner/service"
"github.com/arangodb/kube-arangodb/pkg/util/constants"
"github.com/arangodb/kube-arangodb/pkg/version"
)
var (
@ -63,26 +61,21 @@ func init() {
// Run the provisioner
func cmdStorageProvisionerRun(cmd *cobra.Command, args []string) {
var err error
if err := logging.InitGlobalLogger(defaultLogLevel, logLevels); err != nil {
cliLog.Fatal().Err(err).Msg("Failed to initialize log service")
}
logService = logging.GlobalLogger()
// Log version
cliLog.Info().Msgf("Starting arangodb local storage provisioner (%s), version %s build %s", version.GetVersionV1().Edition.Title(), version.GetVersionV1().Version, version.GetVersionV1().Build)
logger.Info("Starting arangodb local storage provisioner (%s), version %s build %s", version.GetVersionV1().Edition.Title(), version.GetVersionV1().Version, version.GetVersionV1().Build)
// Get environment
nodeName := os.Getenv(constants.EnvOperatorNodeName)
if len(nodeName) == 0 {
cliLog.Fatal().Msgf("%s environment variable missing", constants.EnvOperatorNodeName)
logger.Fatal("%s environment variable missing", constants.EnvOperatorNodeName)
}
config, deps := newProvisionerConfigAndDeps(nodeName)
p, err := service.New(config, deps)
config := newProvisionerConfigAndDeps(nodeName)
p, err := service.New(config)
if err != nil {
cliLog.Fatal().Err(err).Msg("Failed to create provisioner")
logger.Err(err).Fatal("Failed to create provisioner")
}
ctx := context.TODO()
@ -90,14 +83,11 @@ func cmdStorageProvisionerRun(cmd *cobra.Command, args []string) {
}
// newProvisionerConfigAndDeps creates storage provisioner config & dependencies.
func newProvisionerConfigAndDeps(nodeName string) (service.Config, service.Dependencies) {
func newProvisionerConfigAndDeps(nodeName string) service.Config {
cfg := service.Config{
Address: net.JoinHostPort("0.0.0.0", strconv.Itoa(storageProvisioner.port)),
NodeName: nodeName,
}
deps := service.Dependencies{
Log: logService.MustGetLogger(logging.LoggerNameProvisioner),
}
return cfg, deps
return cfg
}

64
cmd/task.go Normal file
View file

@ -0,0 +1,64 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package cmd
import (
"github.com/spf13/cobra"
)
func init() {
var deploymentName string
cmdMain.AddCommand(cmdTask)
cmdOps.AddCommand(cmdTask)
cmdTask.AddCommand(cmdTaskCreate)
cmdTaskCreate.Flags().StringVarP(&deploymentName, ArgDeploymentName, "d", "",
"Name of ArangoDeployment for which Task will be created - necessary when more than one deployment exist within one namespace")
cmdTask.AddCommand(cmdTaskState)
}
var cmdTask = &cobra.Command{
Use: "task",
Run: executeUsage,
}
var cmdTaskCreate = &cobra.Command{
Use: "create",
Short: "Create task",
Run: taskCreate,
}
var cmdTaskState = &cobra.Command{
Use: "state",
Short: "Get Task state",
Long: "It prints the task current state on the stdout",
Run: taskState,
}
func taskCreate(cmd *cobra.Command, args []string) {
logger.Info("TODO: create task")
}
func taskState(cmd *cobra.Command, args []string) {
logger.Info("TODO: check task state")
}

View file

@ -23,8 +23,9 @@ package cmd
import (
"fmt"
"github.com/arangodb/kube-arangodb/pkg/version"
"github.com/spf13/cobra"
"github.com/arangodb/kube-arangodb/pkg/version"
)
func init() {

View file

@ -4,3 +4,7 @@
- [Documentation](https://www.arangodb.com/docs/stable/deployment-kubernetes.html)
- [Design documents](./design/README.md)
- [Providers](./providers/README.md)
# ArangoDB Kubernetes Operator Generated Documentation
- [ArangoDB Operator Metrics & Alerts](./generated/metrics/README.md)

View file

@ -1,6 +1,6 @@
# ArangoDB on bare metal Kubernetes
A not of warning for lack of a better word upfront: Kubernetes is
A note of warning for lack of a better word upfront: Kubernetes is
awesome and powerful. As with awesome and powerful things, there is
infinite ways of setting up a k8s cluster. With great flexibility
comes great complexity. There are infinite ways of hitting barriers.

View file

@ -10,4 +10,7 @@
- [Upgrading](./upgrading.md)
- [Rotating Pods](./rotating.md)
- [Maintenance](./maintenance.md)
- [Additional configuration](./additional_configuration.md)
- [Additional configuration](./additional_configuration.md)
- [Topology awareness](./topology_awareness.md)
- [Configuring timezone](./configuring_tz.md)
- [Operator API](./api.md)

30
docs/design/api.md Normal file
View file

@ -0,0 +1,30 @@
# Operator API
A running operator exposes HTTP and gRPC API listeners to allow retrieving and setting some configuration values programmatically.
Both listeners require a secured connection to be established. It is possible to provide TLS certificate via k8s secret
using command line option `--api.tls-secret-name`. If secret name is not provided, operator will use self-signed certificate.
Some HTTP endpoints require the authorization to work with. All gRPC endpoints require the authorization.
The authorization can be accomplished by providing JWT token in 'Authorization' header, e.g. `Authorization: Bearer <token>`
The JWT token can be fetched from k8s secret (by default `arangodb-operator-api-jwt`). The token is generated automatically
on operator startup using the signing key specified in `arangodb-operator-api-jwt-key` secret. If it is empty or not exists,
the signing key will be auto-generated and saved into secret. You can specify other signing key using `--api.jwt-key-secret-name` CLI option.
## HTTP
The HTTP API is running at endpoint specified by operator command line options `--api.http-port` (8628 by default).
The HTTP API exposes endpoints used to get operator health and readiness status, operator version, and prometheus-compatible metrics.
For now only `/metrics` endpoint require authorization.
## gRPC
The gRPC API is running at endpoint specified by operator command line options `--api.grpc-port` (8728 by default).
The gRPC API is exposed to allow programmatic access to some operator features and status.
gRPC protobuf definitions and go-client can be found at `github.com/kube-arangodb/pkg/api/server` package.
All gRPC requests require per-RPC metadata set to contain a valid Authorization header.

View file

@ -0,0 +1,18 @@
# Configuring timezone
To set timezone for cluster components, mount the required timezone into container
by adjusting `spec.<group>` of ArangoDeployment resource:
```yaml
dbservers:
volumeMounts:
- mountPath: /etc/localtime
name: timezone
volumes:
- hostPath:
path: /usr/share/zoneinfo/Europe/Warsaw
type: File
name: timezone
```
If `/usr/share/zoneinfo` is not present on your host your probably have to install `tzdata` package.

View file

@ -28,7 +28,7 @@ In default mode metrics provided by ArangoDB `_admin/metrics` (<=3.7) or `_admin
There are several ways to configure Prometheus to fetch metrics from the ArangoDB Exporter.
Below you're find a sample Prometheus configuration file that can be used to fetch
Below you will find a sample Prometheus configuration file that can be used to fetch
metrics from an ArangoDB exporter listening on localhost port 9101 (without TLS).
```yaml

View file

@ -1,12 +1,147 @@
# Metrics
TODO:
Operator provides metrics of its operations in a format supported by [Prometheus](https://prometheus.io/).
- Investigate prometheus annotations wrt metrics
- see https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus-kubernetes.yml
- `prometheus.io/scrape`: Only scrape services that have a value of `true`
- `prometheus.io/scheme`: If the metrics endpoint is secured then you will need
- `prometheus.io/path`: If the metrics path is not `/metrics` override this.
- `prometheus.io/port`: If the metrics are exposed on a different port to the
The metrics are exposed through HTTPS on port `8528` under path `/metrics`.
- Add prometheus compatible `/metrics` endpoint to `arangod`
For a full list of available metrics, see [here](./../generated/metrics/README.md).
#### Contents
- [Integration with standard Prometheus installation (no TLS)](#Integration-with-standard-Prometheus-installation-no-TLS)
- [Integration with standard Prometheus installation (TLS)](#Integration-with-standard-Prometheus-installation-TLS)
- [Integration with Prometheus Operator](#Integration-with-Prometheus-Operator)
- [Exposing ArangoDB metrics](#ArangoDB-metrics)
## Integration with standard Prometheus installation (no TLS)
After creating operator deployment, you must configure Prometheus using a configuration file that instructs it
about which targets to scrape.
To do so, add a new scrape job to your prometheus.yaml config:
```yaml
scrape_configs:
- job_name: 'arangodb-operator'
scrape_interval: 10s # scrape every 10 seconds.
scheme: 'https'
tls_config:
insecure_skip_verify: true
static_configs:
- targets:
- "<operator-endpoint-ip>:8528"
```
## Integration with standard Prometheus installation (TLS)
By default, the operator uses self-signed certificate for its server API.
To use your own certificate, you need to create k8s secret containing certificate and provide secret name to operator.
Create k8s secret (in same namespace where the operator is running):
```shell
kubectl create secret tls my-own-certificate --cert ./cert.crt --key ./cert.key
```
Then edit the operator deployment definition (`kubectl edit deployments.apps`) to use your secret for its server API:
```
spec:
# ...
containers:
# ...
args:
- --server.tls-secret-name=my-own-certificate
# ...
```
Wait for operator pods to restart.
Now update Prometheus config to use your certificate for operator scrape job:
```yaml
tls_config:
# if you are using self-signed certificate, just specify CA certificate:
ca_file: /etc/prometheus/rootCA.crt
# otherwise, specify the generated client certificate and key:
cert_file: /etc/prometheus/cert.crt
key_file: /etc/prometheus/cert.key
```
## Integration with Prometheus Operator
Assuming that you have [Prometheus Operator](https://prometheus-operator.dev/) installed in your cluster (`monitoring` namespace),
and kube-arangodb installed in `default` namespace, you can easily configure the integration with ArangoDB operator.
The easiest way to do that is to create new a ServiceMonitor:
```yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: arango-deployment-operator
namespace: monitoring
labels:
prometheus: kube-prometheus
spec:
selector:
matchLabels:
app.kubernetes.io/name: kube-arangodb
namespaceSelector:
matchNames:
- default
endpoints:
- port: server
scheme: https
tlsConfig:
insecureSkipVerify: true
```
You also can see the example of Grafana dashboard at `examples/metrics` folder of this repo.
## ArangoDB metrics
The operator can run sidecar containers for ArangoDB deployments of type `Cluster` which expose metrics in Prometheus format.
Edit your `ArangoDeployment` resource, setting `spec.metrics.enabled` to true to enable ArangoDB metrics:
```yaml
spec:
metrics:
enabled: true
```
The operator will run a sidecar container for every cluster component.
In addition to the sidecar containers the operator will deploy a `Service` to access the exporter ports (from within the k8s cluster),
and a resource of type `ServiceMonitor`, provided the corresponding custom resource definition is deployed in the k8s cluster.
If you are running Prometheus in the same k8s cluster with the Prometheus operator, this will be the case.
The ServiceMonitor will have the following labels set:
```yaml
app: arangodb
arango_deployment: YOUR_DEPLOYMENT_NAME
context: metrics
metrics: prometheus
```
This makes it possible to configure your Prometheus deployment to automatically start monitoring on the available Prometheus feeds.
To this end, you must configure the `serviceMonitorSelector` in the specs of your Prometheus deployment to match these labels. For example:
```yaml
serviceMonitorSelector:
matchLabels:
metrics: prometheus
```
would automatically select all pods of all ArangoDB cluster deployments which have metrics enabled.
By default, the sidecar metrics exporters are using TLS for all connections. You can disable the TLS by specifying
```yaml
spec:
metrics:
enabled: true
tls: false
```
You can fine-tune the monitored metrics by specifying `ArangoDeployment` annotations. Example:
```yaml
spec:
annotations:
prometheus.io/scrape: 'true'
prometheus.io/port: '9101'
prometheus.io/scrape_interval: '5s'
```
See the [list of exposed ArangoDB metrics](https://www.arangodb.com/docs/stable/http/administration-and-monitoring-metrics.html#list-of-exposed-metrics)

View file

@ -0,0 +1,198 @@
# Topology awareness
## Table of contents
1. [Overview](#1)
2. [Requirements](#2)
3. [Enable/Disable topology](#3)
4. [Check topology](#4)
## Overview <a name="1"></a>
Topology awareness is responsible for the even distribution of groups of pods across nodes in the cluster.
A distribution should be done by the zone, so thanks to that if one of the zone fails there are other working pods
in different zones. For the time being, there are 3 groups of pods that can be distributed evenly
(coordinators, agents, DB servers). For each of these groups, the Kube-ArangoDB operator
tries to distribute them in different zones in a cluster, so there can not
be a situation where many pods of the same group exist in one zone and there are no
pods in other zones. It would lead to many issues when a zone with many pods failed.
When Kube-ArangoDB operator is going to add a new pod, but all zones already contain a pod of this group,
it will choose the zone with the fewest number of pods of this group.
#### Example
Let's say we have two zones (uswest-1, uswest-2) and we would like to distribute ArangoDB cluster
with 3 coordinators, 3 agents, and 3 DB servers. First coordinator, agent, and DB server would go to random zone (e.g. uswest-1).
Second coordinator must be assigned to the `uswest-2` zone, because the zone `uswest-1` already contains one coordinator.
The same happens for the second agent and the second DB server. Third coordinator can be placed randomly
because each of the zone contains exactly one coordinator, so after this operation one of the zone should have 2 coordinators
and second zone should have 1 coordinator. The same applies to agents and DB servers.
According to the above example we can see that:
- coordinators should not be assigned to the same zone with other coordinators, unless ALL zones contain coordinators.
- agents should not be placed in the same zone with other agents, unless ALL zones contain agents.
- DB servers should not be placed in the same zone with other DB servers, unless ALL zones contain DB servers.
## Requirements <a name="2"></a>
- It does not work in a `Single` mode of a deployment.
The `spec.mode` of the Kubernetes resource ArangoDeployment can not be set to `Single`.
- Kube-ArangoDB version should be at least 1.2.10 and enterprise version.
## How to enable/disable topology awareness for the ArangoDeployment <a name="3"></a>
Enable topology:
```yaml
spec:
topology:
enabled: true
label: string # A node's label which will be considered as distribution affinity. By default: 'topology.kubernetes.io/zone'
zones: int # How many zones will be used to assign pods there. It must be higher than 0.
```
Disable topology:
```yaml
spec:
topology:
enable: false
```
or remove `spec.topology` object.
## How to check which ArangoDB members are assigned to the topology <a name="4"></a>
#### Topology aware
Each member should be topology aware, and it can be checked in list of conditions here `status.members.[agents|coordinators|dbservers].conditions`.
Example:
```yaml
status:
...
members:
agents:
- conditions:
reason: Topology awareness enabled
status: True
type: TopologyAware
```
If `status` for the condition's type `TopologyAware` is set to `false` then it is required to replace ArangoDB member.
To do so we need to set pod's annotation `deployment.arangodb.com/replace` to `true`, starting from all
coordinators which are not assigned to any zone. This situation usually happens when
topology was enabled on an existing ArangoDeployment resource.
#### Member topology
Each member's status should have topology, and it can be checked here `status.members.[agents|coordinators|dbservers].topology` and here `status.topology`.
Example:
```yaml
status:
...
members:
agents:
- id: AGNT-2shphs7a
topology:
id: 35a61527-9d2b-49df-8a31-e62417fcd7e6
label: eu-central-1c
rack: 0
...
topology:
id: 35a61527-9d2b-49df-8a31-e62417fcd7e6
label: topology.kubernetes.io/zone
size: 3
zones:
- id: 0
labels:
- eu-central-1c
members:
agnt:
- AGNT-2shphs7a
...
- ...
...
```
which means that `AGNT-2shphs7a` is assigned to `eu-central-1c`.
#### Pod's labels
A pod which belongs to the member should have two new labels.
Example:
```yaml
apiVersion: v1
kind: Pod
metadata:
labels:
deployment.arangodb.com/topology: 35a61527-9d2b-49df-8a31-e62417fcd7e6
deployment.arangodb.com/zone: "0"
```
#### Pod anti-affinity
A pod which belongs to the member should have a new pod anti affinity rules.
Example:
```yaml
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: deployment.arangodb.com/topology
operator: In
values:
- 35a61527-9d2b-49df-8a31-e62417fcd7e6
- ...
- key: deployment.arangodb.com/zone
operator: In
values:
- "1"
- "2"
- ...
topologyKey: topology.kubernetes.io/zone
- ...
```
which means that pod can not be assigned to zone `1` and `2`.
#### Node affinity
A pod which belongs to the member can have a node affinity rules. If a pod does not have it then it will have pod affinities.
Example:
```yaml
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- eu-central-1c
- ...
- matchExpressions:
- key: topology.kubernetes.io/zone
operator: NotIn
values:
- eu-central-1a
- eu-central-1b
- ...
```
#### Pod affinity
A pod which belongs to the member can have a pod affinity rules. If a pod does not have it then it will have node affinity.
Example:
```yaml
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: deployment.arangodb.com/topology
operator: In
values:
- 35a61527-9d2b-49df-8a31-e62417fcd7e6
- key: deployment.arangodb.com/zone
operator: In
values:
- "1"
- ...
topologyKey: topology.kubernetes.io/zone
```

View file

@ -0,0 +1,27 @@
# ArangoDB Operator Metrics
## List
| Name | Namespace | Group | Type | Description |
|:-------------------------------------------------------------------------------------------------------------------------------------:|:-----------------:|:------------:|:-------:|:--------------------------------------------------------------------------------------|
| [arangodb_operator_agency_errors](./arangodb_operator_agency_errors.md) | arangodb_operator | agency | Counter | Current count of agency cache fetch errors |
| [arangodb_operator_agency_fetches](./arangodb_operator_agency_fetches.md) | arangodb_operator | agency | Counter | Current count of agency cache fetches |
| [arangodb_operator_agency_index](./arangodb_operator_agency_index.md) | arangodb_operator | agency | Gauge | Current index of the agency cache |
| [arangodb_operator_agency_cache_health_present](./arangodb_operator_agency_cache_health_present.md) | arangodb_operator | agency_cache | Gauge | Determines if local agency cache health is present |
| [arangodb_operator_agency_cache_healthy](./arangodb_operator_agency_cache_healthy.md) | arangodb_operator | agency_cache | Gauge | Determines if agency is healthy |
| [arangodb_operator_agency_cache_leaders](./arangodb_operator_agency_cache_leaders.md) | arangodb_operator | agency_cache | Gauge | Determines agency leader vote count |
| [arangodb_operator_agency_cache_member_commit_offset](./arangodb_operator_agency_cache_member_commit_offset.md) | arangodb_operator | agency_cache | Gauge | Determines agency member commit offset |
| [arangodb_operator_agency_cache_member_serving](./arangodb_operator_agency_cache_member_serving.md) | arangodb_operator | agency_cache | Gauge | Determines if agency member is reachable |
| [arangodb_operator_agency_cache_present](./arangodb_operator_agency_cache_present.md) | arangodb_operator | agency_cache | Gauge | Determines if local agency cache is present |
| [arangodb_operator_agency_cache_serving](./arangodb_operator_agency_cache_serving.md) | arangodb_operator | agency_cache | Gauge | Determines if agency is serving |
| [arangodb_operator_engine_panics_recovered](./arangodb_operator_engine_panics_recovered.md) | arangodb_operator | engine | Counter | Number of Panics recovered inside Operator reconciliation loop |
| [arangodb_operator_members_unexpected_container_exit_codes](./arangodb_operator_members_unexpected_container_exit_codes.md) | arangodb_operator | members | Counter | Counter of unexpected restarts in pod (Containers/InitContainers/EphemeralContainers) |
| [arangodb_operator_rebalancer_enabled](./arangodb_operator_rebalancer_enabled.md) | arangodb_operator | rebalancer | Gauge | Determines if rebalancer is enabled |
| [arangodb_operator_rebalancer_moves_current](./arangodb_operator_rebalancer_moves_current.md) | arangodb_operator | rebalancer | Gauge | Define how many moves are currently in progress |
| [arangodb_operator_rebalancer_moves_failed](./arangodb_operator_rebalancer_moves_failed.md) | arangodb_operator | rebalancer | Counter | Define how many moves failed |
| [arangodb_operator_rebalancer_moves_generated](./arangodb_operator_rebalancer_moves_generated.md) | arangodb_operator | rebalancer | Counter | Define how many moves were generated |
| [arangodb_operator_rebalancer_moves_succeeded](./arangodb_operator_rebalancer_moves_succeeded.md) | arangodb_operator | rebalancer | Counter | Define how many moves succeeded |
| [arangodb_operator_resources_arangodeployment_accepted](./arangodb_operator_resources_arangodeployment_accepted.md) | arangodb_operator | resources | Gauge | Defines if ArangoDeployment has been accepted |
| [arangodb_operator_resources_arangodeployment_immutable_errors](./arangodb_operator_resources_arangodeployment_immutable_errors.md) | arangodb_operator | resources | Counter | Counter for deployment immutable errors |
| [arangodb_operator_resources_arangodeployment_uptodate](./arangodb_operator_resources_arangodeployment_uptodate.md) | arangodb_operator | resources | Gauge | Defines if ArangoDeployment is uptodate |
| [arangodb_operator_resources_arangodeployment_validation_errors](./arangodb_operator_resources_arangodeployment_validation_errors.md) | arangodb_operator | resources | Counter | Counter for deployment validation errors |

View file

@ -0,0 +1,12 @@
# arangodb_operator_agency_cache_health_present (Gauge)
## Description
Determines if local agency cache health is present
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |

View file

@ -0,0 +1,12 @@
# arangodb_operator_agency_cache_healthy (Gauge)
## Description
Determines if agency is healthy
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |

View file

@ -0,0 +1,13 @@
# arangodb_operator_agency_cache_leaders (Gauge)
## Description
Determines agency leader vote count. Should be always one
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |
| agent | Agent ID |

View file

@ -0,0 +1,13 @@
# arangodb_operator_agency_cache_member_commit_offset (Gauge)
## Description
Determines agency member commit offset. Set to -1 if Agent is not reachable
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |
| agent | Agent ID |

View file

@ -0,0 +1,13 @@
# arangodb_operator_agency_cache_member_serving (Gauge)
## Description
Determines if agency member is reachable
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |
| agent | Agent ID |

View file

@ -0,0 +1,12 @@
# arangodb_operator_agency_cache_present (Gauge)
## Description
Determines if local agency cache is present
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |

View file

@ -0,0 +1,12 @@
# arangodb_operator_agency_cache_serving (Gauge)
## Description
Determines if agency is serving
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |

View file

@ -0,0 +1,12 @@
# arangodb_operator_agency_errors (Counter)
## Description
Current count of agency cache fetch errors
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |

View file

@ -0,0 +1,12 @@
# arangodb_operator_agency_fetches (Counter)
## Description
Current count of agency cache fetches
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |

View file

@ -0,0 +1,12 @@
# arangodb_operator_agency_index (Gauge)
## Description
Current index of the agency cache
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |

View file

@ -0,0 +1,11 @@
# arangodb_operator_engine_panics_recovered (Counter)
## Description
Number of Panics recovered inside Operator reconciliation loop. Section represents recovery section
## Labels
| Label | Description |
|:-------:|:--------------|
| section | Panic Section |

View file

@ -0,0 +1,13 @@
# arangodb_operator_kubernetes_events_created (Counter)
## Description
Counter for created events
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |
| eventType | Event Type |

View file

@ -0,0 +1,16 @@
# arangodb_operator_members_unexpected_container_exit_codes (Counter)
## Description
Counter of unexpected restarts in pod (Containers/InitContainers/EphemeralContainers)
## Labels
| Label | Description |
|:--------------:|:-------------------------------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |
| member | Member ID |
| container | Container Name |
| container_type | Container/InitContainer/EphemeralContainer |
| code | ExitCode |

View file

@ -0,0 +1,12 @@
# arangodb_operator_rebalancer_enabled (Gauge)
## Description
Determines if rebalancer is enabled
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |

View file

@ -0,0 +1,12 @@
# arangodb_operator_rebalancer_moves_current (Gauge)
## Description
Define how many moves are currently in progress
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |

View file

@ -0,0 +1,12 @@
# arangodb_operator_rebalancer_moves_failed (Counter)
## Description
Define how many moves failed
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |

View file

@ -0,0 +1,12 @@
# arangodb_operator_rebalancer_moves_generated (Counter)
## Description
Define how many moves were generated
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |

View file

@ -0,0 +1,12 @@
# arangodb_operator_rebalancer_moves_succeeded (Counter)
## Description
Define how many moves succeeded
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |

View file

@ -0,0 +1,12 @@
# arangodb_operator_resources_arangodeployment_accepted (Gauge)
## Description
Defines if ArangoDeployment has been accepted
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |

View file

@ -0,0 +1,12 @@
# arangodb_operator_resources_arangodeployment_immutable_errors (Counter)
## Description
Counter for deployment immutable errors
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |

View file

@ -0,0 +1,12 @@
# arangodb_operator_resources_arangodeployment_uptodate (Gauge)
## Description
Defines if ArangoDeployment is uptodate
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |

View file

@ -0,0 +1,12 @@
# arangodb_operator_resources_arangodeployment_validation_errors (Counter)
## Description
Counter for deployment validation errors
## Labels
| Label | Description |
|:---------:|:---------------------|
| namespace | Deployment Namespace |
| name | Deployment Name |

View file

@ -11,7 +11,7 @@ metadata:
spec:
selector:
matchLabels:
app: arango-deployment-operator
app.kubernetes.io/name: kube-arangodb
namespaceSelector:
matchNames:
- default

View file

@ -6,7 +6,7 @@ spec:
restartPolicy: Never
serviceAccountName: arango-deployment-operator-reboot
containers:
- image: arangodb/kube-arangodb:1.2.12
- image: arangodb/kube-arangodb:1.2.15
name: reboot
command: ["arangodb_operator", "reboot"]
args:

15
go.mod
View file

@ -30,7 +30,6 @@ require (
github.com/arangodb/go-upgrade-rules v0.0.0-20180809110947-031b4774ff21
github.com/cenkalti/backoff v2.2.1+incompatible
github.com/dchest/uniuri v0.0.0-20160212164326-8902c56451e9
github.com/ghodss/yaml v1.0.0
github.com/gin-gonic/gin v1.7.2
github.com/golang-jwt/jwt v3.2.2+incompatible
github.com/jessevdk/go-assets v0.0.0-20160921144138-4f4301a06e15
@ -46,7 +45,11 @@ require (
github.com/spf13/cobra v1.2.1
github.com/spf13/pflag v1.0.5
github.com/stretchr/testify v1.7.0
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c
google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad // indirect
google.golang.org/grpc v1.47.0
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
k8s.io/api v0.21.10
k8s.io/apiextensions-apiserver v0.18.3
k8s.io/apimachinery v0.21.10
@ -68,16 +71,13 @@ require (
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/addlicense v0.0.0-20210428195630-6d92264d7170 // indirect
github.com/google/go-cmp v0.5.5 // indirect
github.com/google/go-cmp v0.5.6 // indirect
github.com/google/gofuzz v1.1.0 // indirect
github.com/google/uuid v1.1.2 // indirect
github.com/googleapis/gnostic v0.4.1 // indirect
github.com/hashicorp/golang-lru v0.5.3 // indirect
github.com/imdario/mergo v0.3.5 // indirect
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/jessevdk/go-assets-builder v0.0.0-20130903091706-b8483521738f // indirect
github.com/jessevdk/go-flags v1.5.0 // indirect
github.com/json-iterator/go v1.1.11 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/mattn/go-isatty v0.0.13 // indirect
@ -97,14 +97,13 @@ require (
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect
golang.org/x/text v0.3.6 // indirect
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.27.1 // indirect
google.golang.org/protobuf v1.28.0
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
k8s.io/klog/v2 v2.9.0 // indirect
k8s.io/kube-openapi v0.0.0-20211110012726-3cc51fd1e909 // indirect
k8s.io/utils v0.0.0-20210521133846-da695404a2bc // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
sigs.k8s.io/yaml v1.2.0 // indirect
sigs.k8s.io/yaml v1.2.0
)

216
go.sum
View file

@ -6,7 +6,6 @@ cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxK
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.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw=
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=
@ -39,39 +38,29 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX
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/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630=
github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q=
github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g=
github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw=
github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A=
github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
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/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
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/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/arangodb-helper/go-certificates v0.0.0-20180821055445-9fca24fc2680 h1:5YCGq0gkf/sCEkDFIsMBPj59GOm5cMibGqDBH2OWWfQ=
github.com/arangodb-helper/go-certificates v0.0.0-20180821055445-9fca24fc2680/go.mod h1:xDyzBwyYzcEhsaDXtmxCNM4p5BrtuoVYYsRTuJqmCeg=
github.com/arangodb/arangosync-client v0.7.0 h1:3vLOVnMyr5vGlPA0OHxJL9Wyy49JJwN0uBYU1HDk0qk=
github.com/arangodb/arangosync-client v0.7.0/go.mod h1:g+JcxH3C63wKaJPnPr9nggYoGbt/bYCWpfcRG0NSodY=
github.com/arangodb/go-driver v0.0.0-20210621075908-e7a6fa0cbd18 h1:3J0tqp5eQ8ptGOeeu7vo92RKf24bOA7MFy0z3uPiTWg=
github.com/arangodb/go-driver v0.0.0-20210621075908-e7a6fa0cbd18/go.mod h1:3NUekcRLpgheFIGEwcOvxilEW73MV1queNKW58k7sdc=
github.com/arangodb/go-driver v1.2.1 h1:HREDHhDmzdIWxHmfkfTESbYUnRjESjPh4WUuXq7FZa8=
github.com/arangodb/go-driver v1.2.1/go.mod h1:zdDkJJnCj8DAkfbtIjIXnsTrWIiy6VhP3Vy14p+uQeY=
github.com/arangodb/go-driver/v2 v2.0.0-20211021031401-d92dcd5a4c83 h1:PCbi3alUFastUw6InBKGEXqniveJJcQuMYspubJMRS8=
@ -83,18 +72,17 @@ github.com/arangodb/go-velocypack v0.0.0-20200318135517-5af53c29c67e/go.mod h1:m
github.com/arangodb/rebalancer v0.1.1 h1:8MikmxlhywKnw/wiDqctD8FFwBZhAAF1E3mIqh8nzCA=
github.com/arangodb/rebalancer v0.1.1/go.mod h1:wLvglmYNuoTUYbLQq/UESIMVkINmSX9eZWC5QB9kNyk=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@ -109,9 +97,13 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-iptables v0.4.3/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU=
github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
@ -123,17 +115,15 @@ github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfc
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/creack/pty v1.1.11/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/dchest/uniuri v0.0.0-20160212164326-8902c56451e9 h1:74lLNRzvsdIlkTgfDSMuaPjBr4cf6k7pwQQANm/yLKU=
github.com/dchest/uniuri v0.0.0-20160212164326-8902c56451e9/go.mod h1:GgB8SF9nRG+GqaDtLcwJZsQFhcogVCJ79j4EdT0c2V4=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
@ -146,21 +136,19 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses=
github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.7.2 h1:Tg03T9yM2xa8j6I3Z3oqLaQRSmKvxPd6g/2HJ6zICFA=
github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
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=
@ -169,53 +157,17 @@ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
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-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY=
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc=
github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=
github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU=
github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg=
github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs=
github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk=
github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA=
github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64=
github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4=
github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY=
github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY=
github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4=
github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA=
github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4=
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
@ -229,19 +181,15 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@ -271,9 +219,6 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS
github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/addlicense v0.0.0-20200817051935-6f4cd4aacc89/go.mod h1:EMjYTRimagHs1FwlIqKyX3wAM0u3rA+McvlIIWmSamA=
github.com/google/addlicense v0.0.0-20210428195630-6d92264d7170 h1:jLUa4MO3autxlRJmC4KubeE5QGIb5JqW9oEaqYTb/fA=
github.com/google/addlicense v0.0.0-20210428195630-6d92264d7170/go.mod h1:EMjYTRimagHs1FwlIqKyX3wAM0u3rA+McvlIIWmSamA=
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/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@ -286,8 +231,9 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.3/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 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
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=
@ -307,7 +253,6 @@ github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLe
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
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=
@ -317,7 +262,7 @@ github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyyc
github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
@ -357,10 +302,6 @@ github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NH
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jessevdk/go-assets v0.0.0-20160921144138-4f4301a06e15 h1:cW/amwGEJK5MSKntPXRjX4dxs/nGxGT8gXKIsKFmHGc=
github.com/jessevdk/go-assets v0.0.0-20160921144138-4f4301a06e15/go.mod h1:Fdm/oWRW+CH8PRbLntksCNtmcCBximKPkVQYvmMl80k=
github.com/jessevdk/go-assets-builder v0.0.0-20130903091706-b8483521738f h1:K2zqtTU3T3ZX/vVeFtJ1OoxEm+gsLhu3zQ34tKgOAyk=
github.com/jessevdk/go-assets-builder v0.0.0-20130903091706-b8483521738f/go.mod h1:GjkD6wGIxVEccQ4pa27Ebe00zAi1EEpAcL6rL0ADvwU=
github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc=
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
@ -375,30 +316,24 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V
github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U=
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
github.com/kisielk/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/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
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 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
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/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
@ -422,7 +357,8 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo=
github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc=
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=
@ -433,6 +369,8 @@ github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8m
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/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
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/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@ -446,7 +384,6 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pavel-v-chernykh/keystore-go v2.1.0+incompatible h1:Jd6xfriVlJ6hWPvYOE0Ni0QWcNTLRehfGPFxr3eSL80=
github.com/pavel-v-chernykh/keystore-go v2.1.0+incompatible/go.mod h1:xlUlxe/2ItGlQyMTstqeDv9r3U4obH7xYd26TbDQutY=
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
@ -481,7 +418,6 @@ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB8
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4=
github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
@ -497,11 +433,10 @@ github.com/rs/zerolog v1.19.0/go.mod h1:IzD0RJ65iWH0w97OQQebJEvTZYvsCUm9WVLWBQrJ
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
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/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
@ -512,8 +447,7 @@ github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8=
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw=
github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
@ -523,7 +457,7 @@ github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
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=
@ -532,7 +466,6 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH
github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/ugorji/go v0.0.0-20181209151446-772ced7fd4c2 h1:c3hsfAKt9dRzwckD9YqrACtMWPmjXSf+eocCfhoYdU8=
@ -541,25 +474,19 @@ github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLY
github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ=
github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
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=
github.com/yuin/goldmark v1.3.3/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8=
go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg=
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
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=
@ -567,6 +494,7 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
@ -577,15 +505,14 @@ go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/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-20190320223903-b7391e95e576/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-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@ -620,14 +547,13 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB
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/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
golang.org/x/mod v0.4.2/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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/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-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@ -635,11 +561,9 @@ golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73r
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-20190320064053-1272bf9dcd53/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-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
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=
@ -668,14 +592,12 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20211209124913-491a49abca63 h1:iocB37TsdFuN6IBRZ+ry36wrkoV51/tl5vOWqkcPGvY=
golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
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 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs=
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-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
@ -696,8 +618,9 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ
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/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8=
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@ -707,7 +630,6 @@ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5h
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-20190321052220-f7bb7a8bee54/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=
@ -719,6 +641,7 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/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=
@ -737,9 +660,9 @@ golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7w
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-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -750,11 +673,13 @@ golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/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-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE=
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@ -770,16 +695,12 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE=
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/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-20190125232054-d66bd3c5d5a6/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=
@ -790,7 +711,6 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn
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-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190617190820-da514acc4774/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-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
@ -818,14 +738,13 @@ golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjs
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-20200505023115-26f46d2f7ef8/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-20200616133436-c1934b75d054/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-20200818005847-188abfa75333/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
@ -834,8 +753,6 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.1-0.20210504181558-0bb7e5c47b1a h1:xiJ7cj6CCsHjXZvlwLWEB1qwiw7jA7iWBzOLnkHM52c=
golang.org/x/tools v0.1.1-0.20210504181558-0bb7e5c47b1a/go.mod h1:sH/Eidr0EddymY8HZSakBo32zU3fG5ovDq874hJLjVg=
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
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=
@ -868,7 +785,6 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl
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 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM=
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=
@ -905,6 +821,7 @@ google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6D
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
@ -914,9 +831,10 @@ google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6D
google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad h1:kqrS+lhvaMHCxul6sKQvKJ8nAAhlVItmZV822hYFH/U=
google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
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.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
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=
@ -935,6 +853,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8=
google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
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=
@ -947,19 +867,22 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
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.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
google.golang.org/protobuf v1.28.0/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 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
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/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
@ -975,9 +898,10 @@ 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.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=
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=
@ -985,47 +909,33 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
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.19.8 h1:U50vBUCb5kc2J483mnITLKfdyoITaC7PnaOJwT7oRRM=
k8s.io/api v0.19.8/go.mod h1:9TMGoKoidvicOK0LSqj+Mj98pugQycbViPKyZHqutBc=
k8s.io/api v0.21.10 h1:WKcYyNBZNMrE9yejBs0Lx70jGsOW8uUwkiA4ioxkz1Q=
k8s.io/api v0.21.10/go.mod h1:5kqv2pCXwcrOvV12WhVAtLZUKaM0kyrZ6nHObw8SojA=
k8s.io/apiextensions-apiserver v0.19.8 h1:3Vb4N/QUoUmD5l+qB/N4rS1q+miNBOyFGf2U1iNuas0=
k8s.io/apiextensions-apiserver v0.19.8/go.mod h1:NX3bMN7hJgtV2ViTgEySaZElHdrqyF9vw8EpkQTmqD0=
k8s.io/apiextensions-apiserver v0.21.10 h1:61ymf3Yw6dadgfUbWCEVud5j6l9rme8ocy6jJbuFK04=
k8s.io/apiextensions-apiserver v0.21.10/go.mod h1:Uu9eBo+d489/K5pauF1oLaVxQzgvdng6aIb2LRlT/w8=
k8s.io/apimachinery v0.19.8 h1:MaehcNcx8brsgvMsqspcI0bi22E1np/DACnjf2mhJ5A=
k8s.io/apimachinery v0.19.8/go.mod h1:6sRbGRAVY5DOCuZwB5XkqguBqpqLU6q/kOaOdk29z6Q=
k8s.io/apimachinery v0.21.10 h1:mOStSZoCrsxnAMIm5UtCNn6P328cJAhtzJToQYFsylc=
k8s.io/apimachinery v0.21.10/go.mod h1:USs+ifLG6ZUgHGA/9lGxjdHzCB3hUO3fG1VBOwi0IHo=
k8s.io/apiserver v0.19.8/go.mod h1:+OJE9rJCT99Qr9DYITQDCKDLxFLVi5zA8nI9KqjGshk=
k8s.io/client-go v0.19.8 h1:rcb2BrXb1HUBiBCoP3m/9Q2VZIMWhZUAmH49EmAyRUA=
k8s.io/client-go v0.19.8/go.mod h1:5Op2bSbK+COBz8mwH62rrRgqhA9wOcORkWZ03+GL0Ow=
k8s.io/apiserver v0.21.10/go.mod h1:dMEmFJ//OIDnnWmjcpVq+XkKQubRY1rAm5as7MwbIWQ=
k8s.io/client-go v0.21.10 h1:/AKJEgLpQDWvZbq7cq2vEx0bpqpAlOOHitOrctSV8bI=
k8s.io/client-go v0.21.10/go.mod h1:nAGhVCjwhbDP2whk65n3STSCn24H/VGp1pKSk9UszU8=
k8s.io/component-base v0.19.8/go.mod h1:cvHAT4oGxKsfcnnm0hMp3JkEMxAt5s6le943V796FXM=
k8s.io/component-base v0.21.10/go.mod h1:zO/BjKH/RR6DoZEQAws7m+Q81pYZ+f5vDfujDqvWdlA=
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A=
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
k8s.io/klog/v2 v2.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM=
k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6 h1:+WnxoVtG8TMiudHBSEtrVL1egv36TkkJm+bA8AxicmQ=
k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
k8s.io/kube-openapi v0.0.0-20211110012726-3cc51fd1e909 h1:s77MRc/+/eQjsF89MB12JssAlsoi9mnNoaacRqibeAU=
k8s.io/kube-openapi v0.0.0-20211110012726-3cc51fd1e909/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE=
k8s.io/utils v0.0.0-20200729134348-d5654de09c73 h1:uJmqzgNWG7XyClnU/mLPBWwfKKF1K8Hf8whTseBgJcg=
k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
k8s.io/utils v0.0.0-20210521133846-da695404a2bc h1:dx6VGe+PnOW/kD/2UV4aUSsRfJGd7+lcqgJ6Xg0HwUs=
k8s.io/utils v0.0.0-20210521133846-da695404a2bc/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
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/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0=
sigs.k8s.io/structured-merge-diff/v4 v4.0.1 h1:YXTMot5Qz/X1iBRJhAt+vI+HVttY0WkSqqhKxQ0xVbA=
sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.27/go.mod h1:tq2nT0Kx7W+/f2JVE+zxYtUhdjuELJkVpNz+x/QN5R4=
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y=
sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=

76
internal/md/column.go Normal file
View file

@ -0,0 +1,76 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package md
import "k8s.io/apimachinery/pkg/util/uuid"
type ColumnAlign int
const (
ColumnRightAlign ColumnAlign = iota
ColumnCenterAlign
ColumnLeftAlign
)
type Columns []Column
func (c Columns) Get(id string) (Column, bool) {
for _, z := range c {
if z.ID() == id {
return z, true
}
}
return nil, false
}
type Column interface {
Name() string
Align() ColumnAlign
ID() string
}
func NewColumn(name string, align ColumnAlign) Column {
return column{
name: name,
id: string(uuid.NewUUID()),
align: align,
}
}
type column struct {
name string
id string
align ColumnAlign
}
func (c column) ID() string {
return c.id
}
func (c column) Name() string {
return c.name
}
func (c column) Align() ColumnAlign {
return c.align
}

View file

@ -17,3 +17,5 @@
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package md

145
internal/md/table.go Normal file
View file

@ -0,0 +1,145 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package md
import (
"sync"
"github.com/arangodb/kube-arangodb/pkg/util/errors"
)
func NewTable(columns ...Column) Table {
return &table{
columns: columns,
}
}
type Table interface {
Render() string
AddRow(in map[Column]string) error
}
type table struct {
lock sync.Mutex
columns Columns
rows []map[string]string
}
func (t *table) AddRow(in map[Column]string) error {
t.lock.Lock()
defer t.lock.Unlock()
r := map[string]string{}
for k, v := range in {
if _, ok := t.columns.Get(k.ID()); !ok {
return errors.Newf("Column not found")
}
r[k.ID()] = v
}
t.rows = append(t.rows, r)
return nil
}
func (t *table) fillString(base, filler string, align ColumnAlign, size int) string {
for len(base) < size {
switch align {
case ColumnLeftAlign:
base += filler
case ColumnRightAlign:
base = filler + base
case ColumnCenterAlign:
base += filler
if len(base) < size {
base = filler + base
}
}
}
return base
}
func (t *table) Render() string {
t.lock.Lock()
defer t.lock.Unlock()
ks := map[string]int{}
for _, c := range t.columns {
ks[c.ID()] = len(c.Name())
}
for _, r := range t.rows {
for _, c := range t.columns {
if q := len(r[c.ID()]); q > ks[c.ID()] {
ks[c.ID()] = q
}
}
}
buff := ""
buff += "|"
for _, c := range t.columns {
buff += " "
buff += t.fillString(c.Name(), " ", c.Align(), ks[c.ID()])
buff += " |"
}
buff += "\n|"
for _, c := range t.columns {
switch c.Align() {
case ColumnLeftAlign, ColumnCenterAlign:
buff += ":"
default:
buff += "-"
}
buff += t.fillString("", "-", ColumnLeftAlign, ks[c.ID()])
switch c.Align() {
case ColumnRightAlign, ColumnCenterAlign:
buff += ":"
default:
buff += "-"
}
buff += "|"
}
buff += "\n"
for _, r := range t.rows {
buff += "|"
for _, c := range t.columns {
buff += " "
buff += t.fillString(r[c.ID()], " ", c.Align(), ks[c.ID()])
buff += " |"
}
buff += "\n"
}
return buff
}

393
internal/metrics.go Normal file
View file

@ -0,0 +1,393 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package internal
import (
_ "embed"
"fmt"
"html/template"
"os"
"path"
"sort"
"strings"
"github.com/arangodb/kube-arangodb/internal/md"
)
//go:embed metrics.go.tmpl
var metricsGoTemplate []byte
//go:embed metrics.item.go.tmpl
var metricsItemGoTemplate []byte
//go:embed metrics.tmpl
var metricsTemplate []byte
//go:embed metrics.item.tmpl
var metricItemTemplate []byte
//go:embed metrics.yaml
var metricsData []byte
type MetricsDoc struct {
Destination string `json:"destination" yaml:"destination"`
Documentation string `json:"documentation" yaml:"documentation"`
Namespaces Namespaces `json:"namespaces" yaml:"namespaces"`
}
type Namespaces map[string]Groups
func (n Namespaces) Keys() []string {
r := make([]string, 0, len(n))
for k := range n {
r = append(r, k)
}
sort.Strings(r)
return r
}
type Groups map[string]Metrics
func (n Groups) Keys() []string {
r := make([]string, 0, len(n))
for k := range n {
r = append(r, k)
}
sort.Strings(r)
return r
}
type Metrics map[string]Metric
func (n Metrics) Keys() []string {
r := make([]string, 0, len(n))
for k := range n {
r = append(r, k)
}
sort.Strings(r)
return r
}
type Metric struct {
Description string `json:"description" yaml:"description"`
Type string `json:"type" yaml:"type"`
ShortDescription string `json:"shortDescription" yaml:"shortDescription"`
Labels []Label `json:"labels" yaml:"labels"`
AlertingRules []Alerting `json:"alertingRules" yaml:"alertingRules"`
}
type Alerting struct {
Priority string `json:"priority" yaml:"priority"`
Query string `json:"query" yaml:"query"`
Description string `json:"description" yaml:"description"`
}
type Label struct {
Key string `json:"key" yaml:"key"`
Description string `json:"description" yaml:"description"`
Type *string `json:"type" yaml:"type"`
}
func GenerateMetricsDocumentation(root string, in MetricsDoc) error {
docsRoot := path.Join(root, in.Documentation)
goFilesRoot := path.Join(root, in.Destination)
if _, err := os.Stat(docsRoot); err != nil {
if os.IsNotExist(err) {
if err := os.MkdirAll(docsRoot, 0755); err != nil {
return err
}
} else {
return err
}
}
if _, err := os.Stat(goFilesRoot); err != nil {
if os.IsNotExist(err) {
if err := os.MkdirAll(goFilesRoot, 0755); err != nil {
return err
}
} else {
return err
}
}
if err := generateMetricsREADME(docsRoot, in); err != nil {
return err
}
if err := generateMetricsGO(goFilesRoot, in); err != nil {
return err
}
return nil
}
func generateMetricFile(root, name string, m Metric) error {
key := md.NewColumn("Label", md.ColumnCenterAlign)
description := md.NewColumn("Description", md.ColumnLeftAlign)
priority := md.NewColumn("Priority", md.ColumnCenterAlign)
query := md.NewColumn("Query", md.ColumnCenterAlign)
t := md.NewTable(
key,
description,
)
for _, l := range m.Labels {
if err := t.AddRow(map[md.Column]string{
key: l.Key,
description: l.Description,
}); err != nil {
return err
}
}
ta := md.NewTable(
priority,
query,
description,
)
for _, l := range m.AlertingRules {
if err := ta.AddRow(map[md.Column]string{
priority: l.Priority,
query: l.Query,
description: l.Description,
}); err != nil {
return err
}
}
q, err := template.New("metrics").Parse(string(metricItemTemplate))
if err != nil {
return err
}
out, err := os.OpenFile(path.Join(root, fmt.Sprintf("%s.md", name)), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
if err != nil {
return err
}
if err := q.Execute(out, map[string]interface{}{
"name": name,
"type": m.Type,
"description": m.Description,
"labels_table": t.Render(),
"labels": len(m.Labels) > 0,
"alerting_table": ta.Render(),
"alerting": len(m.AlertingRules) > 0,
}); err != nil {
return err
}
if err := out.Close(); err != nil {
return err
}
return nil
}
func generateMetricsREADME(root string, in MetricsDoc) error {
name := md.NewColumn("Name", md.ColumnCenterAlign)
ns := md.NewColumn("Namespace", md.ColumnCenterAlign)
group := md.NewColumn("Group", md.ColumnCenterAlign)
typeCol := md.NewColumn("Type", md.ColumnCenterAlign)
description := md.NewColumn("Description", md.ColumnLeftAlign)
t := md.NewTable(
name,
ns,
group,
typeCol,
description,
)
for _, namespace := range in.Namespaces.Keys() {
for _, g := range in.Namespaces[namespace].Keys() {
for _, metric := range in.Namespaces[namespace][g].Keys() {
mname := fmt.Sprintf("%s_%s_%s", namespace, g, metric)
rname := fmt.Sprintf("[%s](./%s.md)", mname, mname)
details := in.Namespaces[namespace][g][metric]
if err := t.AddRow(map[md.Column]string{
name: rname,
ns: namespace,
group: g,
description: details.ShortDescription,
typeCol: details.Type,
}); err != nil {
return err
}
if err := generateMetricFile(root, mname, details); err != nil {
return err
}
}
}
}
table := t.Render()
q, err := template.New("metrics").Parse(string(metricsTemplate))
if err != nil {
return err
}
out, err := os.OpenFile(path.Join(root, "README.md"), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
if err != nil {
return err
}
if err := q.Execute(out, map[string]interface{}{
"table": table,
}); err != nil {
return err
}
if err := out.Close(); err != nil {
return err
}
return nil
}
func generateLabels(labels []Label) string {
if len(labels) == 0 {
return "nil"
}
parts := make([]string, len(labels))
for id := range labels {
parts[id] = fmt.Sprintf("`%s`", labels[id].Key)
}
return fmt.Sprintf("[]string{%s}", strings.Join(parts, ", "))
}
func generateMetricsGO(root string, in MetricsDoc) error {
i, err := template.New("metrics").Parse(string(metricsItemGoTemplate))
if err != nil {
return err
}
for _, namespace := range in.Namespaces.Keys() {
for _, g := range in.Namespaces[namespace].Keys() {
for _, metric := range in.Namespaces[namespace][g].Keys() {
details := in.Namespaces[namespace][g][metric]
mname := fmt.Sprintf("%s_%s_%s", namespace, g, metric)
out, err := os.OpenFile(path.Join(root, fmt.Sprintf("%s.go", mname)), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
if err != nil {
return err
}
parts := strings.Split(mname, "_")
tparts := strings.Split(strings.Title(strings.Join(parts, " ")), " ")
fnameParts := make([]string, len(parts))
for id := range parts {
if id == 0 {
fnameParts[id] = parts[id]
} else {
fnameParts[id] = tparts[id]
}
}
var keys []string
var params []string
params = append(params, "value float64")
keys = append(keys, "value")
for _, label := range details.Labels {
v := strings.Split(strings.ToLower(label.Key), "_")
for id := range v {
if id == 0 {
continue
}
v[id] = strings.Title(v[id])
}
k := strings.Join(v, "")
keys = append(keys, k)
if t := label.Type; t != nil {
params = append(params, fmt.Sprintf("%s %s", k, *t))
} else {
params = append(params, fmt.Sprintf("%s string", k))
}
}
if err := i.Execute(out, map[string]interface{}{
"name": mname,
"fname": strings.Join(fnameParts, ""),
"ename": strings.Join(tparts, ""),
"shortDescription": details.ShortDescription,
"labels": generateLabels(details.Labels),
"type": details.Type,
"fparams": strings.Join(params, ", "),
"fkeys": strings.Join(keys, ", "),
}); err != nil {
return err
}
if err := out.Close(); err != nil {
return err
}
}
}
}
out, err := os.OpenFile(path.Join(root, "metrics.go"), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
if err != nil {
return err
}
q, err := template.New("metrics").Parse(string(metricsGoTemplate))
if err != nil {
return err
}
if err := q.Execute(out, nil); err != nil {
return err
}
if err := out.Close(); err != nil {
return err
}
return nil
}

49
internal/metrics.go.tmpl Normal file
View file

@ -0,0 +1,49 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package metric_descriptions
import (
"sync"
"github.com/arangodb/kube-arangodb/pkg/util/metrics"
)
var (
descriptions []metrics.Description
descriptionsLock sync.Mutex
)
func registerDescription( d ... metrics.Description) {
if len(d) == 0 {
return
}
descriptionsLock.Lock()
defer descriptionsLock.Unlock()
descriptions = append(descriptions, d...)
}
func Descriptions (c metrics.PushDescription) {
descriptionsLock.Lock()
defer descriptionsLock.Unlock()
c.Push(descriptions...)
}

View file

@ -0,0 +1,39 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package metric_descriptions
import "github.com/arangodb/kube-arangodb/pkg/util/metrics"
var (
{{ .fname }} = metrics.NewDescription("{{ .name }}", "{{ .shortDescription }}", {{ .labels }}, nil)
)
func init() {
registerDescription({{ .fname }})
}
func {{ .ename }}() metrics.Description {
return {{ .fname }}
}
func {{ .ename }}{{ .type }}({{ .fparams }}) metrics.Metric {
return {{ .ename }}().Gauge({{ .fkeys }})
}

View file

@ -0,0 +1,19 @@
# {{ .name }} ({{ .type }})
## Description
{{ .description }}
{{ if .labels -}}
## Labels
{{ .labels_table }}
{{- end -}}
{{- if .alerting }}
## Alerting
{{ .alerting_table }}
{{- end -}}

5
internal/metrics.tmpl Normal file
View file

@ -0,0 +1,5 @@
# ArangoDB Operator Metrics
## List
{{ .table }}

215
internal/metrics.yaml Normal file
View file

@ -0,0 +1,215 @@
---
documentation: docs/generated/metrics
destination: pkg/generated/metric_descriptions
namespaces:
arangodb_operator:
agency_cache:
present:
shortDescription: "Determines if local agency cache is present"
description: "Determines if local agency cache is present"
type: "Gauge"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
health_present:
shortDescription: "Determines if local agency cache health is present"
description: "Determines if local agency cache health is present"
type: "Gauge"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
serving:
shortDescription: "Determines if agency is serving"
description: "Determines if agency is serving"
type: "Gauge"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
healthy:
shortDescription: "Determines if agency is healthy"
description: "Determines if agency is healthy"
type: "Gauge"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
member_serving:
shortDescription: "Determines if agency member is reachable"
description: "Determines if agency member is reachable"
type: "Gauge"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
- key: agent
description: "Agent ID"
member_commit_offset:
shortDescription: "Determines agency member commit offset"
description: "Determines agency member commit offset. Set to -1 if Agent is not reachable"
type: "Gauge"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
- key: agent
description: "Agent ID"
leaders:
shortDescription: "Determines agency leader vote count"
description: "Determines agency leader vote count. Should be always one"
type: "Gauge"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
- key: agent
description: "Agent ID"
agency:
index:
shortDescription: "Current index of the agency cache"
description: "Current index of the agency cache"
type: "Gauge"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
fetches:
shortDescription: "Current count of agency cache fetches"
description: "Current count of agency cache fetches"
type: "Counter"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
errors:
shortDescription: "Current count of agency cache fetch errors"
description: "Current count of agency cache fetch errors"
type: "Counter"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
rebalancer:
enabled:
shortDescription: "Determines if rebalancer is enabled"
description: "Determines if rebalancer is enabled"
type: "Gauge"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
moves_generated:
shortDescription: "Define how many moves were generated"
description: "Define how many moves were generated"
type: "Counter"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
moves_succeeded:
shortDescription: "Define how many moves succeeded"
description: "Define how many moves succeeded"
type: "Counter"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
moves_failed:
shortDescription: "Define how many moves failed"
description: "Define how many moves failed"
type: "Counter"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
moves_current:
shortDescription: "Define how many moves are currently in progress"
description: "Define how many moves are currently in progress"
type: "Gauge"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
resources:
arangodeployment_validation_errors:
shortDescription: "Counter for deployment validation errors"
description: "Counter for deployment validation errors"
type: "Counter"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
arangodeployment_immutable_errors:
shortDescription: "Counter for deployment immutable errors"
description: "Counter for deployment immutable errors"
type: "Counter"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
arangodeployment_accepted:
shortDescription: "Defines if ArangoDeployment has been accepted"
description: "Defines if ArangoDeployment has been accepted"
type: "Gauge"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
arangodeployment_uptodate:
shortDescription: "Defines if ArangoDeployment is uptodate"
description: "Defines if ArangoDeployment is uptodate"
type: "Gauge"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
members:
unexpected_container_exit_codes:
shortDescription: "Counter of unexpected restarts in pod (Containers/InitContainers/EphemeralContainers)"
description: "Counter of unexpected restarts in pod (Containers/InitContainers/EphemeralContainers)"
type: "Counter"
labels:
- key: namespace
description: "Deployment Namespace"
- key: name
description: "Deployment Name"
- key: member
description: "Member ID"
- key: container
description: "Container Name"
- key: container_type
description: "Container/InitContainer/EphemeralContainer"
- key: code
description: "ExitCode"
engine:
panics_recovered:
shortDescription: "Number of Panics recovered inside Operator reconciliation loop"
description: "Number of Panics recovered inside Operator reconciliation loop. Section represents recovery section"
type: "Counter"
labels:
- key: section
description: "Panic Section"

40
internal/metrics_test.go Normal file
View file

@ -0,0 +1,40 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package internal
import (
"os"
"testing"
"github.com/stretchr/testify/require"
"gopkg.in/yaml.v3"
)
func Test_GenerateMetricsDocumentation(t *testing.T) {
root := os.Getenv("ROOT")
require.NotEmpty(t, root)
var m MetricsDoc
require.NoError(t, yaml.Unmarshal(metricsData, &m))
require.NoError(t, GenerateMetricsDocumentation(root, m))
}

207
internal/timezones.go Normal file
View file

@ -0,0 +1,207 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package internal
import (
_ "embed"
"encoding/base64"
"fmt"
"io/ioutil"
"os"
"path"
"path/filepath"
"sort"
"strings"
"text/template"
"time"
)
//go:embed timezones.go.tmpl
var timezonesGoTemplate []byte
type Timezone struct {
Name string
Offset int64
Zone string
Parent string
}
type TimezoneData struct {
Name string
Data string
}
func RenderTimezones(root string) error {
rootPath := path.Join(root, "pkg", "generated", "timezones")
if _, err := os.Stat(rootPath); err != nil {
if os.IsNotExist(err) {
if err := os.MkdirAll(rootPath, 0755); err != nil {
return err
}
} else {
return err
}
}
out, err := os.OpenFile(path.Join(rootPath, "timezones.go"), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
if err != nil {
return err
}
i, err := template.New("timezones").Parse(string(timezonesGoTemplate))
if err != nil {
return err
}
tzs, data := ListTimezones()
if err := i.Execute(out, map[string]interface{}{
"timezones": tzs,
"timezoneDatas": data,
}); err != nil {
return err
}
if err := out.Close(); err != nil {
return err
}
return nil
}
func ListTimezones() ([]Timezone, []TimezoneData) {
var zoneDirs = []string{
// Update path according to your OS
"/usr/share/zoneinfo/",
"/usr/share/lib/zoneinfo/",
"/usr/lib/locale/TZ/",
}
zones := map[string]time.Time{}
datas := map[string]string{}
dataMaps := map[string]string{}
now := time.Now()
var tzs []Timezone
for _, zoneDir := range zoneDirs {
files, err := ioutil.ReadDir(zoneDir)
if err != nil {
continue
}
for _, file := range files {
fn := file.Name()
if !file.IsDir() {
loc, err := time.LoadLocation(fn)
if err != nil {
continue
}
if file.Mode()&os.ModeSymlink != os.ModeSymlink {
data, err := ioutil.ReadFile(path.Join(zoneDir, fn))
if err == nil {
datas[fn] = base64.StdEncoding.EncodeToString(data)
dataMaps[fn] = fn
}
} else {
target, err := os.Readlink(path.Join(zoneDir, fn))
if err == nil {
real, err := filepath.Abs(path.Join(zoneDir, target))
if err == nil {
dataMaps[fn] = strings.TrimLeft(real, zoneDir)
}
}
}
zones[fn] = now.In(loc)
} else {
if fn[0] != strings.ToUpper(fn)[0] {
continue
}
if fn[1:] != strings.ToLower(fn)[1:] {
continue
}
subFiles, err := ioutil.ReadDir(path.Join(zoneDir, fn))
if err != nil {
continue
}
for _, subFile := range subFiles {
zn := fmt.Sprintf("%s/%s", fn, subFile.Name())
loc, err := time.LoadLocation(zn)
if err != nil {
continue
}
if subFile.Mode()&os.ModeSymlink != os.ModeSymlink {
data, err := ioutil.ReadFile(path.Join(zoneDir, zn))
if err == nil {
datas[zn] = base64.StdEncoding.EncodeToString(data)
dataMaps[zn] = zn
}
} else {
target, err := os.Readlink(path.Join(zoneDir, zn))
if err == nil {
real, err := filepath.Abs(path.Join(zoneDir, fn, target))
if err == nil {
dataMaps[zn] = strings.TrimLeft(real, zoneDir)
}
}
}
zones[zn] = now.In(loc)
}
}
}
}
var tzData []TimezoneData
for tz, data := range datas {
tzData = append(tzData, TimezoneData{
Name: tz,
Data: data,
})
}
for tz, t := range zones {
q, o := t.Zone()
tzs = append(tzs, Timezone{
Name: tz,
Offset: (int64(o) * int64(time.Second)) / int64(time.Minute),
Zone: q,
Parent: dataMaps[tz],
})
}
sort.Slice(tzs, func(i, j int) bool {
return tzs[i].Name < tzs[j].Name
})
sort.Slice(tzData, func(i, j int) bool {
return tzData[i].Name < tzData[j].Name
})
return tzs, tzData
}

View file

@ -0,0 +1,71 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package timezones
import (
"time"
"encoding/base64"
)
type Timezone struct {
Name string
Offset time.Duration
Zone string
Parent string
}
func (t Timezone) GetData() ([]byte, bool) {
if d, ok := timezonesData[t.Parent]; ok {
if d, err := base64.StdEncoding.DecodeString(d); err == nil {
return d, true
}
}
return nil, false
}
func GetZoneTimezone(zone string) (string, bool) {
for tz, v := range timezones {
if v.Zone == zone {
return tz, true
}
}
return "", false
}
func GetTimezone(timezone string) (Timezone, bool) {
v, ok := timezones[timezone]
return v, ok
}
var timezonesData = map[string]string{
{{- range .timezoneDatas }}
"{{ .Name }}": "{{ .Data }}",
{{- end }}
}
var timezones = map[string]Timezone{
{{- range .timezones }}
"{{ .Name }}": { Name: "{{ .Name }}", Offset: {{ .Offset }} * time.Minute, Zone: "{{ .Zone }}", Parent: "{{ .Parent }}" },
{{- end }}
}

View file

@ -0,0 +1,34 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package internal
import (
"os"
"testing"
"github.com/stretchr/testify/require"
)
func Test_GenerateTimezones(t *testing.T) {
root := os.Getenv("ROOT")
require.NotEmpty(t, root)
require.NoError(t, RenderTimezones(root))
}

View file

@ -7,7 +7,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -21,7 +21,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -33,7 +33,7 @@ metadata:
name: arangolocalstorages.storage.arangodb.com
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -63,7 +63,7 @@ metadata:
name: arango-all-operator-rbac-apps
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -79,7 +79,7 @@ metadata:
name: arango-all-operator-rbac-backup
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -95,7 +95,7 @@ metadata:
name: arango-all-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -104,8 +104,15 @@ rules:
resources: ["customresourcedefinitions"]
verbs: ["get", "list", "watch", "update", "delete"]
resourceNames:
- "arangodeployments.database.arangodb.com"
- "arangoclustersynchronizations.database.arangodb.com"
- "arangomembers.database.arangodb.com"
- "arangotasks.database.arangodb.com"
- "arangodeploymentreplications.replication.database.arangodb.com"
- "arangobackups.backup.arangodb.com"
- "arangobackuppolicies.backup.arangodb.com"
- "arangojobs.apps.arangodb.com"
- "arangolocalstorages.storage.arangodb.com"
---
# Source: kube-arangodb/templates/deployment-operator/cluster-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
@ -114,7 +121,7 @@ metadata:
name: arango-all-operator-rbac-deployment
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -133,7 +140,7 @@ metadata:
name: arango-all-operator-rbac-deployment-replication
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -152,7 +159,7 @@ metadata:
name: arango-all-operator-rbac-k2kclustersync
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -169,7 +176,7 @@ metadata:
name: arango-all-operator-rbac-storage
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -197,7 +204,7 @@ metadata:
name: arango-all-operator-rbac-apps
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -217,7 +224,7 @@ metadata:
name: arango-all-operator-rbac-backup
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -237,7 +244,7 @@ metadata:
name: arango-all-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -257,7 +264,7 @@ metadata:
name: arango-all-operator-rbac-deployment
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -277,7 +284,7 @@ metadata:
name: arango-all-operator-rbac-deployment-replication
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -297,7 +304,7 @@ metadata:
name: arango-all-operator-rbac-k2kclustersync
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -318,7 +325,7 @@ metadata:
name: arango-all-operator-rbac-storage
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -339,7 +346,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -373,7 +380,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -390,7 +397,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -422,7 +429,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -439,7 +446,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -477,7 +484,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -503,7 +510,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -533,7 +540,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -559,7 +566,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -581,7 +588,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -602,7 +609,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -623,7 +630,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -644,7 +651,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -665,7 +672,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -686,7 +693,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -708,7 +715,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -729,7 +736,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -756,7 +763,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -775,7 +782,7 @@ spec:
metadata:
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -786,7 +793,7 @@ spec:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
- key: kubernetes.io/arch
operator: In
values:
- "amd64"
@ -814,7 +821,7 @@ spec:
containers:
- name: operator
imagePullPolicy: Always
image: arangodb/kube-arangodb:1.2.12
image: arangodb/kube-arangodb:1.2.15
args:
- --scope=legacy
- --operator.deployment

View file

@ -7,7 +7,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -21,7 +21,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -33,7 +33,7 @@ metadata:
name: arango-apps-operator-rbac-apps
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -49,7 +49,7 @@ metadata:
name: arango-apps-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -58,8 +58,15 @@ rules:
resources: ["customresourcedefinitions"]
verbs: ["get", "list", "watch", "update", "delete"]
resourceNames:
- "arangodeployments.database.arangodb.com"
- "arangoclustersynchronizations.database.arangodb.com"
- "arangomembers.database.arangodb.com"
- "arangotasks.database.arangodb.com"
- "arangodeploymentreplications.replication.database.arangodb.com"
- "arangobackups.backup.arangodb.com"
- "arangobackuppolicies.backup.arangodb.com"
- "arangojobs.apps.arangodb.com"
- "arangolocalstorages.storage.arangodb.com"
---
# Source: kube-arangodb/templates/apps-operator/cluster-role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
@ -68,7 +75,7 @@ metadata:
name: arango-apps-operator-rbac-apps
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -88,7 +95,7 @@ metadata:
name: arango-apps-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -109,7 +116,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -143,7 +150,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -160,7 +167,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -182,7 +189,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -203,7 +210,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -230,7 +237,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -249,7 +256,7 @@ spec:
metadata:
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -260,7 +267,7 @@ spec:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
- key: kubernetes.io/arch
operator: In
values:
- "amd64"
@ -288,7 +295,7 @@ spec:
containers:
- name: operator
imagePullPolicy: Always
image: arangodb/kube-arangodb:1.2.12
image: arangodb/kube-arangodb:1.2.15
args:
- --scope=legacy

View file

@ -7,7 +7,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -19,7 +19,7 @@ metadata:
name: arango-backup-operator-rbac-backup
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -35,7 +35,7 @@ metadata:
name: arango-backup-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -44,8 +44,15 @@ rules:
resources: ["customresourcedefinitions"]
verbs: ["get", "list", "watch", "update", "delete"]
resourceNames:
- "arangodeployments.database.arangodb.com"
- "arangoclustersynchronizations.database.arangodb.com"
- "arangomembers.database.arangodb.com"
- "arangotasks.database.arangodb.com"
- "arangodeploymentreplications.replication.database.arangodb.com"
- "arangobackups.backup.arangodb.com"
- "arangobackuppolicies.backup.arangodb.com"
- "arangojobs.apps.arangodb.com"
- "arangolocalstorages.storage.arangodb.com"
---
# Source: kube-arangodb/templates/backup-operator/cluster-role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
@ -54,7 +61,7 @@ metadata:
name: arango-backup-operator-rbac-backup
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -74,7 +81,7 @@ metadata:
name: arango-backup-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -95,7 +102,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -127,7 +134,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -148,7 +155,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -175,7 +182,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -194,7 +201,7 @@ spec:
metadata:
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -205,7 +212,7 @@ spec:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
- key: kubernetes.io/arch
operator: In
values:
- "amd64"
@ -233,7 +240,7 @@ spec:
containers:
- name: operator
imagePullPolicy: Always
image: arangodb/kube-arangodb:1.2.12
image: arangodb/kube-arangodb:1.2.15
args:
- --scope=legacy

View file

@ -6,7 +6,7 @@ metadata:
name: arangobackuppolicies.backup.arangodb.com
labels:
app.kubernetes.io/name: kube-arangodb-crd
helm.sh/chart: kube-arangodb-crd-1.2.12
helm.sh/chart: kube-arangodb-crd-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: crd
release: crd
@ -77,7 +77,7 @@ metadata:
name: arangobackups.backup.arangodb.com
labels:
app.kubernetes.io/name: kube-arangodb-crd
helm.sh/chart: kube-arangodb-crd-1.2.12
helm.sh/chart: kube-arangodb-crd-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: crd
release: crd
@ -189,7 +189,7 @@ metadata:
name: arangodeploymentreplications.replication.database.arangodb.com
labels:
app.kubernetes.io/name: kube-arangodb-crd
helm.sh/chart: kube-arangodb-crd-1.2.12
helm.sh/chart: kube-arangodb-crd-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: crd
release: crd
@ -236,7 +236,7 @@ metadata:
name: arangodeployments.database.arangodb.com
labels:
app.kubernetes.io/name: kube-arangodb-crd
helm.sh/chart: kube-arangodb-crd-1.2.12
helm.sh/chart: kube-arangodb-crd-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: crd
release: crd
@ -283,7 +283,7 @@ metadata:
name: arangojobs.apps.arangodb.com
labels:
app.kubernetes.io/name: kube-arangodb-crd
helm.sh/chart: kube-arangodb-crd-1.2.12
helm.sh/chart: kube-arangodb-crd-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: crd
release: crd
@ -321,7 +321,7 @@ metadata:
name: arangoclustersynchronizations.database.arangodb.com
labels:
app.kubernetes.io/name: kube-arangodb-crd
helm.sh/chart: kube-arangodb-crd-1.2.12
helm.sh/chart: kube-arangodb-crd-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: crd
release: crd
@ -363,7 +363,7 @@ metadata:
name: arangomembers.database.arangodb.com
labels:
app.kubernetes.io/name: kube-arangodb-crd
helm.sh/chart: kube-arangodb-crd-1.2.12
helm.sh/chart: kube-arangodb-crd-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: crd
release: crd

View file

@ -7,7 +7,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -19,7 +19,7 @@ metadata:
name: arango-deployment-replication-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -28,8 +28,15 @@ rules:
resources: ["customresourcedefinitions"]
verbs: ["get", "list", "watch", "update", "delete"]
resourceNames:
- "arangodeployments.database.arangodb.com"
- "arangoclustersynchronizations.database.arangodb.com"
- "arangomembers.database.arangodb.com"
- "arangotasks.database.arangodb.com"
- "arangodeploymentreplications.replication.database.arangodb.com"
- "arangobackups.backup.arangodb.com"
- "arangobackuppolicies.backup.arangodb.com"
- "arangojobs.apps.arangodb.com"
- "arangolocalstorages.storage.arangodb.com"
---
# Source: kube-arangodb/templates/deployment-replications-operator/cluster-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
@ -38,7 +45,7 @@ metadata:
name: arango-deployment-replication-operator-rbac-deployment-replication
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -57,7 +64,7 @@ metadata:
name: arango-deployment-replication-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -77,7 +84,7 @@ metadata:
name: arango-deployment-replication-operator-rbac-deployment-replication
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -98,7 +105,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -124,7 +131,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -145,7 +152,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -172,7 +179,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -191,7 +198,7 @@ spec:
metadata:
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -202,7 +209,7 @@ spec:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
- key: kubernetes.io/arch
operator: In
values:
- "amd64"
@ -230,7 +237,7 @@ spec:
containers:
- name: operator
imagePullPolicy: Always
image: arangodb/kube-arangodb:1.2.12
image: arangodb/kube-arangodb:1.2.15
args:
- --scope=legacy
- --operator.deployment-replication

View file

@ -7,7 +7,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -19,7 +19,7 @@ metadata:
name: arango-deployment-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -28,8 +28,15 @@ rules:
resources: ["customresourcedefinitions"]
verbs: ["get", "list", "watch", "update", "delete"]
resourceNames:
- "arangodeployments.database.arangodb.com"
- "arangoclustersynchronizations.database.arangodb.com"
- "arangomembers.database.arangodb.com"
- "arangotasks.database.arangodb.com"
- "arangodeploymentreplications.replication.database.arangodb.com"
- "arangobackups.backup.arangodb.com"
- "arangobackuppolicies.backup.arangodb.com"
- "arangojobs.apps.arangodb.com"
- "arangolocalstorages.storage.arangodb.com"
---
# Source: kube-arangodb/templates/deployment-operator/cluster-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
@ -38,7 +45,7 @@ metadata:
name: arango-deployment-operator-rbac-deployment
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -57,7 +64,7 @@ metadata:
name: arango-deployment-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -77,7 +84,7 @@ metadata:
name: arango-deployment-operator-rbac-deployment
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -98,7 +105,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -115,7 +122,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -153,7 +160,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -174,7 +181,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -195,7 +202,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -222,7 +229,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -241,7 +248,7 @@ spec:
metadata:
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -252,7 +259,7 @@ spec:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
- key: kubernetes.io/arch
operator: In
values:
- "amd64"
@ -280,7 +287,7 @@ spec:
containers:
- name: operator
imagePullPolicy: Always
image: arangodb/kube-arangodb:1.2.12
image: arangodb/kube-arangodb:1.2.15
args:
- --scope=legacy
- --operator.deployment

View file

@ -7,7 +7,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -19,7 +19,7 @@ metadata:
name: arango-k2kclustersync-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -28,8 +28,15 @@ rules:
resources: ["customresourcedefinitions"]
verbs: ["get", "list", "watch", "update", "delete"]
resourceNames:
- "arangodeployments.database.arangodb.com"
- "arangoclustersynchronizations.database.arangodb.com"
- "arangomembers.database.arangodb.com"
- "arangotasks.database.arangodb.com"
- "arangodeploymentreplications.replication.database.arangodb.com"
- "arangobackups.backup.arangodb.com"
- "arangobackuppolicies.backup.arangodb.com"
- "arangojobs.apps.arangodb.com"
- "arangolocalstorages.storage.arangodb.com"
---
# Source: kube-arangodb/templates/k2k-cluster-sync-operator/cluster-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
@ -38,7 +45,7 @@ metadata:
name: arango-k2kclustersync-operator-rbac-k2kclustersync
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -55,7 +62,7 @@ metadata:
name: arango-k2kclustersync-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -75,7 +82,7 @@ metadata:
name: arango-k2kclustersync-operator-rbac-k2kclustersync
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -97,7 +104,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -127,7 +134,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -149,7 +156,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -176,7 +183,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -195,7 +202,7 @@ spec:
metadata:
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -206,7 +213,7 @@ spec:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
- key: kubernetes.io/arch
operator: In
values:
- "amd64"
@ -234,7 +241,7 @@ spec:
containers:
- name: operator
imagePullPolicy: Always
image: arangodb/kube-arangodb:1.2.12
image: arangodb/kube-arangodb:1.2.15
args:
- --scope=legacy

View file

@ -7,7 +7,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -19,7 +19,7 @@ metadata:
name: arangolocalstorages.storage.arangodb.com
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -49,7 +49,7 @@ metadata:
name: arango-storage-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -58,8 +58,15 @@ rules:
resources: ["customresourcedefinitions"]
verbs: ["get", "list", "watch", "update", "delete"]
resourceNames:
- "arangodeployments.database.arangodb.com"
- "arangoclustersynchronizations.database.arangodb.com"
- "arangomembers.database.arangodb.com"
- "arangotasks.database.arangodb.com"
- "arangodeploymentreplications.replication.database.arangodb.com"
- "arangobackups.backup.arangodb.com"
- "arangobackuppolicies.backup.arangodb.com"
- "arangojobs.apps.arangodb.com"
- "arangolocalstorages.storage.arangodb.com"
---
# Source: kube-arangodb/templates/storage-operator/cluster-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
@ -68,7 +75,7 @@ metadata:
name: arango-storage-operator-rbac-storage
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -96,7 +103,7 @@ metadata:
name: arango-storage-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -116,7 +123,7 @@ metadata:
name: arango-storage-operator-rbac-storage
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -137,7 +144,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -163,7 +170,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -184,7 +191,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -211,7 +218,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -230,7 +237,7 @@ spec:
metadata:
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -241,7 +248,7 @@ spec:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
- key: kubernetes.io/arch
operator: In
values:
- "amd64"
@ -269,7 +276,7 @@ spec:
containers:
- name: operator
imagePullPolicy: Always
image: arangodb/kube-arangodb:1.2.12
image: arangodb/kube-arangodb:1.2.15
args:
- --scope=legacy
- --operator.storage

View file

@ -7,7 +7,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb-test
helm.sh/chart: kube-arangodb-test-1.2.12
helm.sh/chart: kube-arangodb-test-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: test
release: test
@ -20,7 +20,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb-test
helm.sh/chart: kube-arangodb-test-1.2.12
helm.sh/chart: kube-arangodb-test-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: test
release: test

View file

@ -7,7 +7,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -21,7 +21,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -33,7 +33,7 @@ metadata:
name: arangolocalstorages.storage.arangodb.com
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -63,7 +63,7 @@ metadata:
name: arango-all-operator-rbac-apps
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -79,7 +79,7 @@ metadata:
name: arango-all-operator-rbac-backup
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -95,7 +95,7 @@ metadata:
name: arango-all-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -104,8 +104,15 @@ rules:
resources: ["customresourcedefinitions"]
verbs: ["get", "list", "watch", "update", "delete"]
resourceNames:
- "arangodeployments.database.arangodb.com"
- "arangoclustersynchronizations.database.arangodb.com"
- "arangomembers.database.arangodb.com"
- "arangotasks.database.arangodb.com"
- "arangodeploymentreplications.replication.database.arangodb.com"
- "arangobackups.backup.arangodb.com"
- "arangobackuppolicies.backup.arangodb.com"
- "arangojobs.apps.arangodb.com"
- "arangolocalstorages.storage.arangodb.com"
---
# Source: kube-arangodb/templates/deployment-operator/cluster-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
@ -114,7 +121,7 @@ metadata:
name: arango-all-operator-rbac-deployment
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -133,7 +140,7 @@ metadata:
name: arango-all-operator-rbac-deployment-replication
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -152,7 +159,7 @@ metadata:
name: arango-all-operator-rbac-k2kclustersync
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -169,7 +176,7 @@ metadata:
name: arango-all-operator-rbac-storage
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -197,7 +204,7 @@ metadata:
name: arango-all-operator-rbac-apps
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -217,7 +224,7 @@ metadata:
name: arango-all-operator-rbac-backup
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -237,7 +244,7 @@ metadata:
name: arango-all-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -257,7 +264,7 @@ metadata:
name: arango-all-operator-rbac-deployment
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -277,7 +284,7 @@ metadata:
name: arango-all-operator-rbac-deployment-replication
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -297,7 +304,7 @@ metadata:
name: arango-all-operator-rbac-k2kclustersync
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -318,7 +325,7 @@ metadata:
name: arango-all-operator-rbac-storage
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -339,7 +346,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -373,7 +380,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -390,7 +397,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -422,7 +429,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -439,7 +446,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -477,7 +484,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -503,7 +510,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -533,7 +540,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -559,7 +566,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -581,7 +588,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -602,7 +609,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -623,7 +630,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -644,7 +651,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -665,7 +672,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -686,7 +693,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -708,7 +715,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -729,7 +736,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -756,7 +763,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -775,7 +782,7 @@ spec:
metadata:
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: all
release: all
@ -786,7 +793,7 @@ spec:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
- key: kubernetes.io/arch
operator: In
values:
- "amd64"
@ -814,7 +821,7 @@ spec:
containers:
- name: operator
imagePullPolicy: Always
image: arangodb/kube-arangodb:1.2.12
image: arangodb/kube-arangodb:1.2.15
args:
- --scope=legacy
- --operator.deployment

View file

@ -7,7 +7,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -21,7 +21,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -33,7 +33,7 @@ metadata:
name: arango-apps-operator-rbac-apps
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -49,7 +49,7 @@ metadata:
name: arango-apps-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -58,8 +58,15 @@ rules:
resources: ["customresourcedefinitions"]
verbs: ["get", "list", "watch", "update", "delete"]
resourceNames:
- "arangodeployments.database.arangodb.com"
- "arangoclustersynchronizations.database.arangodb.com"
- "arangomembers.database.arangodb.com"
- "arangotasks.database.arangodb.com"
- "arangodeploymentreplications.replication.database.arangodb.com"
- "arangobackups.backup.arangodb.com"
- "arangobackuppolicies.backup.arangodb.com"
- "arangojobs.apps.arangodb.com"
- "arangolocalstorages.storage.arangodb.com"
---
# Source: kube-arangodb/templates/apps-operator/cluster-role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
@ -68,7 +75,7 @@ metadata:
name: arango-apps-operator-rbac-apps
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -88,7 +95,7 @@ metadata:
name: arango-apps-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -109,7 +116,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -143,7 +150,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -160,7 +167,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -182,7 +189,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -203,7 +210,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -230,7 +237,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -249,7 +256,7 @@ spec:
metadata:
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: apps
release: apps
@ -260,7 +267,7 @@ spec:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
- key: kubernetes.io/arch
operator: In
values:
- "amd64"
@ -288,7 +295,7 @@ spec:
containers:
- name: operator
imagePullPolicy: Always
image: arangodb/kube-arangodb:1.2.12
image: arangodb/kube-arangodb:1.2.15
args:
- --scope=legacy

View file

@ -7,7 +7,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -19,7 +19,7 @@ metadata:
name: arango-k2kclustersync-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -28,8 +28,15 @@ rules:
resources: ["customresourcedefinitions"]
verbs: ["get", "list", "watch", "update", "delete"]
resourceNames:
- "arangodeployments.database.arangodb.com"
- "arangoclustersynchronizations.database.arangodb.com"
- "arangomembers.database.arangodb.com"
- "arangotasks.database.arangodb.com"
- "arangodeploymentreplications.replication.database.arangodb.com"
- "arangobackups.backup.arangodb.com"
- "arangobackuppolicies.backup.arangodb.com"
- "arangojobs.apps.arangodb.com"
- "arangolocalstorages.storage.arangodb.com"
---
# Source: kube-arangodb/templates/k2k-cluster-sync-operator/cluster-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
@ -38,7 +45,7 @@ metadata:
name: arango-k2kclustersync-operator-rbac-k2kclustersync
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -55,7 +62,7 @@ metadata:
name: arango-k2kclustersync-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -75,7 +82,7 @@ metadata:
name: arango-k2kclustersync-operator-rbac-k2kclustersync
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -97,7 +104,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -127,7 +134,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -149,7 +156,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -176,7 +183,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -195,7 +202,7 @@ spec:
metadata:
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: k2kclustersync
release: k2kclustersync
@ -206,7 +213,7 @@ spec:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
- key: kubernetes.io/arch
operator: In
values:
- "amd64"
@ -234,7 +241,7 @@ spec:
containers:
- name: operator
imagePullPolicy: Always
image: arangodb/kube-arangodb:1.2.12
image: arangodb/kube-arangodb:1.2.15
args:
- --scope=legacy

View file

@ -7,7 +7,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -19,7 +19,7 @@ metadata:
name: arango-backup-operator-rbac-backup
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -35,7 +35,7 @@ metadata:
name: arango-backup-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -44,8 +44,15 @@ rules:
resources: ["customresourcedefinitions"]
verbs: ["get", "list", "watch", "update", "delete"]
resourceNames:
- "arangodeployments.database.arangodb.com"
- "arangoclustersynchronizations.database.arangodb.com"
- "arangomembers.database.arangodb.com"
- "arangotasks.database.arangodb.com"
- "arangodeploymentreplications.replication.database.arangodb.com"
- "arangobackups.backup.arangodb.com"
- "arangobackuppolicies.backup.arangodb.com"
- "arangojobs.apps.arangodb.com"
- "arangolocalstorages.storage.arangodb.com"
---
# Source: kube-arangodb/templates/backup-operator/cluster-role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
@ -54,7 +61,7 @@ metadata:
name: arango-backup-operator-rbac-backup
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -74,7 +81,7 @@ metadata:
name: arango-backup-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -95,7 +102,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -127,7 +134,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -148,7 +155,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -175,7 +182,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -194,7 +201,7 @@ spec:
metadata:
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: backup
release: backup
@ -205,7 +212,7 @@ spec:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
- key: kubernetes.io/arch
operator: In
values:
- "amd64"
@ -233,7 +240,7 @@ spec:
containers:
- name: operator
imagePullPolicy: Always
image: arangodb/kube-arangodb:1.2.12
image: arangodb/kube-arangodb:1.2.15
args:
- --scope=legacy

View file

@ -6,7 +6,7 @@ metadata:
name: arangobackuppolicies.backup.arangodb.com
labels:
app.kubernetes.io/name: kube-arangodb-crd
helm.sh/chart: kube-arangodb-crd-1.2.12
helm.sh/chart: kube-arangodb-crd-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: crd
release: crd
@ -77,7 +77,7 @@ metadata:
name: arangobackups.backup.arangodb.com
labels:
app.kubernetes.io/name: kube-arangodb-crd
helm.sh/chart: kube-arangodb-crd-1.2.12
helm.sh/chart: kube-arangodb-crd-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: crd
release: crd
@ -189,7 +189,7 @@ metadata:
name: arangodeploymentreplications.replication.database.arangodb.com
labels:
app.kubernetes.io/name: kube-arangodb-crd
helm.sh/chart: kube-arangodb-crd-1.2.12
helm.sh/chart: kube-arangodb-crd-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: crd
release: crd
@ -236,7 +236,7 @@ metadata:
name: arangodeployments.database.arangodb.com
labels:
app.kubernetes.io/name: kube-arangodb-crd
helm.sh/chart: kube-arangodb-crd-1.2.12
helm.sh/chart: kube-arangodb-crd-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: crd
release: crd
@ -283,7 +283,7 @@ metadata:
name: arangojobs.apps.arangodb.com
labels:
app.kubernetes.io/name: kube-arangodb-crd
helm.sh/chart: kube-arangodb-crd-1.2.12
helm.sh/chart: kube-arangodb-crd-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: crd
release: crd
@ -321,7 +321,7 @@ metadata:
name: arangoclustersynchronizations.database.arangodb.com
labels:
app.kubernetes.io/name: kube-arangodb-crd
helm.sh/chart: kube-arangodb-crd-1.2.12
helm.sh/chart: kube-arangodb-crd-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: crd
release: crd
@ -363,7 +363,7 @@ metadata:
name: arangomembers.database.arangodb.com
labels:
app.kubernetes.io/name: kube-arangodb-crd
helm.sh/chart: kube-arangodb-crd-1.2.12
helm.sh/chart: kube-arangodb-crd-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: crd
release: crd

View file

@ -7,7 +7,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -19,7 +19,7 @@ metadata:
name: arango-deployment-replication-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -28,8 +28,15 @@ rules:
resources: ["customresourcedefinitions"]
verbs: ["get", "list", "watch", "update", "delete"]
resourceNames:
- "arangodeployments.database.arangodb.com"
- "arangoclustersynchronizations.database.arangodb.com"
- "arangomembers.database.arangodb.com"
- "arangotasks.database.arangodb.com"
- "arangodeploymentreplications.replication.database.arangodb.com"
- "arangobackups.backup.arangodb.com"
- "arangobackuppolicies.backup.arangodb.com"
- "arangojobs.apps.arangodb.com"
- "arangolocalstorages.storage.arangodb.com"
---
# Source: kube-arangodb/templates/deployment-replications-operator/cluster-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
@ -38,7 +45,7 @@ metadata:
name: arango-deployment-replication-operator-rbac-deployment-replication
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -57,7 +64,7 @@ metadata:
name: arango-deployment-replication-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -77,7 +84,7 @@ metadata:
name: arango-deployment-replication-operator-rbac-deployment-replication
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -98,7 +105,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -124,7 +131,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -145,7 +152,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -172,7 +179,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -191,7 +198,7 @@ spec:
metadata:
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment-replication
release: deployment-replication
@ -202,7 +209,7 @@ spec:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
- key: kubernetes.io/arch
operator: In
values:
- "amd64"
@ -230,7 +237,7 @@ spec:
containers:
- name: operator
imagePullPolicy: Always
image: arangodb/kube-arangodb:1.2.12
image: arangodb/kube-arangodb:1.2.15
args:
- --scope=legacy
- --operator.deployment-replication

View file

@ -7,7 +7,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -19,7 +19,7 @@ metadata:
name: arango-deployment-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -28,8 +28,15 @@ rules:
resources: ["customresourcedefinitions"]
verbs: ["get", "list", "watch", "update", "delete"]
resourceNames:
- "arangodeployments.database.arangodb.com"
- "arangoclustersynchronizations.database.arangodb.com"
- "arangomembers.database.arangodb.com"
- "arangotasks.database.arangodb.com"
- "arangodeploymentreplications.replication.database.arangodb.com"
- "arangobackups.backup.arangodb.com"
- "arangobackuppolicies.backup.arangodb.com"
- "arangojobs.apps.arangodb.com"
- "arangolocalstorages.storage.arangodb.com"
---
# Source: kube-arangodb/templates/deployment-operator/cluster-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
@ -38,7 +45,7 @@ metadata:
name: arango-deployment-operator-rbac-deployment
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -57,7 +64,7 @@ metadata:
name: arango-deployment-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -77,7 +84,7 @@ metadata:
name: arango-deployment-operator-rbac-deployment
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -98,7 +105,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -115,7 +122,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -153,7 +160,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -174,7 +181,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -195,7 +202,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -222,7 +229,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -241,7 +248,7 @@ spec:
metadata:
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: deployment
release: deployment
@ -252,7 +259,7 @@ spec:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
- key: kubernetes.io/arch
operator: In
values:
- "amd64"
@ -280,7 +287,7 @@ spec:
containers:
- name: operator
imagePullPolicy: Always
image: arangodb/kube-arangodb:1.2.12
image: arangodb/kube-arangodb:1.2.15
args:
- --scope=legacy
- --operator.deployment

View file

@ -7,7 +7,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -19,7 +19,7 @@ metadata:
name: arangolocalstorages.storage.arangodb.com
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -49,7 +49,7 @@ metadata:
name: arango-storage-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -58,8 +58,15 @@ rules:
resources: ["customresourcedefinitions"]
verbs: ["get", "list", "watch", "update", "delete"]
resourceNames:
- "arangodeployments.database.arangodb.com"
- "arangoclustersynchronizations.database.arangodb.com"
- "arangomembers.database.arangodb.com"
- "arangotasks.database.arangodb.com"
- "arangodeploymentreplications.replication.database.arangodb.com"
- "arangobackups.backup.arangodb.com"
- "arangobackuppolicies.backup.arangodb.com"
- "arangojobs.apps.arangodb.com"
- "arangolocalstorages.storage.arangodb.com"
---
# Source: kube-arangodb/templates/storage-operator/cluster-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
@ -68,7 +75,7 @@ metadata:
name: arango-storage-operator-rbac-storage
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -96,7 +103,7 @@ metadata:
name: arango-storage-operator-rbac-crd
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -116,7 +123,7 @@ metadata:
name: arango-storage-operator-rbac-storage
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -137,7 +144,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -163,7 +170,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -184,7 +191,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -211,7 +218,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -230,7 +237,7 @@ spec:
metadata:
labels:
app.kubernetes.io/name: kube-arangodb
helm.sh/chart: kube-arangodb-1.2.12
helm.sh/chart: kube-arangodb-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: storage
release: storage
@ -241,7 +248,7 @@ spec:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
- key: kubernetes.io/arch
operator: In
values:
- "amd64"
@ -269,7 +276,7 @@ spec:
containers:
- name: operator
imagePullPolicy: Always
image: arangodb/kube-arangodb:1.2.12
image: arangodb/kube-arangodb:1.2.15
args:
- --scope=legacy
- --operator.storage

View file

@ -7,7 +7,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb-test
helm.sh/chart: kube-arangodb-test-1.2.12
helm.sh/chart: kube-arangodb-test-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: test
release: test
@ -20,7 +20,7 @@ metadata:
namespace: default
labels:
app.kubernetes.io/name: kube-arangodb-test
helm.sh/chart: kube-arangodb-test-1.2.12
helm.sh/chart: kube-arangodb-test-1.2.15
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/instance: test
release: test

130
pkg/api/api.go Normal file
View file

@ -0,0 +1,130 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package api
import (
"net"
"net/http"
"time"
"golang.org/x/sync/errgroup"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
typedCore "k8s.io/client-go/kubernetes/typed/core/v1"
pb "github.com/arangodb/kube-arangodb/pkg/api/server"
"github.com/arangodb/kube-arangodb/pkg/logging"
"github.com/arangodb/kube-arangodb/pkg/util/probe"
)
var apiLogger = logging.Global().RegisterAndGetLogger("api-server", logging.Info)
type Server struct {
httpServer *http.Server
grpcServer *grpc.Server
grpcAddress string
pb.UnimplementedOperatorServer
}
type ReadinessProbeConfig struct {
Enabled bool
Probe *probe.ReadyProbe
}
// ServerConfig settings for the Server
type ServerConfig struct {
Namespace string
ServerName string
ServerAltNames []string
HTTPAddress string
GRPCAddress string
TLSSecretName string
JWTSecretName string
JWTKeySecretName string
LivelinessProbe *probe.LivenessProbe
ProbeDeployment ReadinessProbeConfig
ProbeDeploymentReplication ReadinessProbeConfig
ProbeStorage ReadinessProbeConfig
}
// NewServer creates and configure a new Server
func NewServer(cli typedCore.CoreV1Interface, cfg ServerConfig) (*Server, error) {
jwtSigningKey, err := ensureJWT(cli, cfg)
if err != nil {
return nil, err
}
tlsConfig, err := prepareTLSConfig(cli, cfg)
if err != nil {
return nil, err
}
auth := &authorization{jwtSigningKey: jwtSigningKey}
s := &Server{
httpServer: &http.Server{
Addr: cfg.HTTPAddress,
ReadTimeout: time.Second * 30,
ReadHeaderTimeout: time.Second * 15,
WriteTimeout: time.Second * 30,
TLSConfig: tlsConfig,
},
grpcServer: grpc.NewServer(
grpc.UnaryInterceptor(auth.ensureGRPCAuth),
grpc.Creds(credentials.NewTLS(tlsConfig)),
),
grpcAddress: cfg.GRPCAddress,
}
handler, err := buildHTTPHandler(cfg, auth)
if err != nil {
return nil, err
}
s.httpServer.Handler = handler
pb.RegisterOperatorServer(s.grpcServer, s)
return s, nil
}
func (s *Server) Run() error {
g := errgroup.Group{}
g.Go(func() error {
apiLogger.Info("Serving HTTP API on %s", s.httpServer.Addr)
if err := s.httpServer.ListenAndServeTLS("", ""); err != nil && err != http.ErrServerClosed {
return err
}
return nil
})
g.Go(func() error {
apiLogger.Info("Serving GRPC API on %s", s.grpcAddress)
ln, err := net.Listen("tcp", s.grpcAddress)
if err != nil {
return err
}
defer ln.Close()
if err := s.grpcServer.Serve(ln); err != nil && err != grpc.ErrServerStopped {
return err
}
return nil
})
return g.Wait()
}

82
pkg/api/auth.go Normal file
View file

@ -0,0 +1,82 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package api
import (
"context"
"net/http"
"strings"
"github.com/gin-gonic/gin"
jg "github.com/golang-jwt/jwt"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/status"
)
type authorization struct {
jwtSigningKey string
}
func (a *authorization) isValid(token string) bool {
t, err := jg.Parse(token, func(_ *jg.Token) (interface{}, error) {
return []byte(a.jwtSigningKey), nil
})
if err != nil {
apiLogger.Err(err).Info("invalid JWT: %s", token)
return false
}
return t.Valid
}
// ensureHTTPAuth ensure a valid token exists within HTTP request header
func (a *authorization) ensureHTTPAuth(c *gin.Context) {
h := c.Request.Header.Values("Authorization")
bearerToken := extractBearerToken(h)
if !a.isValid(bearerToken) {
c.AbortWithStatus(http.StatusUnauthorized)
}
}
// ensureGRPCAuth ensures a valid token exists within a GRPC request's metadata
func (a *authorization) ensureGRPCAuth(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
md, ok := metadata.FromIncomingContext(ctx)
if !ok {
return nil, status.Errorf(codes.InvalidArgument, "missing metadata")
}
// The keys within metadata.MD are normalized to lowercase.
// See: https://godoc.org/google.golang.org/grpc/metadata#New
bearerToken := extractBearerToken(md["authorization"])
if !a.isValid(bearerToken) {
return nil, status.Errorf(codes.Unauthenticated, "invalid token")
}
// Continue execution of handler after ensuring a valid token.
return handler(ctx, req)
}
func extractBearerToken(authorization []string) string {
if len(authorization) < 1 {
return ""
}
return strings.TrimPrefix(authorization[0], "Bearer ")
}

39
pkg/api/grpc.go Normal file
View file

@ -0,0 +1,39 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package api
import (
"context"
pb "github.com/arangodb/kube-arangodb/pkg/api/server"
"github.com/arangodb/kube-arangodb/pkg/version"
)
func (s *Server) GetVersion(ctx context.Context, _ *pb.Empty) (*pb.Version, error) {
v := version.GetVersionV1()
return &pb.Version{
Version: string(v.Version),
Build: v.Build,
Edition: string(v.Edition),
GoVersion: v.GoVersion,
BuildDate: v.BuildDate,
}, nil
}

79
pkg/api/http.go Normal file
View file

@ -0,0 +1,79 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package api
import (
"net/http"
"github.com/gin-gonic/gin"
prometheus "github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/arangodb/kube-arangodb/pkg/util/errors"
operatorHTTP "github.com/arangodb/kube-arangodb/pkg/util/http"
"github.com/arangodb/kube-arangodb/pkg/util/probe"
"github.com/arangodb/kube-arangodb/pkg/version"
)
func buildHTTPHandler(cfg ServerConfig, auth *authorization) (http.Handler, error) {
gin.SetMode(gin.ReleaseMode)
r := gin.New()
r.Use(gin.Recovery())
versionV1Responder, err := operatorHTTP.NewSimpleJSONResponse(version.GetVersionV1())
if err != nil {
return nil, errors.WithStack(err)
}
r.GET("/_api/version", gin.WrapF(versionV1Responder.ServeHTTP))
r.GET("/api/v1/version", gin.WrapF(versionV1Responder.ServeHTTP))
r.GET("/health", gin.WrapF(cfg.LivelinessProbe.LivenessHandler))
var readyProbes []*probe.ReadyProbe
if cfg.ProbeDeployment.Enabled {
r.GET("/ready/deployment", gin.WrapF(cfg.ProbeDeployment.Probe.ReadyHandler))
readyProbes = append(readyProbes, cfg.ProbeDeployment.Probe)
}
if cfg.ProbeDeploymentReplication.Enabled {
r.GET("/ready/deployment-replication", gin.WrapF(cfg.ProbeDeploymentReplication.Probe.ReadyHandler))
readyProbes = append(readyProbes, cfg.ProbeDeploymentReplication.Probe)
}
if cfg.ProbeStorage.Enabled {
r.GET("/ready/storage", gin.WrapF(cfg.ProbeStorage.Probe.ReadyHandler))
readyProbes = append(readyProbes, cfg.ProbeStorage.Probe)
}
r.GET("/ready", gin.WrapF(handleGetReady(readyProbes...)))
r.GET("/metrics", auth.ensureHTTPAuth, gin.WrapH(prometheus.Handler()))
return r, nil
}
func handleGetReady(probes ...*probe.ReadyProbe) func(w http.ResponseWriter, r *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
for _, probe := range probes {
if !probe.IsReady() {
w.WriteHeader(http.StatusInternalServerError)
return
}
}
w.WriteHeader(http.StatusOK)
}
}

95
pkg/api/jwt.go Normal file
View file

@ -0,0 +1,95 @@
//
// DISCLAIMER
//
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package api
import (
"context"
"crypto/rand"
"fmt"
"time"
jg "github.com/golang-jwt/jwt"
typedCore "k8s.io/client-go/kubernetes/typed/core/v1"
"github.com/arangodb/kube-arangodb/pkg/util/errors"
"github.com/arangodb/kube-arangodb/pkg/util/globals"
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
secret "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/secret/v1"
)
// ensureJWT ensure that JWT signing key exists or creates a new one.
// It also saves new token into secret if it is not present.
// Returns JWT signing key.
func ensureJWT(cli typedCore.CoreV1Interface, cfg ServerConfig) (string, error) {
secrets := cli.Secrets(cfg.Namespace)
signingKey, err := k8sutil.GetTokenSecret(context.Background(), secrets, cfg.JWTKeySecretName)
if err != nil && k8sutil.IsNotFound(err) || signingKey == "" {
signingKey, err = createSigningKey(secrets, cfg.JWTKeySecretName)
if err != nil {
return "", err
}
} else if err != nil {
return "", errors.WithStack(err)
}
_, err = k8sutil.GetTokenSecret(context.Background(), secrets, cfg.JWTSecretName)
if err != nil && k8sutil.IsNotFound(err) {
err = generateAndSaveJWT(secrets, cfg)
if err != nil {
return "", err
}
} else if err != nil {
return "", errors.WithStack(err)
}
return signingKey, nil
}
// generateAndSaveJWT tries to generate new JWT using signing key retrieved from secret.
// If it is not present, it creates a new key.
// The resulting JWT is stored in secrets.
func generateAndSaveJWT(secrets secret.Interface, cfg ServerConfig) error {
claims := jg.MapClaims{
"iss": fmt.Sprintf("kube-arangodb/%s", cfg.ServerName),
"iat": time.Now().Unix(),
}
err := k8sutil.CreateJWTFromSecret(context.Background(), secrets, secrets, cfg.JWTSecretName, cfg.JWTKeySecretName, claims, nil)
if err != nil {
return errors.WithStack(err)
}
return err
}
func createSigningKey(secrets secret.ModInterface, keySecretName string) (string, error) {
signingKey := make([]byte, 32)
_, err := rand.Read(signingKey)
if err != nil {
return "", errors.WithStack(err)
}
err = globals.GetGlobalTimeouts().Kubernetes().RunWithTimeout(context.Background(), func(ctxChild context.Context) error {
return k8sutil.CreateTokenSecret(ctxChild, secrets, keySecretName, string(signingKey), nil)
})
if err != nil {
return "", errors.WithStack(err)
}
return string(signingKey), nil
}

Some files were not shown because too many files have changed in this diff Show more