From 252bb9bc61c19d201587cf7e1afd3fdc7f3de4b7 Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 4 Aug 2023 08:12:00 -0300 Subject: [PATCH] chore: delete terraform package Signed-off-by: Francisco --- tests/terraform/.gitignore | 4 - tests/terraform/.golangci.yaml | 79 -- tests/terraform/Makefile | 75 -- tests/terraform/README.md | 107 -- tests/terraform/config.mk | 13 - .../terraform/createcluster/createcluster.go | 92 -- .../createcluster/createcluster_test.go | 259 ----- tests/terraform/go.mod | 65 -- tests/terraform/go.sum | 975 ------------------ .../manual_upgrade/upgradecluster_test.go | 387 ------- tests/terraform/modules/define_node_role.sh | 104 -- .../terraform/modules/install_rke2_master.sh | 104 -- tests/terraform/modules/join_rke2_agent.sh | 82 -- tests/terraform/modules/join_rke2_master.sh | 88 -- tests/terraform/modules/main.tf | 77 -- .../modules/master/instances_server.tf | 352 ------- tests/terraform/modules/master/outputs.tf | 13 - tests/terraform/modules/master/variables.tf | 46 - .../terraform/modules/optional_write_files.sh | 19 - tests/terraform/modules/outputs.tf | 14 - tests/terraform/modules/providers.tf | 3 - tests/terraform/modules/variables.tf | 73 -- .../modules/worker/instances_worker.tf | 57 - tests/terraform/modules/worker/outputs.tf | 3 - tests/terraform/modules/worker/variables.tf | 30 - tests/terraform/resource_files/clusterip.yaml | 43 - tests/terraform/resource_files/daemonset.yaml | 28 - tests/terraform/resource_files/dnsutils.yaml | 23 - tests/terraform/resource_files/ingress.yaml | 77 -- tests/terraform/resource_files/nodeport.yaml | 45 - tests/terraform/resource_files/suc.yaml | 103 -- .../resource_files/upgrade-plan.yaml | 66 -- tests/terraform/scripts/Dockerfile.build | 27 - tests/terraform/scripts/Jenkinsfile | 93 -- tests/terraform/scripts/build.sh | 22 - tests/terraform/scripts/configure.sh | 12 - tests/terraform/scripts/delete_resources.sh | 86 -- tests/terraform/suc_upgrade/upgradecluster.go | 28 - .../suc_upgrade/upgradecluster_test.go | 453 -------- tests/terraform/testutils.go | 292 ------ .../upgradecluster/upgradecluster_test.go | 453 -------- 41 files changed, 4972 deletions(-) delete mode 100644 tests/terraform/.gitignore delete mode 100644 tests/terraform/.golangci.yaml delete mode 100644 tests/terraform/Makefile delete mode 100644 tests/terraform/README.md delete mode 100644 tests/terraform/config.mk delete mode 100644 tests/terraform/createcluster/createcluster.go delete mode 100644 tests/terraform/createcluster/createcluster_test.go delete mode 100644 tests/terraform/go.mod delete mode 100644 tests/terraform/go.sum delete mode 100644 tests/terraform/manual_upgrade/upgradecluster_test.go delete mode 100644 tests/terraform/modules/define_node_role.sh delete mode 100755 tests/terraform/modules/install_rke2_master.sh delete mode 100755 tests/terraform/modules/join_rke2_agent.sh delete mode 100755 tests/terraform/modules/join_rke2_master.sh delete mode 100644 tests/terraform/modules/main.tf delete mode 100644 tests/terraform/modules/master/instances_server.tf delete mode 100644 tests/terraform/modules/master/outputs.tf delete mode 100644 tests/terraform/modules/master/variables.tf delete mode 100644 tests/terraform/modules/optional_write_files.sh delete mode 100644 tests/terraform/modules/outputs.tf delete mode 100644 tests/terraform/modules/providers.tf delete mode 100644 tests/terraform/modules/variables.tf delete mode 100644 tests/terraform/modules/worker/instances_worker.tf delete mode 100644 tests/terraform/modules/worker/outputs.tf delete mode 100644 tests/terraform/modules/worker/variables.tf delete mode 100644 tests/terraform/resource_files/clusterip.yaml delete mode 100644 tests/terraform/resource_files/daemonset.yaml delete mode 100644 tests/terraform/resource_files/dnsutils.yaml delete mode 100644 tests/terraform/resource_files/ingress.yaml delete mode 100644 tests/terraform/resource_files/nodeport.yaml delete mode 100644 tests/terraform/resource_files/suc.yaml delete mode 100644 tests/terraform/resource_files/upgrade-plan.yaml delete mode 100644 tests/terraform/scripts/Dockerfile.build delete mode 100644 tests/terraform/scripts/Jenkinsfile delete mode 100755 tests/terraform/scripts/build.sh delete mode 100755 tests/terraform/scripts/configure.sh delete mode 100755 tests/terraform/scripts/delete_resources.sh delete mode 100644 tests/terraform/suc_upgrade/upgradecluster.go delete mode 100644 tests/terraform/suc_upgrade/upgradecluster_test.go delete mode 100644 tests/terraform/testutils.go delete mode 100644 tests/terraform/upgradecluster/upgradecluster_test.go diff --git a/tests/terraform/.gitignore b/tests/terraform/.gitignore deleted file mode 100644 index 493038c7c0..0000000000 --- a/tests/terraform/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.ssh/ -*.tfstate* -.terraform* -config/ diff --git a/tests/terraform/.golangci.yaml b/tests/terraform/.golangci.yaml deleted file mode 100644 index 273f792582..0000000000 --- a/tests/terraform/.golangci.yaml +++ /dev/null @@ -1,79 +0,0 @@ -linters: - enable: - - gofmt - - govet - - revive - - gosec - - megacheck - - misspell - - unparam - - exportloopref - - nlreturn - - nestif - - dupl - - gci - - ginkgolinter - -linters-settings: - govet: - check-shadowing: true - check-tests: true - - nestif: - min-complexity: 4 - - revive: - confidence: 0.8 - severity: warning - ignore-generated-header: true - rules: - - name: line-length-limit - arguments: [100] - - name: cognitive-complexity - arguments: [10] - - name: empty-lines - - name: empty-block - - name: bare-return - - name: blank-imports - - name: confusing-naming - - name: confusing-results - - name: context-as-argument - - name: duplicated-imports - - name: early-return - - name: empty-block - - name: error-naming - - name: error-return - - name: error-strings - - name: errorf - - name: exported - - name: flag-parameter - - name: get-return - - name: if-return - - name: increment-decrement - - name: indent-error-flow - - name: import-shadowing - - name: modifies-parameter - - name: modifies-value-receiver - - name: range - - name: range-val-in-closure - - name: range-val-address - - name: receiver-naming - - name: string-of-int - - name: struct-tag - - name: superfluous-else - - name: time-naming - - name: var-declaration - - name: unconditional-recursion - - name: unexported-naming - - name: unexported-return - - name: unhandled-error - arguments: ["fmt.Printf", "builder.WriteString"] - - name: unnecessary-stmt - - name: unreachable-code - - name: unused-parameter - - name: unused-receiver - -issues: - exclude-rules: - - linters: [typecheck] - text: "command-line-arguments" \ No newline at end of file diff --git a/tests/terraform/Makefile b/tests/terraform/Makefile deleted file mode 100644 index d258311980..0000000000 --- a/tests/terraform/Makefile +++ /dev/null @@ -1,75 +0,0 @@ -##========================= Terraform Tests =========================# -include ./config.mk - - -TAGNAME ?= default -tf-up: - @cd ../.. && docker build . -q -f ./tests/terraform/scripts/Dockerfile.build -t rke2-tf-${TAGNAME} - -.PHONY: tf-run -tf-run: - @docker run -d --name rke2-tf-test-${IMGNAME} -t \ - -e AWS_ACCESS_KEY_ID="${AWS_ACCESS_KEY_ID}" \ - -e AWS_SECRET_ACCESS_KEY="${AWS_SECRET_ACCESS_KEY}" \ - -v ${ACCESS_KEY_LOCAL}:/go/src/github.com/rancher/rke2/tests/terraform/modules/config/.ssh/aws_key.pem \ - rke2-tf-${TAGNAME} sh -c 'cd ./tests/terraform ; \ - if [ -n "${ARGNAME}" ]; then \ - go test -v -timeout=45m \ - ./${TESTDIR}/... \ - -"${ARGNAME}"="${ARGVALUE}"; \ - elif [ -z "${TESTDIR}" ]; then \ - go test -v -timeout=40m \ - ./createcluster/...; \ - else \ - go test -v -timeout=45m \ - ./${TESTDIR}/...; \ - fi' - -.PHONY: tf-logs -tf-logs: - @docker logs -f rke2-tf-test-${IMGNAME} - -.PHONY: tf-down -tf-down: - @echo "Removing containers and images" - @docker stop $$(docker ps -a -q --filter="name=rke2-tf*") - @docker rm $$(docker ps -a -q --filter="name=rke2-tf*") - @docker rmi $$(docker images -q --filter="reference=rke2-tf*") - -.PHONY: tf-clean -tf-clean: - @./scripts/delete_resources.sh - -.PHONY: tf-complete -tf-tests-complete: tf-clean tf-down tf-remove-state tf-up tf-run - - -#========================= Run terraform tests locally =========================# - -.PHONY: tf-create -tf-create: - @go test -timeout=45m -v ./createcluster/... - -.PHONY: tf-upgrade -tf-upgrade: - @go test -timeout=45m -v ./upgradecluster/... -${ARGNAME}=${ARGVALUE} - -.PHONY: tf-remove-state -tf-remove-state: - @rm -rf ./modules/.terraform - @rm -rf ./modules/.terraform.lock.hcl ./modules/terraform.tfstate ./modules/terraform.tfstate.backup - -.PHONY: tf-test-suite -tf-test-suite: - @make tf-remove-state && make tf-create ; sleep 5 && \ - make tf-remove-state && make tf-upgrade ${ARGNAME}=${ARGVALUE} - -.PHONY: tf-test-suite-same-cluster -tf-test-suite-same-cluster: - @make tf-create ; sleep 5 && make tf-upgrade ${ARGNAME}=${ARGVALUE} - -#========================= TestCode Static Quality Check =========================# -.PHONY: vet-lint ## Run locally only inside Tests package -vet-lint: - @echo "Running go vet and lint" - @go vet ./${TESTDIR} && golangci-lint run --tests \ No newline at end of file diff --git a/tests/terraform/README.md b/tests/terraform/README.md deleted file mode 100644 index ad62079bcc..0000000000 --- a/tests/terraform/README.md +++ /dev/null @@ -1,107 +0,0 @@ -# Terraform (TF) Tests - -Terraform (TF) tests are an additional form of End-to-End (E2E) tests that cover multi-node RKE2 configuration and administration: install, update, teardown, etc. across a wide range of operating systems. Terraform tests are used as part of RKE2 quality assurance (QA) to bring up clusters with different configurations on demand, perform specific functionality tests, and keep them up and running to perform some exploratory tests in real-world scenarios. - -## Framework -TF tests utilize [Ginkgo](https://onsi.github.io/ginkgo/) and [Gomega](https://onsi.github.io/gomega/) like the e2e tests. They rely on [Terraform](https://www.terraform.io/) to provide the underlying cluster configuration. - -## Format - -- All TF tests should be placed under `tests/terraform/`. -- All TF test functions should be named: `Test_TF`. - -See the [create cluster test](../tests/terraform/createcluster_test.go) as an example. - -## Running - -- Before running the tests, it's required to create a tfvars file in `./tests/terraform/modules/config/local.tfvars`. This should be filled in to match the desired variables, including those relevant for your AWS environment. All variables that are necessary can be seen in [main.tf](../tests/terraform/modules/main.tf). -It is also required to have standard AWS environment variables present: `AWS_ACCESS_KEY_ID` , `AWS_SECRET_ACCESS_KEY` and `ACCESS_KEY_LOCAL` - - -- The local.tfvars split roles section should be strictly followed to not cause any false positives or negatives on tests - - -- Please also when creating tf var resource_name, make sure that you do not have any instances from other automations with the same name to avoid deleting wrong resources - - -- If you want to run tests locally totally in parallel, please make sure that you have different resource_name for each test - -*** - -Tests can be run per package with: -```bash -go test -timeout=30m -v ./tests/terraform/$PACKAGE_NAME/... -``` -Additionally, you can use docker to run the tests, which may be beneficial when wanting to run multiple tests in parallel. Just be sure to change the resource name in the tfvars file to ensure there won't be overwrites! Provided example below is for running two separate packages using docker: -```bash -$ docker build . -f ./tests/terraform/scripts/Dockerfile.build -t rke2-tf -# These next commands assume you have the following environment variable in your config/local.tfvars: 'access_key = "/tmp/aws_key.pem"' -$ docker run --name rke2-tf-creation-test -t -e AWS_ACCESS_KEY_ID= -e AWS_SECRET_ACCESS_KEY= -v /path/to/aws/key.pem:/tmp/aws_key.pem rke2-tf sh -c "go test -timeout=30m -v ./tests/terraform/createcluster/..." -$ docker run --name rke2-tf-upgrade-test -t -e AWS_ACCESS_KEY_ID= -e AWS_SECRET_ACCESS_KEY= -v /path/to/aws/key.pem:/tmp/aws_key.pem rke2-tf sh -c "go test -timeout=45m -v ./tests/terraform/upgradecluster/... -upgradeVersion=v1.24.8+rke2r1" -``` -Test Flags: -``` -- ${upgradeVersion} version to upgrade to -``` -We can also run tests through the Makefile through ./test/terraform directory: - -- On the first run with make and docker please delete your .terraform folder, terraform.tfstate and terraform.hcl.lock file -```bash -Args: -*All args are optional and can be used with: - -`$make tf-run` `$make tf-logs`, -`$make vet-lint` `$make tf-complete`, -`$make tf-upgrade` `$make tf-test-suite-same-cluster`, -`$make tf-test-suite` - -- ${IMGNAME} append any string to the end of image name -- ${TAGNAME} append any string to the end of tag name -- ${ARGNAME} name of the arg to pass to the test -- ${ARGVALUE} value of the arg to pass to the test -- ${TESTDIR} path to the test directory - -Commands: -$ make tf-up # create the image from Dockerfile.build -$ make tf-run # runs all tests if no flags or args provided -$ make tf-down # removes the image -$ make tf-clean # removes instances and resources created by tests -$ make tf-logs # prints logs from container the tests -$ make tf--complete # clean resources + remove images + run tests -$ make tf-create # runs create cluster test locally -$ make tf-upgrade # runs upgrade cluster test locally -$ make tf-test-suite-same-cluster # runs all tests locally in sequence using the same state -$ make tf-remove-state # removes terraform state dir and files -$ make tf-test-suite # runs all tests locally in sequence not using the same state -$ make vet-lint # runs go vet and go lint - - -Examples: -$ make tf-up TAGNAME=ubuntu -$ make tf-run IMGNAME=2 TAGNAME=ubuntu TESTDIR=upgradecluster ARGNAME=upgradeVersion ARGVALUE=v1.26.2+rke2r1 -$ make tf-run TESTDIR=createcluster -$ make tf-logs IMGNAME=1 -$ make vet-lint TESTDIR=upgradecluster -``` - -# Running tests in parallel: -- You can play around and have a lot of different test combinations like: -``` -- Build docker image with different TAGNAME="OS`s" + with different configurations( resource_name, node_os, versions, install type, nodes and etc) and have unique "IMGNAMES" -- And in the meanwhile run also locally with different configuration while your dockers TAGNAME and IMGNAMES are running -``` - -# In between tests: -- If you want to run with same cluster do not delete ./tests/terraform/modules/terraform.tfstate + .terraform.lock.hcl file after each test. - -- If you want to use new resources then make sure to delete the ./tests/terraform/modules/terraform.tfstate + .terraform.lock.hcl file if you want to create a new cluster. - - -# Common Issues: - -- Issues related to terraform plugin please also delete the modules/.terraform folder -- In mac m1 maybe you need also to go to rke2/tests/terraform/modules and run `terraform init` to download the plugins - - -# Debugging -To focus individual runs on specific test clauses, you can prefix with `F`. For example, in the [create cluster test](../tests/terraform/createcluster_test.go), you can update the initial creation to be: `FIt("Starts up with no issues", func() {` in order to focus the run on only that clause. diff --git a/tests/terraform/config.mk b/tests/terraform/config.mk deleted file mode 100644 index 89a789f028..0000000000 --- a/tests/terraform/config.mk +++ /dev/null @@ -1,13 +0,0 @@ -SHELL := /bin/bash - -TFVARS_PATH := terraform/modules/config/local.tfvars - -ifeq ($(wildcard ${TFVARS_PATH}),) - RESOURCE_NAME := -else - export RESOURCE_NAME := $(shell sed -n 's/resource_name *= *"\([^"]*\)"/\1/p' ${TFVARS_PATH}) -endif - -export ACCESS_KEY_LOCAL -export AWS_ACCESS_KEY_ID -export AWS_SECRET_ACCESS_KEY \ No newline at end of file diff --git a/tests/terraform/createcluster/createcluster.go b/tests/terraform/createcluster/createcluster.go deleted file mode 100644 index 7eb4e30352..0000000000 --- a/tests/terraform/createcluster/createcluster.go +++ /dev/null @@ -1,92 +0,0 @@ -package createcluster - -import ( - "fmt" - - "path/filepath" - "strconv" - "testing" - - "github.com/gruntwork-io/terratest/modules/terraform" - tf "github.com/rancher/rke2/tests/terraform" -) - -var ( - KubeConfigFile string - MasterIPs string - WorkerIPs string - NumServers int - NumWorkers int - AwsUser string - AccessKey string - modulesPath = "/tests/terraform/modules" - tfVarsPath = "/tests/terraform/modules/config/local.tfvars" -) - -func BuildCluster(t *testing.T, destroy bool) (string, error) { - tfDir, err := filepath.Abs(tf.Basepath() + modulesPath) - if err != nil { - return "", err - } - - varDir, err := filepath.Abs(tf.Basepath() + tfVarsPath) - if err != nil { - return "", err - } - terraformOptions := terraform.Options{ - TerraformDir: tfDir, - VarFiles: []string{varDir}, - } - - NumServers, err = strconv.Atoi(terraform.GetVariableAsStringFromVarFile(t, varDir, "no_of_server_nodes")) - if err != nil { - return "", err - } - NumWorkers, err = strconv.Atoi(terraform.GetVariableAsStringFromVarFile(t, varDir, "no_of_worker_nodes")) - if err != nil { - return "", err - } - - splitRoles := terraform.GetVariableAsStringFromVarFile(t, varDir, "split_roles") - if splitRoles == "true" { - etcdNodes, err := strconv.Atoi(terraform.GetVariableAsStringFromVarFile(t, varDir, "etcd_only_nodes")) - if err != nil { - return "", err - } - etcdCpNodes, err := strconv.Atoi(terraform.GetVariableAsStringFromVarFile(t, varDir, "etcd_cp_nodes")) - if err != nil { - return "", err - } - etcdWorkerNodes, err := strconv.Atoi(terraform.GetVariableAsStringFromVarFile(t, varDir, "etcd_worker_nodes")) - if err != nil { - return "", err - } - cpNodes, err := strconv.Atoi(terraform.GetVariableAsStringFromVarFile(t, varDir, "cp_only_nodes")) - if err != nil { - return "", err - } - cpWorkerNodes, err := strconv.Atoi(terraform.GetVariableAsStringFromVarFile(t, varDir, "cp_worker_nodes")) - if err != nil { - return "", err - } - NumServers = NumServers + etcdNodes + etcdCpNodes + etcdWorkerNodes + cpNodes + cpWorkerNodes - } - - AwsUser = terraform.GetVariableAsStringFromVarFile(t, varDir, "aws_user") - AccessKey = terraform.GetVariableAsStringFromVarFile(t, varDir, "access_key") - - if destroy { - fmt.Printf("Cluster is being deleted") - terraform.Destroy(t, &terraformOptions) - return "cluster destroyed", nil - } - - fmt.Printf("Creating Cluster") - - terraform.InitAndApply(t, &terraformOptions) - KubeConfigFile = terraform.Output(t, &terraformOptions, "kubeconfig") - MasterIPs = terraform.Output(t, &terraformOptions, "master_ips") - WorkerIPs = terraform.Output(t, &terraformOptions, "worker_ips") - - return "cluster created", nil -} diff --git a/tests/terraform/createcluster/createcluster_test.go b/tests/terraform/createcluster/createcluster_test.go deleted file mode 100644 index 62fcfb982c..0000000000 --- a/tests/terraform/createcluster/createcluster_test.go +++ /dev/null @@ -1,259 +0,0 @@ -package createcluster - -import ( - "flag" - "fmt" - "regexp" - "strings" - "testing" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - - "github.com/rancher/rke2/tests/terraform" -) - -var destroy = flag.Bool("destroy", false, "a bool") - -func Test_TFClusterCreateValidation(t *testing.T) { - RegisterFailHandler(Fail) - flag.Parse() - - RunSpecs(t, "Create Cluster Test Suite") -} - -var _ = Describe("Test:", func() { - Context("Build Cluster:", func() { - It("Starts up with no issues", func() { - status, err := BuildCluster(&testing.T{}, false) - Expect(err).NotTo(HaveOccurred()) - Expect(status).To(Equal("cluster created")) - - defer GinkgoRecover() - - fmt.Println("Server Node IPS:", MasterIPs) - fmt.Println("Agent Node IPS:", WorkerIPs) - terraform.PrintFileContents(KubeConfigFile) - - Expect(KubeConfigFile).ShouldNot(BeEmpty()) - Expect(MasterIPs).ShouldNot(BeEmpty()) - - if NumWorkers > 0 { - Expect(WorkerIPs).ShouldNot(BeEmpty()) - } else { - Expect(WorkerIPs).Should(BeEmpty()) - } - Expect(KubeConfigFile).ShouldNot(BeEmpty()) - }) - - fmt.Printf("\nFetching node status\n") - It("Checks Node and Pod Status", func() { - defer func() { - _, err := terraform.Nodes(KubeConfigFile, true) - if err != nil { - fmt.Println("Error retrieving nodes: ", err) - } - _, err = terraform.Pods(KubeConfigFile, true) - if err != nil { - fmt.Println("Error retrieving pods: ", err) - } - }() - - expectedNodeCount := NumServers + NumWorkers - Eventually(func(g Gomega) { - nodes, err := terraform.Nodes(KubeConfigFile, false) - - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(len(nodes)).To(Equal(expectedNodeCount), - "Number of nodes should match the spec") - - for _, node := range nodes { - g.Expect(node.Status).Should(Equal("Ready"), - "Nodes should all be in Ready state") - } - }, "420s", "5s").Should(Succeed()) - - fmt.Printf("\nFetching pod status\n") - Eventually(func(g Gomega) { - pods, err := terraform.Pods(KubeConfigFile, false) - - g.Expect(err).NotTo(HaveOccurred()) - - re := regexp.MustCompile("[0-9]+") - for _, pod := range pods { - if strings.Contains(pod.Name, "helm-install") { - g.Expect(pod.Status).Should(Equal("Completed"), pod.Name) - } else { - g.Expect(pod.Status).Should(Equal("Running"), pod.Name) - g.Expect(pod.Restarts).Should(Equal("0"), pod.Name) - numRunning := re.FindAllString(pod.Ready, 2) - g.Expect(numRunning[0]).Should(Equal(numRunning[1]), pod.Name, - "should have all containers running") - } - } - }, "600s", "5s").Should(Succeed()) - }) - - It("Verifies ClusterIP Service", func() { - namespace := "auto-clusterip" - _, err := terraform.DeployWorkload("clusterip.yaml", KubeConfigFile) - Expect(err).NotTo(HaveOccurred(), "Cluster IP manifest not deployed") - - defer terraform.RemoveWorkload("clusterip.yaml", KubeConfigFile) - - Eventually(func(g Gomega) { - cmd := "kubectl get pods -n " + namespace + " -o=name -l k8s-app=nginx-app-clusterip " + - "--field-selector=status.phase=Running --kubeconfig=" + KubeConfigFile - res, err := terraform.RunCommand(cmd) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-clusterip")) - }, "420s", "5s").Should(Succeed()) - - clusterip, port, _ := terraform.FetchClusterIP(KubeConfigFile, namespace, - "nginx-clusterip-svc") - - cmd := "curl -sL --insecure http://" + clusterip + ":" + port + "/name.html" - nodeExternalIP := terraform.FetchNodeExternalIP(KubeConfigFile) - - for _, ip := range nodeExternalIP { - Eventually(func(g Gomega) { - res, err := terraform.RunCommandOnNode(cmd, ip, AwsUser, AccessKey) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-clusterip")) - }, "420s", "10s").Should(Succeed()) - } - }) - - It("Verifies NodePort Service", func() { - namespace := "auto-nodeport" - _, err := terraform.DeployWorkload("nodeport.yaml", KubeConfigFile) - Expect(err).NotTo(HaveOccurred(), "NodePort manifest not deployed") - - defer terraform.RemoveWorkload("nodeport.yaml", KubeConfigFile) - - nodeExternalIP := terraform.FetchNodeExternalIP(KubeConfigFile) - cmd := "kubectl get service -n " + namespace + " nginx-nodeport-svc --kubeconfig=" + - KubeConfigFile + " --output jsonpath=\"{.spec.ports[0].nodePort}\"" - - nodeport, err := terraform.RunCommand(cmd) - Expect(err).NotTo(HaveOccurred()) - - for _, ip := range nodeExternalIP { - Eventually(func(g Gomega) { - cmd := "kubectl get pods -n " + namespace + " -o=name -l k8s-app=nginx-app-nodeport " + - "--field-selector=status.phase=Running --kubeconfig=" + KubeConfigFile - res, err := terraform.RunCommand(cmd) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-nodeport")) - }, "240s", "5s").Should(Succeed()) - - cmd = "curl -sL --insecure http://" + ip + ":" + nodeport + "/name.html" - Eventually(func(g Gomega) { - res, err := terraform.RunCommand(cmd) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-nodeport")) - }, "240s", "5s").Should(Succeed()) - } - }) - - It("Verifies Ingress", func() { - namespace := "auto-ingress" - _, err := terraform.DeployWorkload("ingress.yaml", KubeConfigFile) - Expect(err).NotTo(HaveOccurred(), "Ingress manifest not deployed") - - defer terraform.RemoveWorkload("ingress.yaml", KubeConfigFile) - - Eventually(func(g Gomega) { - cmd := "kubectl get pods -n " + namespace + " -o=name -l k8s-app=nginx-app-ingress" + - " --field-selector=status.phase=Running --kubeconfig=" + KubeConfigFile - res, err := terraform.RunCommand(cmd) - - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-ingress")) - }, "240s", "5s").Should(Succeed()) - - var ingressIps []string - nodes, err := terraform.WorkerNodes(KubeConfigFile, false) - if err != nil { - fmt.Println("Error retrieving nodes: ", err) - } - - Eventually(func(g Gomega) { - ingressIps, err = terraform.FetchIngressIP(namespace, KubeConfigFile) - - g.Expect(err).NotTo(HaveOccurred(), "Ingress ip is not returned") - g.Expect(len(ingressIps)).To(Equal(len(nodes)), - "Number of ingress IPs should match the number of nodes") - }, "240s", "5s").Should(Succeed()) - - for _, ip := range ingressIps { - cmd := "curl -s --header host:foo1.bar.com" + " http://" + ip + "/name.html" - Eventually(func(g Gomega) { - res, err := terraform.RunCommand(cmd) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-ingress")) - }, "240s", "5s").Should(Succeed()) - } - }) - - It("Verifies Daemonset", func() { - _, err := terraform.DeployWorkload("daemonset.yaml", KubeConfigFile) - Expect(err).NotTo(HaveOccurred(), "Daemonset manifest not deployed") - - defer terraform.RemoveWorkload("daemonset.yaml", KubeConfigFile) - - nodes, _ := terraform.WorkerNodes(KubeConfigFile, false) - pods, _ := terraform.Pods(KubeConfigFile, false) - - Eventually(func(g Gomega) { - count := terraform.CountOfStringInSlice("test-daemonset", pods) - g.Expect(count).Should(Equal(len(nodes)), - "Daemonset pod count does not match node count") - }, "420s", "10s").Should(Succeed()) - }) - - It("Verifies dns access", func() { - namespace := "auto-dns" - _, err := terraform.DeployWorkload("dnsutils.yaml", KubeConfigFile) - Expect(err).NotTo(HaveOccurred(), "dnsutils manifest not deployed") - - defer terraform.RemoveWorkload("dnsutils.yaml", KubeConfigFile) - - Eventually(func(g Gomega) { - cmd := "kubectl get pods dnsutils " + "-n " + namespace + " --kubeconfig=" + KubeConfigFile - res, _ := terraform.RunCommand(cmd) - g.Expect(res).Should(ContainSubstring("dnsutils")) - g.Expect(res).Should(ContainSubstring("Running")) - }, "420s", "2s").Should(Succeed()) - - Eventually(func(g Gomega) { - cmd := "kubectl -n " + namespace + " --kubeconfig=" + - KubeConfigFile + " exec -t dnsutils -- nslookup kubernetes.default" - res, _ := terraform.RunCommand(cmd) - g.Expect(res).Should(ContainSubstring("kubernetes.default.svc.cluster.local")) - }, "420s", "2s").Should(Succeed()) - }) - }) -}) - -var _ = BeforeEach(func() { - if *destroy { - Skip("Cluster is being Deleted") - } -}) - -var _ = AfterEach(func() { - if CurrentSpecReport().Failed() { - fmt.Printf("\nFAILED! %s\n", CurrentSpecReport().FullText()) - } else { - fmt.Printf("\nPASSED! %s\n", CurrentSpecReport().FullText()) - } -}) - -var _ = AfterSuite(func() { - if *destroy { - status, err := BuildCluster(&testing.T{}, *destroy) - Expect(err).NotTo(HaveOccurred()) - Expect(status).To(Equal("cluster destroyed")) - } -}) diff --git a/tests/terraform/go.mod b/tests/terraform/go.mod deleted file mode 100644 index 6859cdc3b5..0000000000 --- a/tests/terraform/go.mod +++ /dev/null @@ -1,65 +0,0 @@ -module github.com/rancher/rke2/tests/terraform - -go 1.19 - -require ( - github.com/gruntwork-io/terratest v0.41.15 - github.com/onsi/ginkgo/v2 v2.9.1 - github.com/onsi/gomega v1.27.3 - golang.org/x/crypto v0.7.0 -) - -require ( - cloud.google.com/go v0.105.0 // indirect - cloud.google.com/go/compute v1.12.1 // indirect - cloud.google.com/go/compute/metadata v0.2.1 // indirect - cloud.google.com/go/iam v0.7.0 // indirect - cloud.google.com/go/storage v1.27.0 // indirect - github.com/agext/levenshtein v1.2.3 // indirect - github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect - github.com/aws/aws-sdk-go v1.44.122 // indirect - github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.2.3 // indirect - github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect - github.com/hashicorp/errwrap v1.0.0 // indirect - github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.7.0 // indirect - github.com/hashicorp/go-multierror v1.1.0 // indirect - github.com/hashicorp/go-safetemp v1.0.0 // indirect - github.com/hashicorp/go-version v1.6.0 // indirect - github.com/hashicorp/hcl/v2 v2.9.1 // indirect - github.com/hashicorp/terraform-json v0.13.0 // indirect - github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/klauspost/compress v1.15.11 // indirect - github.com/mattn/go-zglob v0.0.2-0.20190814121620-e3c945676326 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/go-testing-interface v1.14.1 // indirect - github.com/mitchellh/go-wordwrap v1.0.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/stretchr/testify v1.8.1 // indirect - github.com/tmccombs/hcl2json v0.3.3 // indirect - github.com/ulikunitz/xz v0.5.10 // indirect - github.com/zclconf/go-cty v1.9.1 // indirect - go.opencensus.io v0.24.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.1.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/tools v0.7.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.103.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c // indirect - google.golang.org/grpc v1.51.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect -) diff --git a/tests/terraform/go.sum b/tests/terraform/go.sum deleted file mode 100644 index 20a94b6d33..0000000000 --- a/tests/terraform/go.sum +++ /dev/null @@ -1,975 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0 h1:DNtEKRBAAzeS4KyIory52wWHuClNaXJ5x1F7xa4q+5Y= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.1 h1:gKVJMEyqV5c/UnpzjjQbo3Rjvvqpr9B1DFSbJC4OXr0= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.7.0 h1:k4MuwOsS7zGJJ+QfZ5vBK8SgHBAvYN/23BWsiihJ1vs= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/longrunning v0.3.0 h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= -github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= -github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= -github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk= -github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= -github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= -github.com/aws/aws-sdk-go v1.44.122 h1:p6mw01WBaNpbdP2xrisz5tIkcNwzj/HysobNoaAHjgo= -github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= -github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/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-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -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/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/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.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -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/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= -github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.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/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0 h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/gruntwork-io/terratest v0.41.15 h1:od3neRQRBuf+Zwz5SSByrf3F90iyqFanV9nFF/86uuM= -github.com/gruntwork-io/terratest v0.41.15/go.mod h1:a9QNOPa3/nbsLy1ufNGT33X9sMRknun7qsf4bIVEbPo= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.0 h1:bzrYP+qu/gMrL1au7/aDvkoOVGUJpeKBgbqRHACAFDY= -github.com/hashicorp/go-getter v1.7.0/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= -github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= -github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= -github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl/v2 v2.9.1 h1:eOy4gREY0/ZQHNItlfuEZqtcQbXIxzojlP301hDpnac= -github.com/hashicorp/hcl/v2 v2.9.1/go.mod h1:FwWsfWEjyV/CMj8s/gqAuiviY72rJ1/oayI9WftqcKg= -github.com/hashicorp/terraform-json v0.13.0 h1:Li9L+lKD1FO5RVFRM1mMMIBDoUHslOniyEi5CM+FWGY= -github.com/hashicorp/terraform-json v0.13.0/go.mod h1:y5OdLBCT+rxbwnpxZs9kGL7R9ExU76+cpdY8zHwoazk= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a h1:zPPuIq2jAWWPTrGt70eK/BSch+gFAGrNzecsoENgu2o= -github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.15.11 h1:Lcadnb3RKGin4FYM/orgq0qde+nc15E5Cbqg4B9Sx9c= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-zglob v0.0.2-0.20190814121620-e3c945676326 h1:ofNAzWCcyTALn2Zv40+8XitdzCgXY6e9qvXwN9W0YXg= -github.com/mattn/go-zglob v0.0.2-0.20190814121620-e3c945676326/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= -github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/onsi/ginkgo/v2 v2.9.1 h1:zie5Ly042PD3bsCvsSOPvRnFwyo3rKe64TJlD6nu0mk= -github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo= -github.com/onsi/gomega v1.27.3 h1:5VwIwnBY3vbBDOJrNtA4rVdiTZCsq9B5F12pvy1Drmk= -github.com/onsi/gomega v1.27.3/go.mod h1:5vG284IBtfDAmDyrK+eGyZmUgUlmi+Wngqo557cZ6Gw= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/sebdah/goldie v1.0.0/go.mod h1:jXP4hmWywNEwZzhMuv2ccnqTSFpuq8iyQhtQdkkZBH4= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/tmccombs/hcl2json v0.3.3 h1:+DLNYqpWE0CsOQiEZu+OZm5ZBImake3wtITYxQ8uLFQ= -github.com/tmccombs/hcl2json v0.3.3/go.mod h1:Y2chtz2x9bAeRTvSibVRVgbLJhLJXKlUeIvjeVdnm4w= -github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8= -github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= -github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= -github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= -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.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= -github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= -github.com/zclconf/go-cty v1.8.1/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= -github.com/zclconf/go-cty v1.9.1 h1:viqrgQwFl5UpSxc046qblj78wZXVDFnSOufaOTER+cc= -github.com/zclconf/go-cty v1.9.1/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= -github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/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/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180811021610-c39426892332/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-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -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/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.1.0 h1:isLCZuhj4v+tYv7eskaN4v/TM+A1begWWgyVJDdl1+Y= -golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/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-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= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-20210423082822-04245dca01da/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-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/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-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.103.0 h1:9yuVqlu2JCvcLg9p8S3fcFLZij8EPSyvODIY1rkMizQ= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-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-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= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c h1:S34D59DS2GWOEwWNt4fYmTcFrtlOgukG2k9WsomZ7tg= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -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.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -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= diff --git a/tests/terraform/manual_upgrade/upgradecluster_test.go b/tests/terraform/manual_upgrade/upgradecluster_test.go deleted file mode 100644 index 3c15819fc7..0000000000 --- a/tests/terraform/manual_upgrade/upgradecluster_test.go +++ /dev/null @@ -1,387 +0,0 @@ -package manual_upgrade - -import ( - "flag" - "fmt" - "regexp" - "strings" - "testing" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - - "github.com/rancher/rke2/tests/terraform" - "github.com/rancher/rke2/tests/terraform/createcluster" -) - -var tfVars = flag.String("tfvars", "/tests/terraform/modules/config/local.tfvars", "custom .tfvars file from base project path") -var destroy = flag.Bool("destroy", false, "a bool") -var upgradeVersion = flag.String("upgradeVersion", "", "Version to upgrade the cluster to") -var channel = flag.String("channel", "", "Channel to use inside the installing command") -var failed bool - -func Test_TFUpgradeClusterValidation(t *testing.T) { - RegisterFailHandler(Fail) - flag.Parse() - - RunSpecs(t, "Upgrade Cluster Test Suite") -} - -var _ = Describe("Upgrade Tests:", func() { - Context("Build Cluster:", func() { - It("Starts up with no issues", func() { - status, err := createcluster.BuildCluster(&testing.T{}, false) - Expect(err).NotTo(HaveOccurred()) - Expect(status).To(Equal("cluster created")) - defer GinkgoRecover() - fmt.Println("Server Node IPS:", createcluster.MasterIPs) - fmt.Println("Agent Node IPS:", createcluster.WorkerIPs) - terraform.PrintFileContents(createcluster.KubeConfigFile) - Expect(createcluster.MasterIPs).ShouldNot(BeEmpty()) - if createcluster.NumWorkers > 0 { - Expect(createcluster.WorkerIPs).ShouldNot(BeEmpty()) - } else { - Expect(createcluster.WorkerIPs).Should(BeEmpty()) - } - Expect(createcluster.KubeConfigFile).ShouldNot(BeEmpty()) - }) - - It("Checks Node and Pod Status", func() { - defer func() { - _, err := terraform.Nodes(createcluster.KubeConfigFile, true) - if err != nil { - fmt.Println("Error retrieving nodes preupgrade: ", err) - } - _, err = terraform.Pods(createcluster.KubeConfigFile, true) - if err != nil { - fmt.Println("Error retrieving pods preupgrade: ", err) - } - }() - - fmt.Printf("\nFetching node status preupgrade\n") - expectedNodeCount := createcluster.NumServers + createcluster.NumWorkers - Eventually(func(g Gomega) { - nodes, err := terraform.Nodes(createcluster.KubeConfigFile, false) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(len(nodes)).To(Equal(expectedNodeCount), "Number of nodes should match the spec") - for _, node := range nodes { - g.Expect(node.Status).Should(Equal("Ready"), "Nodes should all be in Ready state") - } - }, "420s", "5s").Should(Succeed()) - - re := regexp.MustCompile("[0-9]+") - fmt.Printf("\nFetching pod status preupgrade\n") - Eventually(func(g Gomega) { - pods, err := terraform.Pods(createcluster.KubeConfigFile, false) - g.Expect(err).NotTo(HaveOccurred()) - for _, pod := range pods { - if strings.Contains(pod.Name, "helm-install") { - g.Expect(pod.Status).Should(Equal("Completed"), pod.Name) - } else { - g.Expect(pod.Status).Should(Equal("Running"), pod.Name) - g.Expect(pod.Restarts).Should(Equal("0"), pod.Name) - numRunning := re.FindAllString(pod.Ready, 2) - g.Expect(numRunning[0]).Should(Equal(numRunning[1]), pod.Name, "should have all containers running") - } - } - }, "600s", "5s").Should(Succeed()) - }) - }) - - Context("Preupgrade Validations:", func() { - It("Verifies ClusterIP Service Preupgrade", func() { - namespace := "auto-clusterip" - _, err := terraform.DeployWorkload("clusterip.yaml", createcluster.KubeConfigFile) - Expect(err).NotTo(HaveOccurred(), "Cluster IP manifest not deployed") - - Eventually(func(g Gomega) { - res, err := terraform.IsAppRunning(namespace, "nginx-app-clusterip", createcluster.KubeConfigFile) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should((ContainSubstring("test-clusterip"))) - }, "420s", "5s").Should(Succeed()) - - clusterip, port, _ := terraform.FetchClusterIP(createcluster.KubeConfigFile, namespace, "nginx-clusterip-svc") - cmd := "curl -sL --insecure http://" + clusterip + ":" + port + "/name.html" - nodeExternalIP := terraform.FetchNodeExternalIP(createcluster.KubeConfigFile) - for _, ip := range nodeExternalIP { - Eventually(func(g Gomega) { - res, err := terraform.RunCommandOnNode(cmd, ip, createcluster.AwsUser, createcluster.AccessKey) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-clusterip")) - }, "420s", "10s").Should(Succeed()) - } - }) - - It("Verifies NodePort Service Preupgrade", func() { - namespace := "auto-nodeport" - _, err := terraform.DeployWorkload("nodeport.yaml", createcluster.KubeConfigFile) - Expect(err).NotTo(HaveOccurred(), "NodePort manifest not deployed") - - nodeExternalIP := terraform.FetchNodeExternalIP(createcluster.KubeConfigFile) - cmd := "kubectl get service -n " + namespace + " nginx-nodeport-svc --kubeconfig=" + createcluster.KubeConfigFile + " --output jsonpath=\"{.spec.ports[0].nodePort}\"" - nodeport, err := terraform.RunCommand(cmd) - Expect(err).NotTo(HaveOccurred()) - - for _, ip := range nodeExternalIP { - Eventually(func(g Gomega) { - res, err := terraform.IsAppRunning(namespace, "nginx-app-nodeport", createcluster.KubeConfigFile) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-nodeport")) - }, "240s", "5s").Should(Succeed()) - - cmd = "curl -sL --insecure http://" + ip + ":" + nodeport + "/name.html" - Eventually(func(g Gomega) { - res, err := terraform.RunCommand(cmd) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-nodeport")) - }, "240s", "5s").Should(Succeed()) - } - }) - - It("Verifies Ingress Preupgrade", func() { - namespace := "auto-ingress" - _, err := terraform.DeployWorkload("ingress.yaml", createcluster.KubeConfigFile) - Expect(err).NotTo(HaveOccurred(), "Ingress manifest not deployed") - - Eventually(func(g Gomega) { - res, err := terraform.IsAppRunning(namespace, "nginx-app-ingress", createcluster.KubeConfigFile) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-ingress")) - }, "240s", "5s").Should(Succeed()) - - var ingressIps []string - nodes, err := terraform.WorkerNodes(createcluster.KubeConfigFile, false) - if err != nil { - fmt.Println("Error retrieving nodes: ", err) - } - Eventually(func(g Gomega) { - ingressIps, err = terraform.FetchIngressIP(namespace, createcluster.KubeConfigFile) - g.Expect(err).NotTo(HaveOccurred(), "Ingress ip is not returned") - g.Expect(len(ingressIps)).To(Equal(len(nodes)), "Number of ingress IPs should match the number of nodes") - }, "240s", "5s").Should(Succeed()) - - for _, ip := range ingressIps { - cmd := "curl -s --header host:foo1.bar.com" + " http://" + ip + "/name.html" - Eventually(func(g Gomega) { - res, err := terraform.RunCommand(cmd) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-ingress")) - }, "240s", "5s").Should(Succeed()) - } - }) - - It("Verifies Daemonset Preupgrade", func() { - _, err := terraform.DeployWorkload("daemonset.yaml", createcluster.KubeConfigFile) - Expect(err).NotTo(HaveOccurred(), "Daemonset manifest not deployed") - - nodes, _ := terraform.WorkerNodes(createcluster.KubeConfigFile, false) - pods, _ := terraform.Pods(createcluster.KubeConfigFile, false) - - Eventually(func(g Gomega) { - count := terraform.CountOfStringInSlice("test-daemonset", pods) - g.Expect(count).Should((Equal(len(nodes))), "Daemonset pod count does not match node count") - }, "420s", "10s").Should(Succeed()) - }) - - It("Verifies DNS Access Preupgrade", func() { - namespace := "auto-dns" - _, err := terraform.DeployWorkload("dnsutils.yaml", createcluster.KubeConfigFile) - Expect(err).NotTo(HaveOccurred(), "dnsutils manifest not deployed") - - Eventually(func(g Gomega) { - cmd := "kubectl get pods dnsutils " + "-n " + namespace + " --kubeconfig=" + createcluster.KubeConfigFile - res, _ := terraform.RunCommand(cmd) - g.Expect(res).Should(ContainSubstring("dnsutils")) - g.Expect(res).Should(ContainSubstring("Running")) - }, "420s", "2s").Should(Succeed()) - - Eventually(func(g Gomega) { - cmd := "kubectl -n " + namespace + " --kubeconfig=" + createcluster.KubeConfigFile + " exec -t dnsutils -- nslookup kubernetes.default" - res, _ := terraform.RunCommand(cmd) - g.Expect(res).Should(ContainSubstring("kubernetes.default.svc.cluster.local")) - }, "420s", "2s").Should(Succeed()) - }) - }) - - Context("Upgrade nodes via manual:", func() { - It("Upgrade nodes", func() { - var cmdUpgradeVersion string - if *channel != "" { - // If a channel is specified, upgrade using that channel - cmdUpgradeVersion = "sudo curl -sfL https://get.rke2.io | sudo INSTALL_RKE2_VERSION=" + *upgradeVersion + " INSTALL_RKE2_CHANNEL=" + *channel + " sh -" - } else { - // If no channel is specified, upgrade using the version specified - cmdUpgradeVersion = "sudo curl -sfL https://get.rke2.io | sudo INSTALL_RKE2_VERSION=" + *upgradeVersion + " sh -" - } - - versionRegex := regexp.MustCompile("-rc[0-9]+") - k8sVersion := versionRegex.ReplaceAllString(*upgradeVersion, "") - re := regexp.MustCompile("[0-9]+") - - nodes, err := terraform.Nodes(createcluster.KubeConfigFile, false) - if err != nil { - fmt.Println("Error retrieving nodes: ", err) - } - - for _, node := range nodes { - // Every node will be upgraded and restarted - - Eventually(func(g Gomega) { - fmt.Println("\nUpgrading ", node.Roles, node.ExternalIP) - terraform.RunCommandOnNode(cmdUpgradeVersion, node.ExternalIP, createcluster.AwsUser, createcluster.AccessKey) - }, "120s", "2s").Should(Succeed()) - - Eventually(func(g Gomega) { - fmt.Println("Restarting node: ", node.Roles, node.ExternalIP) - terraform.RunCommandOnNode("sudo systemctl restart rke2-*", node.ExternalIP, createcluster.AwsUser, createcluster.AccessKey) - }, "240s", "2s").Should(Succeed()) - } - - //Fetch node status & version PostUpgrade - Eventually(func(g Gomega) { - expectedNodeCount := createcluster.NumServers + createcluster.NumWorkers - nodes, err := terraform.Nodes(createcluster.KubeConfigFile, false) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(len(nodes)).To(Equal(expectedNodeCount), "Number of nodes should match the spec") - for _, node := range nodes { - g.Expect(node.Status).Should(Equal("Ready"), "Nodes should all be in Ready state after upgrading") - g.Expect(node.Version).Should(Equal(k8sVersion), "Nodes should all be upgraded to the specified version") - } - }, "900s", "30s").Should(Succeed()) - - //Fetch pods status PostUpgrade - Eventually(func(g Gomega) { - pods, err := terraform.Pods(createcluster.KubeConfigFile, false) - g.Expect(err).NotTo(HaveOccurred()) - for _, pod := range pods { - if strings.Contains(pod.Name, "helm-install") { - g.Expect(pod.Status).Should(Equal("Completed"), pod.Name) - } else { - g.Expect(pod.Status).Should(Equal("Running"), pod.Name) - numRunning := re.FindAllString(pod.Ready, 2) - g.Expect(numRunning[0]).Should(Equal(numRunning[1]), pod.Name, "should have all containers running") - } - } - }, "600s", "5s").Should(Succeed()) - }) - }) - - Context("Postupgrade Validations:", func() { - It("Verifies ClusterIP Service Postupgrade", func() { - namespace := "auto-clusterip" - defer terraform.RemoveWorkload("clusterip.yaml", createcluster.KubeConfigFile) - - res, err := terraform.IsAppRunning(namespace, "nginx-app-clusterip", createcluster.KubeConfigFile) - Expect(err).NotTo(HaveOccurred()) - Expect(res).Should((ContainSubstring("test-clusterip"))) - - clusterip, port, _ := terraform.FetchClusterIP(createcluster.KubeConfigFile, namespace, "nginx-clusterip-svc") - cmd := "curl -sL --insecure http://" + clusterip + ":" + port + "/name.html" - nodeExternalIP := terraform.FetchNodeExternalIP(createcluster.KubeConfigFile) - for _, ip := range nodeExternalIP { - Eventually(func(g Gomega) { - res, err := terraform.RunCommandOnNode(cmd, ip, createcluster.AwsUser, createcluster.AccessKey) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-clusterip")) - }, "120s", "10s").Should(Succeed()) - } - }) - - It("Verifies NodePort Service Postupgrade", func() { - namespace := "auto-nodeport" - defer terraform.RemoveWorkload("nodeport.yaml", createcluster.KubeConfigFile) - - nodeExternalIP := terraform.FetchNodeExternalIP(createcluster.KubeConfigFile) - cmd := "kubectl get service -n " + namespace + " nginx-nodeport-svc --kubeconfig=" + createcluster.KubeConfigFile + " --output jsonpath=\"{.spec.ports[0].nodePort}\"" - nodeport, err := terraform.RunCommand(cmd) - Expect(err).NotTo(HaveOccurred()) - - for _, ip := range nodeExternalIP { - Eventually(func(g Gomega) { - res, err := terraform.IsAppRunning(namespace, "nginx-app-nodeport", createcluster.KubeConfigFile) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-nodeport")) - }, "120s", "5s").Should(Succeed()) - - cmd = "curl -sL --insecure http://" + ip + ":" + nodeport + "/name.html" - Eventually(func(g Gomega) { - res, err := terraform.RunCommand(cmd) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-nodeport")) - }, "120s", "5s").Should(Succeed()) - } - }) - - It("Verifies Ingress Postupgrade", func() { - namespace := "auto-ingress" - defer terraform.RemoveWorkload("ingress.yaml", createcluster.KubeConfigFile) - - res, err := terraform.IsAppRunning(namespace, "nginx-app-ingress", createcluster.KubeConfigFile) - Expect(err).NotTo(HaveOccurred()) - Expect(res).Should(ContainSubstring("test-ingress")) - - var ingressIps []string - nodes, err := terraform.WorkerNodes(createcluster.KubeConfigFile, false) - if err != nil { - fmt.Println("Error retrieving nodes: ", err) - } - Eventually(func(g Gomega) { - ingressIps, err = terraform.FetchIngressIP(namespace, createcluster.KubeConfigFile) - g.Expect(err).NotTo(HaveOccurred(), "Ingress ip is not returned") - g.Expect(len(ingressIps)).To(Equal(len(nodes)), "Number of ingress IPs should match the number of nodes") - }, "120s", "5s").Should(Succeed()) - - for _, ip := range ingressIps { - cmd := "curl -s --header host:foo1.bar.com" + " http://" + ip + "/name.html" - Eventually(func(g Gomega) { - res, err := terraform.RunCommand(cmd) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-ingress")) - }, "120s", "5s").Should(Succeed()) - } - }) - - It("Verifies Daemonset Postupgrade", func() { - defer terraform.RemoveWorkload("daemonset.yaml", createcluster.KubeConfigFile) - nodes, _ := terraform.WorkerNodes(createcluster.KubeConfigFile, false) - pods, _ := terraform.Pods(createcluster.KubeConfigFile, false) - count := terraform.CountOfStringInSlice("test-daemonset", pods) - Expect(count).Should((Equal(len(nodes))), "Daemonset pod count does not match node count") - }) - - It("Verifies DNS Access Postupgrade", func() { - namespace := "auto-dns" - _, err := terraform.DeployWorkload("dnsutils.yaml", createcluster.KubeConfigFile) - Expect(err).NotTo(HaveOccurred(), "dnsutils manifest not deployed") - defer terraform.RemoveWorkload("dnsutils.yaml", createcluster.KubeConfigFile) - - Eventually(func(g Gomega) { - cmd := "kubectl get pods dnsutils " + "-n " + namespace + " --kubeconfig=" + createcluster.KubeConfigFile - res, _ := terraform.RunCommand(cmd) - g.Expect(res).Should(ContainSubstring("dnsutils")) - g.Expect(res).Should(ContainSubstring("Running")) - }, "120s", "2s").Should(Succeed()) - - Eventually(func(g Gomega) { - cmd := "kubectl -n " + namespace + " --kubeconfig=" + createcluster.KubeConfigFile + " exec -t dnsutils -- nslookup kubernetes.default" - res, _ := terraform.RunCommand(cmd) - g.Expect(res).Should(ContainSubstring("kubernetes.default.svc.cluster.local")) - }, "120s", "2s").Should(Succeed()) - }) - }) - -}) - -var _ = BeforeEach(func() { - if *destroy { - Skip("Cluster is being Deleted") - } -}) - -var _ = AfterEach(func() { - if CurrentSpecReport().Failed() { - fmt.Printf("\nFAILED! %s\n", CurrentSpecReport().FullText()) - } else { - fmt.Printf("\nPASSED! %s\n", CurrentSpecReport().FullText()) - } -}) diff --git a/tests/terraform/modules/define_node_role.sh b/tests/terraform/modules/define_node_role.sh deleted file mode 100644 index abd17af494..0000000000 --- a/tests/terraform/modules/define_node_role.sh +++ /dev/null @@ -1,104 +0,0 @@ -#!/bin/bash -# This script defines which role this node will be and writes that to a file -# that is readable by rke2 - -if [ $# != 8 ]; then - echo "Usage: define_node_roles.sh node_index role_order all_role_nodes etcd_only_nodes etcd_cp_nodes etcd_worker_nodes cp_only_nodes cp_worker_nodes" - exit 1 -fi - -node_index=$(($1+1)) -role_order=$2 -all_role_nodes=$3 -etcd_only_nodes=$4 -etcd_cp_nodes=$5 -etcd_worker_nodes=$6 -cp_only_nodes=$7 -cp_worker_nodes=$8 - -# Set the desired role into an array based on the index -order_array=($(echo "$role_order" | tr ',' '\n')) -role_array=() -for order_num in "${order_array[@]}"; do - case "$order_num" in - 1) - role_array+=($(printf "all-roles %.0s " $(seq 1 "$all_role_nodes"))) - ;; - 2) - role_array+=($(printf "etcd-only %.0s " $(seq 1 "$etcd_only_nodes"))) - ;; - 3) - role_array+=($(printf "etcd-cp %.0s " $(seq 1 "$etcd_cp_nodes"))) - ;; - 4) - role_array+=($(printf "etcd-worker %.0s " $(seq 1 "$etcd_worker_nodes"))) - ;; - 5) - role_array+=($(printf "cp-only %.0s " $(seq 1 "$cp_only_nodes"))) - ;; - 6) - role_array+=($(printf "cp-worker %.0s " $(seq 1 "$cp_worker_nodes"))) - ;; - esac -done - -# Get role based on which node is being created -role="${role_array[$node_index]}" -echo "Writing config for a ${role} node." - -# Write config -mkdir -p /etc/rancher/rke2/config.yaml.d -if [[ "$role" == "etcd-only" ]] -then -cat << EOF > /etc/rancher/rke2/config.yaml.d/role_config.yaml -disable-apiserver: true -disable-controller-manager: true -disable-scheduler: true -node-taint: - - node-role.kubernetes.io/etcd:NoExecute -EOF - -elif [[ "$role" == "etcd-cp" ]] -then -cat << EOF > /etc/rancher/rke2/config.yaml.d/role_config.yaml -node-taint: - - node-role.kubernetes.io/control-plane:NoSchedule - - node-role.kubernetes.io/etcd:NoExecute -EOF -cat << EOF > /tmp/.control-plane -true -EOF - -elif [[ "$role" == "etcd-worker" ]] -then -cat << EOF > /etc/rancher/rke2/config.yaml.d/role_config.yaml -disable-apiserver: true -disable-controller-manager: true -disable-scheduler: true -EOF - -elif [[ "$role" == "cp-only" ]] -then -cat << EOF > /etc/rancher/rke2/config.yaml.d/role_config.yaml -disable-etcd: true -node-taint: - - node-role.kubernetes.io/control-plane:NoSchedule -EOF -cat << EOF > /tmp/.control-plane -true -EOF - -elif [[ "$role" == "cp-worker" ]] -then -cat << EOF > /etc/rancher/rke2/config.yaml.d/role_config.yaml -disable-etcd: true -EOF -cat << EOF > /tmp/.control-plane -true -EOF - -else -cat << EOF > /tmp/.control-plane -true -EOF -fi \ No newline at end of file diff --git a/tests/terraform/modules/install_rke2_master.sh b/tests/terraform/modules/install_rke2_master.sh deleted file mode 100755 index 348c753aa2..0000000000 --- a/tests/terraform/modules/install_rke2_master.sh +++ /dev/null @@ -1,104 +0,0 @@ -#!/bin/bash -# This script installs the first master, ensuring first master is installed -# and ready before proceeding to install other nodes -set -x -echo "$@" - -node_os=$1 -create_lb=$2 -rke2_version=$3 -public_ip=$4 -rke2_channel=$5 -server_flags=$6 -install_mode=$7 -rhel_username=$8 -rhel_password=$9 -install_method=${10} - -hostname=$(hostname -f) -mkdir -p /etc/rancher/rke2 -cat << EOF >/etc/rancher/rke2/config.yaml -write-kubeconfig-mode: "0644" -tls-san: - - ${create_lb} -node-name: ${hostname} -EOF - -if [ -n "$server_flags" ] && [[ "$server_flags" == *":"* ]] -then - echo "$server_flags" - echo -e "$server_flags" >> /etc/rancher/rke2/config.yaml - if [[ "$server_flags" != *"cloud-provider-name"* ]] - then - echo -e "node-external-ip: $public_ip" >> /etc/rancher/rke2/config.yaml - fi - cat /etc/rancher/rke2/config.yaml -else - echo -e "node-external-ip: $public_ip" >> /etc/rancher/rke2/config.yaml -fi - -if [[ "$node_os" = "rhel" ]] -then - subscription-manager register --auto-attach --username="$rhel_username" --password="$rhel_password" - subscription-manager repos --enable=rhel-7-server-extras-rpms -fi - -if [ "$node_os" = "centos8" ] || [ "$node_os" = "rhel8" ] || [ "$node_os" = "oracle8" ] -then - yum install tar -y - yum install iptables -y - workaround="[keyfile]\nunmanaged-devices=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico;interface-name:flannel*" - if [ ! -e /etc/NetworkManager/conf.d/canal.conf ]; then - echo -e "$workaround" > /etc/NetworkManager/conf.d/canal.conf - else - echo -e "$workaround" >> /etc/NetworkManager/conf.d/canal.conf - fi - sudo systemctl reload NetworkManager -fi - -export "$install_mode"="$rke2_version" -if [ -n "$install_method" ] -then - export INSTALL_RKE2_METHOD="$install_method" -fi - -if [ "$rke2_channel" != "null" ] -then - curl -sfL https://get.rke2.io | INSTALL_RKE2_CHANNEL="$rke2_channel" sh - -else - curl -sfL https://get.rke2.io | sh - -fi -sleep 10 -if [ -n "$server_flags" ] && [[ "$server_flags" == *"cis"* ]] -then - if [[ "$node_os" == *"rhel"* ]] || [[ "$node_os" == *"centos"* ]] || [[ "$node_os" == *"oracle"* ]] - then - cp -f /usr/share/rke2/rke2-cis-sysctl.conf /etc/sysctl.d/60-rke2-cis.conf - else - cp -f /usr/local/share/rke2/rke2-cis-sysctl.conf /etc/sysctl.d/60-rke2-cis.conf - fi - systemctl restart systemd-sysctl - useradd -r -c "etcd user" -s /sbin/nologin -M etcd -U -fi -sudo systemctl enable rke2-server -sudo systemctl start rke2-server - -timeElapsed=0 -while [[ $timeElapsed -lt 600 ]] -do - notready=false - if [[ ! -f /var/lib/rancher/rke2/server/node-token ]] || [[ ! -f /etc/rancher/rke2/rke2.yaml ]] - then - notready=true - fi - if [[ $notready == false ]] - then - break - fi - sleep 5 - ((timeElapsed+=5)) -done - -cat /etc/rancher/rke2/config.yaml> /tmp/joinflags -cat /var/lib/rancher/rke2/server/node-token >/tmp/nodetoken -cat /etc/rancher/rke2/rke2.yaml >/tmp/config \ No newline at end of file diff --git a/tests/terraform/modules/join_rke2_agent.sh b/tests/terraform/modules/join_rke2_agent.sh deleted file mode 100755 index 4e3ee7092a..0000000000 --- a/tests/terraform/modules/join_rke2_agent.sh +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/bash -# This script is used to join one or more nodes as agents -set -x -echo "$@" - - -node_os=$1 -server_ip=$2 -token=$3 -rke2_version=$4 -public_ip=$5 -rke2_channel=$6 -worker_flags=$7 -install_mode=$8 -rhel_username=$9 -rhel_password=${10} -install_method=${11} - -hostname=$(hostname -f) -mkdir -p /etc/rancher/rke2 -cat <>/etc/rancher/rke2/config.yaml -server: https://${server_ip}:9345 -token: "${token}" -node-name: "${hostname}" -EOF - -if [ -n "$worker_flags" ] && [[ "$worker_flags" == *":"* ]] -then - echo "$worker_flags" - echo -e "$worker_flags" >> /etc/rancher/rke2/config.yaml - if [[ "$worker_flags" != *"cloud-provider-name"* ]] - then - echo -e "node-external-ip: $public_ip" >> /etc/rancher/rke2/config.yaml - fi - cat /etc/rancher/rke2/config.yaml -else - echo -e "node-external-ip: $public_ip" >> /etc/rancher/rke2/config.yaml -fi - -if [[ "$node_os" = "rhel" ]] -then - subscription-manager register --auto-attach --username="$rhel_username" --password="$rhel_password" - subscription-manager repos --enable=rhel-7-server-extras-rpms -fi - -if [ "$node_os" = "centos8" ] || [ "$node_os" = "rhel8" ] || [ "$node_os" = "oracle8" ] -then - yum install tar -y - yum install iptables -y - workaround="[keyfile]\nunmanaged-devices=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico;interface-name:flannel*" - if [ ! -e /etc/NetworkManager/conf.d/canal.conf ]; then - echo -e "$workaround" > /etc/NetworkManager/conf.d/canal.conf - else - echo -e "$workaround" >> /etc/NetworkManager/conf.d/canal.conf - fi - sudo systemctl reload NetworkManager -fi - -export "$install_mode"="$rke2_version" -if [ -n "$install_method" ] -then - export INSTALL_RKE2_METHOD="$install_method" -fi - -if [ "$rke2_channel" != "null" ] -then - curl -sfL https://get.rke2.io | INSTALL_RKE2_CHANNEL="$rke2_channel" INSTALL_RKE2_TYPE='agent' sh - -else - curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE='agent' sh - -fi -if [ -n "$worker_flags" ] && [[ "$worker_flags" == *"cis"* ]] -then - if [[ "$node_os" == *"rhel"* ]] || [[ "$node_os" == *"centos"* ]] || [[ "$node_os" == *"oracle"* ]] - then - cp -f /usr/share/rke2/rke2-cis-sysctl.conf /etc/sysctl.d/60-rke2-cis.conf - else - cp -f /usr/local/share/rke2/rke2-cis-sysctl.conf /etc/sysctl.d/60-rke2-cis.conf - fi - systemctl restart systemd-sysctl -fi -sudo systemctl enable rke2-agent -sudo systemctl start rke2-agent diff --git a/tests/terraform/modules/join_rke2_master.sh b/tests/terraform/modules/join_rke2_master.sh deleted file mode 100755 index 1c1af0ec4c..0000000000 --- a/tests/terraform/modules/join_rke2_master.sh +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/bash -# This script is used to join one or more nodes as masters to the first master -set -x -echo "$@" - -node_os=$1 -create_lb=$2 -initial_node_ip=$3 -token=$4 -rke2_version=$5 -public_ip=$6 -rke2_channel=$7 -server_flags=$8 -install_mode=$9 -rhel_username=${10} -rhel_password=${11} -install_method=${12} - -hostname=$(hostname -f) -mkdir -p /etc/rancher/rke2 -cat <>/etc/rancher/rke2/config.yaml -write-kubeconfig-mode: "0644" -tls-san: - - ${create_lb} -server: https://${initial_node_ip}:9345 -token: "${token}" -node-name: "${hostname}" -EOF - -if [ -n "$server_flags" ] && [[ "$server_flags" == *":"* ]] -then - echo "$server_flags" - echo -e "$server_flags" >> /etc/rancher/rke2/config.yaml - if [[ "$server_flags" != *"cloud-provider-name"* ]] - then - echo -e "node-external-ip: $public_ip" >> /etc/rancher/rke2/config.yaml - fi - cat /etc/rancher/rke2/config.yaml -else - echo -e "node-external-ip: $public_ip" >> /etc/rancher/rke2/config.yaml -fi - -if [[ "$node_os" = "rhel" ]] -then - subscription-manager register --auto-attach --username="$rhel_username" --password="$rhel_password" - subscription-manager repos --enable=rhel-7-server-extras-rpms -fi - -if [ "$node_os" = "centos8" ] || [ "$node_os" = "rhel8" ] || [ "$node_os" = "oracle8" ] -then - yum install tar -y - yum install iptables -y - workaround="[keyfile]\nunmanaged-devices=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico;interface-name:flannel*" - if [ ! -e /etc/NetworkManager/conf.d/canal.conf ]; then - echo -e "$workaround" > /etc/NetworkManager/conf.d/canal.conf - else - echo -e "$workaround" >> /etc/NetworkManager/conf.d/canal.conf - fi - sudo systemctl reload NetworkManager -fi - -export "$install_mode"="$rke2_version" -if [ -n "$install_method" ] -then - export INSTALL_RKE2_METHOD="$install_method" -fi - -if [ "$rke2_channel" != "null" ] -then - curl -sfL https://get.rke2.io | INSTALL_RKE2_CHANNEL="$rke2_channel" sh - -else - curl -sfL https://get.rke2.io | sh - -fi -sleep 10 -if [ -n "$server_flags" ] && [[ "$server_flags" == *"cis"* ]] -then - if [[ "$node_os" == *"rhel"* ]] || [[ "$node_os" == *"centos"* ]] || [[ "$node_os" == *"oracle"* ]] - then - cp -f /usr/share/rke2/rke2-cis-sysctl.conf /etc/sysctl.d/60-rke2-cis.conf - else - cp -f /usr/local/share/rke2/rke2-cis-sysctl.conf /etc/sysctl.d/60-rke2-cis.conf - fi - systemctl restart systemd-sysctl - useradd -r -c "etcd user" -s /sbin/nologin -M etcd -U -fi - -sudo systemctl enable rke2-server -sudo systemctl start --no-block rke2-server diff --git a/tests/terraform/modules/main.tf b/tests/terraform/modules/main.tf deleted file mode 100644 index d4defe860c..0000000000 --- a/tests/terraform/modules/main.tf +++ /dev/null @@ -1,77 +0,0 @@ -# Server Nodes -module "master" { - source = "./master" - - # Basic variables - node_os = var.node_os - no_of_server_nodes = var.no_of_server_nodes - create_lb = var.create_lb - username = var.username - password = var.password - all_role_nodes = var.no_of_server_nodes - etcd_only_nodes = var.etcd_only_nodes - etcd_cp_nodes = var.etcd_cp_nodes - etcd_worker_nodes = var.etcd_worker_nodes - cp_only_nodes = var.cp_only_nodes - cp_worker_nodes = var.cp_worker_nodes - optional_files = var.optional_files - - # AWS variables - access_key = var.access_key - ssh_key = var.ssh_key - availability_zone = var.availability_zone - aws_ami = var.aws_ami - aws_user = var.aws_user - ec2_instance_class = var.ec2_instance_class - volume_size = var.volume_size - iam_role = var.iam_role - hosted_zone = var.hosted_zone - region = var.region - resource_name = var.resource_name - sg_id = var.sg_id - subnets = var.subnets - vpc_id = var.vpc_id - - # RKE2 variables - rke2_version = var.rke2_version - install_mode = var.install_mode - install_method = var.install_method - rke2_channel = var.rke2_channel - server_flags = var.server_flags - split_roles = var.split_roles - role_order = var.role_order -} - -# Agent Nodes -module "worker" { - source = "./worker" - dependency = module.master - - # Basic variables - node_os = var.node_os - no_of_worker_nodes = var.no_of_worker_nodes - username = var.username - password = var.password - - # AWS variables - access_key = var.access_key - ssh_key = var.ssh_key - availability_zone = var.availability_zone - aws_ami = var.aws_ami - aws_user = var.aws_user - ec2_instance_class = var.ec2_instance_class - volume_size = var.volume_size - iam_role = var.iam_role - region = var.region - resource_name = var.resource_name - sg_id = var.sg_id - subnets = var.subnets - vpc_id = var.vpc_id - - # RKE2 variables - rke2_version = var.rke2_version - install_mode = var.install_mode - install_method = var.install_method - rke2_channel = var.rke2_channel - worker_flags = var.worker_flags -} diff --git a/tests/terraform/modules/master/instances_server.tf b/tests/terraform/modules/master/instances_server.tf deleted file mode 100644 index 2ba6d7f4e8..0000000000 --- a/tests/terraform/modules/master/instances_server.tf +++ /dev/null @@ -1,352 +0,0 @@ -resource "aws_instance" "master" { - ami = var.aws_ami - instance_type = var.ec2_instance_class - iam_instance_profile = var.iam_role - connection { - type = "ssh" - user = var.aws_user - host = self.public_ip - private_key = file(var.access_key) - } - root_block_device { - volume_size = var.volume_size - volume_type = "standard" - } - subnet_id = var.subnets - availability_zone = var.availability_zone - vpc_security_group_ids = ["${var.sg_id}"] - key_name = var.ssh_key - tags = { - Name = "${var.resource_name}-server" - "kubernetes.io/cluster/clusterid" = "owned" - } - provisioner "file" { - source = "optional_write_files.sh" - destination = "/tmp/optional_write_files.sh" - } - provisioner "remote-exec" { - inline = [ - "chmod +x /tmp/optional_write_files.sh", - "sudo /tmp/optional_write_files.sh \"${var.optional_files}\"", - ] - } - provisioner "file" { - source = "define_node_role.sh" - destination = "/tmp/define_node_role.sh" - } - provisioner "remote-exec" { - inline = [ - "chmod +x /tmp/define_node_role.sh", - "sudo /tmp/define_node_role.sh -1 \"${var.role_order}\" ${var.all_role_nodes} ${var.etcd_only_nodes} ${var.etcd_cp_nodes} ${var.etcd_worker_nodes} ${var.cp_only_nodes} ${var.cp_worker_nodes}", - ] - } - provisioner "file" { - source = "install_rke2_master.sh" - destination = "/tmp/install_rke2_master.sh" - } - provisioner "remote-exec" { - inline = [ - "chmod +x /tmp/install_rke2_master.sh", - "sudo /tmp/install_rke2_master.sh ${var.node_os} ${var.create_lb ? aws_route53_record.aws_route53[0].fqdn : "fake.fqdn.value"} ${var.rke2_version} ${self.public_ip} ${var.rke2_channel} \"${var.server_flags}\" ${var.install_mode} ${var.username} ${var.password} \"${var.install_method}\"", - ] - } - provisioner "local-exec" { - command = "echo ${aws_instance.master.public_ip} >/tmp/${var.resource_name}_master_ip" - } - provisioner "local-exec" { - command = "scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ${var.access_key} ${var.aws_user}@${aws_instance.master.public_ip}:/tmp/nodetoken /tmp/${var.resource_name}_nodetoken" - } - provisioner "local-exec" { - command = "scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ${var.access_key} ${var.aws_user}@${aws_instance.master.public_ip}:/tmp/config /tmp/${var.resource_name}_config" - } - provisioner "local-exec" { - command = "scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ${var.access_key} ${var.aws_user}@${aws_instance.master.public_ip}:/tmp/joinflags /tmp/${var.resource_name}_joinflags" - } -} - -resource "aws_instance" "master2" { - ami = var.aws_ami - instance_type = var.ec2_instance_class - iam_instance_profile = var.iam_role - count = var.no_of_server_nodes + var.etcd_only_nodes + var.etcd_cp_nodes + var.etcd_worker_nodes + var.cp_only_nodes + var.cp_worker_nodes - 1 - connection { - type = "ssh" - user = var.aws_user - host = self.public_ip - private_key = file(var.access_key) - } - root_block_device { - volume_size = var.volume_size - volume_type = "standard" - } - subnet_id = var.subnets - availability_zone = var.availability_zone - vpc_security_group_ids = [var.sg_id] - key_name = var.ssh_key - tags = { - Name = "${var.resource_name}-server${count.index + 1}" - "kubernetes.io/cluster/clusterid" = "owned" - } - depends_on = [aws_instance.master] - provisioner "file" { - source = "optional_write_files.sh" - destination = "/tmp/optional_write_files.sh" - } - provisioner "remote-exec" { - inline = [ - "chmod +x /tmp/optional_write_files.sh", - "sudo /tmp/optional_write_files.sh \"${var.optional_files}\"", - ] - } - provisioner "file" { - source = "define_node_role.sh" - destination = "/tmp/define_node_role.sh" - } - provisioner "remote-exec" { - inline = [ - "chmod +x /tmp/define_node_role.sh", - "sudo /tmp/define_node_role.sh ${count.index} \"${var.role_order}\" ${var.all_role_nodes} ${var.etcd_only_nodes} ${var.etcd_cp_nodes} ${var.etcd_worker_nodes} ${var.cp_only_nodes} ${var.cp_worker_nodes}", - ] - } - provisioner "file" { - source = "join_rke2_master.sh" - destination = "/tmp/join_rke2_master.sh" - } - provisioner "remote-exec" { - inline = [ - "chmod +x /tmp/join_rke2_master.sh", - "sudo /tmp/join_rke2_master.sh ${var.node_os} ${var.create_lb ? aws_route53_record.aws_route53[0].fqdn : aws_instance.master.public_ip} ${aws_instance.master.public_ip} ${local.node_token} ${var.rke2_version} ${self.public_ip} ${var.rke2_channel} \"${var.server_flags}\" ${var.install_mode} ${var.username} ${var.password} \"${var.install_method}\"", - ] - } -} - -data "local_file" "token" { - filename = "/tmp/${var.resource_name}_nodetoken" - depends_on = [aws_instance.master] -} - -locals { - node_token = trimspace("${data.local_file.token.content}") -} - -resource "random_string" "suffix" { - length = 4 - upper = false - special = false -} - -locals { - random_string = random_string.suffix.result -} - -resource "local_file" "master_ips" { - content = join(",", aws_instance.master.*.public_ip, aws_instance.master2.*.public_ip) - filename = "/tmp/${var.resource_name}_master_ips" -} - -resource "aws_lb_target_group" "aws_tg_6443" { - port = 6443 - protocol = "TCP" - vpc_id = var.vpc_id - name = "${var.resource_name}${local.random_string}-tg-6443" - count = var.create_lb ? 1 : 0 -} - -resource "aws_lb_target_group" "aws_tg_9345" { - port = 9345 - protocol = "TCP" - vpc_id = var.vpc_id - name = "${var.resource_name}${local.random_string}-tg-9345" - count = var.create_lb ? 1 : 0 -} - -resource "aws_lb_target_group" "aws_tg_80" { - port = 80 - protocol = "TCP" - vpc_id = var.vpc_id - name = "${var.resource_name}${local.random_string}-tg-80" - health_check { - protocol = "HTTP" - port = "traffic-port" - path = "/ping" - interval = 10 - timeout = 6 - healthy_threshold = 3 - unhealthy_threshold = 3 - matcher = "200-399" - } - count = var.create_lb ? 1 : 0 -} - -resource "aws_lb_target_group" "aws_tg_443" { - port = 443 - protocol = "TCP" - vpc_id = var.vpc_id - name = "${var.resource_name}${local.random_string}-tg-443" - health_check { - protocol = "HTTP" - port = 80 - path = "/ping" - interval = 10 - timeout = 6 - healthy_threshold = 3 - unhealthy_threshold = 3 - matcher = "200-399" - } - count = var.create_lb ? 1 : 0 -} - -resource "aws_lb_target_group_attachment" "aws_tg_attachment_6443" { - target_group_arn = aws_lb_target_group.aws_tg_6443[0].arn - target_id = aws_instance.master.id - port = 6443 - depends_on = [aws_instance.master] - count = var.create_lb ? 1 : 0 -} - -resource "aws_lb_target_group_attachment" "aws_tg_attachment_6443_2" { - target_group_arn = aws_lb_target_group.aws_tg_6443[0].arn - count = var.create_lb ? length(aws_instance.master2) : 0 - target_id = aws_instance.master2[count.index].id - depends_on = [aws_instance.master2] - port = 6443 -} - -resource "aws_lb_target_group_attachment" "aws_tg_attachment_9345" { - target_group_arn = aws_lb_target_group.aws_tg_9345[0].arn - target_id = aws_instance.master.id - port = 9345 - depends_on = [aws_instance.master] - count = var.create_lb ? 1 : 0 -} -resource "aws_lb_target_group_attachment" "aws_tg_attachment_9345_2" { - target_group_arn = aws_lb_target_group.aws_tg_9345[0].arn - count = var.create_lb ? length(aws_instance.master2) : 0 - target_id = aws_instance.master2[count.index].id - depends_on = [aws_instance.master2] - port = 9345 -} - -resource "aws_lb_target_group_attachment" "aws_tg_attachment_80" { - target_group_arn = aws_lb_target_group.aws_tg_80[0].arn - target_id = aws_instance.master.id - port = 80 - depends_on = [aws_instance.master] - count = var.create_lb ? 1 : 0 -} - -resource "aws_lb_target_group_attachment" "aws_tg_attachment_80_2" { - target_group_arn = aws_lb_target_group.aws_tg_80[0].arn - count = var.create_lb ? length(aws_instance.master2) : 0 - target_id = aws_instance.master2[count.index].id - port = 80 - depends_on = [aws_instance.master] -} - -resource "aws_lb_target_group_attachment" "aws_tg_attachment_443" { - target_group_arn = aws_lb_target_group.aws_tg_443[0].arn - target_id = aws_instance.master.id - port = 443 - depends_on = [aws_instance.master] - count = var.create_lb ? 1 : 0 -} - -resource "aws_lb_target_group_attachment" "aws_tg_attachment_443_2" { - target_group_arn = aws_lb_target_group.aws_tg_443[0].arn - count = var.create_lb ? length(aws_instance.master2) : 0 - target_id = aws_instance.master2[count.index].id - port = 443 - depends_on = [aws_instance.master] -} - -resource "aws_lb" "aws_nlb" { - internal = false - load_balancer_type = "network" - subnets = ["${var.subnets}"] - name = "${var.resource_name}${local.random_string}-nlb" - count = var.create_lb ? 1 : 0 -} - -resource "aws_lb_listener" "aws_nlb_listener_6443" { - load_balancer_arn = aws_lb.aws_nlb[0].arn - port = "6443" - protocol = "TCP" - default_action { - type = "forward" - target_group_arn = aws_lb_target_group.aws_tg_6443[0].arn - } - count = var.create_lb ? 1 : 0 -} - -resource "aws_lb_listener" "aws_nlb_listener_9345" { - load_balancer_arn = aws_lb.aws_nlb[0].arn - port = "9345" - protocol = "TCP" - default_action { - type = "forward" - target_group_arn = aws_lb_target_group.aws_tg_9345[0].arn - } - count = var.create_lb ? 1 : 0 -} - -resource "aws_lb_listener" "aws_nlb_listener_80" { - load_balancer_arn = aws_lb.aws_nlb[0].arn - port = "80" - protocol = "TCP" - default_action { - type = "forward" - target_group_arn = aws_lb_target_group.aws_tg_80[0].arn - } - count = var.create_lb ? 1 : 0 -} - -resource "aws_lb_listener" "aws_nlb_listener_443" { - load_balancer_arn = aws_lb.aws_nlb[0].arn - port = "443" - protocol = "TCP" - default_action { - type = "forward" - target_group_arn = aws_lb_target_group.aws_tg_443[0].arn - } - count = var.create_lb ? 1 : 0 -} - -resource "aws_route53_record" "aws_route53" { - zone_id = data.aws_route53_zone.selected.zone_id - name = "${var.resource_name}${local.random_string}-r53" - type = "CNAME" - ttl = "300" - records = ["${aws_lb.aws_nlb[0].dns_name}"] - count = var.create_lb ? 1 : 0 -} - -data "aws_route53_zone" "selected" { - name = var.hosted_zone - private_zone = false -} - -locals { - serverIp = var.create_lb ? aws_route53_record.aws_route53[0].fqdn : aws_instance.master.public_ip - depends_on = [aws_instance.master] -} - -resource "null_resource" "update_kubeconfig" { - count = var.no_of_server_nodes + var.etcd_only_nodes + var.etcd_cp_nodes + var.etcd_worker_nodes + var.cp_only_nodes + var.cp_worker_nodes - depends_on = [aws_instance.master, aws_instance.master2] - - provisioner "local-exec" { - command = "scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ${var.access_key} ${var.aws_user}@${count.index == 0 ? aws_instance.master.public_ip : aws_instance.master2[count.index - 1].public_ip}:/tmp/.control-plane /tmp/${var.resource_name}_control_plane_${count.index}" - on_failure = continue - } - provisioner "local-exec" { - command = "test -f /tmp/${var.resource_name}_control_plane_${count.index} && sed s/127.0.0.1/\"${count.index == 0 ? local.serverIp : aws_instance.master2[count.index - 1].public_ip}\"/g /tmp/${var.resource_name}_config >/tmp/${var.resource_name}_kubeconfig" - on_failure = continue - } -} - -resource "null_resource" "store_fqdn" { - provisioner "local-exec" { - command = "echo \"${var.create_lb ? aws_route53_record.aws_route53[0].fqdn : aws_instance.master.public_ip}\" >/tmp/${var.resource_name}_fixed_reg_addr" - } - depends_on = [aws_instance.master] -} \ No newline at end of file diff --git a/tests/terraform/modules/master/outputs.tf b/tests/terraform/modules/master/outputs.tf deleted file mode 100644 index a4d8b7243f..0000000000 --- a/tests/terraform/modules/master/outputs.tf +++ /dev/null @@ -1,13 +0,0 @@ -output "Route53_info" { - value = aws_route53_record.aws_route53.* - description = "List of DNS records" -} - -output "kubeconfig" { - value = "/tmp/${var.resource_name}_kubeconfig" - description = "kubeconfig of the cluster created" -} - -output "master_ips" { - value = join("," , aws_instance.master.*.public_ip,aws_instance.master2.*.public_ip) -} \ No newline at end of file diff --git a/tests/terraform/modules/master/variables.tf b/tests/terraform/modules/master/variables.tf deleted file mode 100644 index 9405da1765..0000000000 --- a/tests/terraform/modules/master/variables.tf +++ /dev/null @@ -1,46 +0,0 @@ -variable "access_key" {} -variable "ssh_key" {} -variable "availability_zone" {} -variable "aws_ami" {} -variable "aws_user" {} -variable "ec2_instance_class" {} -variable "volume_size" {} -variable "iam_role" {} -variable "node_os" {} -variable "no_of_server_nodes" {} -variable "password" { - default = "password" -} -variable "hosted_zone" {} -variable "region" {} -variable "resource_name" {} -variable "rke2_version" {} -variable "install_mode" {} -variable "install_method" {} -variable "rke2_channel" {} -variable "server_flags" {} -variable "sg_id" {} -variable "subnets" {} -variable "vpc_id" {} -variable "username" { - default = "username" -} -variable "create_lb" { - description = "Create Network Load Balancer if set to true" - type = bool -} -variable "split_roles" { - description = "When true, server nodes may be a mix of etcd, cp, and worker" - type = bool -} -variable "role_order" { - description = "Comma separated order of how to bring the nodes up when split roles" - type = string -} -variable "all_role_nodes" {} -variable "etcd_only_nodes" {} -variable "etcd_cp_nodes" {} -variable "etcd_worker_nodes" {} -variable "cp_only_nodes" {} -variable "cp_worker_nodes" {} -variable "optional_files" {} diff --git a/tests/terraform/modules/optional_write_files.sh b/tests/terraform/modules/optional_write_files.sh deleted file mode 100644 index 809b4542d2..0000000000 --- a/tests/terraform/modules/optional_write_files.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -# This script pulls raw files and writes to specified locations. -# For example, it can be used to write HelmChartConfig or custom PSA files. - - -files=$1 - -if [ -n "$files" ] -then - file_array=($(echo "$files" | tr ' ' '\n')) - for current_file in "${file_array[@]}"; do - file_location=$(echo "$current_file" | awk -F, '{print $1}') - mkdir -p "$(dirname "$file_location")" - - raw_data=$(echo "$current_file" | awk -F, '{print $2}') - curl -s "$raw_data" -o "$file_location" - done - -fi diff --git a/tests/terraform/modules/outputs.tf b/tests/terraform/modules/outputs.tf deleted file mode 100644 index 6c5d8c9792..0000000000 --- a/tests/terraform/modules/outputs.tf +++ /dev/null @@ -1,14 +0,0 @@ -output "master_ips" { - value = module.master.master_ips - description = "The public IP of the AWS node" -} - -output "worker_ips" { - value = module.worker.worker_ips - description = "The public IP of the AWS node" -} - -output "kubeconfig" { - value = module.master.kubeconfig - description = "kubeconfig of the cluster created" -} diff --git a/tests/terraform/modules/providers.tf b/tests/terraform/modules/providers.tf deleted file mode 100644 index 0ced9d7521..0000000000 --- a/tests/terraform/modules/providers.tf +++ /dev/null @@ -1,3 +0,0 @@ -provider "aws" { - region = "${var.region}" -} diff --git a/tests/terraform/modules/variables.tf b/tests/terraform/modules/variables.tf deleted file mode 100644 index 8aecf32adf..0000000000 --- a/tests/terraform/modules/variables.tf +++ /dev/null @@ -1,73 +0,0 @@ -# Basic variables -variable "node_os" {} -variable "username" { - default = "username" -} -variable "password" { - default = "password" -} -variable "no_of_server_nodes" {} -variable "no_of_worker_nodes" {} -variable "create_lb" { - description = "Create Network Load Balancer if set to true" - type = bool - default = false -} -variable "access_key" {} - -# AWS variables -variable "ssh_key" {} -variable "availability_zone" {} -variable "aws_ami" {} -variable "aws_user" {} -variable "ec2_instance_class" {} -variable "volume_size" {} -variable "iam_role" {} -variable "hosted_zone" {} -variable "region" {} -variable "resource_name" {} -variable "sg_id" {} -variable "subnets" {} -variable "vpc_id" {} - -# RKE2 variables -variable "rke2_version" {} -variable "install_mode" { - default = "INSTALL_RKE2_VERSION" -} -variable "install_method" { - default = null -} -variable "rke2_channel" { - default = "latest" -} -variable "server_flags" {} -variable "worker_flags" {} -variable "split_roles" { - description = "When true, server nodes may be a mix of etcd, cp, and worker" - type = bool - default = false -} -variable "role_order" { - description = "Comma separated order of how to bring the nodes up when split roles" - type = string - default = "1,2,3,4,5,6" -} -variable "etcd_only_nodes" { - default = 0 -} -variable "etcd_cp_nodes" { - default = 0 -} -variable "etcd_worker_nodes" { - default = 0 -} -variable "cp_only_nodes" { - default = 0 -} -variable "cp_worker_nodes" { - default = 0 -} -variable "optional_files" { - description = "File location and raw data url separate by commas, with a space for other pairs. E.g. file1,url1 file2,url2" -} diff --git a/tests/terraform/modules/worker/instances_worker.tf b/tests/terraform/modules/worker/instances_worker.tf deleted file mode 100644 index 545396f49c..0000000000 --- a/tests/terraform/modules/worker/instances_worker.tf +++ /dev/null @@ -1,57 +0,0 @@ -resource "aws_instance" "worker" { - depends_on = [ - var.dependency - ] - ami = var.aws_ami - instance_type = var.ec2_instance_class - count = var.no_of_worker_nodes - iam_instance_profile = "${var.iam_role}" - connection { - type = "ssh" - user = var.aws_user - host = self.public_ip - private_key = "${file(var.access_key)}" - } - root_block_device { - volume_size = var.volume_size - volume_type = "standard" - } - subnet_id = var.subnets - availability_zone = var.availability_zone - vpc_security_group_ids = [ - "${var.sg_id}" - ] - key_name = var.ssh_key - tags = { - Name = "${var.resource_name}-worker" - "kubernetes.io/cluster/clusterid" = "owned" - } - provisioner "file" { - source = "join_rke2_agent.sh" - destination = "/tmp/join_rke2_agent.sh" - } - provisioner "remote-exec" { - inline = [ - "chmod +x /tmp/join_rke2_agent.sh", - "sudo /tmp/join_rke2_agent.sh ${var.node_os} ${local.master_ip} \"${local.node_token}\" ${var.rke2_version} ${self.public_ip} ${var.rke2_channel} \"${var.worker_flags}\" ${var.install_mode} ${var.username} ${var.password} \"${var.install_method}\"", - ] - } -} - -data "local_file" "master_ip" { - depends_on = [var.dependency] - filename = "/tmp/${var.resource_name}_master_ip" -} - -locals { - master_ip = trimspace("${data.local_file.master_ip.content}") -} - -data "local_file" "token" { - depends_on = [var.dependency] - filename = "/tmp/${var.resource_name}_nodetoken" -} - -locals { - node_token = trimspace("${data.local_file.token.content}") -} \ No newline at end of file diff --git a/tests/terraform/modules/worker/outputs.tf b/tests/terraform/modules/worker/outputs.tf deleted file mode 100644 index 87238eef9a..0000000000 --- a/tests/terraform/modules/worker/outputs.tf +++ /dev/null @@ -1,3 +0,0 @@ -output "worker_ips" { - value = join(",", aws_instance.worker.*.public_ip) -} diff --git a/tests/terraform/modules/worker/variables.tf b/tests/terraform/modules/worker/variables.tf deleted file mode 100644 index 4d509beb59..0000000000 --- a/tests/terraform/modules/worker/variables.tf +++ /dev/null @@ -1,30 +0,0 @@ -variable "access_key" {} -variable "ssh_key" {} -variable "availability_zone" {} -variable "aws_ami" {} -variable "aws_user" {} -variable "dependency" { - type = any - default = null -} -variable "ec2_instance_class" {} -variable "volume_size" {} -variable "iam_role" {} -variable "node_os" {} -variable "no_of_worker_nodes" {} -variable "password" { - default = "password" -} -variable "region" {} -variable "resource_name" {} -variable "rke2_version" {} -variable "install_mode" {} -variable "install_method" {} -variable "rke2_channel" {} -variable "sg_id" {} -variable "subnets" {} -variable "username" { - default = "username" -} -variable "vpc_id" {} -variable "worker_flags" {} diff --git a/tests/terraform/resource_files/clusterip.yaml b/tests/terraform/resource_files/clusterip.yaml deleted file mode 100644 index da17473e51..0000000000 --- a/tests/terraform/resource_files/clusterip.yaml +++ /dev/null @@ -1,43 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: auto-clusterip - labels: - pod-security.kubernetes.io/enforce: privileged - pod-security.kubernetes.io/audit: privileged - pod-security.kubernetes.io/warn: privileged ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: test-clusterip - namespace: auto-clusterip -spec: - selector: - matchLabels: - k8s-app: nginx-app-clusterip - replicas: 2 - template: - metadata: - labels: - k8s-app: nginx-app-clusterip - spec: - containers: - - name: nginx - image: ranchertest/mytestcontainer:unprivileged - ports: - - containerPort: 8080 ---- -apiVersion: v1 -kind: Service -metadata: - labels: - k8s-app: nginx-app-clusterip - name: nginx-clusterip-svc - namespace: auto-clusterip -spec: - type: ClusterIP - ports: - - port: 8080 - selector: - k8s-app: nginx-app-clusterip diff --git a/tests/terraform/resource_files/daemonset.yaml b/tests/terraform/resource_files/daemonset.yaml deleted file mode 100644 index 18ac2b88c2..0000000000 --- a/tests/terraform/resource_files/daemonset.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: auto-daemonset - labels: - pod-security.kubernetes.io/enforce: privileged - pod-security.kubernetes.io/audit: privileged - pod-security.kubernetes.io/warn: privileged ---- -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: test-daemonset - namespace: auto-daemonset -spec: - selector: - matchLabels: - k8s-app: test-daemonset - template: - metadata: - labels: - k8s-app: test-daemonset - spec: - containers: - - name: webserver - image: ranchertest/mytestcontainer:unprivileged - ports: - - containerPort: 8080 diff --git a/tests/terraform/resource_files/dnsutils.yaml b/tests/terraform/resource_files/dnsutils.yaml deleted file mode 100644 index 08ccc12401..0000000000 --- a/tests/terraform/resource_files/dnsutils.yaml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: auto-dns - labels: - pod-security.kubernetes.io/enforce: privileged - pod-security.kubernetes.io/audit: privileged - pod-security.kubernetes.io/warn: privileged ---- -apiVersion: v1 -kind: Pod -metadata: - name: dnsutils - namespace: auto-dns -spec: - containers: - - name: dnsutils - image: gcr.io/kubernetes-e2e-test-images/dnsutils:1.3 - command: - - sleep - - "3600" - imagePullPolicy: IfNotPresent - restartPolicy: Always diff --git a/tests/terraform/resource_files/ingress.yaml b/tests/terraform/resource_files/ingress.yaml deleted file mode 100644 index 3f7277b196..0000000000 --- a/tests/terraform/resource_files/ingress.yaml +++ /dev/null @@ -1,77 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: auto-ingress - labels: - pod-security.kubernetes.io/enforce: privileged - pod-security.kubernetes.io/audit: privileged - pod-security.kubernetes.io/warn: privileged ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: test-ingress - namespace: auto-ingress - labels: - k8s-app: nginx-app-ingress -spec: - rules: - - host: foo1.bar.com - http: - paths: - - backend: - service: - name: nginx-ingress-svc - port: - number: 8080 - path: / - pathType: ImplementationSpecific ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: allow-all-ingress - namespace: auto-ingress -spec: - podSelector: {} - ingress: - - {} - policyTypes: - - Ingress ---- -apiVersion: v1 -kind: Service -metadata: - name: nginx-ingress-svc - namespace: auto-ingress - labels: - k8s-app: nginx-app-ingress -spec: - ports: - - port: 8080 - targetPort: 8080 - protocol: TCP - name: http - selector: - k8s-app: nginx-app-ingress ---- -apiVersion: v1 -kind: ReplicationController -metadata: - name: test-ingress - namespace: auto-ingress -spec: - replicas: 2 - selector: - k8s-app: nginx-app-ingress - template: - metadata: - labels: - k8s-app: nginx-app-ingress - spec: - terminationGracePeriodSeconds: 60 - containers: - - name: testcontainer - image: ranchertest/mytestcontainer:unprivileged - ports: - - containerPort: 8080 diff --git a/tests/terraform/resource_files/nodeport.yaml b/tests/terraform/resource_files/nodeport.yaml deleted file mode 100644 index f3715299e2..0000000000 --- a/tests/terraform/resource_files/nodeport.yaml +++ /dev/null @@ -1,45 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: auto-nodeport - labels: - pod-security.kubernetes.io/enforce: privileged - pod-security.kubernetes.io/audit: privileged - pod-security.kubernetes.io/warn: privileged ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: test-nodeport - namespace: auto-nodeport -spec: - selector: - matchLabels: - k8s-app: nginx-app-nodeport - replicas: 2 - template: - metadata: - labels: - k8s-app: nginx-app-nodeport - spec: - containers: - - name: nginx - image: ranchertest/mytestcontainer:unprivileged - ports: - - containerPort: 8080 ---- -apiVersion: v1 -kind: Service -metadata: - labels: - k8s-app: nginx-app-nodeport - name: nginx-nodeport-svc - namespace: auto-nodeport -spec: - type: NodePort - ports: - - port: 8080 - nodePort: 30096 - name: http - selector: - k8s-app: nginx-app-nodeport diff --git a/tests/terraform/resource_files/suc.yaml b/tests/terraform/resource_files/suc.yaml deleted file mode 100644 index 7a5b95a8d9..0000000000 --- a/tests/terraform/resource_files/suc.yaml +++ /dev/null @@ -1,103 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: system-upgrade - labels: - pod-security.kubernetes.io/enforce: privileged - pod-security.kubernetes.io/enforce-version: v1.25 - # We are setting these to our _desired_ `enforce` level. - pod-security.kubernetes.io/audit: privileged - pod-security.kubernetes.io/audit-version: v1.25 - pod-security.kubernetes.io/warn: privileged - pod-security.kubernetes.io/warn-version: v1.25 ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: system-upgrade - namespace: system-upgrade ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: system-upgrade -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cluster-admin -subjects: -- kind: ServiceAccount - name: system-upgrade - namespace: system-upgrade ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: default-controller-env - namespace: system-upgrade -data: - SYSTEM_UPGRADE_CONTROLLER_DEBUG: "true" - SYSTEM_UPGRADE_CONTROLLER_THREADS: "2" - SYSTEM_UPGRADE_JOB_ACTIVE_DEADLINE_SECONDS: "900" - SYSTEM_UPGRADE_JOB_BACKOFF_LIMIT: "99" - SYSTEM_UPGRADE_JOB_IMAGE_PULL_POLICY: "Always" - SYSTEM_UPGRADE_JOB_KUBECTL_IMAGE: "rancher/kubectl:v1.21.9" - SYSTEM_UPGRADE_JOB_PRIVILEGED: "true" - SYSTEM_UPGRADE_JOB_TTL_SECONDS_AFTER_FINISH: "900" - SYSTEM_UPGRADE_PLAN_POLLING_INTERVAL: "15m" ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: system-upgrade-controller - namespace: system-upgrade -spec: - selector: - matchLabels: - upgrade.cattle.io/controller: system-upgrade-controller - template: - metadata: - labels: - upgrade.cattle.io/controller: system-upgrade-controller # necessary to avoid drain - spec: - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - {key: "node-role.kubernetes.io/master", operator: In, values: ["true"]} - serviceAccountName: system-upgrade - tolerations: - - key: "CriticalAddonsOnly" - operator: "Exists" - - key: "node-role.kubernetes.io/master" - operator: "Exists" - effect: "NoSchedule" - containers: - - name: system-upgrade-controller - image: rancher/system-upgrade-controller:v0.10.0 - imagePullPolicy: IfNotPresent - envFrom: - - configMapRef: - name: default-controller-env - env: - - name: SYSTEM_UPGRADE_CONTROLLER_NAME - valueFrom: - fieldRef: - fieldPath: metadata.labels['upgrade.cattle.io/controller'] - - name: SYSTEM_UPGRADE_CONTROLLER_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - volumeMounts: - - name: etc-ssl - mountPath: /etc/ssl - - name: tmp - mountPath: /tmp - volumes: - - name: etc-ssl - hostPath: - path: /etc/ssl - type: Directory - - name: tmp - emptyDir: {} \ No newline at end of file diff --git a/tests/terraform/resource_files/upgrade-plan.yaml b/tests/terraform/resource_files/upgrade-plan.yaml deleted file mode 100644 index 9a574e6f7c..0000000000 --- a/tests/terraform/resource_files/upgrade-plan.yaml +++ /dev/null @@ -1,66 +0,0 @@ -apiVersion: upgrade.cattle.io/v1 -kind: Plan -metadata: - name: rke2-server-cp - namespace: system-upgrade - labels: - rke2-upgrade: server -spec: - concurrency: 1 - version: $UPGRADEVERSION - nodeSelector: - matchExpressions: - - {key: node-role.kubernetes.io/control-plane, operator: In, values: ["true"]} - tolerations: - - operator: Exists - serviceAccountName: system-upgrade - cordon: true - upgrade: - image: rancher/rke2-upgrade ---- -apiVersion: upgrade.cattle.io/v1 -kind: Plan -metadata: - name: rke2-server-etcd - namespace: system-upgrade - labels: - rke2-upgrade: server -spec: - concurrency: 1 - version: $UPGRADEVERSION - nodeSelector: - matchExpressions: - - {key: node-role.kubernetes.io/etcd, operator: In, values: ["true"]} - - {key: node-role.kubernetes.io/control-plane, operator: NotIn, values: ["true"]} - tolerations: - - operator: Exists - serviceAccountName: system-upgrade - prepare: - image: rancher/rke2-upgrade - args: ["prepare", "rke2-server-cp"] - cordon: true - upgrade: - image: rancher/rke2-upgrade ---- -apiVersion: upgrade.cattle.io/v1 -kind: Plan -metadata: - name: rke2-agent - namespace: system-upgrade - labels: - rke2-upgrade: agent -spec: - concurrency: 2 - version: $UPGRADEVERSION - nodeSelector: - matchExpressions: - - {key: node-role.kubernetes.io/etcd, operator: NotIn, values: ["true"]} - - {key: node-role.kubernetes.io/control-plane, operator: NotIn, values: ["true"]} - serviceAccountName: system-upgrade - prepare: - image: rancher/rke2-upgrade - args: ["prepare", "rke2-server-etcd"] - drain: - force: true - upgrade: - image: rancher/rke2-upgrade \ No newline at end of file diff --git a/tests/terraform/scripts/Dockerfile.build b/tests/terraform/scripts/Dockerfile.build deleted file mode 100644 index 0d58de9875..0000000000 --- a/tests/terraform/scripts/Dockerfile.build +++ /dev/null @@ -1,27 +0,0 @@ -FROM golang:alpine - -ARG TF_VERSION=1.4.5 -ENV TERRAFORM_VERSION $TF_VERSION - -RUN apk update && \ - apk upgrade --update-cache --available && \ - apk add --no-cache curl git jq bash openssh unzip gcc g++ make ca-certificates && \ - if [ "$(uname -m)" = "aarch64" ]; then \ - KUBE_ARCH="linux/arm64" && \ - TF_ARCH="linux_arm64"; \ - else \ - KUBE_ARCH="linux/amd64" && \ - TF_ARCH="linux_amd64"; \ - fi && \ - curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/${KUBE_ARCH}/kubectl" && \ - chmod +x ./kubectl && \ - mv ./kubectl /usr/local/bin && \ - mkdir tmp && \ - curl "https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_${TF_ARCH}.zip" -o tmp/terraform.zip && \ - unzip tmp/terraform.zip -d /usr/local/bin && \ - chmod +x /usr/local/bin/terraform && \ - rm -rf tmp - -WORKDIR $GOPATH/src/github.com/rancher/rke2 - -COPY . . diff --git a/tests/terraform/scripts/Jenkinsfile b/tests/terraform/scripts/Jenkinsfile deleted file mode 100644 index de955cf4dc..0000000000 --- a/tests/terraform/scripts/Jenkinsfile +++ /dev/null @@ -1,93 +0,0 @@ -#!groovy -node { - def job_name = "${JOB_NAME}" - if (job_name.contains('/')) { - job_names = job_name.split('/') - job_name = job_names[job_names.size() - 1] - } - def testContainer = "${job_name}${env.BUILD_NUMBER}_test" - def imageName = "rke2-tf-${job_name}${env.BUILD_NUMBER}" - def envFile = ".env" - def branch = "master" - if ("${env.BRANCH}" != "null" && "${env.BRANCH}" != "") { - branch = "${env.BRANCH}" - } - def repo = scm.userRemoteConfigs - if ("${env.REPO}" != "null" && "${env.REPO}" != "") { - repo = [[url: "${env.REPO}"]] - } - def timeout = "60m" - if ("${env.TIMEOUT}" != "null" && "${env.TIMEOUT}" != "") { - timeout = "${env.TIMEOUT}" - } - wrap([$class: 'AnsiColorBuildWrapper', 'colorMapName': 'XTerm', 'defaultFg': 2, 'defaultBg':1]) { - withFolderProperties { - paramsMap = [] - params.each { - if (it.value && it.value.trim() != "") { - paramsMap << "$it.key=$it.value" - } - } - withCredentials([ - - string(credentialsId: 'AWS_ACCESS_KEY_ID', variable: 'AWS_ACCESS_KEY_ID'), - string(credentialsId: 'AWS_SECRET_ACCESS_KEY', variable: 'AWS_SECRET_ACCESS_KEY'), - string(credentialsId: 'AWS_SSH_PEM_KEY', variable: 'AWS_SSH_PEM_KEY'), - string(credentialsId: 'ADMIN_PASSWORD', variable: 'ADMIN_PASSWORD'), - string(credentialsId: 'RKE2_RHEL_PASSWORD', variable: 'RKE2_RHEL_PASSWORD') - ]) { - withEnv(paramsMap) { - stage('Checkout') { - deleteDir() - checkout([ - $class: 'GitSCM', - branches: [[name: "*/${branch}"]], - extensions: scm.extensions + [[$class: 'CleanCheckout']], - userRemoteConfigs: repo - ]) - } - dir ("./") { - try { - stage('Configure and Build') { - if (env.AWS_SSH_PEM_KEY && env.AWS_SSH_KEY_NAME) { - dir("./tests/terraform/modules/config/.ssh") { - def decoded = new String(AWS_SSH_PEM_KEY.decodeBase64()) - writeFile file: "aws_key.pem", text: decoded - } - } - - dir("./tests/terraform/modules/config") { - def filename = "local.tfvars" - def configContents = env.TFVARS - - writeFile file: filename, text: configContents + - "\npassword = \"" + RKE2_RHEL_PASSWORD + "\"" + - "\nssh_key = \"" + AWS_SSH_KEY_NAME + "\"" + - "\naccess_key = \"/go/src/github.com/rancher/rke2/tests/terraform/modules/config/.ssh/aws_key.pem\"" + - "\nresource_name = \"" + RKE2_HOSTNAME_PREFIX + "\"" + - "\nrke2_version = \"" + RKE2_VERSION + "\"" + - "\nrke2_channel = \"" + RKE2_CHANNEL + "\"" - } - - sh "./tests/terraform/scripts/configure.sh" - sh "./tests/terraform/scripts/build.sh" - } - stage('Run Tests') { - sh "docker run --name ${testContainer} -t --env-file ${envFile} " + - "${imageName} sh -c \"chmod 400 /go/src/github.com/rancher/rke2/tests/terraform/modules/config/.ssh/aws_key.pem && " + - "cd ./tests/terraform && go test -timeout=${timeout} -v ./${RKE2_TESTCASE}/... ${RKE2_TEST_ARGS}\"" - } - } finally { - stage('Cleanup') { - // Stop and remove containers and images, but don't fail job if these fail for whatever reason (generally due to a previous step failing) - sh "docker stop ${testContainer} || true" - sh "docker rm -v ${testContainer} || true" - sh "docker rmi -f ${imageName} || true" - } - } // finally - } // dir - } // withEnv - } // withCredentials - } // withFolderProperties - } // wrap -}// node \ No newline at end of file diff --git a/tests/terraform/scripts/build.sh b/tests/terraform/scripts/build.sh deleted file mode 100755 index b4b4b258db..0000000000 --- a/tests/terraform/scripts/build.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -set -x -set -eu - -DEBUG="${DEBUG:-false}" - -TRIM_JOB_NAME=$(basename "$JOB_NAME") - -if [ "false" != "${DEBUG}" ]; then - echo "Environment:" - env | sort -fi - -count=0 -while [[ 3 -gt $count ]]; do - docker build . -f tests/terraform/scripts/Dockerfile.build -t rke2-tf-"${TRIM_JOB_NAME}""${BUILD_NUMBER}" - - if [[ $? -eq 0 ]]; then break; fi - count=$(($count + 1)) - echo "Repeating failed Docker build ${count} of 3..." -done \ No newline at end of file diff --git a/tests/terraform/scripts/configure.sh b/tests/terraform/scripts/configure.sh deleted file mode 100755 index 01cc5ac6d8..0000000000 --- a/tests/terraform/scripts/configure.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -set -x -set -eu - -DEBUG="${DEBUG:-false}" - -env | egrep '^(AWS|RKE2).*\=.+' | sort > .env - -if [ "false" != "${DEBUG}" ]; then - cat .env -fi \ No newline at end of file diff --git a/tests/terraform/scripts/delete_resources.sh b/tests/terraform/scripts/delete_resources.sh deleted file mode 100755 index af24ea329a..0000000000 --- a/tests/terraform/scripts/delete_resources.sh +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -#Get resource name from tfvarslocal && change name to make more sense in this context -RESOURCE_NAME=$(grep resource_name /dev/null 2>&1 - - -#Get the list of load balancer ARNs -LB_ARN_LIST=$(aws elbv2 describe-load-balancers \ - --query "LoadBalancers[?starts_with(LoadBalancerName, '${NAME_PREFIX}') && Type=='network'].LoadBalancerArn" \ - --output text) - - -#Loop through the load balancer ARNs and delete the load balancers -for LB_ARN in $LB_ARN_LIST; do - echo "Deleting load balancer $LB_ARN" - aws elbv2 delete-load-balancer --load-balancer-arn "$LB_ARN" -done - - -#Get the list of target group ARNs -TG_ARN_LIST=$(aws elbv2 describe-target-groups \ - --query "TargetGroups[?starts_with(TargetGroupName, '${NAME_PREFIX}') && Protocol=='TCP'].TargetGroupArn" \ - --output text) - - -#Loop through the target group ARNs and delete the target groups -for TG_ARN in $TG_ARN_LIST; do - echo "Deleting target group $TG_ARN" - aws elbv2 delete-target-group --target-group-arn "$TG_ARN" -done - - -#Get the ID and recordName with lower case of the hosted zone that contains the Route 53 record sets -NAME_PREFIX_LOWER=$(echo "$NAME_PREFIX" | tr '[:upper:]' '[:lower:]') -R53_ZONE_ID=$(aws route53 list-hosted-zones-by-name --dns-name "${NAME_PREFIX}." \ - --query "HostedZones[0].Id" --output text) -R53_RECORD=$(aws route53 list-resource-record-sets \ - --hosted-zone-id "${R53_ZONE_ID}" \ - --query "ResourceRecordSets[?starts_with(Name, '${NAME_PREFIX_LOWER}.') && Type == 'CNAME'].Name" \ - --output text) - - -#Get ResourceRecord Value -RECORD_VALUE=$(aws route53 list-resource-record-sets \ - --hosted-zone-id "${R53_ZONE_ID}" \ - --query "ResourceRecordSets[?starts_with(Name, '${NAME_PREFIX_LOWER}.') \ - && Type == 'CNAME'].ResourceRecords[0].Value" --output text) - - -#Delete Route53 record -if [[ "$R53_RECORD" == "${NAME_PREFIX_LOWER}."* ]]; then - echo "Deleting Route53 record ${R53_RECORD}" - CHANGE_STATUS=$(aws route53 change-resource-record-sets --hosted-zone-id "${R53_ZONE_ID}" \ - --change-batch '{"Changes": [ - { - "Action": "DELETE", - "ResourceRecordSet": { - "Name": "'"${R53_RECORD}"'", - "Type": "CNAME", - "TTL": 300, - "ResourceRecords": [ - { - "Value": "'"${RECORD_VALUE}"'" - } - ] - } - } - ] - }') - STATUS_ID=$(echo "$CHANGE_STATUS" | jq -r '.ChangeInfo.Id') - #Get status from the change - aws route53 wait resource-record-sets-changed --id "$STATUS_ID" - echo "Successfully deleted Route53 record ${R53_RECORD}: status: ${STATUS_ID}" -else - echo "No Route53 record found" -fi \ No newline at end of file diff --git a/tests/terraform/suc_upgrade/upgradecluster.go b/tests/terraform/suc_upgrade/upgradecluster.go deleted file mode 100644 index fee95468b2..0000000000 --- a/tests/terraform/suc_upgrade/upgradecluster.go +++ /dev/null @@ -1,28 +0,0 @@ -package suc_upgrade - -import ( - "fmt" - "os" - "regexp" - "strings" - - "github.com/rancher/rke2/tests/terraform" -) - -func upgradeCluster(version string, kubeconfig string) error { - if strings.TrimSpace(version) == "" { - return fmt.Errorf("please provide a non-empty rke2 version to upgrade to") - } - regex := regexp.MustCompile(`\+`) - sucVersion := regex.ReplaceAllString(version, "-") - originalFilePath := terraform.Basepath() + "/tests/terraform/resource_files" + "/upgrade-plan.yaml" - newFilePath := terraform.Basepath() + "/tests/terraform/resource_files" + "/plan.yaml" - content, err := os.ReadFile(originalFilePath) - if err != nil { - return err - } - newContent := strings.ReplaceAll(string(content), "$UPGRADEVERSION", sucVersion) - os.WriteFile(newFilePath, []byte(newContent), 0777) - _, err = terraform.DeployWorkload("plan.yaml", kubeconfig) - return err -} diff --git a/tests/terraform/suc_upgrade/upgradecluster_test.go b/tests/terraform/suc_upgrade/upgradecluster_test.go deleted file mode 100644 index 80dd8da3cc..0000000000 --- a/tests/terraform/suc_upgrade/upgradecluster_test.go +++ /dev/null @@ -1,453 +0,0 @@ -package suc_upgrade - -import ( - "flag" - "fmt" - "regexp" - "strings" - "testing" - - "github.com/rancher/rke2/tests/terraform" - "github.com/rancher/rke2/tests/terraform/createcluster" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var ( - destroy = flag.Bool("destroy", false, "a bool") - upgradeVersion = flag.String("upgradeVersion", "", "Version to upgrade the cluster to") -) - -func Test_TFUpgradeClusterValidation(t *testing.T) { - RegisterFailHandler(Fail) - flag.Parse() - - RunSpecs(t, "Upgrade Cluster Test Suite") -} - -var _ = Describe("Upgrade Tests:", func() { - Context("Build Cluster:", func() { - It("Starts up with no issues", func() { - status, err := createcluster.BuildCluster(&testing.T{}, false) - Expect(err).NotTo(HaveOccurred()) - Expect(status).To(Equal("cluster created")) - - defer GinkgoRecover() - - fmt.Println("Server Node IPS:", createcluster.MasterIPs) - fmt.Println("Agent Node IPS:", createcluster.WorkerIPs) - terraform.PrintFileContents(createcluster.KubeConfigFile) - - Expect(createcluster.KubeConfigFile).ShouldNot(BeEmpty()) - Expect(createcluster.MasterIPs).ShouldNot(BeEmpty()) - - if createcluster.NumWorkers > 0 { - Expect(createcluster.WorkerIPs).ShouldNot(BeEmpty()) - } else { - Expect(createcluster.WorkerIPs).Should(BeEmpty()) - } - Expect(createcluster.KubeConfigFile).ShouldNot(BeEmpty()) - }) - - It("Checks Node and Pod Status", func() { - defer func() { - fmt.Printf("\nFetching node status preupgrade\n") - - _, err := terraform.Nodes(createcluster.KubeConfigFile, true) - if err != nil { - fmt.Println("Error retrieving nodes preupgrade: ", err) - } - _, err = terraform.Pods(createcluster.KubeConfigFile, true) - if err != nil { - fmt.Println("Error retrieving pods preupgrade: ", err) - } - }() - - expectedNodeCount := createcluster.NumServers + createcluster.NumWorkers - Eventually(func(g Gomega) { - nodes, err := terraform.Nodes(createcluster.KubeConfigFile, false) - - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(len(nodes)).To(Equal(expectedNodeCount), - "Number of nodes should match the spec") - - for _, node := range nodes { - g.Expect(node.Status).Should(Equal("Ready"), - "Nodes should all be in Ready state", node.Name) - } - }, "420s", "5s").Should(Succeed()) - - fmt.Printf("\nFetching pod status preupgrade\n") - Eventually(func(g Gomega) { - pods, err := terraform.Pods(createcluster.KubeConfigFile, false) - g.Expect(err).NotTo(HaveOccurred()) - - re := regexp.MustCompile("[0-9]+") - for _, pod := range pods { - if strings.Contains(pod.Name, "helm-install") { - g.Expect(pod.Status).Should(Equal("Completed"), pod.Name) - } else { - g.Expect(pod.Status).Should(Equal("Running"), pod.Name) - g.Expect(pod.Restarts).Should(Equal("0"), pod.Name) - numRunning := re.FindAllString(pod.Ready, 2) - g.Expect(numRunning[0]).Should(Equal(numRunning[1]), pod.Name, - "should have all containers running") - } - } - }, "600s", "5s").Should(Succeed()) - }) - }) - - Context("Preupgrade Validations:", func() { - It("Verifies ClusterIP Service Preupgrade", func() { - namespace := "auto-clusterip" - _, err := terraform.DeployWorkload("clusterip.yaml", createcluster.KubeConfigFile) - - Expect(err).NotTo(HaveOccurred(), "Cluster IP manifest not deployed") - - Eventually(func(g Gomega) { - cmd := "kubectl get pods -n " + namespace + " -o=name " + - "-l k8s-app=nginx-app-clusterip --field-selector=status.phase=Running " + - "--kubeconfig=" + createcluster.KubeConfigFile - res, err := terraform.RunCommand(cmd) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-clusterip")) - }, "240s", "5s").Should(Succeed()) - - clusterip, port, _ := terraform.FetchClusterIP(createcluster.KubeConfigFile, - namespace, "nginx-clusterip-svc") - - cmd := "curl -sL --insecure http://" + clusterip + ":" + port + "/name.html" - nodeExternalIP := terraform.FetchNodeExternalIP(createcluster.KubeConfigFile) - - for _, ip := range nodeExternalIP { - Eventually(func(g Gomega) { - res, err := terraform.RunCommandOnNode(cmd, ip, createcluster.AwsUser, createcluster.AccessKey) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-clusterip")) - }, "240s", "10s").Should(Succeed()) - } - }) - - It("Verifies NodePort Service Preupgrade", func() { - namespace := "auto-nodeport" - _, err := terraform.DeployWorkload("nodeport.yaml", createcluster.KubeConfigFile) - - Expect(err).NotTo(HaveOccurred(), "NodePort manifest not deployed") - - nodeExternalIP := terraform.FetchNodeExternalIP(createcluster.KubeConfigFile) - cmd := "kubectl get service -n " + namespace + " nginx-nodeport-svc --kubeconfig=" + - createcluster.KubeConfigFile + " --output jsonpath=\"{.spec.ports[0].nodePort}\"" - - nodeport, err := terraform.RunCommand(cmd) - Expect(err).NotTo(HaveOccurred()) - - for _, ip := range nodeExternalIP { - Eventually(func(g Gomega) { - cmd := "kubectl get pods -n " + namespace + " -o=name -l k8s-app=nginx-app-nodeport " + - "--field-selector=status.phase=Running --kubeconfig=" + createcluster.KubeConfigFile - res, err := terraform.RunCommand(cmd) - - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-nodeport")) - }, "240s", "5s").Should(Succeed()) - - cmd = "curl -sL --insecure http://" + ip + ":" + nodeport + "/name.html" - Eventually(func(g Gomega) { - res, err := terraform.RunCommand(cmd) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-nodeport")) - }, "240s", "5s").Should(Succeed()) - } - }) - - It("Verifies Ingress Preupgrade", func() { - namespace := "auto-ingress" - _, err := terraform.DeployWorkload("ingress.yaml", createcluster.KubeConfigFile) - - Expect(err).NotTo(HaveOccurred(), "Ingress manifest not deployed") - - Eventually(func(g Gomega) { - cmd := "kubectl get pods -n " + namespace + " -o=name -l k8s-app=nginx-app-ingress " + - "--field-selector=status.phase=Running --kubeconfig=" + createcluster.KubeConfigFile - res, err := terraform.RunCommand(cmd) - - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-ingress")) - }, "240s", "5s").Should(Succeed()) - - var ingressIps []string - nodes, err := terraform.WorkerNodes(createcluster.KubeConfigFile, false) - if err != nil { - fmt.Println("Error retrieving nodes: ", err) - } - - Eventually(func(g Gomega) { - ingressIps, err = terraform.FetchIngressIP(namespace, createcluster.KubeConfigFile) - - g.Expect(err).NotTo(HaveOccurred(), "Ingress ip is not returned") - g.Expect(len(ingressIps)).To(Equal(len(nodes)), - "Number of ingress IPs should match the number of nodes") - }, "240s", "5s").Should(Succeed()) - - for _, ip := range ingressIps { - cmd := "curl -s --header host:foo1.bar.com" + " http://" + ip + "/name.html" - Eventually(func(g Gomega) { - res, err := terraform.RunCommand(cmd) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-ingress")) - }, "240s", "5s").Should(Succeed()) - } - }) - - It("Verifies Daemonset Preupgrade", func() { - _, err := terraform.DeployWorkload("daemonset.yaml", createcluster.KubeConfigFile) - - Expect(err).NotTo(HaveOccurred(), "Daemonset manifest not deployed") - - nodes, _ := terraform.WorkerNodes(createcluster.KubeConfigFile, false) - pods, _ := terraform.Pods(createcluster.KubeConfigFile, false) - Eventually(func(g Gomega) { - count := terraform.CountOfStringInSlice("test-daemonset", pods) - g.Expect(count).Should(Equal(len(nodes)), - "Daemonset pod count does not match node count") - }, "240s", "10s").Should(Succeed()) - }) - - It("Verifies DNS Access Preupgrade", func() { - namespace := "auto-dns" - _, err := terraform.DeployWorkload("dnsutils.yaml", createcluster.KubeConfigFile) - - Expect(err).NotTo(HaveOccurred(), "dnsutils manifest not deployed") - - Eventually(func(g Gomega) { - cmd := "kubectl get pods dnsutils " + "-n " + namespace + - " --kubeconfig=" + createcluster.KubeConfigFile - res, _ := terraform.RunCommand(cmd) - - g.Expect(res).Should(ContainSubstring("dnsutils")) - g.Expect(res).Should(ContainSubstring("Running")) - }, "240s", "2s").Should(Succeed()) - - Eventually(func(g Gomega) { - cmd := "kubectl -n " + namespace + " --kubeconfig=" + - createcluster.KubeConfigFile + " exec -t dnsutils -- nslookup kubernetes.default" - res, _ := terraform.RunCommand(cmd) - - g.Expect(res).Should(ContainSubstring("kubernetes.default.svc.cluster.local")) - }, "240s", "2s").Should(Succeed()) - }) - }) - - Context("Upgrade via SUC:", func() { - It("Verifies Upgrade", func() { - namespace := "system-upgrade" - _, err := terraform.DeployWorkload("suc.yaml", createcluster.KubeConfigFile) - Expect(err).NotTo(HaveOccurred(), - "system-upgrade-controller manifest did not deploy successfully") - - Eventually(func(g Gomega) { - cmd := "kubectl get pods " + "-n " + namespace + " --kubeconfig=" + createcluster.KubeConfigFile - res, _ := terraform.RunCommand(cmd) - - g.Expect(res).Should(ContainSubstring("system-upgrade-controller")) - g.Expect(res).Should(ContainSubstring("Running")) - }, "120s", "2s").Should(Succeed()) - - err = upgradeCluster(*upgradeVersion, createcluster.KubeConfigFile) - Expect(err).NotTo(HaveOccurred(), "failed to upgrade cluster.") - - defer func() { - _, err := terraform.Nodes(createcluster.KubeConfigFile, true) - if err != nil { - fmt.Println("Error retrieving nodes postupgrade: ", err) - } - _, err = terraform.Pods(createcluster.KubeConfigFile, true) - if err != nil { - fmt.Println("Error retrieving pods postupgrade: ", err) - } - }() - - versionRegex := regexp.MustCompile("-rc[0-9]+") - k8sVersion := versionRegex.ReplaceAllString(*upgradeVersion, "") - - fmt.Printf("\nFetching node status postupgrade\n") - - expectedNodeCount := createcluster.NumServers + createcluster.NumWorkers - Eventually(func(g Gomega) { - nodes, err := terraform.Nodes(createcluster.KubeConfigFile, false) - - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(len(nodes)).To(Equal(expectedNodeCount), - "Number of nodes should match the spec") - - for _, node := range nodes { - g.Expect(node.Status).Should(Equal("Ready"), - "Nodes should all be in Ready state after upgrading", node.Name) - g.Expect(node.Version).Should(Equal(k8sVersion), - "Nodes should all be upgraded to the specified version", node.Name) - } - }, "900s", "30s").Should(Succeed()) - - fmt.Printf("\n Fetching pod status postupgrade\n") - Eventually(func(g Gomega) { - pods, err := terraform.Pods(createcluster.KubeConfigFile, false) - g.Expect(err).NotTo(HaveOccurred()) - for _, pod := range pods { - if strings.Contains(pod.Name, "helm-install") { - g.Expect(pod.Status).Should(Equal("Completed"), pod.Name) - } else { - g.Expect(pod.Status).Should(Equal("Running"), pod.Name) - numRunning := versionRegex.FindAllString(pod.Ready, 2) - g.Expect(numRunning[0]).Should(Equal(numRunning[1]), pod.Name, "should have all containers running") - } - } - }, "600s", "5s").Should(Succeed()) - }) - }) - - Context("Postupgrade Validations:", func() { - It("Verifies ClusterIP Service Postupgrade", func() { - namespace := "auto-clusterip" - defer terraform.RemoveWorkload("clusterip.yaml", createcluster.KubeConfigFile) - - cmd := "kubectl get pods -n " + namespace + " -o=name -l " + - "k8s-app=nginx-app-clusterip --field-selector=status.phase=Running --kubeconfig=" + - createcluster.KubeConfigFile - res, err := terraform.RunCommand(cmd) - - Expect(err).NotTo(HaveOccurred()) - Expect(res).Should(ContainSubstring("test-clusterip")) - - clusterip, port, _ := terraform.FetchClusterIP(createcluster.KubeConfigFile, - namespace, "nginx-clusterip-svc") - cmd = "curl -sL --insecure http://" + clusterip + ":" + port + "/name.html" - nodeExternalIP := terraform.FetchNodeExternalIP(createcluster.KubeConfigFile) - - for _, ip := range nodeExternalIP { - Eventually(func(g Gomega) { - res, err := terraform.RunCommandOnNode(cmd, ip, createcluster.AwsUser, createcluster.AccessKey) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-clusterip")) - }, "120s", "10s").Should(Succeed()) - } - }) - - It("Verifies NodePort Service Postupgrade", func() { - namespace := "auto-nodeport" - defer terraform.RemoveWorkload("nodeport.yaml", createcluster.KubeConfigFile) - - nodeExternalIP := terraform.FetchNodeExternalIP(createcluster.KubeConfigFile) - cmd := "kubectl get service -n " + namespace + " nginx-nodeport-svc --kubeconfig=" + - createcluster.KubeConfigFile + " --output jsonpath=\"{.spec.ports[0].nodePort}\"" - nodeport, err := terraform.RunCommand(cmd) - - Expect(err).NotTo(HaveOccurred()) - - for _, ip := range nodeExternalIP { - Eventually(func(g Gomega) { - cmd := "kubectl get pods -n " + namespace + " -o=name -l " + - "k8s-app=nginx-app-nodeport --field-selector=status.phase=Running --kubeconfig=" + - createcluster.KubeConfigFile - res, err := terraform.RunCommand(cmd) - - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-nodeport")) - }, "120s", "5s").Should(Succeed()) - - cmd = "curl -sL --insecure http://" + ip + ":" + nodeport + "/name.html" - Eventually(func(g Gomega) { - res, err := terraform.RunCommand(cmd) - - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-nodeport")) - }, "120s", "5s").Should(Succeed()) - } - }) - - It("Verifies Ingress Postupgrade", func() { - namespace := "auto-ingress" - - defer terraform.RemoveWorkload("ingress.yaml", createcluster.KubeConfigFile) - - cmd := "kubectl get pods -n " + namespace + " -o=name -l k8s-app=nginx-app-ingress " + - "--field-selector=status.phase=Running --kubeconfig=" + createcluster.KubeConfigFile - res, err := terraform.RunCommand(cmd) - - Expect(err).NotTo(HaveOccurred()) - Expect(res).Should(ContainSubstring("test-ingress")) - - var ingressIps []string - nodes, err := terraform.WorkerNodes(createcluster.KubeConfigFile, false) - if err != nil { - fmt.Println("Error retrieving nodes: ", err) - } - - Eventually(func(g Gomega) { - ingressIps, err = terraform.FetchIngressIP(namespace, createcluster.KubeConfigFile) - g.Expect(err).NotTo(HaveOccurred(), "Ingress ip is not returned") - g.Expect(len(ingressIps)).To(Equal(len(nodes)), - "Number of ingress IPs should match the number of nodes") - }, "120s", "5s").Should(Succeed()) - - for _, ip := range ingressIps { - cmd := "curl -s --header host:foo1.bar.com" + " http://" + ip + "/name.html" - Eventually(func(g Gomega) { - res, err := terraform.RunCommand(cmd) - - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-ingress")) - }, "120s", "5s").Should(Succeed()) - } - }) - - It("Verifies Daemonset Postupgrade", func() { - nodes, _ := terraform.WorkerNodes(createcluster.KubeConfigFile, false) - pods, _ := terraform.Pods(createcluster.KubeConfigFile, false) - count := terraform.CountOfStringInSlice("test-daemonset", pods) - - defer terraform.RemoveWorkload("daemonset.yaml", createcluster.KubeConfigFile) - Expect(count).Should((Equal(len(nodes))), - "Daemonset pod count does not match node count") - }) - - It("Verifies DNS Access Postupgrade", func() { - namespace := "auto-dns" - _, err := terraform.DeployWorkload("dnsutils.yaml", createcluster.KubeConfigFile) - - Expect(err).NotTo(HaveOccurred(), "dnsutils manifest not deployed") - - defer terraform.RemoveWorkload("dnsutils.yaml", createcluster.KubeConfigFile) - Eventually(func(g Gomega) { - cmd := "kubectl get pods dnsutils " + "-n " + namespace + - " --kubeconfig=" + createcluster.KubeConfigFile - res, _ := terraform.RunCommand(cmd) - - g.Expect(res).Should(ContainSubstring("dnsutils")) - g.Expect(res).Should(ContainSubstring("Running")) - }, "120s", "2s").Should(Succeed()) - - Eventually(func(g Gomega) { - cmd := "kubectl -n " + namespace + " --kubeconfig=" + createcluster.KubeConfigFile + " exec -t dnsutils -- nslookup kubernetes.default" - res, _ := terraform.RunCommand(cmd) - - g.Expect(res).Should(ContainSubstring("kubernetes.default.svc.cluster.local")) - }, "120s", "2s").Should(Succeed()) - }) - }) -}) - -var _ = BeforeEach(func() { - if *destroy { - Skip("Cluster is being Deleted") - } -}) - -var _ = AfterEach(func() { - if CurrentSpecReport().Failed() { - fmt.Printf("\nFAILED! %s\n", CurrentSpecReport().FullText()) - } else { - fmt.Printf("\nPASSED! %s\n", CurrentSpecReport().FullText()) - } -}) diff --git a/tests/terraform/testutils.go b/tests/terraform/testutils.go deleted file mode 100644 index f4aa5c514d..0000000000 --- a/tests/terraform/testutils.go +++ /dev/null @@ -1,292 +0,0 @@ -package terraform - -import ( - "bytes" - "fmt" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" - "time" - - "golang.org/x/crypto/ssh" -) - -type KubectlCommand string - -var config *ssh.ClientConfig - -type Node struct { - Name string - Status string - Roles string - Version string - InternalIP string - ExternalIP string -} - -type Pod struct { - NameSpace string - Name string - Ready string - Status string - Restarts string - NodeIP string - Node string -} - -func publicKey(path string) (ssh.AuthMethod, error) { - key, err := os.ReadFile(path) - if err != nil { - return nil, err - } - signer, err := ssh.ParsePrivateKey(key) - if err != nil { - return nil, err - } - return ssh.PublicKeys(signer), nil -} - -func configureSSH(host string, sshUser string, sshKey string) (*ssh.Client, error) { - authMethod, err := publicKey(sshKey) - if err != nil { - return nil, err - } - config = &ssh.ClientConfig{ - User: sshUser, - Auth: []ssh.AuthMethod{ - authMethod, - }, - HostKeyCallback: ssh.InsecureIgnoreHostKey(), - } - conn, err := ssh.Dial("tcp", host, config) - if err != nil { - return nil, err - } - return conn, nil -} - -func runsshCommand(cmd string, conn *ssh.Client) (string, error) { - session, err := conn.NewSession() - if err != nil { - return "", err - } - defer session.Close() - var stdoutBuf bytes.Buffer - var stderrBuf bytes.Buffer - session.Stdout = &stdoutBuf - session.Stderr = &stderrBuf - if err := session.Run(cmd); err != nil { - return "", err - } - return fmt.Sprintf("%s", stdoutBuf.String()), err -} - -func parseNodes(kubeConfig string, print bool, cmd string) ([]Node, error) { - nodes := make([]Node, 0, 10) - res, err := RunCommand(cmd) - if err != nil { - return nil, err - } - rawNodes := strings.TrimSpace(res) - split := strings.Split(rawNodes, "\n") - for _, rec := range split { - if strings.TrimSpace(rec) != "" { - fields := strings.Fields(rec) - n := Node{ - Name: fields[0], - Status: fields[1], - Roles: fields[2], - Version: fields[4], - InternalIP: fields[5], - ExternalIP: fields[6], - } - nodes = append(nodes, n) - } - } - if print { - fmt.Println(rawNodes) - } - - return nodes, nil -} - -func parsePods(kubeconfig string, print bool, cmd string) ([]Pod, error) { - pods := make([]Pod, 0, 10) - res, _ := RunCommand(cmd) - rawPods := strings.TrimSpace(res) - - split := strings.Split(rawPods, "\n") - for _, rec := range split { - fields := strings.Fields(string(rec)) - p := Pod{ - NameSpace: fields[0], - Name: fields[1], - Ready: fields[2], - Status: fields[3], - Restarts: fields[4], - NodeIP: fields[6], - Node: fields[7], - } - pods = append(pods, p) - } - if print { - fmt.Println(rawPods) - } - - return pods, nil -} - -func Basepath() string { - _, b, _, _ := runtime.Caller(0) - return filepath.Join(filepath.Dir(b), "../..") -} - -func PrintFileContents(f ...string) error { - for _, file := range f { - content, err := os.ReadFile(file) - if err != nil { - return err - } - fmt.Println(string(content) + "\n") - } - - return nil -} - -// RunCommandOnNode executes a command from within the given node -func RunCommandOnNode(cmd string, ServerIP string, sshUser string, sshKey string) (string, error) { - Server := ServerIP + ":22" - conn, err := configureSSH(Server, sshUser, sshKey) - if err != nil { - return "", err - } - res, err := runsshCommand(cmd, conn) - res = strings.TrimSpace(res) - - return res, err -} - -// RunCommand executes a command on the host -func RunCommand(cmd string) (string, error) { - c := exec.Command("bash", "-c", cmd) - out, err := c.CombinedOutput() - - return string(out), err -} - -// CountOfStringInSlice Used to count the pods using prefix passed in the list of pods -func CountOfStringInSlice(str string, pods []Pod) int { - var count int - for _, p := range pods { - if strings.Contains(p.Name, str) { - count++ - } - } - - return count -} - -func DeployWorkload(workload, kubeconfig string) (string, error) { - resourceDir := Basepath() + "/tests/terraform/resource_files" - files, err := os.ReadDir(resourceDir) - if err != nil { - return "", fmt.Errorf("%s : Unable to read resource manifest file for %s", err, workload) - } - for _, f := range files { - filename := filepath.Join(resourceDir, f.Name()) - if strings.TrimSpace(f.Name()) == workload { - cmd := "kubectl apply -f " + filename + " --kubeconfig=" + kubeconfig - return RunCommand(cmd) - } - } - - return "", nil -} - -func RemoveWorkload(workload, kubeconfig string) (string, error) { - resourceDir := Basepath() + "/tests/terraform/resource_files" - files, err := os.ReadDir(resourceDir) - if err != nil { - return "", fmt.Errorf("%s : Unable to read resource manifest file for %s", err, workload) - } - for _, f := range files { - filename := filepath.Join(resourceDir, f.Name()) - if strings.TrimSpace(f.Name()) == workload { - cmd := "kubectl delete -f " + filename + " --kubeconfig=" + kubeconfig - return RunCommand(cmd) - } - } - - return "", nil -} - -func FetchClusterIP(kubeconfig string, namespace string, servicename string) (string, string, error) { - ipCmd := "kubectl get svc " + servicename + " -n " + namespace + - " -o jsonpath='{.spec.clusterIP}' --kubeconfig=" + kubeconfig - ip, err := RunCommand(ipCmd) - if err != nil { - return "", "", err - } - portCmd := "kubectl get svc " + servicename + " -n " + namespace + - " -o jsonpath='{.spec.ports[0].port}' --kubeconfig=" + kubeconfig - port, err := RunCommand(portCmd) - if err != nil { - return "", "", err - } - - return ip, port, err -} - -func FetchNodeExternalIP(kubeconfig string) []string { - cmd := "kubectl get node --output=jsonpath='{range .items[*]} " + - "{ .status.addresses[?(@.type==\"ExternalIP\")].address}' --kubeconfig=" + kubeconfig - time.Sleep(10 * time.Second) - res, _ := RunCommand(cmd) - nodeExternalIP := strings.Trim(res, " ") - nodeExternalIPs := strings.Split(nodeExternalIP, " ") - - return nodeExternalIPs -} - -func FetchIngressIP(namespace string, kubeconfig string) ([]string, error) { - cmd := "kubectl get ingress -n " + namespace + - " -o jsonpath='{.items[0].status.loadBalancer.ingress[*].ip}' --kubeconfig=" + kubeconfig - res, err := RunCommand(cmd) - if err != nil { - return nil, err - } - ingressIP := strings.Trim(res, " ") - if ingressIP != "" { - ingressIPs := strings.Split(ingressIP, " ") - return ingressIPs, nil - } - - return nil, nil -} - -func Nodes(kubeConfig string, print bool) ([]Node, error) { - cmd := "kubectl get nodes --no-headers -o wide --kubeconfig=" + kubeConfig - return parseNodes(kubeConfig, print, cmd) -} - -func WorkerNodes(kubeConfig string, print bool) ([]Node, error) { - cmd := "kubectl get node -o jsonpath='{range .items[*]}{@.metadata.name} " + - "{@.status.conditions[-1].type} {@.status.nodeInfo.kubeletVersion} " + - "{@.status.addresses[?(@.type==\"InternalIP\")].address} " + - "{@.status.addresses[?(@.type==\"ExternalIP\")].address} {@.spec.taints[*].effect}{\"\\n\"}{end}' " + - "--kubeconfig=" + kubeConfig + " | grep -v NoSchedule | grep -v NoExecute" - - return parseNodes(kubeConfig, print, cmd) -} - -func Pods(kubeconfig string, print bool) ([]Pod, error) { - cmd := "kubectl get pods -o wide --no-headers -A --kubeconfig=" + kubeconfig - return parsePods(kubeconfig, print, cmd) -} - -func IsAppRunning(namespace, appName string, kubeconfig string) (string, error) { - cmd := "kubectl get pods -n" + namespace + " -o=name -l k8s-app=" + appName + " --field-selector=status.phase=Running --kubeconfig=" + kubeconfig - return RunCommand(cmd) -} diff --git a/tests/terraform/upgradecluster/upgradecluster_test.go b/tests/terraform/upgradecluster/upgradecluster_test.go deleted file mode 100644 index ec282def38..0000000000 --- a/tests/terraform/upgradecluster/upgradecluster_test.go +++ /dev/null @@ -1,453 +0,0 @@ -package upgradecluster - -import ( - "flag" - "fmt" - "regexp" - "strings" - "testing" - - "github.com/rancher/rke2/tests/terraform" - "github.com/rancher/rke2/tests/terraform/createcluster" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var ( - destroy = flag.Bool("destroy", false, "a bool") - upgradeVersion = flag.String("upgradeVersion", "", "Version to upgrade the cluster to") -) - -func Test_TFUpgradeClusterValidation(t *testing.T) { - RegisterFailHandler(Fail) - flag.Parse() - - RunSpecs(t, "Upgrade Cluster Test Suite") -} - -var _ = Describe("Upgrade Tests:", func() { - Context("Build Cluster:", func() { - It("Starts up with no issues", func() { - status, err := createcluster.BuildCluster(&testing.T{}, false) - Expect(err).NotTo(HaveOccurred()) - Expect(status).To(Equal("cluster created")) - - defer GinkgoRecover() - - fmt.Println("Server Node IPS:", createcluster.MasterIPs) - fmt.Println("Agent Node IPS:", createcluster.WorkerIPs) - terraform.PrintFileContents(createcluster.KubeConfigFile) - - Expect(createcluster.KubeConfigFile).ShouldNot(BeEmpty()) - Expect(createcluster.MasterIPs).ShouldNot(BeEmpty()) - - if createcluster.NumWorkers > 0 { - Expect(createcluster.WorkerIPs).ShouldNot(BeEmpty()) - } else { - Expect(createcluster.WorkerIPs).Should(BeEmpty()) - } - Expect(createcluster.KubeConfigFile).ShouldNot(BeEmpty()) - }) - - It("Checks Node and Pod Status", func() { - defer func() { - fmt.Printf("\nFetching node status preupgrade\n") - - _, err := terraform.Nodes(createcluster.KubeConfigFile, true) - if err != nil { - fmt.Println("Error retrieving nodes preupgrade: ", err) - } - _, err = terraform.Pods(createcluster.KubeConfigFile, true) - if err != nil { - fmt.Println("Error retrieving pods preupgrade: ", err) - } - }() - - expectedNodeCount := createcluster.NumServers + createcluster.NumWorkers - Eventually(func(g Gomega) { - nodes, err := terraform.Nodes(createcluster.KubeConfigFile, false) - - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(len(nodes)).To(Equal(expectedNodeCount), - "Number of nodes should match the spec") - - for _, node := range nodes { - g.Expect(node.Status).Should(Equal("Ready"), - "Nodes should all be in Ready state", node.Name) - } - }, "420s", "5s").Should(Succeed()) - - fmt.Printf("\nFetching pod status preupgrade\n") - Eventually(func(g Gomega) { - pods, err := terraform.Pods(createcluster.KubeConfigFile, false) - g.Expect(err).NotTo(HaveOccurred()) - - re := regexp.MustCompile("[0-9]+") - for _, pod := range pods { - if strings.Contains(pod.Name, "helm-install") { - g.Expect(pod.Status).Should(Equal("Completed"), pod.Name) - } else { - g.Expect(pod.Status).Should(Equal("Running"), pod.Name) - g.Expect(pod.Restarts).Should(Equal("0"), pod.Name) - numRunning := re.FindAllString(pod.Ready, 2) - g.Expect(numRunning[0]).Should(Equal(numRunning[1]), pod.Name, - "should have all containers running") - } - } - }, "600s", "5s").Should(Succeed()) - }) - }) - - Context("Preupgrade Validations:", func() { - It("Verifies ClusterIP Service Preupgrade", func() { - namespace := "auto-clusterip" - _, err := terraform.DeployWorkload("clusterip.yaml", createcluster.KubeConfigFile) - - Expect(err).NotTo(HaveOccurred(), "Cluster IP manifest not deployed") - - Eventually(func(g Gomega) { - cmd := "kubectl get pods -n " + namespace + " -o=name " + - "-l k8s-app=nginx-app-clusterip --field-selector=status.phase=Running " + - "--kubeconfig=" + createcluster.KubeConfigFile - res, err := terraform.RunCommand(cmd) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-clusterip")) - }, "240s", "5s").Should(Succeed()) - - clusterip, port, _ := terraform.FetchClusterIP(createcluster.KubeConfigFile, - namespace, "nginx-clusterip-svc") - - cmd := "curl -sL --insecure http://" + clusterip + ":" + port + "/name.html" - nodeExternalIP := terraform.FetchNodeExternalIP(createcluster.KubeConfigFile) - - for _, ip := range nodeExternalIP { - Eventually(func(g Gomega) { - res, err := terraform.RunCommandOnNode(cmd, ip, createcluster.AwsUser, createcluster.AccessKey) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-clusterip")) - }, "240s", "10s").Should(Succeed()) - } - }) - - It("Verifies NodePort Service Preupgrade", func() { - namespace := "auto-nodeport" - _, err := terraform.DeployWorkload("nodeport.yaml", createcluster.KubeConfigFile) - - Expect(err).NotTo(HaveOccurred(), "NodePort manifest not deployed") - - nodeExternalIP := terraform.FetchNodeExternalIP(createcluster.KubeConfigFile) - cmd := "kubectl get service -n " + namespace + " nginx-nodeport-svc --kubeconfig=" + - createcluster.KubeConfigFile + " --output jsonpath=\"{.spec.ports[0].nodePort}\"" - - nodeport, err := terraform.RunCommand(cmd) - Expect(err).NotTo(HaveOccurred()) - - for _, ip := range nodeExternalIP { - Eventually(func(g Gomega) { - cmd := "kubectl get pods -n " + namespace + " -o=name -l k8s-app=nginx-app-nodeport " + - "--field-selector=status.phase=Running --kubeconfig=" + createcluster.KubeConfigFile - res, err := terraform.RunCommand(cmd) - - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-nodeport")) - }, "240s", "5s").Should(Succeed()) - - cmd = "curl -sL --insecure http://" + ip + ":" + nodeport + "/name.html" - Eventually(func(g Gomega) { - res, err := terraform.RunCommand(cmd) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-nodeport")) - }, "240s", "5s").Should(Succeed()) - } - }) - - It("Verifies Ingress Preupgrade", func() { - namespace := "auto-ingress" - _, err := terraform.DeployWorkload("ingress.yaml", createcluster.KubeConfigFile) - - Expect(err).NotTo(HaveOccurred(), "Ingress manifest not deployed") - - Eventually(func(g Gomega) { - cmd := "kubectl get pods -n " + namespace + " -o=name -l k8s-app=nginx-app-ingress " + - "--field-selector=status.phase=Running --kubeconfig=" + createcluster.KubeConfigFile - res, err := terraform.RunCommand(cmd) - - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-ingress")) - }, "240s", "5s").Should(Succeed()) - - var ingressIps []string - nodes, err := terraform.WorkerNodes(createcluster.KubeConfigFile, false) - if err != nil { - fmt.Println("Error retrieving nodes: ", err) - } - - Eventually(func(g Gomega) { - ingressIps, err = terraform.FetchIngressIP(namespace, createcluster.KubeConfigFile) - - g.Expect(err).NotTo(HaveOccurred(), "Ingress ip is not returned") - g.Expect(len(ingressIps)).To(Equal(len(nodes)), - "Number of ingress IPs should match the number of nodes") - }, "240s", "5s").Should(Succeed()) - - for _, ip := range ingressIps { - cmd := "curl -s --header host:foo1.bar.com" + " http://" + ip + "/name.html" - Eventually(func(g Gomega) { - res, err := terraform.RunCommand(cmd) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-ingress")) - }, "240s", "5s").Should(Succeed()) - } - }) - - It("Verifies Daemonset Preupgrade", func() { - _, err := terraform.DeployWorkload("daemonset.yaml", createcluster.KubeConfigFile) - - Expect(err).NotTo(HaveOccurred(), "Daemonset manifest not deployed") - - nodes, _ := terraform.WorkerNodes(createcluster.KubeConfigFile, false) - pods, _ := terraform.Pods(createcluster.KubeConfigFile, false) - Eventually(func(g Gomega) { - count := terraform.CountOfStringInSlice("test-daemonset", pods) - g.Expect(count).Should(Equal(len(nodes)), - "Daemonset pod count does not match node count") - }, "240s", "10s").Should(Succeed()) - }) - - It("Verifies DNS Access Preupgrade", func() { - namespace := "auto-dns" - _, err := terraform.DeployWorkload("dnsutils.yaml", createcluster.KubeConfigFile) - - Expect(err).NotTo(HaveOccurred(), "dnsutils manifest not deployed") - - Eventually(func(g Gomega) { - cmd := "kubectl get pods dnsutils " + "-n " + namespace + - " --kubeconfig=" + createcluster.KubeConfigFile - res, _ := terraform.RunCommand(cmd) - - g.Expect(res).Should(ContainSubstring("dnsutils")) - g.Expect(res).Should(ContainSubstring("Running")) - }, "240s", "2s").Should(Succeed()) - - Eventually(func(g Gomega) { - cmd := "kubectl -n " + namespace + " --kubeconfig=" + - createcluster.KubeConfigFile + " exec -t dnsutils -- nslookup kubernetes.default" - res, _ := terraform.RunCommand(cmd) - - g.Expect(res).Should(ContainSubstring("kubernetes.default.svc.cluster.local")) - }, "240s", "2s").Should(Succeed()) - }) - }) - - Context("Upgrade via SUC:", func() { - It("Verifies Upgrade", func() { - namespace := "system-upgrade" - _, err := terraform.DeployWorkload("suc.yaml", createcluster.KubeConfigFile) - Expect(err).NotTo(HaveOccurred(), - "system-upgrade-controller manifest did not deploy successfully") - - Eventually(func(g Gomega) { - cmd := "kubectl get pods " + "-n " + namespace + " --kubeconfig=" + createcluster.KubeConfigFile - res, _ := terraform.RunCommand(cmd) - - g.Expect(res).Should(ContainSubstring("system-upgrade-controller")) - g.Expect(res).Should(ContainSubstring("Running")) - }, "120s", "2s").Should(Succeed()) - - err = upgradeCluster(*upgradeVersion, createcluster.KubeConfigFile) - Expect(err).NotTo(HaveOccurred(), "failed to upgrade cluster.") - - defer func() { - _, err := terraform.Nodes(createcluster.KubeConfigFile, true) - if err != nil { - fmt.Println("Error retrieving nodes postupgrade: ", err) - } - _, err = terraform.Pods(createcluster.KubeConfigFile, true) - if err != nil { - fmt.Println("Error retrieving pods postupgrade: ", err) - } - }() - - versionRegex := regexp.MustCompile("-rc[0-9]+") - k8sVersion := versionRegex.ReplaceAllString(*upgradeVersion, "") - - fmt.Printf("\nFetching node status postupgrade\n") - - expectedNodeCount := createcluster.NumServers + createcluster.NumWorkers - Eventually(func(g Gomega) { - nodes, err := terraform.Nodes(createcluster.KubeConfigFile, false) - - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(len(nodes)).To(Equal(expectedNodeCount), - "Number of nodes should match the spec") - - for _, node := range nodes { - g.Expect(node.Status).Should(Equal("Ready"), - "Nodes should all be in Ready state after upgrading", node.Name) - g.Expect(node.Version).Should(Equal(k8sVersion), - "Nodes should all be upgraded to the specified version", node.Name) - } - }, "900s", "30s").Should(Succeed()) - - fmt.Printf("\n Fetching pod status postupgrade\n") - Eventually(func(g Gomega) { - pods, err := terraform.Pods(createcluster.KubeConfigFile, false) - g.Expect(err).NotTo(HaveOccurred()) - for _, pod := range pods { - if strings.Contains(pod.Name, "helm-install") { - g.Expect(pod.Status).Should(Equal("Completed"), pod.Name) - } else { - g.Expect(pod.Status).Should(Equal("Running"), pod.Name) - numRunning := versionRegex.FindAllString(pod.Ready, 2) - g.Expect(numRunning[0]).Should(Equal(numRunning[1]), pod.Name, "should have all containers running") - } - } - }, "600s", "5s").Should(Succeed()) - }) - }) - - Context("Postupgrade Validations:", func() { - It("Verifies ClusterIP Service Postupgrade", func() { - namespace := "auto-clusterip" - defer terraform.RemoveWorkload("clusterip.yaml", createcluster.KubeConfigFile) - - cmd := "kubectl get pods -n " + namespace + " -o=name -l " + - "k8s-app=nginx-app-clusterip --field-selector=status.phase=Running --kubeconfig=" + - createcluster.KubeConfigFile - res, err := terraform.RunCommand(cmd) - - Expect(err).NotTo(HaveOccurred()) - Expect(res).Should(ContainSubstring("test-clusterip")) - - clusterip, port, _ := terraform.FetchClusterIP(createcluster.KubeConfigFile, - namespace, "nginx-clusterip-svc") - cmd = "curl -sL --insecure http://" + clusterip + ":" + port + "/name.html" - nodeExternalIP := terraform.FetchNodeExternalIP(createcluster.KubeConfigFile) - - for _, ip := range nodeExternalIP { - Eventually(func(g Gomega) { - res, err := terraform.RunCommandOnNode(cmd, ip, createcluster.AwsUser, createcluster.AccessKey) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-clusterip")) - }, "120s", "10s").Should(Succeed()) - } - }) - - It("Verifies NodePort Service Postupgrade", func() { - namespace := "auto-nodeport" - defer terraform.RemoveWorkload("nodeport.yaml", createcluster.KubeConfigFile) - - nodeExternalIP := terraform.FetchNodeExternalIP(createcluster.KubeConfigFile) - cmd := "kubectl get service -n " + namespace + " nginx-nodeport-svc --kubeconfig=" + - createcluster.KubeConfigFile + " --output jsonpath=\"{.spec.ports[0].nodePort}\"" - nodeport, err := terraform.RunCommand(cmd) - - Expect(err).NotTo(HaveOccurred()) - - for _, ip := range nodeExternalIP { - Eventually(func(g Gomega) { - cmd := "kubectl get pods -n " + namespace + " -o=name -l " + - "k8s-app=nginx-app-nodeport --field-selector=status.phase=Running --kubeconfig=" + - createcluster.KubeConfigFile - res, err := terraform.RunCommand(cmd) - - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-nodeport")) - }, "120s", "5s").Should(Succeed()) - - cmd = "curl -sL --insecure http://" + ip + ":" + nodeport + "/name.html" - Eventually(func(g Gomega) { - res, err := terraform.RunCommand(cmd) - - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-nodeport")) - }, "120s", "5s").Should(Succeed()) - } - }) - - It("Verifies Ingress Postupgrade", func() { - namespace := "auto-ingress" - - defer terraform.RemoveWorkload("ingress.yaml", createcluster.KubeConfigFile) - - cmd := "kubectl get pods -n " + namespace + " -o=name -l k8s-app=nginx-app-ingress " + - "--field-selector=status.phase=Running --kubeconfig=" + createcluster.KubeConfigFile - res, err := terraform.RunCommand(cmd) - - Expect(err).NotTo(HaveOccurred()) - Expect(res).Should(ContainSubstring("test-ingress")) - - var ingressIps []string - nodes, err := terraform.WorkerNodes(createcluster.KubeConfigFile, false) - if err != nil { - fmt.Println("Error retrieving nodes: ", err) - } - - Eventually(func(g Gomega) { - ingressIps, err = terraform.FetchIngressIP(namespace, createcluster.KubeConfigFile) - g.Expect(err).NotTo(HaveOccurred(), "Ingress ip is not returned") - g.Expect(len(ingressIps)).To(Equal(len(nodes)), - "Number of ingress IPs should match the number of nodes") - }, "120s", "5s").Should(Succeed()) - - for _, ip := range ingressIps { - cmd := "curl -s --header host:foo1.bar.com" + " http://" + ip + "/name.html" - Eventually(func(g Gomega) { - res, err := terraform.RunCommand(cmd) - - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(res).Should(ContainSubstring("test-ingress")) - }, "120s", "5s").Should(Succeed()) - } - }) - - It("Verifies Daemonset Postupgrade", func() { - nodes, _ := terraform.WorkerNodes(createcluster.KubeConfigFile, false) - pods, _ := terraform.Pods(createcluster.KubeConfigFile, false) - count := terraform.CountOfStringInSlice("test-daemonset", pods) - - defer terraform.RemoveWorkload("daemonset.yaml", createcluster.KubeConfigFile) - Expect(count).Should((Equal(len(nodes))), - "Daemonset pod count does not match node count") - }) - - It("Verifies DNS Access Postupgrade", func() { - namespace := "auto-dns" - _, err := terraform.DeployWorkload("dnsutils.yaml", createcluster.KubeConfigFile) - - Expect(err).NotTo(HaveOccurred(), "dnsutils manifest not deployed") - - defer terraform.RemoveWorkload("dnsutils.yaml", createcluster.KubeConfigFile) - Eventually(func(g Gomega) { - cmd := "kubectl get pods dnsutils " + "-n " + namespace + - " --kubeconfig=" + createcluster.KubeConfigFile - res, _ := terraform.RunCommand(cmd) - - g.Expect(res).Should(ContainSubstring("dnsutils")) - g.Expect(res).Should(ContainSubstring("Running")) - }, "120s", "2s").Should(Succeed()) - - Eventually(func(g Gomega) { - cmd := "kubectl -n " + namespace + " --kubeconfig=" + createcluster.KubeConfigFile + " exec -t dnsutils -- nslookup kubernetes.default" - res, _ := terraform.RunCommand(cmd) - - g.Expect(res).Should(ContainSubstring("kubernetes.default.svc.cluster.local")) - }, "120s", "2s").Should(Succeed()) - }) - }) -}) - -var _ = BeforeEach(func() { - if *destroy { - Skip("Cluster is being Deleted") - } -}) - -var _ = AfterEach(func() { - if CurrentSpecReport().Failed() { - fmt.Printf("\nFAILED! %s\n", CurrentSpecReport().FullText()) - } else { - fmt.Printf("\nPASSED! %s\n", CurrentSpecReport().FullText()) - } -})