diff --git a/.envrc b/.envrc new file mode 100644 index 00000000..b85b26d1 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +has nix && use flake diff --git a/.github/workflows/auto-codespell.yml b/.github/workflows/auto-codespell.yml index e6fea4e9..88dc0316 100644 --- a/.github/workflows/auto-codespell.yml +++ b/.github/workflows/auto-codespell.yml @@ -12,9 +12,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Codespell - uses: codespell-project/actions-codespell@v1 + uses: codespell-project/actions-codespell@v2 with: check_filenames: true ignore_words_list: aks,ags,startin diff --git a/.github/workflows/auto-gen-docs.yaml b/.github/workflows/auto-gen-docs.yaml index f446e72f..4e7e58a7 100644 --- a/.github/workflows/auto-gen-docs.yaml +++ b/.github/workflows/auto-gen-docs.yaml @@ -23,7 +23,7 @@ jobs: steps: # Checks out a copy of your repository on the ubuntu-latest machine - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: recursive # Fetch the Docsy theme fetch-depth: 0 @@ -45,7 +45,7 @@ jobs: # Sets up node - required by Hugo - name: Setup Node if: env.IS_CHANGED == 'true' - uses: actions/setup-node@v1 + uses: actions/setup-node@v4 with: node-version: '12.x' @@ -77,7 +77,7 @@ jobs: # Creates pull request with generated docs - name: Create Pull Request if: env.IS_CHANGED == 'true' - uses: peter-evans/create-pull-request@v5 + uses: peter-evans/create-pull-request@v6 with: commit-message: Auto-updated docs branch: docs-generator diff --git a/.github/workflows/auto-generate-manifests.yaml b/.github/workflows/auto-generate-manifests.yaml index d9b62423..c20979bb 100644 --- a/.github/workflows/auto-generate-manifests.yaml +++ b/.github/workflows/auto-generate-manifests.yaml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up env vars run: | @@ -51,7 +51,7 @@ jobs: cp chart/jenkins-operator/crds/jenkins-crd.yaml deploy/crds/jenkins.io_jenkins_crd.yaml - name: Create Pull Request - uses: peter-evans/create-pull-request@v5 + uses: peter-evans/create-pull-request@v6 with: commit-message: Auto-updated Kubernetes Manifests branch: manifest-deploy-update diff --git a/.github/workflows/auto-stale-issue.yaml b/.github/workflows/auto-stale-issue.yaml index fbed5626..b31b74f3 100644 --- a/.github/workflows/auto-stale-issue.yaml +++ b/.github/workflows/auto-stale-issue.yaml @@ -12,7 +12,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v8 + - uses: actions/stale@v9 with: repo-token: ${{ secrets.GITHUB_TOKEN }} operations-per-run: 200 diff --git a/.github/workflows/auto-tests-bats.yaml b/.github/workflows/auto-tests-bats.yaml index abd839c5..a2293bde 100644 --- a/.github/workflows/auto-tests-bats.yaml +++ b/.github/workflows/auto-tests-bats.yaml @@ -26,18 +26,18 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up env vars run: | echo "GO111MODULE=on" >> $GITHUB_ENV - echo "GO_VERSION=v$(sed -n 's/GO_VERSION=//p' config.base.env)" >> $GITHUB_ENV - echo "HELM_VERSION=v$(sed -n 's/HELM_VERSION=//p' config.base.env)" >> $GITHUB_ENV - echo "KIND_CLUSTER_NAME=$(sed -n 's/KIND_CLUSTER_NAME=//p' config.base.env)" >> $GITHUB_ENV + echo "GO_VERSION=v$(sed -n 's/GO_VERSION=//p' config.base.env | tr -d '\n' | tr -d '"')" >> $GITHUB_ENV + echo "HELM_VERSION=v$(sed -n 's/HELM_VERSION=//p' config.base.env | tr -d '\n' | tr -d '"')" >> $GITHUB_ENV + echo "KIND_CLUSTER_NAME=$(sed -n 's/KIND_CLUSTER_NAME=//p' config.base.env | tr -d '\n' | tr -d '"')" >> $GITHUB_ENV echo "GOPATH=/home/runner/go" >> $GITHUB_ENV - name: Prepare go environment - uses: actions/setup-go@v2 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} @@ -45,7 +45,7 @@ jobs: run: make go-dependencies - name: Setup Bats and libs - uses: brokenpip3/setup-bats-libs@1.5.2 + uses: bats-core/bats-action@1.5.5 with: support-path: "${{ github.workspace }}/.bats/bats-support" assert-path: "${{ github.workspace }}/.bats/bats-assert" @@ -53,7 +53,7 @@ jobs: file-path: "${{ github.workspace }}/.bats/bats-file" - name: Kind setup - uses: helm/kind-action@v1.5.0 + uses: helm/kind-action@v1.9.0 with: cluster_name: ${{env.KIND_CLUSTER_NAME}} diff --git a/.github/workflows/auto-tests-e2e.yaml b/.github/workflows/auto-tests-e2e.yaml index 0e8138dc..ad987843 100644 --- a/.github/workflows/auto-tests-e2e.yaml +++ b/.github/workflows/auto-tests-e2e.yaml @@ -19,10 +19,6 @@ on: - 'backup/**' - '*.md' -env: - MINIKUBE_CPUS_NUMBER: 2 - MINIKUBE_MEMORY_AMOUNT: 6144 - jobs: run-tests: if: github.event.pull_request.draft == false @@ -30,20 +26,18 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up env vars run: | echo "GO111MODULE=on" >> $GITHUB_ENV - echo "CHANGE_MINIKUBE_NONE_USER=true" >> $GITHUB_ENV - echo "MINIKUBE_WANTUPDATENOTIFICATION=false" >> $GITHUB_ENV - echo "MINIKUBE_WANTREPORTERRORPROMPT=false" >> $GITHUB_ENV - echo "GO_VERSION=v$(sed -n 's/GO_VERSION=//p' config.base.env)" >> $GITHUB_ENV - echo "HELM_VERSION=v$(sed -n 's/HELM_VERSION=//p' config.base.env)" >> $GITHUB_ENV + echo "GO_VERSION=v$(sed -n 's/GO_VERSION=//p' config.base.env | tr -d '\n' | tr -d '"')" >> $GITHUB_ENV + echo "HELM_VERSION=v$(sed -n 's/HELM_VERSION=//p' config.base.env | tr -d '\n' | tr -d '"')" >> $GITHUB_ENV + echo "KIND_CLUSTER_NAME=$(sed -n 's/KIND_CLUSTER_NAME=//p' config.base.env | tr -d '\n' | tr -d '"')" >> $GITHUB_ENV echo "GOPATH=/home/runner/go" >> $GITHUB_ENV - name: Prepare go environment - uses: actions/setup-go@v2 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} @@ -53,16 +47,30 @@ jobs: - name: Verify code formatting run: make verify + - name: Kind setup + uses: helm/kind-action@v1.9.0 + with: + cluster_name: ${{env.KIND_CLUSTER_NAME}} + config: kind-cluster.yaml + - name: Prepare environment for e2e run: | sudo apt-get update sudo apt-get install socat - sudo mkdir -p $HOME/.kube $HOME/.minikube - sudo chown -R $USER $HOME/.kube $HOME/.minikube - make minikube-start \ - MINIKUBE_DRIVER='docker' \ - MEMORY_AMOUNT=${{ env.MINIKUBE_MEMORY_AMOUNT }} \ - CPUS_NUMBER=${{ env.MINIKUBE_CPUS_NUMBER }} + sudo mkdir -p $HOME/.kube + sudo chown -R $USER $HOME/.kube + + - name: Jenkins Operator - e2e - list tests + run: make e2e E2E_TEST_ARGS='-ginkgo.v -ginkgo.dryRun' - name: Jenkins Operator - e2e run: make e2e E2E_TEST_ARGS='-ginkgo.v' + + - name: Debug + if: failure() + shell: bash + continue-on-error: true + run: | + randomns=$(kubectl get ns| grep -i 'ns[0-9]\+' |cut -d ' ' -f 1) + kubectl get pods -n ${randomns} + kubectl get events -n ${randomns} diff --git a/.github/workflows/auto-tests-helm.yaml b/.github/workflows/auto-tests-helm.yaml index 86c6c867..6c75fa19 100644 --- a/.github/workflows/auto-tests-helm.yaml +++ b/.github/workflows/auto-tests-helm.yaml @@ -19,10 +19,6 @@ on: - 'backup/**' - '*.md' -env: - MINIKUBE_CPUS_NUMBER: 2 - MINIKUBE_MEMORY_AMOUNT: 6144 - jobs: run-tests: if: github.event.pull_request.draft == false @@ -30,20 +26,18 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up env vars run: | echo "GO111MODULE=on" >> $GITHUB_ENV - echo "CHANGE_MINIKUBE_NONE_USER=true" >> $GITHUB_ENV - echo "MINIKUBE_WANTUPDATENOTIFICATION=false" >> $GITHUB_ENV - echo "MINIKUBE_WANTREPORTERRORPROMPT=false" >> $GITHUB_ENV - echo "GO_VERSION=v$(sed -n 's/GO_VERSION=//p' config.base.env)" >> $GITHUB_ENV - echo "HELM_VERSION=v$(sed -n 's/HELM_VERSION=//p' config.base.env)" >> $GITHUB_ENV + echo "GO_VERSION=v$(sed -n 's/GO_VERSION=//p' config.base.env | tr -d '\n' | tr -d '"')" >> $GITHUB_ENV + echo "HELM_VERSION=v$(sed -n 's/HELM_VERSION=//p' config.base.env | tr -d '\n' | tr -d '"')" >> $GITHUB_ENV + echo "KIND_CLUSTER_NAME=$(sed -n 's/KIND_CLUSTER_NAME=//p' config.base.env | tr -d '\n' | tr -d '"')" >> $GITHUB_ENV echo "GOPATH=/home/runner/go" >> $GITHUB_ENV - name: Prepare go environment - uses: actions/setup-go@v2 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} @@ -53,20 +47,21 @@ jobs: - name: Verify code formatting run: make verify + - name: Kind setup + uses: helm/kind-action@v1.9.0 + with: + cluster_name: ${{env.KIND_CLUSTER_NAME}} + config: kind-cluster.yaml + - name: Prepare environment for e2e run: | sudo apt-get update sudo apt-get install socat - sudo mkdir -p $HOME/.kube $HOME/.minikube - sudo chown -R $USER $HOME/.kube $HOME/.minikube - make minikube-start \ - MINIKUBE_DRIVER='docker' \ - MEMORY_AMOUNT=${{ env.MINIKUBE_MEMORY_AMOUNT }} \ - CPUS_NUMBER=${{ env.MINIKUBE_CPUS_NUMBER }} + sudo mkdir -p $HOME/.kube + sudo chown -R $USER $HOME/.kube - name: Jenkins Operator - Helm Chart tests run: | git reset --hard make helm-lint - eval $(bin/minikube docker-env) make helm-e2e E2E_TEST_ARGS='-ginkgo.v' diff --git a/.github/workflows/release-backup.yaml b/.github/workflows/release-backup.yaml index 337c263d..138665dd 100644 --- a/.github/workflows/release-backup.yaml +++ b/.github/workflows/release-backup.yaml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Check envs run: make -C backup/pvc check-env @@ -46,7 +46,7 @@ jobs: - name: Login to Quay.io if: github.ref == 'refs/heads/master' && github.event_name != 'pull_request' - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: quay.io username: ${{ secrets.QUAYIO_USERNAME }} diff --git a/.github/workflows/release-helm-chart.yaml b/.github/workflows/release-helm-chart.yaml index 36bf84e1..5b0778fc 100644 --- a/.github/workflows/release-helm-chart.yaml +++ b/.github/workflows/release-helm-chart.yaml @@ -17,7 +17,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Deploy Helm chart run: | @@ -31,7 +31,7 @@ jobs: # Creates pull request with new chart version - name: Create Pull Request - uses: peter-evans/create-pull-request@v5 + uses: peter-evans/create-pull-request@v6 with: commit-message: Release Helm chart ${{ github.event.inputs.chartVersion }} branch: helm-chart-release-${{ github.event.inputs.chartVersion }} diff --git a/.github/workflows/release-nightly.yaml b/.github/workflows/release-nightly.yaml index 5a2fb1ac..3012bd26 100644 --- a/.github/workflows/release-nightly.yaml +++ b/.github/workflows/release-nightly.yaml @@ -8,41 +8,33 @@ on: description: "Flag for skipping the tests. If set to true (without quotation marks), the workflow will skip tests and go straight to releasing the nightly build. Use with caution!" required: false -env: - MINIKUBE_CPUS_NUMBER: 2 - MINIKUBE_MEMORY_AMOUNT: 6144 - jobs: publish-image: name: Publish nightly snapshot runs-on: ubuntu-latest steps: - name: Prep - check out code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Prep - Set up env vars run: | echo "GO111MODULE=on" >> $GITHUB_ENV - echo "CHANGE_MINIKUBE_NONE_USER=true" >> $GITHUB_ENV - echo "MINIKUBE_WANTUPDATENOTIFICATION=false" >> $GITHUB_ENV - echo "MINIKUBE_WANTREPORTERRORPROMPT=false" >> $GITHUB_ENV - echo "GO_VERSION=v$(sed -n 's/GO_VERSION=//p' config.base.env)" >> $GITHUB_ENV - echo "HELM_VERSION=v$(sed -n 's/HELM_VERSION=//p' config.base.env)" >> $GITHUB_ENV - echo "KIND_CLUSTER_NAME=$(sed -n 's/KIND_CLUSTER_NAME=//p' config.base.env)" >> $GITHUB_ENV + echo "GO_VERSION=v$(sed -n 's/GO_VERSION=//p' config.base.env | tr -d '\n' | tr -d '"')" >> $GITHUB_ENV + echo "HELM_VERSION=v$(sed -n 's/HELM_VERSION=//p' config.base.env | tr -d '\n' | tr -d '"')" >> $GITHUB_ENV + echo "KIND_CLUSTER_NAME=$(sed -n 's/KIND_CLUSTER_NAME=//p' config.base.env | tr -d '\n' | tr -d '"')" >> $GITHUB_ENV echo "GOPATH=/home/runner/go" >> $GITHUB_ENV - - name: Prep - setup BATS + - name: Prep - setup Bats and bats libs if: ${{ github.event.inputs.skipTests != 'true' }} - uses: mig4/setup-bats@v1 + uses: bats-core/bats-action@1.5.5 with: - bats-version: 1.9.0 - - - name: Prep - setup Bats libs - if: ${{ github.event.inputs.skipTests != 'true' }} - uses: brokenpip3/setup-bats-libs@0.1.0 + support-path: "${{ github.workspace }}/.bats/bats-support" + assert-path: "${{ github.workspace }}/.bats/bats-assert" + detik-path: "${{ github.workspace }}/.bats/bats-detik" + file-path: "${{ github.workspace }}/.bats/bats-file" - name: Prep - go environment - uses: actions/setup-go@v2 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} @@ -57,12 +49,15 @@ jobs: run: | sudo apt-get update sudo apt-get install socat - sudo mkdir -p $HOME/.kube $HOME/.minikube - sudo chown -R $USER $HOME/.kube $HOME/.minikube - make minikube-start \ - MINIKUBE_DRIVER='docker' \ - MEMORY_AMOUNT=${{ env.MINIKUBE_MEMORY_AMOUNT }} \ - CPUS_NUMBER=${{ env.MINIKUBE_CPUS_NUMBER }} + sudo mkdir -p $HOME/.kube + sudo chown -R $USER $HOME/.kube + + - name: Prep - Kind setup + if: ${{ github.event.inputs.skipTests != 'true' }} + uses: helm/kind-action@v1.9.0 + with: + cluster_name: ${{env.KIND_CLUSTER_NAME}} + config: kind-cluster.yaml - name: Test - e2e if: ${{ github.event.inputs.skipTests != 'true' }} @@ -73,26 +68,14 @@ jobs: run: | git reset --hard make helm-lint - eval $(bin/minikube docker-env) make helm-e2e E2E_TEST_ARGS='-ginkgo.v' - - name: Prep - Destroy minikube - if: ${{ github.event.inputs.skipTests != 'true' }} - run: | - make minikube-destroy - - - name: Prep - Kind setup - if: ${{ github.event.inputs.skipTests != 'true' }} - uses: helm/kind-action@v1.5.0 - with: - cluster_name: ${{env.KIND_CLUSTER_NAME}} - - name: Test - bats if: ${{ github.event.inputs.skipTests != 'true' }} run: make bats-tests - name: Post - Login to Quay.io - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: quay.io username: ${{ secrets.QUAYIO_USERNAME }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 44dfd086..3dd8148f 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -9,7 +9,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -20,7 +20,7 @@ jobs: echo "GOPATH=/home/runner/go" >> $GITHUB_ENV - name: Prepare go environment - uses: actions/setup-go@v2 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} @@ -45,7 +45,7 @@ jobs: tag_name: ${{ env.VERSION }} - name: Login to Quay.io - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: quay.io username: ${{ secrets.QUAYIO_USERNAME }} diff --git a/.gitignore b/.gitignore index 85ea5a70..e776f8b1 100644 --- a/.gitignore +++ b/.gitignore @@ -94,3 +94,6 @@ testbin/* ### Bats chart/jenkins-operator/deploy.tmp + +### Nix +result diff --git a/Makefile b/Makefile index 7374460c..14d4384c 100644 --- a/Makefile +++ b/Makefile @@ -94,13 +94,45 @@ e2e: deepcopy-gen manifests ## Runs e2e tests, you can use EXTRA_ARGS RUNNING_TESTS=1 go test -parallel=1 "./test/e2e/" -ginkgo.v -tags "$(BUILDTAGS) cgo" -v -timeout 60m -run "$(E2E_TEST_SELECTOR)" \ -jenkins-api-hostname=$(JENKINS_API_HOSTNAME) -jenkins-api-port=$(JENKINS_API_PORT) -jenkins-api-use-nodeport=$(JENKINS_API_USE_NODEPORT) $(E2E_TEST_ARGS) +## HELM Section + +.PHONY: helm +HAS_HELM := $(shell command -v helm 2> /dev/null) +helm: ## Download helm if it's not present, otherwise symlink + @echo "+ $@" +ifeq ($(strip $(HAS_HELM)),) + mkdir -p $(PROJECT_DIR)/bin + curl -Lo $(PROJECT_DIR)/bin/helm.tar.gz https://get.helm.sh/helm-v$(HELM_VERSION)-$(PLATFORM)-amd64.tar.gz && tar xzfv $(PROJECT_DIR)/bin/helm.tar.gz -C $(PROJECT_DIR)/bin + mv $(PROJECT_DIR)/bin/$(PLATFORM)-amd64/helm $(PROJECT_DIR)/bin/helm + rm -rf $(PROJECT_DIR)/bin/$(PLATFORM)-amd64 + rm -rf $(PROJECT_DIR)/bin/helm.tar.gz +else + test -L $(PROJECT_DIR)/bin/helm || ln -sf $(shell command -v helm) $(PROJECT_DIR)/bin/helm +endif + +.PHONY: helm-lint +helm-lint: helm + bin/helm lint chart/jenkins-operator + +.PHONY: helm-release-latest +helm-release-latest: helm + mkdir -p /tmp/jenkins-operator-charts + mv chart/jenkins-operator/*.tgz /tmp/jenkins-operator-charts + cd chart && ../bin/helm package jenkins-operator + mv chart/jenkins-operator-*.tgz chart/jenkins-operator/ + bin/helm repo index chart/ --url https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/chart/ --merge chart/index.yaml + mv /tmp/jenkins-operator-charts/*.tgz chart/jenkins-operator/ + .PHONY: helm-e2e IMAGE_NAME := quay.io/$(QUAY_ORGANIZATION)/$(QUAY_REGISTRY):$(GITCOMMIT)-amd64 helm-e2e: helm container-runtime-build-amd64 ## Runs helm e2e tests, you can use EXTRA_ARGS + kind load docker-image ${IMAGE_NAME} --name $(KIND_CLUSTER_NAME) @echo "+ $@" RUNNING_TESTS=1 go test -parallel=1 "./test/helm/" -ginkgo.v -tags "$(BUILDTAGS) cgo" -v -timeout 60m -run "$(E2E_TEST_SELECTOR)" -image-name=$(IMAGE_NAME) $(E2E_TEST_ARGS) +## CODE CHECKS section + .PHONY: vet vet: ## Verifies `go vet` passes @echo "+ $@" @@ -143,6 +175,7 @@ install: ## Installs the executable .PHONY: update-lts-version update-lts-version: ## Update the latest lts version @echo "+ $@" + echo $(LATEST_LTS_VERSION) sed -i 's|jenkins/jenkins:[0-9]\+.[0-9]\+.[0-9]\+|jenkins/jenkins:$(LATEST_LTS_VERSION)|g' chart/jenkins-operator/values.yaml sed -i 's|jenkins/jenkins:[0-9]\+.[0-9]\+.[0-9]\+|jenkins/jenkins:$(LATEST_LTS_VERSION)|g' test/e2e/test_utility.go sed -i 's|jenkins/jenkins:[0-9]\+.[0-9]\+.[0-9]\+|jenkins/jenkins:$(LATEST_LTS_VERSION)|g' test/helm/helm_test.go @@ -153,7 +186,7 @@ run: export WATCH_NAMESPACE = $(NAMESPACE) run: export OPERATOR_NAME = $(NAME) run: fmt vet install-crds build ## Run the executable, you can use EXTRA_ARGS @echo "+ $@" -ifeq ($(KUBERNETES_PROVIDER),minikube) +ifeq ($(KUBERNETES_PROVIDER),kind) kubectl config use-context $(KUBECTL_CONTEXT) endif ifeq ($(KUBERNETES_PROVIDER),crc) @@ -292,12 +325,6 @@ container-runtime-run: ## Run the container in docker, you can use EXTRA_ARGS --volume $(HOME)/.kube/config:/home/jenkins-operator/.kube/config \ quay.io/${QUAY_ORGANIZATION}/$(QUAY_REGISTRY):$(GITCOMMIT) /usr/bin/jenkins-operator $(OPERATOR_ARGS) -.PHONY: minikube-run -minikube-run: export WATCH_NAMESPACE = $(NAMESPACE) -minikube-run: export OPERATOR_NAME = $(NAME) -minikube-run: minikube-start run ## Run the operator locally and use minikube as Kubernetes cluster, you can use OPERATOR_ARGS - @echo "+ $@" - .PHONY: crc-run crc-run: export WATCH_NAMESPACE = $(NAMESPACE) crc-run: export OPERATOR_NAME = $(NAME) @@ -320,14 +347,6 @@ ifndef HAS_GEN_CRD_API_REFERENCE_DOCS endif $(GEN_CRD_API)/$(GEN_CRD_API) -config gen-crd-api-config.json -api-dir $(PKG)/api/$(API_VERSION) -template-dir $(GEN_CRD_API)/template -out-file documentation/$(VERSION)/jenkins-$(API_VERSION)-scheme.md -.PHONY: check-minikube -check-minikube: ## Checks if KUBERNETES_PROVIDER is set to minikube - @echo "+ $@" - @echo "KUBERNETES_PROVIDER '$(KUBERNETES_PROVIDER)'" -ifneq ($(KUBERNETES_PROVIDER),minikube) - $(error KUBERNETES_PROVIDER not set to 'minikube') -endif - .PHONY: check-crc check-crc: ## Checks if KUBERNETES_PROVIDER is set to crc @echo "+ $@" @@ -336,44 +355,10 @@ ifneq ($(KUBERNETES_PROVIDER),crc) $(error KUBERNETES_PROVIDER not set to 'crc') endif -.PHONY: helm -HAS_HELM := $(shell which $(PROJECT_DIR)/bin/helm) -helm: ## Download helm if it's not present - @echo "+ $@" -ifndef HAS_HELM - mkdir -p $(PROJECT_DIR)/bin - curl -Lo bin/helm.tar.gz https://get.helm.sh/helm-v$(HELM_VERSION)-$(PLATFORM)-amd64.tar.gz && tar xzfv bin/helm.tar.gz -C $(PROJECT_DIR)/bin - mv $(PROJECT_DIR)/bin/$(PLATFORM)-amd64/helm $(PROJECT_DIR)/bin/helm - rm -rf $(PROJECT_DIR)/bin/$(PLATFORM)-amd64 - rm -rf $(PROJECT_DIR)/bin/helm.tar.gz -endif - -.PHONY: minikube -HAS_MINIKUBE := $(shell which $(PROJECT_DIR)/bin/minikube) -minikube: ## Download minikube if it's not present - @echo "+ $@" -ifndef HAS_MINIKUBE - mkdir -p $(PROJECT_DIR)/bin - wget -O $(PROJECT_DIR)/bin/minikube https://github.com/kubernetes/minikube/releases/download/v$(MINIKUBE_VERSION)/minikube-$(PLATFORM)-amd64 - chmod +x $(PROJECT_DIR)/bin/minikube -endif - -.PHONY: minikube-start -minikube-start: minikube check-minikube ## Start minikube - @echo "+ $@" - bin/minikube status && exit 0 || \ - bin/minikube start --kubernetes-version $(MINIKUBE_KUBERNETES_VERSION) --dns-domain=$(CLUSTER_DOMAIN) --extra-config=kubelet.cluster-domain=$(CLUSTER_DOMAIN) --driver=$(MINIKUBE_DRIVER) --memory $(MEMORY_AMOUNT) --cpus $(CPUS_NUMBER) - -.PHONY: minikube-destroy -minikube-destroy: ## Stop and destroy minikube - @echo "+ $@" - bin/minikube stop - bin/minikube delete - .PHONY: kind-setup kind-setup: ## Setup kind cluster @echo "+ $@" - kind create cluster --name $(KIND_CLUSTER_NAME) + kind create cluster --config kind-cluster.yaml --name $(KIND_CLUSTER_NAME) .PHONY: kind-clean kind-clean: ## Delete kind cluster @@ -462,20 +447,6 @@ endif go mod vendor -v @echo -.PHONY: helm-lint -helm-lint: helm - @echo "+ $@" - bin/helm lint chart/jenkins-operator - -.PHONY: helm-release-latest -helm-release-latest: helm - @echo "+ $@" - mkdir -p /tmp/jenkins-operator-charts - mv chart/jenkins-operator/*.tgz /tmp/jenkins-operator-charts - cd chart && ../bin/helm package jenkins-operator - mv chart/jenkins-operator-*.tgz chart/jenkins-operator/ - bin/helm repo index chart/ --url https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/chart/ --merge chart/index.yaml - mv /tmp/jenkins-operator-charts/*.tgz chart/jenkins-operator/ # Download and build hugo extended locally if necessary HUGO_PATH = $(shell pwd)/bin/hugo @@ -579,10 +550,10 @@ kubebuilder: source ${ENVTEST_ASSETS_DIR}/setup-envtest.sh; fetch_envtest_tools $(ENVTEST_ASSETS_DIR); setup_envtest_env $(ENVTEST_ASSETS_DIR); # install cert-manager v1.5.1 -install-cert-manager: minikube-start +install-cert-manager: kind-setup kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.1/cert-manager.yaml -uninstall-cert-manager: minikube-start +uninstall-cert-manager: kind-setup kubectl delete -f https://github.com/jetstack/cert-manager/releases/download/v1.5.1/cert-manager.yaml # Deploy the operator locally along with webhook using helm charts diff --git a/api/v1alpha2/zz_generated.deepcopy.go b/api/v1alpha2/zz_generated.deepcopy.go index 35547563..6caa129b 100644 --- a/api/v1alpha2/zz_generated.deepcopy.go +++ b/api/v1alpha2/zz_generated.deepcopy.go @@ -1,4 +1,3 @@ -//go:build !ignore_autogenerated // +build !ignore_autogenerated /* @@ -357,6 +356,11 @@ func (in *JenkinsMaster) DeepCopyInto(out *JenkinsMaster) { *out = make([]Plugin, len(*in)) copy(*out, *in) } + if in.LatestPlugins != nil { + in, out := &in.LatestPlugins, &out.LatestPlugins + *out = new(bool) + **out = **in + } if in.HostAliases != nil { in, out := &in.HostAliases, &out.HostAliases *out = make([]corev1.HostAlias, len(*in)) diff --git a/chart/jenkins-operator/README.md b/chart/jenkins-operator/README.md index c2df40a5..d8cdef29 100644 --- a/chart/jenkins-operator/README.md +++ b/chart/jenkins-operator/README.md @@ -1,6 +1,6 @@ # jenkins-operator -![Version: 0.8.0-beta.2](https://img.shields.io/badge/Version-0.8.0--beta.2-informational?style=flat-square) ![AppVersion: 0.8.0-beta.2](https://img.shields.io/badge/AppVersion-0.8.0--beta.2-informational?style=flat-square) +![Version: 0.8.0](https://img.shields.io/badge/Version-0.8.0-informational?style=flat-square) ![AppVersion: 0.8.0](https://img.shields.io/badge/AppVersion-0.8.0-informational?style=flat-square) Kubernetes native operator which fully manages Jenkins on Kubernetes @@ -44,15 +44,15 @@ Kubernetes native operator which fully manages Jenkins on Kubernetes | jenkins.backup.volumeMounts[1].mountPath | string | `"/backup"` | | | jenkins.backup.volumeMounts[1].name | string | `"backup"` | | | jenkins.basePlugins | list | `[]` | | -| jenkins.configuration.configurationAsCode | object | `{}` | | -| jenkins.configuration.groovyScripts | object | `{}` | | +| jenkins.configuration.configurationAsCode | list | `[]` | | +| jenkins.configuration.groovyScripts | list | `[]` | | | jenkins.configuration.secretData | object | `{}` | | | jenkins.configuration.secretRefName | string | `""` | | | jenkins.disableCSRFProtection | bool | `false` | | | jenkins.enabled | bool | `true` | | | jenkins.env | list | `[]` | | | jenkins.hostAliases | object | `{}` | | -| jenkins.image | string | `"jenkins/jenkins:2.414.1-lts"` | | +| jenkins.image | string | `"jenkins/jenkins:2.440.1-lts"` | | | jenkins.imagePullPolicy | string | `"Always"` | | | jenkins.imagePullSecrets | list | `[]` | | | jenkins.labels | object | `{}` | | @@ -109,4 +109,4 @@ Kubernetes native operator which fully manages Jenkins on Kubernetes | webhook.enabled | bool | `false` | | ---------------------------------------------- -Autogenerated from chart metadata using [helm-docs v1.11.0](https://github.com/norwoodj/helm-docs/releases/v1.11.0) +Autogenerated from chart metadata using [helm-docs v1.11.2](https://github.com/norwoodj/helm-docs/releases/v1.11.2) diff --git a/chart/jenkins-operator/values.yaml b/chart/jenkins-operator/values.yaml index c39e32eb..26e2986b 100644 --- a/chart/jenkins-operator/values.yaml +++ b/chart/jenkins-operator/values.yaml @@ -36,7 +36,7 @@ jenkins: # image is the name (and tag) of the Jenkins instance # Default: jenkins/jenkins:lts # It's recommended to use LTS (tag: "lts") version - image: jenkins/jenkins:2.414.1-lts + image: jenkins/jenkins:2.440.1-lts # env contains jenkins container environment variables env: [] @@ -90,17 +90,17 @@ jenkins: # # basePlugins: # - name: kubernetes - # version: 4029.v5712230ccb_f8 + # version: 4186.v1d804571d5d4 # - name: workflow-job - # version: 1342.v046651d5b_dfe + # version: 1385.vb_58b_86ea_fff1 # - name: workflow-aggregator # version: 596.v8c21c963d92d # - name: git # version: 5.2.1 # - name: job-dsl - # version: "1.85" + # version: "1.87" # - name: configuration-as-code - # version: 1647.ve39ca_b_829b_42 + # version: 11775.v810dc950b_514 # - name: kubernetes-credentials-provider # version: 1.234.vf3013b_35f5b_a @@ -135,7 +135,7 @@ jenkins: # repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git seedJobs: [] - # SeedJobAgentImage defines the image that will be used by the seed job agent. If not defined jenkins/inbound-agent:4.10-3 will be used. + # SeedJobAgentImage defines the image that will be used by the seed job agent. If not defined jenkins/inbound-agent:3206.vb_15dcf73f6a_9-3 will be used. seedJobAgentImage: "" # Resource limit/request for Jenkins diff --git a/config.base.env b/config.base.env index 835a8b36..d7bc92bf 100644 --- a/config.base.env +++ b/config.base.env @@ -1,17 +1,16 @@ -# Setup variables for the Makefile -NAME=kubernetes-operator -OPERATOR_SDK_VERSION=1.3.0 -GO_VERSION=1.15.6 -PKG=github.com/jenkinsci/kubernetes-operator -QUAY_ORGANIZATION=jenkins-kubernetes-operator -QUAY_REGISTRY=operator -NAMESPACE=default -API_VERSION=v1alpha2 -API_VERSION_NEXT=v1alpha3 -ALL_IN_ONE_DEPLOY_FILE_PREFIX=all-in-one -GEN_CRD_API=gen-crd-api-reference-docs -IMAGE_PULL_MODE=local -HELM_VERSION=3.12.3 -CLUSTER_DOMAIN=cluster.local -LATEST_LTS_VERSION=2.414.1 -KIND_CLUSTER_NAME=jenkins +ALL_IN_ONE_DEPLOY_FILE_PREFIX="all-in-one" +API_VERSION_NEXT="v1alpha3" +API_VERSION="v1alpha2" +CLUSTER_DOMAIN="cluster.local" +GEN_CRD_API="gen-crd-api-reference-docs" +GO_VERSION="1.15.6" +HELM_VERSION="3.12.3" +IMAGE_PULL_MODE="local" +KIND_CLUSTER_NAME="jenkins" +LATEST_LTS_VERSION="2.440.1" +NAME="kubernetes-operator" +NAMESPACE="default" +OPERATOR_SDK_VERSION="1.3.0" +PKG="github.com/jenkinsci/kubernetes-operator" +QUAY_ORGANIZATION="jenkins-kubernetes-operator" +QUAY_REGISTRY="operator" diff --git a/config.crc.env b/config.crc.env deleted file mode 100644 index 8bead977..00000000 --- a/config.crc.env +++ /dev/null @@ -1,7 +0,0 @@ -KUBERNETES_PROVIDER=crc - -JENKINS_API_HOSTNAME_COMMAND=crc ip -JENKINS_API_PORT=0 -JENKINS_API_USE_NODEPORT=true - -CRC_OC_PROJECT=default \ No newline at end of file diff --git a/config.kind.env b/config.kind.env new file mode 100644 index 00000000..b4e7ddf1 --- /dev/null +++ b/config.kind.env @@ -0,0 +1,5 @@ +JENKINS_API_HOSTNAME_COMMAND=echo localhost +JENKINS_API_PORT=0 +JENKINS_API_USE_NODEPORT=true +KUBERNETES_PROVIDER=kind +KUBECTL_CONTEXT=kind-jenkins diff --git a/config.minikube.env b/config.minikube.env deleted file mode 100644 index 944978fc..00000000 --- a/config.minikube.env +++ /dev/null @@ -1,10 +0,0 @@ -KUBERNETES_PROVIDER=minikube - -MINIKUBE_KUBERNETES_VERSION=v1.24.8 -MINIKUBE_DRIVER=virtualbox -MINIKUBE_VERSION=1.28.0 -KUBECTL_CONTEXT=minikube - -JENKINS_API_HOSTNAME_COMMAND=bin/minikube ip -JENKINS_API_PORT=0 -JENKINS_API_USE_NODEPORT=true diff --git a/flake.lock b/flake.lock new file mode 100644 index 00000000..d3b999c6 --- /dev/null +++ b/flake.lock @@ -0,0 +1,119 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1705309234, + "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "go_15": { + "locked": { + "lastModified": 1610974077, + "narHash": "sha256-kfU2R7Q6eMU34VooazWvCqxOKwQOApCYh9TH79oZ8VA=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4eccd6f731627ba5ad9915bcf600c9329a34ca78", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4eccd6f731627ba5ad9915bcf600c9329a34ca78", + "type": "github" + } + }, + "golangci": { + "locked": { + "lastModified": 1593485095, + "narHash": "sha256-cgfJfZKqPgqQ1fdFWdpNnDEO2HmIVIDCvBTGke2LpnI=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "e912fb83d2155a393e7146da98cda0e455a80fb6", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "e912fb83d2155a393e7146da98cda0e455a80fb6", + "type": "github" + } + }, + "gomod2nix": { + "inputs": { + "flake-utils": [ + "flake-utils" + ], + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1705314449, + "narHash": "sha256-yfQQ67dLejP0FLK76LKHbkzcQqNIrux6MFe32MMFGNQ=", + "owner": "nix-community", + "repo": "gomod2nix", + "rev": "30e3c3a9ec4ac8453282ca7f67fca9e1da12c3e6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "gomod2nix", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1707451808, + "narHash": "sha256-UwDBUNHNRsYKFJzyTMVMTF5qS4xeJlWoeyJf+6vvamU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "442d407992384ed9c0e6d352de75b69079904e4e", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "go_15": "go_15", + "golangci": "golangci", + "gomod2nix": "gomod2nix", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 00000000..8d1648cf --- /dev/null +++ b/flake.nix @@ -0,0 +1,58 @@ +{ + description = "Jenkins Kubernetes Operator"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + go_15.url = "github:nixos/nixpkgs/4eccd6f731627ba5ad9915bcf600c9329a34ca78"; + golangci.url = "github:nixos/nixpkgs/e912fb83d2155a393e7146da98cda0e455a80fb6"; + gomod2nix = { + url = "github:nix-community/gomod2nix"; + inputs.nixpkgs.follows = "nixpkgs"; + inputs.flake-utils.follows = "flake-utils"; + }; + }; + + outputs = { self, nixpkgs, flake-utils, go_15, golangci, gomod2nix, ... }: + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = nixpkgs.legacyPackages.${system}; + go_15_pkgs = go_15.legacyPackages.${system}; + golangci_pkgs = golangci.legacyPackages.${system}; + operatorVersion = builtins.readFile ./VERSION.txt; + sdkVersion = ((builtins.fromTOML (builtins.readFile ./config.base.env)).OPERATOR_SDK_VERSION); + jenkinsLtsVersion = ((builtins.fromTOML (builtins.readFile ./config.base.env)).LATEST_LTS_VERSION); + in + { + # Nix fmt + formatter = nixpkgs.legacyPackages.${system}.nixpkgs-fmt; + + # shell in nix develop + devShells.default = nixpkgs.legacyPackages.${system}.mkShell { + packages = [ + pkgs.gnumake + pkgs.wget + pkgs.helm-docs + go_15_pkgs.go + golangci_pkgs.golangci-lint + ]; + shellHook = '' + echo Operator Version ${operatorVersion} + echo Latest Jenkins LTS version: ${jenkinsLtsVersion} + echo Operator SDK version: ${sdkVersion} + ''; + }; + + # nix shell .#gomod + devShells.gomod = pkgs.callPackage ./nix/shell.nix { + inherit (gomod2nix.legacyPackages.${system}) mkGoEnv gomod2nix; + }; + + # nix build with gomod2nix + packages.default = pkgs.callPackage ./nix { + inherit (gomod2nix.legacyPackages.${system}) buildGoApplication; + }; + + } + ); +} diff --git a/kind-cluster.yaml b/kind-cluster.yaml new file mode 100644 index 00000000..726f6137 --- /dev/null +++ b/kind-cluster.yaml @@ -0,0 +1,9 @@ +apiVersion: kind.x-k8s.io/v1alpha4 +kind: Cluster +nodes: +- role: control-plane + extraPortMappings: + - containerPort: 30303 + hostPort: 30303 + listenAddress: "0.0.0.0" + protocol: tcp \ No newline at end of file diff --git a/nix/default.nix b/nix/default.nix new file mode 100644 index 00000000..44ccad75 --- /dev/null +++ b/nix/default.nix @@ -0,0 +1,21 @@ +{ pkgs ? ( + let + inherit (builtins) fetchTree fromJSON readFile; + inherit ((fromJSON (readFile ./flake.lock)).nodes) nixpkgs gomod2nix; + in + import (fetchTree nixpkgs.locked) { + overlays = [ + (import "${fetchTree gomod2nix.locked}/overlay.nix") + ]; + } + ) +, buildGoApplication ? pkgs.buildGoApplication +}: + +buildGoApplication { + pname = ((builtins.fromTOML (builtins.readFile ../config.base.env)).NAME); + version = builtins.readFile ../VERSION.txt; + pwd = ../.; + src = ../.; + modules = ./gomod2nix.toml; +} diff --git a/nix/gomod2nix.toml b/nix/gomod2nix.toml new file mode 100644 index 00000000..847f508e --- /dev/null +++ b/nix/gomod2nix.toml @@ -0,0 +1,855 @@ +schema = 3 + +[mod] + [mod."cloud.google.com/go"] + version = "v0.54.0" + hash = "sha256-0GHaPyaZ6PtSrRPoVDs1zWxgo9kwSm/cxHCD0+Q6C8g=" + [mod."cloud.google.com/go/bigquery"] + version = "v1.4.0" + hash = "sha256-niyEg/99kFPoAnQ5CQHfS8GEfQYGKtNbD36nNuSF4zo=" + [mod."cloud.google.com/go/datastore"] + version = "v1.1.0" + hash = "sha256-wyOuic/vp33s1QiybElwERALQwPrn8gFHDAdlTBcv1Q=" + [mod."cloud.google.com/go/firestore"] + version = "v1.1.0" + hash = "sha256-sxPVdUINjmpjTGXfKqkc5u7MxQe4As35kT/TYeizvII=" + [mod."cloud.google.com/go/pubsub"] + version = "v1.2.0" + hash = "sha256-pVKDdQS2A1P0inU6mkI1aUrfIuHgL5ib8RpKt/rYQVI=" + [mod."cloud.google.com/go/storage"] + version = "v1.6.0" + hash = "sha256-pF2Ff0UVveFDI5yDX1G3MV4bCx++x+mTQ4OIHgPIGqA=" + [mod."dmitri.shuralyov.com/gpu/mtl"] + version = "v0.0.0-20190408044501-666a987793e9" + hash = "sha256-H+xcbVdCNDahWZPgwk4k+XxnM73g0hwaFY7x+OAATcc=" + [mod."github.com/Azure/go-ansiterm"] + version = "v0.0.0-20170929234023-d6e3b3328b78" + hash = "sha256-OPSOVNWduO7IQ8PK9NetjeHAyMbMmrU37Sy5CWeGEwQ=" + [mod."github.com/Azure/go-autorest"] + version = "v14.2.0+incompatible" + hash = "sha256-dvWOcudtx0NP6U2RDt40hwtELFRdYdLEklRWYterRN0=" + [mod."github.com/Azure/go-autorest/autorest"] + version = "v0.11.1" + hash = "sha256-bN1VIsW4p6mx/llR8xQR5w7TZ1IQukp84kPkZei9oiY=" + [mod."github.com/Azure/go-autorest/autorest/adal"] + version = "v0.9.5" + hash = "sha256-FXtgMdxDWf9sQIUJT4kD5C+t9qP5WDybd43EwAKkVak=" + [mod."github.com/Azure/go-autorest/autorest/date"] + version = "v0.3.0" + hash = "sha256-PWFHUZ9jMJ6gkMCnRpR89s/aI3YdtzskIePj8Ulu4dc=" + [mod."github.com/Azure/go-autorest/autorest/mocks"] + version = "v0.4.1" + hash = "sha256-ZzK6AL03DbclhBC8gF9bnQadnAn5hQSEXOlmglZMCEg=" + [mod."github.com/Azure/go-autorest/logger"] + version = "v0.2.0" + hash = "sha256-YMh3dvYDlI2yQIQJs91eAcfyQtwOKJD3kC3flSPrMrs=" + [mod."github.com/Azure/go-autorest/tracing"] + version = "v0.6.0" + hash = "sha256-CcLYoOyRcMo4aRRYN+TBbaHtJqDra4e0qo3cmGZIB74=" + [mod."github.com/BurntSushi/toml"] + version = "v0.3.1" + hash = "sha256-Rqak1dE/Aj/+Kx1/pl3Hifgt+Q3OzuZ5fJR+/x3nTbo=" + [mod."github.com/BurntSushi/xgb"] + version = "v0.0.0-20160522181843-27f122750802" + hash = "sha256-ck+gNOSXNYy/ji6mpSX3OTHgCDm2nww+3ZKu4lAXl6I=" + [mod."github.com/NYTimes/gziphandler"] + version = "v0.0.0-20170623195520-56545f4a5d46" + hash = "sha256-4mTVrxEH1Cu3MVhm/nB+Zm8b2oYS4SecOHjnbT5Pk7s=" + [mod."github.com/OneOfOne/xxhash"] + version = "v1.2.2" + hash = "sha256-JvJnJFr9NFh5u+b7BgNEIwZR6scXW8l8RkT1DXmGTtY=" + [mod."github.com/PuerkitoBio/purell"] + version = "v1.1.1" + hash = "sha256-Hjf8ZNNdwcRd50A9QNrcCj17gu/6f1iKzVTVrrMrojA=" + [mod."github.com/PuerkitoBio/urlesc"] + version = "v0.0.0-20170810143723-de5bf2ad4578" + hash = "sha256-nL0/0QM0Pec83vBlwXvQ8g5SvvZnCQgzD1apxfHNGlg=" + [mod."github.com/agnivade/levenshtein"] + version = "v1.0.1" + hash = "sha256-+f8z3r10jE93Cj/WtIsEb3ydY3Y4JOlnh2dPqhcUMac=" + [mod."github.com/alecthomas/template"] + version = "v0.0.0-20190718012654-fb15b899a751" + hash = "sha256-RsS4qxdRQ3q+GejA8D9Iu31A/mZNms4LbJ7518jWiu4=" + [mod."github.com/alecthomas/units"] + version = "v0.0.0-20190717042225-c3de453c63f4" + hash = "sha256-vho02JWLkLST8oBHdWufpXZxoDSkCUVkMP6M/eg/Q0s=" + [mod."github.com/andreyvit/diff"] + version = "v0.0.0-20170406064948-c7f18ee00883" + hash = "sha256-2XoKB20lN+KGnAb/eVv1NcU/CcSdUPcvVNiXF/uUmOg=" + [mod."github.com/armon/circbuf"] + version = "v0.0.0-20150827004946-bbbad097214e" + hash = "sha256-klQjllsJZqZ2KPNx1mZT9XP+UAJkuBhmTnZdNlAflEM=" + [mod."github.com/armon/consul-api"] + version = "v0.0.0-20180202201655-eb2c6b5be1b6" + hash = "sha256-aVqUesaJyU/nrgwlfG2p16VxcF6Hyk4s8diMp0Nuzsg=" + [mod."github.com/armon/go-metrics"] + version = "v0.0.0-20180917152333-f0300d1749da" + hash = "sha256-+zqX1hlJgc+IrXRzBQDMhR8GYQdc0Oj6PiIDfctgh44=" + [mod."github.com/armon/go-radix"] + version = "v0.0.0-20180808171621-7fddfc383310" + hash = "sha256-ZHU4pyBqHHRuQJuYr2K+LqeAnLX9peX07cmSYK+GDHk=" + [mod."github.com/asaskevich/govalidator"] + version = "v0.0.0-20190424111038-f61b66f89f4a" + hash = "sha256-pcrINvdGpQExaSQv1j19L0NLWcvZL8jXQMsvMlVq8ss=" + [mod."github.com/beorn7/perks"] + version = "v1.0.1" + hash = "sha256-h75GUqfwJKngCJQVE5Ao5wnO3cfKD9lSIteoLp/3xJ4=" + [mod."github.com/bgentry/speakeasy"] + version = "v0.1.0" + hash = "sha256-Gt1vj6CFovLnO6wX5u2O4UfecY9V2J9WGw1ez4HMrgk=" + [mod."github.com/bketelsen/crypt"] + version = "v0.0.3-0.20200106085610-5cbc8cc4026c" + hash = "sha256-d44/dm431lvmGZQBJjDOWfIa/GX/jNE9y4t49WO1a/U=" + [mod."github.com/blang/semver"] + version = "v3.5.0+incompatible" + hash = "sha256-FPuL+G3gZCZ0ujzC748snVZekQK5adlwgnV0GPpyKt0=" + [mod."github.com/bndr/gojenkins"] + version = "v1.0.1" + hash = "sha256-H43dVsPhDdQVnMXMfVtr5LhWo1BokTEHM/fGtYEn0JQ=" + [mod."github.com/census-instrumentation/opencensus-proto"] + version = "v0.2.1" + hash = "sha256-3RWTfGGuKbkrOQ91ociOgp9igGvU/FAv3NAidPVoYP8=" + [mod."github.com/cespare/xxhash"] + version = "v1.1.0" + hash = "sha256-nVDTtXH9PC3yJ0THaQZEN243UP9xgLi/clt5xRqj3+M=" + [mod."github.com/cespare/xxhash/v2"] + version = "v2.1.1" + hash = "sha256-cF+sDnnTZ1xRwjsy08SVSV/JoZalwY+dg0Zkghy6BNw=" + [mod."github.com/chzyer/logex"] + version = "v1.1.10" + hash = "sha256-BNOaV/CFAqOymWW3R2m1sCikdCwFZM/pVkylzoeU6yI=" + [mod."github.com/chzyer/readline"] + version = "v0.0.0-20180603132655-2972be24d48e" + hash = "sha256-2Uj5LGpHEbLQG3d/7z9AL8DknUBZyoTAMs4j+VVDmIA=" + [mod."github.com/chzyer/test"] + version = "v0.0.0-20180213035817-a1ea475d72b1" + hash = "sha256-U0irpUSqegh7Nzg1ErPuyjESOcIXXOWf7ikKMbES2mY=" + [mod."github.com/client9/misspell"] + version = "v0.3.4" + hash = "sha256-MIKnt4va/nPl+5cCgOvCyRGIORTnguieQhlj8ery4BU=" + [mod."github.com/cockroachdb/datadriven"] + version = "v0.0.0-20190809214429-80d97fb3cbaa" + hash = "sha256-l9bswpYsaqhhls7BsJjfhbpDBEreIQtKNjHDn9Tcamc=" + [mod."github.com/coreos/bbolt"] + version = "v1.3.2" + hash = "sha256-otoFfHibSdPIg6A/d6yLeKTC0ocTJrtNnpsXZq6hpY0=" + [mod."github.com/coreos/etcd"] + version = "v3.3.13+incompatible" + hash = "sha256-Hz8x4xE3ku/xSVlUW/LrKv2Tc9fo/PsIcy5LcE8OD4Q=" + [mod."github.com/coreos/go-oidc"] + version = "v2.1.0+incompatible" + hash = "sha256-JSzXrEvaE12Re5Xm/qA0MKcqRaVIuHEh3v/0BRcptNI=" + [mod."github.com/coreos/go-semver"] + version = "v0.3.0" + hash = "sha256-ielBK5+kGscOuygfFNNr5iKuuF1qKBiXLlK8eGuA4Bw=" + [mod."github.com/coreos/go-systemd"] + version = "v0.0.0-20190321100706-95778dfbb74e" + hash = "sha256-1WiFUSLDPxsSVafwCkzz0xjpC0W7bNX/sJ0wRBVrvn4=" + [mod."github.com/coreos/pkg"] + version = "v0.0.0-20180928190104-399ea9e2e55f" + hash = "sha256-R4EcMkhMPi5fSE5SU8Oa1FlvP5VEysXPaX9GYqnW15w=" + [mod."github.com/cpuguy83/go-md2man/v2"] + version = "v2.0.0" + hash = "sha256-Pi84FPmTnz+Oq8tV9Lx7cMopiMculHkUtUmtWCuaX1s=" + [mod."github.com/creack/pty"] + version = "v1.1.7" + hash = "sha256-o235RbsTlx++gnUf46iU5SPgxX5tQblrT5wYFAWnqvE=" + [mod."github.com/davecgh/go-spew"] + version = "v1.1.1" + hash = "sha256-nhzSUrE1fCkN0+RL04N4h8jWmRFPPPWbCuDc7Ss0akI=" + [mod."github.com/dgrijalva/jwt-go"] + version = "v3.2.0+incompatible" + hash = "sha256-t5rhczm+60rYmMg0mZTp86dJkzuGp/OLd5ccXek+oiI=" + [mod."github.com/dgryski/go-sip13"] + version = "v0.0.0-20181026042036-e10d5fee7954" + hash = "sha256-pgVia6npFluwOrbY1DyEgy5X2zzgHTe+pAkIrdyK3pU=" + [mod."github.com/docker/distribution"] + version = "v2.7.1+incompatible" + hash = "sha256-8AFnEYjwqs8AzpSNBYgKmbUfFiCAxS+UH5SBFSuEctc=" + [mod."github.com/docker/go-units"] + version = "v0.4.0" + hash = "sha256-f9d4OzZqYcsgP2gqutTPRju5BVFz4/pzefgSipGSD00=" + [mod."github.com/docker/spdystream"] + version = "v0.0.0-20160310174837-449fdfce4d96" + hash = "sha256-VB9QUDdmpYNgAx1AeXVE4AgJc/w55j4DjuEkHeNlIpA=" + [mod."github.com/docopt/docopt-go"] + version = "v0.0.0-20180111231733-ee0de3bc6815" + hash = "sha256-0mCKIC5x7aauBL8ahXB9ExMfoTJl55HaafWWWPNRmUI=" + [mod."github.com/dustin/go-humanize"] + version = "v1.0.0" + hash = "sha256-gy4G1PnHD9iw2MitHX6y1y93qr3C9IncmXL7ttUMDs8=" + [mod."github.com/elazarl/goproxy"] + version = "v0.0.0-20180725130230-947c36da3153" + hash = "sha256-aZb2tgdNc9f8k1wdT8+y71+AFJzgH4skELWhHwRVGaQ=" + [mod."github.com/emersion/go-sasl"] + version = "v0.0.0-20190704090222-36b50694675c" + hash = "sha256-jI815xYE5ETZ1/kJSIHy5fz/AOP7NB7UlmQJR24Mnb0=" + [mod."github.com/emersion/go-smtp"] + version = "v0.11.2" + hash = "sha256-lUV1TG5Dx/KoyoFIWqGAh3rnGKXtvcO1m9UMuVh0nb4=" + [mod."github.com/emicklei/go-restful"] + version = "v2.9.5+incompatible" + hash = "sha256-ZsxRjMxQQxlc1FZbY51KyLiaqteSMPs/SjDmKfDxqAg=" + [mod."github.com/envoyproxy/go-control-plane"] + version = "v0.9.1-0.20191026205805-5f8ba28d4473" + hash = "sha256-DFjKGsJUiBsD0+6E5zgyUDhjM2MWWqb3a7/0UueFuvg=" + [mod."github.com/envoyproxy/protoc-gen-validate"] + version = "v0.1.0" + hash = "sha256-2htufg3hdOHfbDVI5wFpsuaiDIhH6O1taUGJMdVbjlQ=" + [mod."github.com/evanphx/json-patch"] + version = "v4.9.0+incompatible" + hash = "sha256-UER1krCnasp2qAPCmG8ytBgcU8JoUab6KSy/mslx8po=" + [mod."github.com/facebookgo/ensure"] + version = "v0.0.0-20160127193407-b4ab57deab51" + hash = "sha256-jdCvva9KDH6KTTAtW0fBNw67xd0DhxLQbxU8PdhWLKY=" + [mod."github.com/facebookgo/stack"] + version = "v0.0.0-20160209184415-751773369052" + hash = "sha256-o6JL8oyrSBcgbdkvjUi4PT5OnfwgyXgbPQDA82sB2R8=" + [mod."github.com/facebookgo/subset"] + version = "v0.0.0-20150612182917-8dac2c3c4870" + hash = "sha256-Ub0cBFwF6MBzTZ7fpqxrC375arBv+au5I/LLzksVzE8=" + [mod."github.com/fatih/color"] + version = "v1.7.0" + hash = "sha256-4In7ef7it7d+6oGUJ3pkD0V+lsL40hVtYdy2KD2ovn0=" + [mod."github.com/form3tech-oss/jwt-go"] + version = "v3.2.2+incompatible" + hash = "sha256-bwmJjAKIhIM7/6r8Uc/2RdlmR41RF+onJkYa5N/3NxQ=" + [mod."github.com/fsnotify/fsnotify"] + version = "v1.4.9" + hash = "sha256-HZBMhbFqcZM9oxSbWqISzEE7GF7JZpco5tyta6c4OcQ=" + [mod."github.com/ghodss/yaml"] + version = "v1.0.0" + hash = "sha256-D+2i+EwF2YptR0m/OG4WIVVLL7tUC7XvgRQef2usfGo=" + [mod."github.com/globalsign/mgo"] + version = "v0.0.0-20181015135952-eeefdecb41b8" + hash = "sha256-kAxBzot2kKi5pKlE5hZ4GXlhIWXZuTXNL+p9kdaCKXU=" + [mod."github.com/go-chi/chi"] + version = "v4.0.0+incompatible" + hash = "sha256-wRaYecq/359G5ebFkwsprfdj3tcc5y44CBbMBdvpXek=" + [mod."github.com/go-gl/glfw"] + version = "v0.0.0-20190409004039-e6da0acd62b1" + hash = "sha256-tqPStzM1xOuEWqAv4pBbzB+lNIxEqqyCCP0wWCbrlyY=" + [mod."github.com/go-gl/glfw/v3.3/glfw"] + version = "v0.0.0-20200222043503-6f7a984d4dc4" + hash = "sha256-6BfEsip1tEBelFTsKVtn2okCTb+0UsqEdIljg+PIjiE=" + [mod."github.com/go-kit/kit"] + version = "v0.9.0" + hash = "sha256-dcW5++iYlt0zxgaZTpWXKl8LX4/npy+MadnXXmzzRUo=" + [mod."github.com/go-logfmt/logfmt"] + version = "v0.4.0" + hash = "sha256-qX6aMMNTmN+D7LtQLZxW/LAKxRpze4vO77F2EQLrVRs=" + [mod."github.com/go-logr/logr"] + version = "v0.3.0" + hash = "sha256-RKn3Lg2fSW6kD7e4WzHrD+kuYdkgaPj2S9g7pxU0qnc=" + [mod."github.com/go-logr/zapr"] + version = "v0.2.0" + hash = "sha256-Uxkz/TEeeVYAZFJ1td2/iBynfhDtWqCWET66TXKJHrE=" + [mod."github.com/go-openapi/analysis"] + version = "v0.19.5" + hash = "sha256-OPlDESGRm1hf8OI2ecQ8B0/t8id8DCAE8czd9eagxMQ=" + [mod."github.com/go-openapi/errors"] + version = "v0.19.2" + hash = "sha256-Z1ZzcvnHbVgY2c20b5Dn5SRe4b6ZEA149JEoOzQYxr0=" + [mod."github.com/go-openapi/jsonpointer"] + version = "v0.19.3" + hash = "sha256-WZL/QvFB0OYyvHPNRhkl1BI0NT0TFMqRFlojX9hZi9Q=" + [mod."github.com/go-openapi/jsonreference"] + version = "v0.19.3" + hash = "sha256-XDP7dJdwIl/AYU85bpKXX3twGJBlMhIrt96RE1UPwtI=" + [mod."github.com/go-openapi/loads"] + version = "v0.19.4" + hash = "sha256-4p/1ejm/8nO08iDMvqGz7Vazz+fq1AsiKDOKAG5grKc=" + [mod."github.com/go-openapi/runtime"] + version = "v0.19.4" + hash = "sha256-r47bBf9kHHRimId2t0BZfEljg64KlwdHaWYIFRDKuOA=" + [mod."github.com/go-openapi/spec"] + version = "v0.19.3" + hash = "sha256-klqjQ6mTn5jBWW7M3uPsDsx3ywEaheRTLHKDUm7AM7Y=" + [mod."github.com/go-openapi/strfmt"] + version = "v0.19.3" + hash = "sha256-HMKD3i2QrR3IXWUn4+Nqpk8WQZ+WUh1WZq3IVGBaIMg=" + [mod."github.com/go-openapi/swag"] + version = "v0.19.5" + hash = "sha256-D8qq6ZbWhLNroEisriI5d4zea5yQ7pzV/tl8XxjeZPw=" + [mod."github.com/go-openapi/validate"] + version = "v0.19.5" + hash = "sha256-tC89PC7WY9YXm04868S/fZ1BAEg/DW6vui+0X6Nhm3E=" + [mod."github.com/go-stack/stack"] + version = "v1.8.0" + hash = "sha256-26RlTEcAkbewMUtmirKrDGQ1WJlNousp69v7HMopYnI=" + [mod."github.com/gogo/protobuf"] + version = "v1.3.1" + hash = "sha256-z1MHtD7vsSbAuOZ+IVXZAHajtS7k+sY/JW4/3PwYoAs=" + [mod."github.com/golang/glog"] + version = "v0.0.0-20160126235308-23def4e6c14b" + hash = "sha256-YDyL9TRikSXHSrYtITVA/ovYIYrdnZGym14XnslAYkk=" + [mod."github.com/golang/groupcache"] + version = "v0.0.0-20200121045136-8c9f03a8e57e" + hash = "sha256-0E3bzqOQk4xolVEGm0GXZ6tUpgCWF7DolyyKkdPJUm4=" + [mod."github.com/golang/mock"] + version = "v1.4.1" + hash = "sha256-5LaaCRbIvFrATowswmQRe+JRRcb4v7u67Qxf21YSw/E=" + [mod."github.com/golang/protobuf"] + version = "v1.4.3" + hash = "sha256-GoytLjWoBKfZq3eBDa4rGQNP2la2IrpkFSWjsH/sPBI=" + [mod."github.com/google/btree"] + version = "v1.0.0" + hash = "sha256-5gr0RMnlvrzCke3kwpkf92WvW3x5nnKZesoulyoYRC0=" + [mod."github.com/google/go-cmp"] + version = "v0.5.2" + hash = "sha256-BRyxX3Sd/ZsxCd0KB1tPFyvmhc+jH1cTFThVGQLxkGE=" + [mod."github.com/google/gofuzz"] + version = "v1.1.0" + hash = "sha256-PSNufXo20YXfSNbayCc3hdujKZT5EW4lybsQ+WJ0Imo=" + [mod."github.com/google/martian"] + version = "v2.1.0+incompatible" + hash = "sha256-N3tPu89U5MQqmtFIqSEfqEXNgnHf883TAmXKvA2N8KQ=" + [mod."github.com/google/pprof"] + version = "v0.0.0-20200229191704-1ebb73c60ed3" + hash = "sha256-bogfN5hWzqf2kxEyA2XsUQu41nPcOBSvs1Z77x2zseI=" + [mod."github.com/google/renameio"] + version = "v0.1.0" + hash = "sha256-XQ5yI+LMfFQuK7+T3Xx5jiaRP7GmiQSsPkFmm1TpIs4=" + [mod."github.com/google/uuid"] + version = "v1.1.2" + hash = "sha256-DXttjObhEiMn5/OH+mYkJU6u03Gwsx5t08lTsIFyd+U=" + [mod."github.com/googleapis/gax-go/v2"] + version = "v2.0.5" + hash = "sha256-2ibpBbDxLVeYHd8gdszHb3w8rgKrChbUNlkaxW9lIhU=" + [mod."github.com/googleapis/gnostic"] + version = "v0.5.1" + hash = "sha256-LvWU9aCP3PgUtlGXvH1OcDySKd4jKUB2FVZx1Dkci3s=" + [mod."github.com/gopherjs/gopherjs"] + version = "v0.0.0-20181017120253-0766667cb4d1" + hash = "sha256-AuXnjjoLbFZ85Oi8sldH117MBh+yCUB9HU5Y5syJ7Lg=" + [mod."github.com/gorilla/websocket"] + version = "v1.4.2" + hash = "sha256-GhBLM/XTm2lFCyDvJbnCLAI2OyYXQV6W+jRPOQ1PdVY=" + [mod."github.com/gregjones/httpcache"] + version = "v0.0.0-20180305231024-9cad4c3443a7" + hash = "sha256-2ngFfFuSm8YSTNZWGQuN5yTpsXlwY2R8aaIzjDnjTXI=" + [mod."github.com/grpc-ecosystem/go-grpc-middleware"] + version = "v1.0.1-0.20190118093823-f849b5445de4" + hash = "sha256-qxUpPmUdsTGBRyX1PBCsVS6Jf8u0o8KCRuZNlheGo1A=" + [mod."github.com/grpc-ecosystem/go-grpc-prometheus"] + version = "v1.2.0" + hash = "sha256-XtdBJuUYTXEokPrUetjD6iEqxFTBgyrm1M0X7r+1Uys=" + [mod."github.com/grpc-ecosystem/grpc-gateway"] + version = "v1.9.5" + hash = "sha256-8vRk3cWgXBaq64feKhCcvA9T1J/kwr50AYhZyX2jZNA=" + [mod."github.com/hashicorp/consul/api"] + version = "v1.1.0" + hash = "sha256-w2m1ObnPFNFUc8PTXABizzkVVd05g9cUKzMbkNghPoQ=" + [mod."github.com/hashicorp/consul/sdk"] + version = "v0.1.1" + hash = "sha256-0UFJskter51L0yMXbr59hyOmCsW3rSZYOix9Nk/WuTc=" + [mod."github.com/hashicorp/errwrap"] + version = "v1.0.0" + hash = "sha256-LGSLrefkABG1kH1i+GUWiD2/ggJxiZEJ+D2YNbhZjmo=" + [mod."github.com/hashicorp/go-cleanhttp"] + version = "v0.5.1" + hash = "sha256-c54zcHr9THj3MQk7hrDQcpjOcQi1MvXZ4Kpin6EbfR4=" + [mod."github.com/hashicorp/go-immutable-radix"] + version = "v1.0.0" + hash = "sha256-JmNxdGaJG63Ty/sVnPjqvTyA4/k5wkzZ/QvpMK2uduw=" + [mod."github.com/hashicorp/go-msgpack"] + version = "v0.5.3" + hash = "sha256-2OUYjD/Jt12TFBrtH0wRqg+lzRljDxSIhk2CqBLUczo=" + [mod."github.com/hashicorp/go-multierror"] + version = "v1.0.0" + hash = "sha256-iXzjerl96o7QDiSwQjbak8R/t+YzZeoUqm59TCmy3gI=" + [mod."github.com/hashicorp/go-rootcerts"] + version = "v1.0.0" + hash = "sha256-4NZJAT5/vocyto+dv6FmW4kFiYldmNvewowsYK/LiTI=" + [mod."github.com/hashicorp/go-sockaddr"] + version = "v1.0.0" + hash = "sha256-orG+SHVsp5lgNRCErmhMLABVFQ3ZWfYIJ/4LTFzlvao=" + [mod."github.com/hashicorp/go-syslog"] + version = "v1.0.0" + hash = "sha256-YRuq6oPMwAFVY7mvwpMDvZqGwNnb5CjBYyKI/x5mbCc=" + [mod."github.com/hashicorp/go-uuid"] + version = "v1.0.1" + hash = "sha256-s1wIvBu37z4U3qK9sdUR1CtbD39N6RwfX4HgDCpCa0s=" + [mod."github.com/hashicorp/go.net"] + version = "v0.0.1" + hash = "sha256-JKal3E+wPO+Hk838opKV4HHKB4O72Xy+77ncXlLkWRk=" + [mod."github.com/hashicorp/golang-lru"] + version = "v0.5.4" + hash = "sha256-1skUMZX+iIf66J1TBVYGWO1OWwQcaoXut3mne331q+k=" + [mod."github.com/hashicorp/hcl"] + version = "v1.0.0" + hash = "sha256-xsRCmYyBfglMxeWUvTZqkaRLSW+V2FvNodEDjTGg1WA=" + [mod."github.com/hashicorp/logutils"] + version = "v1.0.0" + hash = "sha256-e8t8Dm8sp/PzKClN1TOmFcrTAWNh4mZHSW7cAjVx3Bw=" + [mod."github.com/hashicorp/mdns"] + version = "v1.0.0" + hash = "sha256-ravx4tklQG43OEjPiJn68iJM9ODZ6hgU0idFCEOiJGM=" + [mod."github.com/hashicorp/memberlist"] + version = "v0.1.3" + hash = "sha256-IsxqevYulPt+2VGtlq068Jyq1YfIk4Ohh9TgakIGxnc=" + [mod."github.com/hashicorp/serf"] + version = "v0.8.2" + hash = "sha256-diRxWOouFLTO75f2E9NlrKgie/qsT+gOOrrbf4tACHw=" + [mod."github.com/hpcloud/tail"] + version = "v1.0.0" + hash = "sha256-7ByBr/RcOwIsGPCiCUpfNwUSvU18QAY+HMnCJr8uU1w=" + [mod."github.com/ianlancetaylor/demangle"] + version = "v0.0.0-20181102032728-5e5cf60278f6" + hash = "sha256-5cS82VAt2PtDlx18XzvNwhp7zk/fryC9HCzdyEKYEro=" + [mod."github.com/imdario/mergo"] + version = "v0.3.10" + hash = "sha256-VySdeGAscETmrtwc1apAIwqL6CwbDgU0yskvj24xByY=" + [mod."github.com/inconshreveable/mousetrap"] + version = "v1.0.0" + hash = "sha256-ogTuLrV40FwS4ueo4hh6hi1wPywOI+LyIqfNjsibwNY=" + [mod."github.com/jonboulle/clockwork"] + version = "v0.1.0" + hash = "sha256-dEV9aGzJRIrYfPpuJux3guJNvZGi+5dfseGurZqGHd8=" + [mod."github.com/json-iterator/go"] + version = "v1.1.10" + hash = "sha256-jdS2C0WsgsWREBSj+YUzSqdZofMfUMecaOQ/lB9Mu6k=" + [mod."github.com/jstemmer/go-junit-report"] + version = "v0.9.1" + hash = "sha256-fK6zLXQU8y+h+SqyeCUldA5OFPA/j0Wlbizk6AG60c4=" + [mod."github.com/jtolds/gls"] + version = "v4.20.0+incompatible" + hash = "sha256-Zu5naRjnwOYBzRv0CYhIZTizA0AajzOg7mJrL7Bo/cw=" + [mod."github.com/julienschmidt/httprouter"] + version = "v1.2.0" + hash = "sha256-xhj9PYKNIfQ/CQb8/3O3OtBmiIAJYtiL23cTnRj1C80=" + [mod."github.com/kisielk/errcheck"] + version = "v1.2.0" + hash = "sha256-LWMRYTXVJENYwTYuJrlAiBSjGtSnMu0XQby3G0F4pio=" + [mod."github.com/kisielk/gotool"] + version = "v1.0.0" + hash = "sha256-lsdQkue8gFz754PGqczUnvGiCQq87SruQtdrDdQVTpE=" + [mod."github.com/konsorten/go-windows-terminal-sequences"] + version = "v1.0.3" + hash = "sha256-9HojTXKv7b3HiEhYaKXDxraEfvU5vrg47FbCjTRpOvs=" + [mod."github.com/kr/logfmt"] + version = "v0.0.0-20140226030751-b84e30acd515" + hash = "sha256-CePQbqWGtS8qP/Av9pkLiqZwH6RaZQff/s1l+1//jQo=" + [mod."github.com/kr/pretty"] + version = "v0.2.0" + hash = "sha256-127gkrb5HVPOCp0sGZOmiJPaQuQ4zptRw0MNGP53i/s=" + [mod."github.com/kr/pty"] + version = "v1.1.5" + hash = "sha256-7wK2dT+rB1SfkhXho6PA3IPKR6zhVGDhtPtJmkiwepo=" + [mod."github.com/kr/text"] + version = "v0.1.0" + hash = "sha256-QT65kTrNypS5GPWGvgnCpGLPlVbQAL4IYvuqAKhepb4=" + [mod."github.com/liggitt/tabwriter"] + version = "v0.0.0-20181228230101-89fcab3d43de" + hash = "sha256-b6pLitORwgfGpOHpe45ykj00P17utbDv8bv6MCVoCBM=" + [mod."github.com/magiconair/properties"] + version = "v1.8.1" + hash = "sha256-y9tzLVKluie7cCruJ86XvjA2rUDeE8Q+gpkBDnrg+Kc=" + [mod."github.com/mailgun/mailgun-go/v3"] + version = "v3.6.4" + hash = "sha256-//QGyCNr5csr8DQV27DK0PuCCSFZCgIGnCiuRmwZPtI=" + [mod."github.com/mailru/easyjson"] + version = "v0.7.0" + hash = "sha256-YxqTR5fcfOh2jBKdMBEs6rrb+TLuOo/YXzUbzV6j/S8=" + [mod."github.com/mattn/go-colorable"] + version = "v0.0.9" + hash = "sha256-fVPF8VxbdggLAZnaexMl6Id1WjXKImzVySxKfa+ukts=" + [mod."github.com/mattn/go-isatty"] + version = "v0.0.4" + hash = "sha256-PI32zFAKvQpIFSfuvIFeL4Orxr696dAxkokrzIQUSX8=" + [mod."github.com/mattn/go-runewidth"] + version = "v0.0.2" + hash = "sha256-60sxUu16q5jJXQg3qlMhiJAFHgMaTdKjscV+N352eW4=" + [mod."github.com/matttproud/golang_protobuf_extensions"] + version = "v1.0.2-0.20181231171920-c182affec369" + hash = "sha256-uovu7OycdeZ2oYQ7FhVxLey5ZX3T0FzShaRldndyGvc=" + [mod."github.com/miekg/dns"] + version = "v1.0.14" + hash = "sha256-OeijUgBaEmDapclTxfvjIqrjh4qZu3+DQpHelGGI4aA=" + [mod."github.com/mitchellh/cli"] + version = "v1.0.0" + hash = "sha256-4nG7AhRcjTRCwUCdnaNaFrAKDxEEoiihaCA4lk+uM8U=" + [mod."github.com/mitchellh/go-homedir"] + version = "v1.1.0" + hash = "sha256-oduBKXHAQG8X6aqLEpqZHs5DOKe84u6WkBwi4W6cv3k=" + [mod."github.com/mitchellh/go-testing-interface"] + version = "v1.0.0" + hash = "sha256-/Dpv/4i5xuK8hDH+q8YTdF6Jg6NNtfO4Wqig2JCWgrY=" + [mod."github.com/mitchellh/gox"] + version = "v0.4.0" + hash = "sha256-GV3LYxzJt8YVbnSac2orlj2QR3MX/YIDrLkSkPhsjuA=" + [mod."github.com/mitchellh/iochan"] + version = "v1.0.0" + hash = "sha256-b5Tp7cw/e8mL++IjsebbmKWXtb9Hrzu4Fc6M4tZKFhU=" + [mod."github.com/mitchellh/mapstructure"] + version = "v1.1.2" + hash = "sha256-OU9HZYHtl0qaqMFd84w7snkkRuRY6UMSsfCnL5HYdw0=" + [mod."github.com/moby/term"] + version = "v0.0.0-20200312100748-672ec06f55cd" + hash = "sha256-ls9pFDkGX7g8HkHOV95anmTylekre6VlhQGENqpWV3c=" + [mod."github.com/modern-go/concurrent"] + version = "v0.0.0-20180306012644-bacd9c7ef1dd" + hash = "sha256-OTySieAgPWR4oJnlohaFTeK1tRaVp/b0d1rYY8xKMzo=" + [mod."github.com/modern-go/reflect2"] + version = "v1.0.1" + hash = "sha256-5D1HGVBc/REwPVdlPYcXsbZM80OIh7V5uiyKAbMA5qo=" + [mod."github.com/munnerz/goautoneg"] + version = "v0.0.0-20191010083416-a7dc8b61c822" + hash = "sha256-79URDDFenmGc9JZu+5AXHToMrtTREHb3BC84b/gym9Q=" + [mod."github.com/mwitkow/go-conntrack"] + version = "v0.0.0-20161129095857-cc309e4a2223" + hash = "sha256-rgZ2fm0Vi04xGDhkeFPDSZ+KPKi0a/5rerjOdea1eVk=" + [mod."github.com/mxk/go-flowrate"] + version = "v0.0.0-20140419014527-cca7078d478f" + hash = "sha256-gRTfRfff/LRxC1SXXnQd2tV3UTcTx9qu90DJIVIaGn8=" + [mod."github.com/nxadm/tail"] + version = "v1.4.4" + hash = "sha256-S336Q+5j2uVmwLOfEUpU0iFBEEDH+UtdQO0NWPsc9OY=" + [mod."github.com/oklog/ulid"] + version = "v1.3.1" + hash = "sha256-LNn883rYNiaoY9sGEPIzlMRx5UwGThdYTjXqfzeGc9k=" + [mod."github.com/olekukonko/tablewriter"] + version = "v0.0.0-20170122224234-a0225b3f23b5" + hash = "sha256-ARnzbCFVz0npfCrsnhi64+bhi8i7SijouaMZ/7vJ6S4=" + [mod."github.com/onsi/ginkgo"] + version = "v1.14.1" + hash = "sha256-izztwvDMHgP0SVhWY2eOKYrACfHmyHZ0FuNVDN2b2qI=" + [mod."github.com/onsi/gomega"] + version = "v1.10.2" + hash = "sha256-cpdElXWK4WJahVbqF8EeaLW71ZPkRVg9KjsUzl7WS8U=" + [mod."github.com/opencontainers/go-digest"] + version = "v1.0.0" + hash = "sha256-cfVDjHyWItmUGZ2dzQhCHgmOmou8v7N+itDkLZVkqkQ=" + [mod."github.com/openshift/api"] + version = "v3.9.0+incompatible" + hash = "sha256-rawzDdF7xnQYXwKWYCMCLXrtQ8MojTWW2mkpwrzgCeU=" + [mod."github.com/pascaldekloe/goe"] + version = "v0.0.0-20180627143212-57f6aae5913c" + hash = "sha256-2KUjqrEC/BwkTZRxImazcI/C3H7QmXfNrlt8slwdDbc=" + [mod."github.com/pborman/uuid"] + version = "v1.2.0" + hash = "sha256-zz0hvDdrajoUaOCXvI/2EIGGoWQa0QlCyFV0jqU3JDg=" + [mod."github.com/pelletier/go-toml"] + version = "v1.2.0" + hash = "sha256-Yt9MGTbIaU/1FhE7SO5UCQbTLxe+2vsypTdf38i3kFY=" + [mod."github.com/peterbourgon/diskv"] + version = "v2.0.1+incompatible" + hash = "sha256-K4mEVjH0eyxyYHQRxdbmgJT0AJrfucUwGB2BplRRt9c=" + [mod."github.com/pkg/errors"] + version = "v0.9.1" + hash = "sha256-mNfQtcrQmu3sNg/7IwiieKWOgFQOVVe2yXgKBpe/wZw=" + [mod."github.com/pmezard/go-difflib"] + version = "v1.0.0" + hash = "sha256-/FtmHnaGjdvEIKAJtrUfEhV7EVo5A/eYrtdnUkuxLDA=" + [mod."github.com/posener/complete"] + version = "v1.1.1" + hash = "sha256-heyPMSBzVlx7ZKgTyzl/xmUfZw3EZCcvGFGrRMIbIr8=" + [mod."github.com/pquerna/cachecontrol"] + version = "v0.0.0-20171018203845-0dec1b30a021" + hash = "sha256-0A/9Zx0atCqUZdnuVdlMdnNrQtKn4jxQWjsDszN03pM=" + [mod."github.com/prometheus/client_golang"] + version = "v1.7.1" + hash = "sha256-PBgo8EAcqkRYLyFxR3GKOP/zzNvu7A18uq/FgSVfPEU=" + [mod."github.com/prometheus/client_model"] + version = "v0.2.0" + hash = "sha256-LTHxYPRgoggl+v89ly2/RkyPIuJlmZRdGs6ZRtK3zkk=" + [mod."github.com/prometheus/common"] + version = "v0.10.0" + hash = "sha256-MYAZJFhir6b2fV8ggC7q9kzIG5h52K7/j+5tq7H7R+U=" + [mod."github.com/prometheus/procfs"] + version = "v0.1.3" + hash = "sha256-JJk/ZBGd1ZJep6RFjaS6IZCeDklcSLwkWZ4MtJoDeOc=" + [mod."github.com/prometheus/tsdb"] + version = "v0.7.1" + hash = "sha256-BPz7YJbfMZgeR+u9YaeWeipVzHIS73EdgXD7VSJSLbA=" + [mod."github.com/rogpeppe/fastuuid"] + version = "v0.0.0-20150106093220-6724a57986af" + hash = "sha256-n4HjQqPQwAH49y6AoG6vxa38pkJylgU2kR2a7uAtRos=" + [mod."github.com/rogpeppe/go-internal"] + version = "v1.3.0" + hash = "sha256-JgiasZeXDy10syy7wmXtqRffDY7CJ1o5VNY+FmmAjVU=" + [mod."github.com/russross/blackfriday/v2"] + version = "v2.0.1" + hash = "sha256-smS2RGP+eOAlWkCJKSQZv7PIKUyJIKM/ty+T1nQ8n1o=" + [mod."github.com/ryanuber/columnize"] + version = "v0.0.0-20160712163229-9b3edd62028f" + hash = "sha256-RLUQcU6Z03upKe08v6rjn9/tkyrQsgmpdEmBtWaLQfk=" + [mod."github.com/sean-/seed"] + version = "v0.0.0-20170313163322-e2103e2c3529" + hash = "sha256-RQQTjvf8Y91jP5FGOyEnGMFw7zCrcSnUU4eH2CXKkT4=" + [mod."github.com/sergi/go-diff"] + version = "v1.0.0" + hash = "sha256-I8rbJFKm44u/wS/gz+2yX9882xXcBdb9mKEKq5OoJRU=" + [mod."github.com/shurcooL/sanitized_anchor_name"] + version = "v1.0.0" + hash = "sha256-DtFSzeLmD1fAl103ncgwab7Vv2F0aulsA+gbkq24ab8=" + [mod."github.com/sirupsen/logrus"] + version = "v1.6.0" + hash = "sha256-4v27X4yyl52BtZcZEnDe0tfvOaEq+TCcp7R8HBzreDM=" + [mod."github.com/smartystreets/assertions"] + version = "v0.0.0-20180927180507-b2de0cb4f26d" + hash = "sha256-PoE+VQEnzJogI/mDBJ6dTCCR217nFjHfYWXQt9Vr9MQ=" + [mod."github.com/smartystreets/goconvey"] + version = "v1.6.4" + hash = "sha256-gDEvwEBgCVYi6daVRlQ2DUXFFlpybM1h4HyvvHphmM4=" + [mod."github.com/soheilhy/cmux"] + version = "v0.1.4" + hash = "sha256-EGyOVbQFq4k+A2M61ZMZ5aAM8uwOPLOcp3ynhswz47g=" + [mod."github.com/spaolacci/murmur3"] + version = "v0.0.0-20180118202830-f09979ecbc72" + hash = "sha256-RWD4PPrlAsZZ8Xy356MBxpj+/NZI7w2XOU14Ob7/Y9M=" + [mod."github.com/spf13/afero"] + version = "v1.2.2" + hash = "sha256-SZVSWEvRzFGZm5u384Rp/LU0dyJ00oIqEQOV9nAxOUk=" + [mod."github.com/spf13/cast"] + version = "v1.3.0" + hash = "sha256-hbVF7F0YsgSybYEJa7W+Rz0As6OpgmpZOxB5JLFzAXc=" + [mod."github.com/spf13/cobra"] + version = "v1.1.1" + hash = "sha256-YdKaCAvr6wAMOQSGzNnNG9LO6Q60T6Z6VSJVTUblomM=" + [mod."github.com/spf13/jwalterweatherman"] + version = "v1.0.0" + hash = "sha256-KLftz+gaA5wSkvLqvQ7CuboB79kKEoTJvgTtrXatbiQ=" + [mod."github.com/spf13/pflag"] + version = "v1.0.5" + hash = "sha256-w9LLYzxxP74WHT4ouBspH/iQZXjuAh2WQCHsuvyEjAw=" + [mod."github.com/spf13/viper"] + version = "v1.7.0" + hash = "sha256-rEBEKDZBAwf429NryLeHHpdzcleC4689hiib584TNiU=" + [mod."github.com/stoewer/go-strcase"] + version = "v1.2.0" + hash = "sha256-Vc8Ecx5DBeAK89TgqxaHV7TUrpjGMUdV6cOc3FM297A=" + [mod."github.com/stretchr/objx"] + version = "v0.2.0" + hash = "sha256-fx9mfz6FjbV2YtLQzk7Wzd+saejwoad2scLLC7Apvnw=" + [mod."github.com/stretchr/testify"] + version = "v1.6.1" + hash = "sha256-GwrZr9lU8698GFal0l/sFQ/TYP/eQIeNnnYJWpe3/IE=" + [mod."github.com/subosito/gotenv"] + version = "v1.2.0" + hash = "sha256-RUsfBl9xvHk8H6SPwiLi/BpHjkyO/YLvlFmRfGRIW1U=" + [mod."github.com/tidwall/pretty"] + version = "v1.0.0" + hash = "sha256-yYJteRI4Eqz63LE++QD+CSBwGn+iXpWkhgjSAVKRl8s=" + [mod."github.com/tmc/grpc-websocket-proxy"] + version = "v0.0.0-20190109142713-0ad062ec5ee5" + hash = "sha256-5OJsX5qqW/MeL4gCapWnU/KvNeAply9cT9xezdMm3Ko=" + [mod."github.com/ugorji/go"] + version = "v1.1.4" + hash = "sha256-n64h3QxN01hQlPOYknATipMitT1hlQGmqfeQgqU38+I=" + [mod."github.com/urfave/cli"] + version = "v1.20.0" + hash = "sha256-l2ogVVY9/fmxFtjuaphK8myaPzVYDblPrLWm8kHkJn8=" + [mod."github.com/vektah/gqlparser"] + version = "v1.1.2" + hash = "sha256-HggIzAVe5vjXHnmEoZQMJSppo6CcrBvo955oB/pkf/c=" + [mod."github.com/xiang90/probing"] + version = "v0.0.0-20190116061207-43a291ad63a2" + hash = "sha256-sXyLzdjys2YAQBxz1ELmV3RulY5huFrOEUQWaYKuQvw=" + [mod."github.com/xordataexchange/crypt"] + version = "v0.0.3-0.20170626215501-b2862e3d0a77" + hash = "sha256-HuXuIK/V5iNuF7j68acNQ3SW7rrn1efaI/Rfq0xBAxM=" + [mod."github.com/yuin/goldmark"] + version = "v1.1.27" + hash = "sha256-Q6Q1tGQ0hbE0A//TT3yrxcvdIrDRB+QZjnyCGC1m4qA=" + [mod."go.etcd.io/bbolt"] + version = "v1.3.5" + hash = "sha256-WVxU7zZkP0+gmwjscUWQHE8iiqOSl+0XMOA8tm98xMA=" + [mod."go.etcd.io/etcd"] + version = "v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5" + hash = "sha256-Sdrmrh2rvdUDp7eGpzzaq8rI1IJeRmoNQM7YZE8RNek=" + [mod."go.mongodb.org/mongo-driver"] + version = "v1.1.2" + hash = "sha256-TMY/sQ0aDKKeflR8O5haS2fOvtSNxM3CMe+vGwXkseU=" + [mod."go.opencensus.io"] + version = "v0.22.3" + hash = "sha256-A6qNyBe3ubB3hu8VJKEzo4uohvhP3dI6hOwItlvxVW8=" + [mod."go.uber.org/atomic"] + version = "v1.6.0" + hash = "sha256-BR42nmQCrvUSK1qWUcVaP+pYAEJOg5kJgE6q8DKEml0=" + [mod."go.uber.org/goleak"] + version = "v1.1.10" + hash = "sha256-1sme1os5aD2mR+Sv/qTJ96PZ32lXbf+uuxdMqSkoREs=" + [mod."go.uber.org/multierr"] + version = "v1.5.0" + hash = "sha256-vMCPfQVr5zYI5+9rlZjA64YeJDSPCDDiA3Rkx7+v7nU=" + [mod."go.uber.org/tools"] + version = "v0.0.0-20190618225709-2cfd321de3ee" + hash = "sha256-vLL9lT4iMxODR5+I6ZS14V4WcEd7REPNYZt0pCdNKLM=" + [mod."go.uber.org/zap"] + version = "v1.15.0" + hash = "sha256-JCzUvn9PEi4LmBdHMrZQ+pMtE8e/qT2Lx8ZG1yHFeXQ=" + [mod."golang.org/x/crypto"] + version = "v0.0.0-20201002170205-7f63de1d35b0" + hash = "sha256-odncubE1ux7rzvBPa04mvf1/3cYYaoflyLc2op1MKLc=" + [mod."golang.org/x/exp"] + version = "v0.0.0-20200224162631-6cc2880d07d6" + hash = "sha256-bhrVk10F9h0g3uRn+rJEA66KqUNy6fG2H56T04KfXPk=" + [mod."golang.org/x/image"] + version = "v0.0.0-20190802002840-cff245a6509b" + hash = "sha256-BP2l1VUXd5afv4fsZ9g6WYy6zEPY782ZAsMrFSe1P0I=" + [mod."golang.org/x/lint"] + version = "v0.0.0-20200302205851-738671d3881b" + hash = "sha256-LNkJ9QCzsDgFjrLI+hYNISu9jrsu9tX9tFKm4i/5cUo=" + [mod."golang.org/x/mobile"] + version = "v0.0.0-20190719004257-d2bd2a29d028" + hash = "sha256-At0uE2mTr/GHCyF4U8Z+AiU2jlvBVQuX25tooo2ll6M=" + [mod."golang.org/x/mod"] + version = "v0.4.2" + hash = "sha256-AMaxD67GPHd887NjhG6ANFtFUPIgHs+hadJ82NJk7Go=" + [mod."golang.org/x/net"] + version = "v0.0.0-20201110031124-69a78807bb2b" + hash = "sha256-4HyK8M534grJBjGZLu+z3llChR6N1zc+e3MQa32iYLQ=" + [mod."golang.org/x/oauth2"] + version = "v0.0.0-20200107190931-bf48bf16ab8d" + hash = "sha256-r+VK6vgr8pMOmLXonG6YhBSUQ+kZJzdHgpV/YFZsOeo=" + [mod."golang.org/x/sync"] + version = "v0.0.0-20190911185100-cd5d95a43a6e" + hash = "sha256-ukGj21BvQcm+cQjIkpabFUeFtABQRlFUZXjj4MX3E9s=" + [mod."golang.org/x/sys"] + version = "v0.0.0-20201112073958-5cba982894dd" + hash = "sha256-z/otbS29pjxXRSv7HbpyUtNXyFaUlApmXP7SDu4kBew=" + [mod."golang.org/x/text"] + version = "v0.3.4" + hash = "sha256-si28LUeDO14RbU4ZAEYNB3XdClrBvFxy2EIDcgXlB70=" + [mod."golang.org/x/time"] + version = "v0.0.0-20200630173020-3af7569d3a1e" + hash = "sha256-eAuotYbzGk6rh6okOQXX0vtw2/uBVONTIlFrugeHGBY=" + [mod."golang.org/x/tools"] + version = "v0.0.0-20200616133436-c1934b75d054" + hash = "sha256-s5WyeTDYIOO6qtPVgHFqcqT0qqueHla+T0yW6TaOZyw=" + [mod."golang.org/x/xerrors"] + version = "v0.0.0-20200804184101-5ec99f83aff1" + hash = "sha256-62f++IO8Ia32CYy+xX8XDxCcT9r1sbPvVwoKV99gf7U=" + [mod."gomodules.xyz/jsonpatch/v2"] + version = "v2.1.0" + hash = "sha256-HuctlpVnROBC74gjJvWGziMP1pjzRmE3ga8yYyACwDg=" + [mod."google.golang.org/api"] + version = "v0.20.0" + hash = "sha256-m7nqVlRss1EJbNEn7uIOXxXdspqNtlcxpMQotWCgJm8=" + [mod."google.golang.org/appengine"] + version = "v1.6.6" + hash = "sha256-nZnEfsXy3mgzRnlyWGHJKqsosvnAQFkhVszw3DSFe6Y=" + [mod."google.golang.org/genproto"] + version = "v0.0.0-20200526211855-cb27e3aa2013" + hash = "sha256-wFVFmWkQLFRBBNTt3C0Dy3GChkYEYnaDLVbQhyq2K1g=" + [mod."google.golang.org/grpc"] + version = "v1.27.1" + hash = "sha256-jPk1fgEH3hVbXuSCY2kGXdWZoRom+wkmnx82fyrxnB4=" + [mod."google.golang.org/protobuf"] + version = "v1.25.0" + hash = "sha256-3sf57K5A0nmA1UmDe+6FUNJI6UR+SfVyZWNv+2TGHT4=" + [mod."gopkg.in/alecthomas/kingpin.v2"] + version = "v2.2.6" + hash = "sha256-uViE2kPj7tMrGYVjjdLOl2jFDmmu+3P7GvnZBse2zVY=" + [mod."gopkg.in/alexcesaro/quotedprintable.v3"] + version = "v3.0.0-20150716171945-2caba252f4dc" + hash = "sha256-6cgI1fteSkqNYkNeReaHz0El7hbomNiRyueg44BHI7o=" + [mod."gopkg.in/check.v1"] + version = "v1.0.0-20190902080502-41f04d3bba15" + hash = "sha256-Xl5gjoqU26M+Yxm6Xok5VHVpYT5hItwsN7d2Wj9L020=" + [mod."gopkg.in/cheggaaa/pb.v1"] + version = "v1.0.25" + hash = "sha256-tw2ZjiPI6xoxFIlftyGI6AP1kdOTkjf8B9v34QyPuG8=" + [mod."gopkg.in/errgo.v2"] + version = "v2.1.0" + hash = "sha256-Ir/MuxQFxvVJEciovGOZbM8ZfKJ/AYotPwYfH2FctRg=" + [mod."gopkg.in/fsnotify.v1"] + version = "v1.4.7" + hash = "sha256-j/Ts92oXa3k1MFU7Yd8/AqafRTsFn7V2pDKCyDJLah8=" + [mod."gopkg.in/gomail.v2"] + version = "v2.0.0-20160411212932-81ebce5c23df" + hash = "sha256-rCKRESTIHR6dkn4HEx6ZlxHfqLTmJvIAtjQFXXaevn0=" + [mod."gopkg.in/inf.v0"] + version = "v0.9.1" + hash = "sha256-z84XlyeWLcoYOvWLxPkPFgLkpjyb2Y4pdeGMyySOZQI=" + [mod."gopkg.in/ini.v1"] + version = "v1.51.0" + hash = "sha256-gQ77WlSLs7+1ACOxnaSp5qb8KZd1tGsoNL9O4uq/jPE=" + [mod."gopkg.in/natefinch/lumberjack.v2"] + version = "v2.0.0" + hash = "sha256-CLir3wRkgNy7tXQWODk7u3RP/W7qIsO2LADdM6/vWtQ=" + [mod."gopkg.in/resty.v1"] + version = "v1.12.0" + hash = "sha256-t9KTjlm1K1WdPAZ0L6rLv0ME/iP/gKeKgvDjXMaxVRg=" + [mod."gopkg.in/square/go-jose.v2"] + version = "v2.2.2" + hash = "sha256-e33daNofpMyBGiotc9/AiHxQ1SSqWSQdRxXxezh2+7I=" + [mod."gopkg.in/tomb.v1"] + version = "v1.0.0-20141024135613-dd632973f1e7" + hash = "sha256-W/4wBAvuaBFHhowB67SZZfXCRDp5tzbYG4vo81TAFdM=" + [mod."gopkg.in/yaml.v2"] + version = "v2.3.0" + hash = "sha256-8tPC5nMGvUFs97W6+JXsxJLjU6EpDmPG9tXo1DyFoNU=" + [mod."gopkg.in/yaml.v3"] + version = "v3.0.0-20200615113413-eeeca48fe776" + hash = "sha256-c/F4pjTx7j+4DBQnRcWbat0WchqMACovc3ybW0ufoxo=" + [mod."gotest.tools"] + version = "v2.2.0+incompatible" + hash = "sha256-BYTGCeD1GH0nUMxaP1ARTpfGk3vQroDNAgb3LYKhon4=" + [mod."gotest.tools/v3"] + version = "v3.0.2" + hash = "sha256-R9KZ5NexCr9mexcjZhPlhRy+cx2d19vGD7hQ9xfFy/4=" + [mod."honnef.co/go/tools"] + version = "v0.0.1-2020.1.3" + hash = "sha256-UI1MNNdyH+nfW7ShzHHTNNlmxOLeJVMSgf8ZfQtcEV8=" + [mod."k8s.io/api"] + version = "v0.20.2" + hash = "sha256-5+6m+A1Wo8kWKay66NKcJ5fqGWxmJr5LPg639lShQDE=" + [mod."k8s.io/apiextensions-apiserver"] + version = "v0.19.2" + hash = "sha256-LjasFi2AxTRLb/ys0cLz94NxcTb8psEzfm3DNlycvOI=" + [mod."k8s.io/apimachinery"] + version = "v0.20.2" + hash = "sha256-3LXYQvpwquhax2fQ4MuDkPg5FhE7Ay/Vo6Tdv6gIDJc=" + [mod."k8s.io/apiserver"] + version = "v0.19.2" + hash = "sha256-JMKW+Kz61PJPh9Z91cz7KyX5IfATp+mgA0NUsSRD6pY=" + [mod."k8s.io/cli-runtime"] + version = "v0.20.2" + hash = "sha256-3I41thzbD2NG8yN0+pZKJ4Ka7N2BV+dUymJ5U1/Uz/s=" + [mod."k8s.io/client-go"] + version = "v0.20.2" + hash = "sha256-+FQzTagUDGa9ypozeOFV4HLsw1hs09iD5vZoyR0TnOM=" + [mod."k8s.io/code-generator"] + version = "v0.19.2" + hash = "sha256-6pGY44kQezwMTzjueHfH0P7GPqvYDJQhv6dRB0JxSDM=" + [mod."k8s.io/component-base"] + version = "v0.19.2" + hash = "sha256-30CAvurpb0z+dCxXlscxNOWYjkENLWyo0WHexJsnPXI=" + [mod."k8s.io/gengo"] + version = "v0.0.0-20200428234225-8167cfdcfc14" + hash = "sha256-n5N6dWGAE8EmgQOt/NO5Evj2HprLSyYzU3TduciOGDw=" + [mod."k8s.io/klog/v2"] + version = "v2.4.0" + hash = "sha256-RA2ciIS20S6bMMeEMuBwYjEd89SA0YYrRChsM7l6mak=" + [mod."k8s.io/kube-openapi"] + version = "v0.0.0-20201113171705-d219536bb9fd" + hash = "sha256-auYHc7KbLJy1WS9wgp00m8svxO1GlW7cgPb3PBQQpIU=" + [mod."k8s.io/utils"] + version = "v0.0.0-20201110183641-67b214c5f920" + hash = "sha256-tSdQUw13SUGrxis61DFIU50rC5eX6PbQhrb8XrqGYSg=" + [mod."rsc.io/binaryregexp"] + version = "v0.2.0" + hash = "sha256-izALTmzybQe67BNXliqQ3xCEOo+b6o8C4YoX5H0FWc0=" + [mod."rsc.io/quote/v3"] + version = "v3.1.0" + hash = "sha256-sF7lOq/bInDPtLI+j610WJRAQ09Cxc5lmPzzytuE6DI=" + [mod."rsc.io/sampler"] + version = "v1.3.0" + hash = "sha256-UPbUO3GOGn6/fz1EBEYONBX45V6bzQKQv6CoZb2Y3S8=" + [mod."sigs.k8s.io/apiserver-network-proxy/konnectivity-client"] + version = "v0.0.9" + hash = "sha256-W57PwBlUDx/gj/Ylf5RUcjRK5dUYPynCxkK7vooEntM=" + [mod."sigs.k8s.io/controller-runtime"] + version = "v0.7.0" + hash = "sha256-fj4SrqyXfyK62nU9TgQ4iFVZVe5PZjGuU09Cictlgc0=" + [mod."sigs.k8s.io/kustomize"] + version = "v2.0.3+incompatible" + hash = "sha256-GG9d5cAwMMkLByE1XK6kM7TpLeutxhYJzOhq80ca6Ew=" + [mod."sigs.k8s.io/structured-merge-diff/v4"] + version = "v4.0.2" + hash = "sha256-IEe1jeQdtgl1r2VCMfjNblXMBQe0htKJjps4PYE0f2w=" + [mod."sigs.k8s.io/yaml"] + version = "v1.2.0" + hash = "sha256-HHqIfaFuKGalif3bP2CcHm8MT8Ily1kJQL9Q8Kz2WHA=" diff --git a/nix/shell.nix b/nix/shell.nix new file mode 100644 index 00000000..8d806a28 --- /dev/null +++ b/nix/shell.nix @@ -0,0 +1,24 @@ +{ pkgs ? ( + let + inherit (builtins) fetchTree fromJSON readFile; + inherit ((fromJSON (readFile ./flake.lock)).nodes) nixpkgs gomod2nix; + in + import (fetchTree nixpkgs.locked) { + overlays = [ + (import "${fetchTree gomod2nix.locked}/overlay.nix") + ]; + } + ) +, mkGoEnv ? pkgs.mkGoEnv +, gomod2nix ? pkgs.gomod2nix +}: + +let + goEnv = mkGoEnv { pwd = ../.; }; +in +pkgs.mkShell { + packages = [ + goEnv + gomod2nix + ]; +} diff --git a/pkg/configuration/user/seedjobs/seedjobs.go b/pkg/configuration/user/seedjobs/seedjobs.go index 5d7fa5c6..f7522f67 100644 --- a/pkg/configuration/user/seedjobs/seedjobs.go +++ b/pkg/configuration/user/seedjobs/seedjobs.go @@ -46,7 +46,7 @@ const ( AgentName = "seed-job-agent" // DefaultAgentImage is the default image used for the seed-job agent - defaultAgentImage = "jenkins/inbound-agent:4.10-3" + defaultAgentImage = "jenkins/inbound-agent:3206.vb_15dcf73f6a_9-3" creatingGroovyScriptName = "seed-job-groovy-script.groovy" diff --git a/pkg/configuration/user/seedjobs/seedjobs_test.go b/pkg/configuration/user/seedjobs/seedjobs_test.go index 6e29b82f..dc2169e9 100644 --- a/pkg/configuration/user/seedjobs/seedjobs_test.go +++ b/pkg/configuration/user/seedjobs/seedjobs_test.go @@ -113,7 +113,7 @@ func TestEnsureSeedJobs(t *testing.T) { var agentDeployment appsv1.Deployment err = fakeClient.Get(ctx, types.NamespacedName{Namespace: jenkins.Namespace, Name: agentDeploymentName(*jenkins, AgentName)}, &agentDeployment) assert.NoError(t, err) - assert.Equal(t, "jenkins/inbound-agent:4.10-3", agentDeployment.Spec.Template.Spec.Containers[0].Image) + assert.Equal(t, "jenkins/inbound-agent:3206.vb_15dcf73f6a_9-3", agentDeployment.Spec.Template.Spec.Containers[0].Image) }) t.Run("delete agent deployment when no seed jobs", func(t *testing.T) { diff --git a/pkg/constants/constants.go b/pkg/constants/constants.go index 5ac3dc97..acd0fc33 100644 --- a/pkg/constants/constants.go +++ b/pkg/constants/constants.go @@ -8,7 +8,7 @@ const ( // SeedJobSuffix is a suffix added for all seed jobs SeedJobSuffix = "job-dsl-seed" // DefaultJenkinsMasterImage is the default Jenkins master docker image - DefaultJenkinsMasterImage = "jenkins/jenkins:2.414.1-lts" + DefaultJenkinsMasterImage = "jenkins/jenkins:2.440.1-lts" // DefaultHTTPPortInt32 is the default Jenkins HTTP port DefaultHTTPPortInt32 = int32(8080) // DefaultSlavePortInt32 is the default Jenkins port for slaves diff --git a/pkg/plugins/base_plugins.go b/pkg/plugins/base_plugins.go index f22dd2b1..9ea3f287 100644 --- a/pkg/plugins/base_plugins.go +++ b/pkg/plugins/base_plugins.go @@ -1,13 +1,13 @@ package plugins const ( - configurationAsCodePlugin = "configuration-as-code:1700.v6f448841296e" + configurationAsCodePlugin = "configuration-as-code:1775.v810dc950b_514" gitPlugin = "git:5.2.1" - jobDslPlugin = "job-dsl:1.85" - kubernetesPlugin = "kubernetes:4029.v5712230ccb_f8" - kubernetesCredentialsProviderPlugin = "kubernetes-credentials-provider:1.234.vf3013b_35f5b_a" + jobDslPlugin = "job-dsl:1.87" + kubernetesPlugin = "kubernetes:4186.v1d804571d5d4" + kubernetesCredentialsProviderPlugin = "kubernetes-credentials-provider:1.258.v95949f923a_a_e" workflowAggregatorPlugin = "workflow-aggregator:596.v8c21c963d92d" - workflowJobPlugin = "workflow-job:1342.v046651d5b_dfe" + workflowJobPlugin = "workflow-job:1385.vb_58b_86ea_fff1" ) // basePluginsList contains plugins to install by operator. diff --git a/test/e2e/configuration_test.go b/test/e2e/configuration_test.go index 6de833f7..ebc165d1 100644 --- a/test/e2e/configuration_test.go +++ b/test/e2e/configuration_test.go @@ -24,13 +24,13 @@ import ( const e2e = "e2e" var expectedBasePluginsList = []plugins.Plugin{ - plugins.Must(plugins.New("configuration-as-code:1700.v6f448841296e")), + plugins.Must(plugins.New("configuration-as-code:1775.v810dc950b_514")), plugins.Must(plugins.New("git:5.2.1")), - plugins.Must(plugins.New("kubernetes:4029.v5712230ccb_f8")), - plugins.Must(plugins.New("kubernetes-credentials-provider:1.234.vf3013b_35f5b_a")), - plugins.Must(plugins.New("job-dsl:1.85")), + plugins.Must(plugins.New("kubernetes:4186.v1d804571d5d4")), + plugins.Must(plugins.New("kubernetes-credentials-provider:1.258.v95949f923a_a_e")), + plugins.Must(plugins.New("job-dsl:1.87")), plugins.Must(plugins.New("workflow-aggregator:596.v8c21c963d92d")), - plugins.Must(plugins.New("workflow-job:1342.v046651d5b_dfe")), + plugins.Must(plugins.New("workflow-job:1385.vb_58b_86ea_fff1")), } func createUserConfigurationSecret(namespace string, stringData map[string]string) { diff --git a/test/e2e/jenkins_test.go b/test/e2e/jenkins_test.go index 4c3a45d9..1543c465 100644 --- a/test/e2e/jenkins_test.go +++ b/test/e2e/jenkins_test.go @@ -125,10 +125,10 @@ func createJenkinsCRSafeRestart(name, namespace string, seedJob *[]v1alpha2.Seed }, }, Plugins: []v1alpha2.Plugin{ - {Name: "audit-trail", Version: "3.11"}, - {Name: "simple-theme-plugin", Version: "136.v23a_15f86c53d"}, - {Name: "github", Version: "1.36.0"}, - {Name: "devoptics", Version: "1.1973", DownloadURL: "https://jenkins-updates.cloudbees.com/download/plugins/devoptics/1.1973/devoptics.hpi"}, + {Name: "audit-trail", Version: "361.v82cde86c784e"}, + {Name: "simple-theme-plugin", Version: "176.v39740c03a_a_f5"}, + {Name: "github", Version: "1.38.0"}, + {Name: "devoptics", Version: "2.0", DownloadURL: "https://jenkins-updates.cloudbees.com/download/plugins/devoptics/2.0/devoptics.hpi"}, }, PriorityClassName: priorityClassName, NodeSelector: map[string]string{"kubernetes.io/os": "linux"}, @@ -145,6 +145,7 @@ func createJenkinsCRSafeRestart(name, namespace string, seedJob *[]v1alpha2.Seed Service: v1alpha2.Service{ Type: corev1.ServiceTypeNodePort, Port: constants.DefaultHTTPPortInt32, + NodePort: 30303, }, }, } @@ -239,10 +240,12 @@ func verifyJenkinsAPIConnection(jenkins *v1alpha2.Jenkins, namespace string) (je func restartJenkinsMasterPod(jenkins *v1alpha2.Jenkins) { _, _ = fmt.Fprintf(GinkgoWriter, "Restarting Jenkins master pod\n") jenkinsPod := getJenkinsMasterPod(jenkins) + _, _ = fmt.Fprintf(GinkgoWriter, "Jenkins pod: %+v\n", jenkinsPod) Expect(K8sClient.Delete(context.TODO(), jenkinsPod)).Should(Succeed()) Eventually(func() (bool, error) { jenkinsPod = getJenkinsMasterPod(jenkins) + fmt.Printf("Jenkins pod deletion timestamp: %v\n", jenkinsPod.DeletionTimestamp) return jenkinsPod.DeletionTimestamp != nil, nil }, 45*retryInterval, retryInterval).Should(BeTrue()) diff --git a/test/e2e/restorebackup_test.go b/test/e2e/restorebackup_test.go index 34d1ffb2..cb895853 100644 --- a/test/e2e/restorebackup_test.go +++ b/test/e2e/restorebackup_test.go @@ -53,7 +53,7 @@ func createPVC(namespace string) { Namespace: namespace, }, Spec: corev1.PersistentVolumeClaimSpec{ - AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteMany}, + AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce}, Resources: corev1.ResourceRequirements{ Requests: corev1.ResourceList{ corev1.ResourceStorage: resource.MustParse("1Gi"), @@ -212,6 +212,7 @@ func createJenkinsWithBackupAndRestoreConfigured(name, namespace string) *v1alph Service: v1alpha2.Service{ Type: corev1.ServiceTypeNodePort, Port: constants.DefaultHTTPPortInt32, + NodePort: 30303, }, }, } diff --git a/test/e2e/test_utility.go b/test/e2e/test_utility.go index c08417eb..7b62003f 100644 --- a/test/e2e/test_utility.go +++ b/test/e2e/test_utility.go @@ -21,7 +21,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/envtest" ) -const JenkinsTestImage = "jenkins/jenkins:2.414.1-lts" +const JenkinsTestImage = "jenkins/jenkins:2.440.1-lts" var ( Cfg *rest.Config @@ -147,10 +147,10 @@ func RenderJenkinsCR(name, namespace string, seedJob *[]v1alpha2.SeedJob, groovy }, }, Plugins: []v1alpha2.Plugin{ - {Name: "audit-trail", Version: "3.11"}, - {Name: "simple-theme-plugin", Version: "136.v23a_15f86c53d"}, - {Name: "github", Version: "1.36.0"}, - {Name: "devoptics", Version: "1.1973", DownloadURL: "https://jenkins-updates.cloudbees.com/download/plugins/devoptics/1.1973/devoptics.hpi"}, + {Name: "audit-trail", Version: "361.v82cde86c784e"}, + {Name: "simple-theme-plugin", Version: "176.v39740c03a_a_f5"}, + {Name: "github", Version: "1.38.0"}, + {Name: "devoptics", Version: "2.0", DownloadURL: "https://jenkins-updates.cloudbees.com/download/plugins/devoptics/2.0/devoptics.hpi"}, }, PriorityClassName: priorityClassName, NodeSelector: map[string]string{"kubernetes.io/os": "linux"}, @@ -167,6 +167,7 @@ func RenderJenkinsCR(name, namespace string, seedJob *[]v1alpha2.SeedJob, groovy Service: v1alpha2.Service{ Type: corev1.ServiceTypeNodePort, Port: constants.DefaultHTTPPortInt32, + NodePort: 30303, }, Roles: []rbacv1.RoleRef{ { diff --git a/test/e2e/wait.go b/test/e2e/wait.go index 59ee67df..00390a16 100644 --- a/test/e2e/wait.go +++ b/test/e2e/wait.go @@ -20,7 +20,7 @@ import ( ) var ( - retryInterval = time.Second * 5 + retryInterval = time.Second * 10 ) func WaitForJenkinsBaseConfigurationToComplete(jenkins *v1alpha2.Jenkins) { @@ -53,6 +53,8 @@ func waitForRecreateJenkinsMasterPod(jenkins *v1alpha2.Jenkins) { } pods := &corev1.PodList{} err := K8sClient.List(context.TODO(), pods, lo) + // debug print + _, _ = fmt.Fprintf(ginkgo.GinkgoWriter, "Pods: %+v\n", pods) if err != nil { return false, err } diff --git a/test/helm/helm_test.go b/test/helm/helm_test.go index 14685cff..5e65ed39 100644 --- a/test/helm/helm_test.go +++ b/test/helm/helm_test.go @@ -47,7 +47,7 @@ var _ = Describe("Jenkins Controller", func() { cmd := exec.Command("../../bin/helm", "upgrade", "jenkins", "../../chart/jenkins-operator", "--namespace", namespace.Name, "--debug", "--set-string", fmt.Sprintf("jenkins.namespace=%s", namespace.Name), - "--set-string", fmt.Sprintf("jenkins.image=%s", "jenkins/jenkins:2.414.1-lts"), + "--set-string", fmt.Sprintf("jenkins.image=%s", "jenkins/jenkins:2.440.1-lts"), "--set-string", fmt.Sprintf("operator.image=%s", *imageName), "--install") output, err := cmd.CombinedOutput() Expect(err).NotTo(HaveOccurred(), string(output)) @@ -80,9 +80,9 @@ var _ = Describe("Jenkins Controller with security validator", func() { {Name: "github", Version: "1.36.0"}, } validPlugins = []v1alpha2.Plugin{ - {Name: "simple-theme-plugin", Version: "136.v23a_15f86c53d"}, - {Name: "audit-trail", Version: "3.11"}, - {Name: "github", Version: "1.37.3.1"}, + {Name: "simple-theme-plugin", Version: "176.v39740c03a_a_f5"}, + {Name: "audit-trail", Version: "361.v82cde86c784e"}, + {Name: "github", Version: "1.38.0"}, } ) diff --git a/variables.mk b/variables.mk index b6a6a771..af82abb5 100644 --- a/variables.mk +++ b/variables.mk @@ -1,4 +1,4 @@ -SHELL := /bin/bash +SHELL := /usr/bin/env bash PATH := $(GOPATH)/bin:$(PATH) OSFLAG := @@ -14,13 +14,18 @@ else endif endif -include config.base.env +define strip_quotes +$(shell echo $(1) | sed -e 's/^"//' -e 's/"$$//') +endef # Import config # You can change the default config with `make config="config_special.env" build` -config ?= config.minikube.env +config ?= config.kind.env include $(config) +include config.base.env +$(foreach var,$(shell cat config.base.env),$(eval $(call strip_quotes,$(var)))) + # Set an output prefix, which is the local directory if not specified PREFIX?=$(shell pwd) @@ -99,4 +104,4 @@ endif ENVTEST_ASSETS_DIR=$(shell pwd)/testbin -PROJECT_DIR := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST)))) \ No newline at end of file +PROJECT_DIR := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST))))