From fd042844daf2a32c0349d5e2b21bbe58244c0d12 Mon Sep 17 00:00:00 2001 From: Svetlana Maltseva <5437289+leo-ri@users.noreply.github.com> Date: Sat, 30 Jan 2021 01:44:36 +0300 Subject: [PATCH 01/19] initial e2e --- .../actions/gen-install-scripts/action.yml | 3 + .../actions/gen-install-scripts/entrypoint.sh | 2 +- .github/workflows/e2e.yml | 98 +++++++++++++++ go.mod | 2 + go.sum | 1 + test/e2e/data/atlascluster_basic.yaml | 12 ++ test/e2e/data/atlasproject.yaml | 8 ++ test/e2e/data/atlassecret.yaml | 8 ++ test/e2e/data/updated_atlascluster_basic.yaml | 12 ++ test/e2e/deploy_test.go | 114 ++++++++++++++++++ test/e2e/e2e_suite_test.go | 38 ++++++ test/e2e/utils/cli.go | 113 +++++++++++++++++ test/e2e/utils/utils.go | 72 +++++++++++ 13 files changed, 482 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/e2e.yml create mode 100644 test/e2e/data/atlascluster_basic.yaml create mode 100644 test/e2e/data/atlasproject.yaml create mode 100644 test/e2e/data/atlassecret.yaml create mode 100644 test/e2e/data/updated_atlascluster_basic.yaml create mode 100644 test/e2e/deploy_test.go create mode 100644 test/e2e/e2e_suite_test.go create mode 100644 test/e2e/utils/cli.go create mode 100644 test/e2e/utils/utils.go diff --git a/.github/actions/gen-install-scripts/action.yml b/.github/actions/gen-install-scripts/action.yml index b494b1ecaa..87b3e1d372 100644 --- a/.github/actions/gen-install-scripts/action.yml +++ b/.github/actions/gen-install-scripts/action.yml @@ -4,6 +4,9 @@ inputs: IMAGE_URL: description: "Operator image" required: true + ENV: + description: "Kustomize patch name (enviroment configuration patch)" + required: true runs: using: 'docker' image: 'Dockerfile' diff --git a/.github/actions/gen-install-scripts/entrypoint.sh b/.github/actions/gen-install-scripts/entrypoint.sh index dbe8ad583a..7af031185b 100644 --- a/.github/actions/gen-install-scripts/entrypoint.sh +++ b/.github/actions/gen-install-scripts/entrypoint.sh @@ -6,6 +6,6 @@ mkdir "${target_dir}" # Generate configuration and save it to `all-in-one` controller-gen crd:crdVersions=v1 rbac:roleName=manager-role webhook paths="./..." output:crd:artifacts:config=config/crd/bases cd config/manager && kustomize edit set image controller="${INPUT_IMAGE_URL}" -cd - && kustomize build config/default > "${target_dir}"/all-in-one.yaml +cd - && kustomize build config/${INPUT_ENV}> "${target_dir}"/all-in-one.yaml cat "${target_dir}"/all-in-one.yaml diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml new file mode 100644 index 0000000000..52d9075dec --- /dev/null +++ b/.github/workflows/e2e.yml @@ -0,0 +1,98 @@ +name: E2E test + +on: + push: + workflow_dispatch: + +jobs: + prepare-e2e: + name: Prepare E2E configuration and image + runs-on: ubuntu-latest + steps: + + - name: Check out code + uses: actions/checkout@v2.3.1 + + - name: Prepare tag + id: prepare + uses: ./.github/actions/set-tag + + - name: Push Atlas Operator to Registry + uses: docker/build-push-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + repository: ${{ secrets.DOCKER_REPO }} + registry: ${{ secrets.DOCKER_REGISTRY }} + tags: ${{ steps.prepare.outputs.tag }} + + e2e: + name: E2E tests + needs: prepare-e2e + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + # k8s: ["1.17-kind", "1.19-kind", "1.17-opeshift"] # - + k8s: ["v1.18.15-kind"] # - + test: ["all-in-one"] # TODO refactor + steps: + + - name: Check out code + uses: actions/checkout@v2.3.1 + + - name: Prepare tag + id: prepare + uses: ./.github/actions/set-tag + + - name: Generate configuration for the tests + uses: ./.github/actions/gen-install-scripts + with: + IMAGE_URL: ${{ secrets.DOCKER_REGISTRY }}/${{ secrets.DOCKER_REPO }}:${{ steps.prepare.outputs.tag }} + ENV: dev + + - name: Set properties + id: properties + run: | + version=$(echo ${{ matrix.k8s }} | awk -F "-" '{print $1}') + platform=$(echo ${{ matrix.k8s }} | awk -F "-" '{print $2}') + echo "::set-output name=k8s_version::$version" + echo "::set-output name=k8s_platform::$platform" + + # run if platform = kind #TODO + - name: Create k8s Kind Cluster + if: ${{ steps.properties.outputs.k8s_platform == 'kind' && !env.ACT }} + uses: helm/kind-action@v1.1.0 + with: + node_image: kindest/node:${{ steps.properties.outputs.k8s_version }} + cluster_name: ${{ matrix.k8s }} + + - name: Setup Go + if: ${{ steps.properties.outputs.k8s_platform == 'kind' && !env.ACT }} + uses: actions/setup-go@v2 + with: + go-version: '1.15.6' + + - name: Install MongoCLI + run: | + sudo apt-get update + sudo apt-get install -y mongocli + mongocli --version + + - name: Run e2e test + if: ${{ steps.properties.outputs.k8s_platform == 'kind' && !env.ACT }} + env: + MCLI_PUBLIC_API_KEY: ${{ secrets.ATLAS_PUBLIC_KEY }} + MCLI_PRIVATE_API_KEY: ${{ secrets.ATLAS_PRIVATE_KEY }} + MCLI_ORG_ID: ${{ secrets.ATLAS_ORG_ID}} + MCLI_OPS_MANAGER_URL: "https://cloud-qa.mongodb.com/" + K8s_PLATFORM: "${{ steps.properties.outputs.k8s_platform }}" + K8s_VERSION: "${{ steps.properties.outputs.k8s_version }}" + TEST_NAME: "${{ matrix.test }}" + run: | + kubectl version + + go version + go get github.com/onsi/ginkgo/ginkgo && \ + go get github.com/onsi/gomega/... + ginkgo ./test/e2e -x -focus "${TEST_NAME}" diff --git a/go.mod b/go.mod index d12bae7ecb..122372f369 100644 --- a/go.mod +++ b/go.mod @@ -8,9 +8,11 @@ require ( github.com/mongodb-forks/digest v1.0.2 github.com/onsi/ginkgo v1.14.2 github.com/onsi/gomega v1.10.1 + github.com/pborman/uuid v1.2.0 github.com/stretchr/testify v1.7.0 go.mongodb.org/atlas v0.5.1-0.20201208094933-0e2a93147ccd go.uber.org/zap v1.16.0 + gopkg.in/yaml.v2 v2.3.0 k8s.io/api v0.18.6 k8s.io/apimachinery v0.18.6 k8s.io/client-go v0.18.6 diff --git a/go.sum b/go.sum index add7d25281..bdbe92be77 100644 --- a/go.sum +++ b/go.sum @@ -250,6 +250,7 @@ github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/openlyinc/pointy v1.1.2 h1:LywVV2BWC5Sp5v7FoP4bUD+2Yn5k0VNeRbU5vq9jUMY= github.com/openlyinc/pointy v1.1.2/go.mod h1:w2Sytx+0FVuMKn37xpXIAyBNhFNBIJGR/v2m7ik1WtM= +github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= diff --git a/test/e2e/data/atlascluster_basic.yaml b/test/e2e/data/atlascluster_basic.yaml new file mode 100644 index 0000000000..346b783af7 --- /dev/null +++ b/test/e2e/data/atlascluster_basic.yaml @@ -0,0 +1,12 @@ +apiVersion: atlas.mongodb.com/v1 +kind: AtlasCluster +metadata: + name: atlascluster-sample +spec: + name: cluster45 + projectRef: + name: my-project + providerSettings: + instanceSizeName: M10 + providerName: AWS + regionName: US_EAST_1 diff --git a/test/e2e/data/atlasproject.yaml b/test/e2e/data/atlasproject.yaml new file mode 100644 index 0000000000..5e40d0c547 --- /dev/null +++ b/test/e2e/data/atlasproject.yaml @@ -0,0 +1,8 @@ +apiVersion: atlas.mongodb.com/v1 +kind: AtlasProject +metadata: + name: my-project +spec: + name: Test Atlas Operator Project + connectionSecretRef: + name: my-atlas-key \ No newline at end of file diff --git a/test/e2e/data/atlassecret.yaml b/test/e2e/data/atlassecret.yaml new file mode 100644 index 0000000000..4ab11bfeb8 --- /dev/null +++ b/test/e2e/data/atlassecret.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +metadata: + name: my-atlas-key +data: + orgId: id + privateApiKey: keyPriv + publicApiKey: keyPub diff --git a/test/e2e/data/updated_atlascluster_basic.yaml b/test/e2e/data/updated_atlascluster_basic.yaml new file mode 100644 index 0000000000..e218dccaa9 --- /dev/null +++ b/test/e2e/data/updated_atlascluster_basic.yaml @@ -0,0 +1,12 @@ +apiVersion: atlas.mongodb.com/v1 +kind: AtlasCluster +metadata: + name: atlascluster-sample +spec: + name: cluster45 + projectRef: + name: my-project + providerSettings: + instanceSizeName: M20 + providerName: AWS + regionName: US_EAST_1 diff --git a/test/e2e/deploy_test.go b/test/e2e/deploy_test.go new file mode 100644 index 0000000000..888ec925d0 --- /dev/null +++ b/test/e2e/deploy_test.go @@ -0,0 +1,114 @@ +package e2e_test + +import ( + "os" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "github.com/pborman/uuid" + + cli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" + . "github.com/onsi/gomega/gbytes" + "github.com/onsi/gomega/gexec" +) + +var _ = Describe("Deploy simple cluster", func() { + + It("Release sample all-in-one.yaml should work", func() { + By("Prepare namespaces") + namespaceUserResources := uuid.NewRandom().String() //TODO + namespaceOperator := "mongodb-atlas-kubernetes-system" + session := cli.Execute("kubectl", "create", "namespace", namespaceUserResources) + Expect(session).ShouldNot(Say("created")) + userProjectConfig := cli.LoadUserProjectConfig("data/atlasproject.yaml") + userClusterConfig := cli.LoadUserClusterConfig("data/atlascluster_basic.yaml") + + By("Check Kubernetes/MongoCLI version\n") + session = cli.Execute("kubectl", "version") + Eventually(session).Should(Say(K8sVersion)) + session = cli.Execute("mongocli", "--version") + Eventually(session).Should(gexec.Exit(0)) + + By("Apply All-in-one configuration\n in ") + session = cli.Execute("kubectl", "apply", "-f", ConfigAll) + Eventually(session.Wait()).Should(Say("customresourcedefinition.apiextensions.k8s.io/atlasclusters.atlas.mongodb.com")) + + By("Create secret") + session = cli.Execute("kubectl", "create", "secret", "generic", "my-atlas-key", + "--from-literal=orgId="+os.Getenv("MCLI_ORG_ID"), + "--from-literal=publicApiKey="+os.Getenv("MCLI_PUBLIC_API_KEY"), + "--from-literal=privateApiKey="+os.Getenv("MCLI_PRIVATE_API_KEY"), + "-n", namespaceUserResources, + ) + Eventually(session.Wait()).Should(Say("my-atlas-key created")) + + By("Create Sample Project\n") + session = cli.Execute("kubectl", "apply", "-f", ProjectSample, "-n", namespaceUserResources) + // Eventually(session).Should(Say("my-project created")) + Eventually(session.Wait()).Should(Say("atlasproject.atlas.mongodb.com/my-project")) + + By("Sample Cluster\n") + session = cli.Execute("kubectl", "apply", "-f", ClusterSample, "-n", namespaceUserResources) + Eventually(session.Wait()).Should(Say("atlascluster-sample created")) + + By("Wait creating and check that it was created") + projectID := cli.GetProjectID(userProjectConfig.Spec.Name) + Expect(projectID).ShouldNot(BeNil()) + GinkgoWriter.Write([]byte("projectID = " + projectID)) + Eventually( + cli.GetPodStatus(namespaceOperator), + "5m", "3s", + ).Should(Equal("Running")) + + Eventually( + cli.IsClusterExist(projectID, userClusterConfig.Spec.Name), + "5m", "1s", + ).Should(BeTrue()) + + Eventually( + cli.GetClusterStatus(projectID, userClusterConfig.Spec.Name), + "35m", "1m", + ).Should(Equal("IDLE")) + + By("check cluster Attribute") //TODO ... + cluster := cli.GetClustersInfo(projectID, userClusterConfig.Spec.Name) + Expect( + cluster.ProviderSettings.InstanceSizeName, + ).Should(Equal(userClusterConfig.Spec.ProviderSettings.InstanceSizeName)) + Expect( + cluster.ProviderSettings.ProviderName, + ).Should(Equal(userClusterConfig.Spec.ProviderSettings.ProviderName)) + Expect( + cluster.ProviderSettings.RegionName, + ).Should(Equal(userClusterConfig.Spec.ProviderSettings.RegionName)) + + By("Update cluster\n") + session = cli.Execute("kubectl", "apply", "-f", "data/updated_atlascluster_basic.yaml", "-n", namespaceUserResources) //TODO param + Eventually(session.Wait()).Should(Say("atlascluster-sample configured")) + + By("Wait creation") + userClusterConfig = cli.LoadUserClusterConfig("data/updated_atlascluster_basic.yaml") + Expect(projectID).ShouldNot(BeNil()) + Eventually( + cli.GetClusterStatus(projectID, userClusterConfig.Spec.Name), + "35m", "1m", + ).Should(Equal("IDLE")) + + uCluster := cli.GetClustersInfo(projectID, userClusterConfig.Spec.Name) + Expect( + uCluster.ProviderSettings.InstanceSizeName, + ).Should(Equal( + userClusterConfig.Spec.ProviderSettings.InstanceSizeName, + )) + + By("Delete cluster") + session = cli.Execute("kubectl", "delete", "-f", "data/updated_atlascluster_basic.yaml", "-n", namespaceUserResources) + Eventually(session.Wait("7m")).Should(gexec.Exit(0)) + Eventually( + cli.IsClusterExist(projectID, userClusterConfig.Spec.Name), + "10m", "1m", + ).Should(BeFalse()) + + // By("Delete project") //TODO + }) +}) diff --git a/test/e2e/e2e_suite_test.go b/test/e2e/e2e_suite_test.go new file mode 100644 index 0000000000..eabc6eba33 --- /dev/null +++ b/test/e2e/e2e_suite_test.go @@ -0,0 +1,38 @@ +package e2e_test + +import ( + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "os" + "testing" + "time" +) + +const ( + EventuallyTimeout = 60 * time.Second + ConsistentlyTimeout = 1 * time.Second + //TODO data provider? + ConfigAll = "../../deploy/all-in-one.yaml" // basic configuration (release) + ProjectSample = "data/atlasproject.yaml" + ClusterSample = "data/atlascluster_basic.yaml" +) + +var ( + //default + Platform = "kind" + K8sVersion = "v1.17.17" +) + +func TestE2e(t *testing.T) { + setUpMongoCLI() + SetDefaultEventuallyTimeout(EventuallyTimeout) + SetDefaultConsistentlyDuration(ConsistentlyTimeout) + RegisterFailHandler(Fail) + RunSpecs(t, "E2e Suite") +} + +//setUpMongoCLI initial setup +func setUpMongoCLI() { + Platform = os.Getenv("K8s_PLATFORM") + K8sVersion = os.Getenv("K8s_VERSION") +} diff --git a/test/e2e/utils/cli.go b/test/e2e/utils/cli.go new file mode 100644 index 0000000000..c6314834cd --- /dev/null +++ b/test/e2e/utils/cli.go @@ -0,0 +1,113 @@ +package utils + +import ( + "fmt" + "os/exec" + + "encoding/json" + "strings" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "github.com/onsi/gomega/gexec" + "go.mongodb.org/atlas/mongodbatlas" +) + +func Execute(command string, args ...string) *gexec.Session { + // GinkgoWriter.Write([]byte("\n " + command + " " + strings.Join(args, " "))) //TODO for the local run only + cmd := exec.Command(command, args...) + session, _ := gexec.Start(cmd, GinkgoWriter, GinkgoWriter) + return session +} + +func GetClusters(projectID string) []mongodbatlas.Cluster { + session := Execute("mongocli", "atlas", "clusters", "list", "--projectId", projectID, "-o", "json") + output := session.Wait("1m").Out.Contents() + var clusters []mongodbatlas.Cluster + ExpectWithOffset(1, json.Unmarshal(output, &clusters)).ShouldNot(HaveOccurred()) + return clusters +} + +func GetClusterByName(projectID string, name string) mongodbatlas.Cluster { + clusters := GetClusters(projectID) + for _, c := range clusters { + if c.Name == name { + return c + } + } + panic(fmt.Sprintf("no Cluster with name %s in project %s", name, projectID)) +} + +func GetProjects() mongodbatlas.Projects { + session := Execute("mongocli", "iam", "projects", "list", "-o", "json") + output := session.Wait("1m").Out.Contents() + var projects mongodbatlas.Projects + ExpectWithOffset(1, json.Unmarshal(output, &projects)).ShouldNot(HaveOccurred()) + return projects +} + +func GetProjectID(name string) string { + projects := GetProjects() + for _, p := range projects.Results { + GinkgoWriter.Write([]byte(p.Name + p.ID + name)) + if p.Name == name { + return p.ID + } + } + return "" +} + +func GetClustersInfo(projectID string, name string) mongodbatlas.Cluster { + session := Execute("mongocli", "atlas", "clusters", "describe", name, "--projectId", projectID, "-o", "json") + output := session.Wait("1m").Out.Contents() + var cluster mongodbatlas.Cluster + Expect(json.Unmarshal(output, &cluster)).ShouldNot(HaveOccurred()) + return cluster +} + +func IsProjectExist(name string) func() bool { + return func() bool { + projects := GetProjects().Results + for _, p := range projects { + if p.Name == name { + return true + } + } + return false + } +} + +func IsClusterExist(projectID string, name string) func() bool { + return func() bool { + clusters := GetClusters(projectID) + // if clusters + for _, c := range clusters { + GinkgoWriter.Write([]byte(c.Name + name + "\n")) + if c.Name == name { + return true + } + } + return false + } +} + +func GetClusterStatus(projectID string, clusterName string) func() string { + return func() string { + result := GetClustersInfo(projectID, clusterName) + return result.StateName + } +} + +//TODO move +func GenKubeVersion(fullVersion string) string { + version := strings.Split(fullVersion, ".") + return fmt.Sprintf("Major:\"%s\", Minor:\"%s\"", version[0], version[1]) +} + +//TODO move +func GetPodStatus(ns string) func() string{ + return func() string{ + session := Execute("kubectl", "get", "pods", "-l", "control-plane=controller-manager", "-o", "jsonpath={.items[0].status.phase}", "-n", ns) + return string(session.Wait("1m").Out.Contents()) + } +} diff --git a/test/e2e/utils/utils.go b/test/e2e/utils/utils.go new file mode 100644 index 0000000000..94bcb41dfa --- /dev/null +++ b/test/e2e/utils/utils.go @@ -0,0 +1,72 @@ +package utils + +import ( + "encoding/json" + "io/ioutil" + "log" + + "gopkg.in/yaml.v2" + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" +) + +//LoadUserProjectConfig load configuration into object +func LoadUserProjectConfig(path string) *v1.AtlasProject { + var config v1.AtlasProject + ReadInYAMLFileAndConvert(path, &config) + return &config +} + +//LoadUserClusterConfig load configuration into object +func LoadUserClusterConfig(path string) *v1.AtlasCluster { + var config v1.AtlasCluster + ReadInYAMLFileAndConvert(path, &config) + return &config +} + +// ReadInYAMLFileAndConvert reads in the yaml file given by the path given +func ReadInYAMLFileAndConvert(pathToYamlFile string, cnfg interface{}) interface{} { + // Read in the yaml file at the path given + yamlFile, err := ioutil.ReadFile(pathToYamlFile) + if err != nil { + log.Printf("Error while parsing YAML file %v, error: %s", pathToYamlFile, err) + } + + // Map yamlFile to interface + var body interface{} + if err := yaml.Unmarshal(yamlFile, &body); err != nil { + panic(err) + } + + // Convert yaml to its json counterpart + body = ConvertYAMLtoJSONHelper(body) + + // Generate json string from data structure + jsonFormat, err := json.Marshal(body) + if err != nil { + panic(err) + } + + if err := json.Unmarshal(jsonFormat, &cnfg); err != nil { + panic(err) + } + + return cnfg +} + +// ConvertYAMLtoJSONHelper converts the yaml to json recursively +func ConvertYAMLtoJSONHelper(i interface{}) interface{} { + switch item := i.(type) { + case map[interface{}]interface{}: + document := map[string]interface{}{} + for k, v := range item { + document[k.(string)] = ConvertYAMLtoJSONHelper(v) + } + return document + case []interface{}: + for i, arr := range item { + item[i] = ConvertYAMLtoJSONHelper(arr) + } + } + + return i +} From ad5c9d52ffe18534fd567040f1a6bb20bbab87f2 Mon Sep 17 00:00:00 2001 From: Svetlana Maltseva <5437289+leo-ri@users.noreply.github.com> Date: Mon, 1 Feb 2021 14:45:29 +0300 Subject: [PATCH 02/19] chore: linters check --- .github/actions/gen-install-scripts/entrypoint.sh | 4 ++-- .github/workflows/e2e.yml | 2 +- .golangci.yml | 3 +++ test/e2e/deploy_test.go | 6 +++--- test/e2e/utils/cli.go | 4 ++-- test/e2e/utils/utils.go | 4 ++-- 6 files changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/actions/gen-install-scripts/entrypoint.sh b/.github/actions/gen-install-scripts/entrypoint.sh index 7af031185b..90fcb55d0a 100644 --- a/.github/actions/gen-install-scripts/entrypoint.sh +++ b/.github/actions/gen-install-scripts/entrypoint.sh @@ -6,6 +6,6 @@ mkdir "${target_dir}" # Generate configuration and save it to `all-in-one` controller-gen crd:crdVersions=v1 rbac:roleName=manager-role webhook paths="./..." output:crd:artifacts:config=config/crd/bases cd config/manager && kustomize edit set image controller="${INPUT_IMAGE_URL}" -cd - && kustomize build config/${INPUT_ENV}> "${target_dir}"/all-in-one.yaml +cd - && kustomize build "config/${INPUT_ENV}>" "${target_dir}/all-in-one.yaml" -cat "${target_dir}"/all-in-one.yaml +cat "${target_dir}/all-in-one.yaml" diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 52d9075dec..a7d314ad61 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -48,7 +48,7 @@ jobs: - name: Generate configuration for the tests uses: ./.github/actions/gen-install-scripts with: - IMAGE_URL: ${{ secrets.DOCKER_REGISTRY }}/${{ secrets.DOCKER_REPO }}:${{ steps.prepare.outputs.tag }} + IMAGE_URL: ${{ secrets.DOCKER_REPO }}:${{ steps.prepare.outputs.tag }} ENV: dev - name: Set properties diff --git a/.golangci.yml b/.golangci.yml index 846846f3f6..e869035c85 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -83,5 +83,8 @@ issues: linters: - gochecknoglobals - wrapcheck + - path: test/e2e + linters: + - errcheck max-issues-per-linter: 0 max-same-issues: 0 diff --git a/test/e2e/deploy_test.go b/test/e2e/deploy_test.go index 888ec925d0..ac54433124 100644 --- a/test/e2e/deploy_test.go +++ b/test/e2e/deploy_test.go @@ -16,7 +16,7 @@ var _ = Describe("Deploy simple cluster", func() { It("Release sample all-in-one.yaml should work", func() { By("Prepare namespaces") - namespaceUserResources := uuid.NewRandom().String() //TODO + namespaceUserResources := uuid.NewRandom().String() // TODO namespaceOperator := "mongodb-atlas-kubernetes-system" session := cli.Execute("kubectl", "create", "namespace", namespaceUserResources) Expect(session).ShouldNot(Say("created")) @@ -70,7 +70,7 @@ var _ = Describe("Deploy simple cluster", func() { "35m", "1m", ).Should(Equal("IDLE")) - By("check cluster Attribute") //TODO ... + By("check cluster Attribute") // TODO ... cluster := cli.GetClustersInfo(projectID, userClusterConfig.Spec.Name) Expect( cluster.ProviderSettings.InstanceSizeName, @@ -83,7 +83,7 @@ var _ = Describe("Deploy simple cluster", func() { ).Should(Equal(userClusterConfig.Spec.ProviderSettings.RegionName)) By("Update cluster\n") - session = cli.Execute("kubectl", "apply", "-f", "data/updated_atlascluster_basic.yaml", "-n", namespaceUserResources) //TODO param + session = cli.Execute("kubectl", "apply", "-f", "data/updated_atlascluster_basic.yaml", "-n", namespaceUserResources) // TODO param Eventually(session.Wait()).Should(Say("atlascluster-sample configured")) By("Wait creation") diff --git a/test/e2e/utils/cli.go b/test/e2e/utils/cli.go index c6314834cd..3df78bf242 100644 --- a/test/e2e/utils/cli.go +++ b/test/e2e/utils/cli.go @@ -98,13 +98,13 @@ func GetClusterStatus(projectID string, clusterName string) func() string { } } -//TODO move +// TODO move func GenKubeVersion(fullVersion string) string { version := strings.Split(fullVersion, ".") return fmt.Sprintf("Major:\"%s\", Minor:\"%s\"", version[0], version[1]) } -//TODO move +// TODO move func GetPodStatus(ns string) func() string{ return func() string{ session := Execute("kubectl", "get", "pods", "-l", "control-plane=controller-manager", "-o", "jsonpath={.items[0].status.phase}", "-n", ns) diff --git a/test/e2e/utils/utils.go b/test/e2e/utils/utils.go index 94bcb41dfa..007e59fd05 100644 --- a/test/e2e/utils/utils.go +++ b/test/e2e/utils/utils.go @@ -9,14 +9,14 @@ import ( "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" ) -//LoadUserProjectConfig load configuration into object +// LoadUserProjectConfig load configuration into object func LoadUserProjectConfig(path string) *v1.AtlasProject { var config v1.AtlasProject ReadInYAMLFileAndConvert(path, &config) return &config } -//LoadUserClusterConfig load configuration into object +// LoadUserClusterConfig load configuration into object func LoadUserClusterConfig(path string) *v1.AtlasCluster { var config v1.AtlasCluster ReadInYAMLFileAndConvert(path, &config) From 6715fc0c5f547298dff8f68613d5b369c8d7ded6 Mon Sep 17 00:00:00 2001 From: Svetlana Maltseva <5437289+leo-ri@users.noreply.github.com> Date: Tue, 2 Feb 2021 12:48:10 +0300 Subject: [PATCH 03/19] Merge --- .gitignore | 1 + .../atlas.mongodb.com_atlasclusters.yaml | 71 +++-- go.mod | 13 +- go.sum | 246 +++++++++++++++++- pkg/api/v1/atlascluster_types.go | 7 +- pkg/api/v1/status/atlascluster.go | 67 +++-- pkg/api/v1/status/zz_generated.deepcopy.go | 54 +++- pkg/controller/atlascluster/cluster.go | 25 +- pkg/util/compat/jsoncopy.go | 18 ++ pkg/util/compat/jsoncopy_test.go | 35 +++ 10 files changed, 455 insertions(+), 82 deletions(-) create mode 100755 pkg/util/compat/jsoncopy.go create mode 100644 pkg/util/compat/jsoncopy_test.go diff --git a/.gitignore b/.gitignore index f073b910f9..21c364bc97 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ bin *.swp *.swo *~ +.vscode/ # act tool .actrc diff --git a/config/crd/bases/atlas.mongodb.com_atlasclusters.yaml b/config/crd/bases/atlas.mongodb.com_atlasclusters.yaml index 646e10d954..ad295dfbaa 100644 --- a/config/crd/bases/atlas.mongodb.com_atlasclusters.yaml +++ b/config/crd/bases/atlas.mongodb.com_atlasclusters.yaml @@ -127,11 +127,6 @@ spec: type: array mongoDBMajorVersion: description: Version of the cluster to deploy. - enum: - - "3.6" - - "4.0" - - "4.2" - - "4.4" type: string name: description: Name of the cluster as it appears in Atlas. After Atlas @@ -354,28 +349,60 @@ spec: description: ConnectionStrings is a set of connection strings that your applications use to connect to this cluster. properties: - awsPrivateLink: - additionalProperties: - type: string - description: 'Deprecated: use connectionStrings.privateEndpoint[n].connectionString - instead. Private-endpoint-aware mongodb://connection strings - for each AWS PrivateLink private endpoint. Atlas returns this - parameter only if you deployed a AWS PrivateLink private endpoint - to the same regions as all of this cluster''s nodes.' - type: object - awsPrivateLinkSrv: - additionalProperties: - type: string - description: 'Deprecated: use connectionStrings.privateEndpoint[n].srvConnectionString - instead. Private-endpoint-aware mongodb+srv:// connection strings - for each AWS PrivateLink private endpoint.' - type: object private: - description: Network-peering-endpoint-aware mongodb://connection + description: Network-peering-endpoint-aware mongodb:// connection strings for each interface VPC endpoint you configured to connect to this cluster. Atlas returns this parameter only if you created a network peering connection to this cluster. type: string + privateEndpoint: + description: Private endpoint connection strings. Each object + describes the connection strings you can use to connect to this + cluster through a private endpoint. Atlas returns this parameter + only if you deployed a private endpoint to all regions to which + you deployed this cluster's nodes. + items: + description: PrivateEndpoint connection strings. Each object + describes the connection strings you can use to connect to + this cluster through a private endpoint. Atlas returns this + parameter only if you deployed a private endpoint to all regions + to which you deployed this cluster's nodes. + properties: + connectionString: + description: Private-endpoint-aware mongodb:// connection + string for this private endpoint. + type: string + endpoints: + description: Private endpoint through which you connect + to Atlas when you use connectionStrings.privateEndpoint[n].connectionString + or connectionStrings.privateEndpoint[n].srvConnectionString. + items: + description: Endpoint through which you connect to Atlas + properties: + endpointId: + description: Unique identifier of the private endpoint. + type: string + providerName: + description: Cloud provider to which you deployed + the private endpoint. Atlas returns AWS or AZURE. + type: string + region: + description: Region to which you deployed the private + endpoint. + type: string + type: object + type: array + srvConnectionString: + description: Private-endpoint-aware mongodb+srv:// connection + string for this private endpoint. + type: string + type: + description: "Type of MongoDB process that you connect to + with the connection strings \n Atlas returns: \n • MONGOD + for replica sets, or \n • MONGOS for sharded clusters" + type: string + type: object + type: array privateSrv: description: Network-peering-endpoint-aware mongodb+srv:// connection strings for each interface VPC endpoint you configured to connect diff --git a/go.mod b/go.mod index 8c4e940f43..1fef9ae257 100644 --- a/go.mod +++ b/go.mod @@ -3,18 +3,21 @@ module github.com/mongodb/mongodb-atlas-kubernetes go 1.15 require ( - github.com/go-logr/zapr v0.1.0 + github.com/go-logr/logr v0.4.0 // indirect + github.com/go-logr/zapr v0.4.0 github.com/google/go-cmp v0.5.4 + github.com/googleapis/gnostic v0.5.3 // indirect github.com/mongodb-forks/digest v1.0.2 github.com/onsi/ginkgo v1.14.2 github.com/onsi/gomega v1.10.1 github.com/pborman/uuid v1.2.0 github.com/stretchr/testify v1.7.0 - go.mongodb.org/atlas v0.5.1-0.20201208094933-0e2a93147ccd + go.mongodb.org/atlas v0.7.1 + go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.16.0 gopkg.in/yaml.v2 v2.3.0 - k8s.io/api v0.18.6 - k8s.io/apimachinery v0.18.6 - k8s.io/client-go v0.18.6 + k8s.io/api v0.20.2 + k8s.io/apimachinery v0.20.2 + k8s.io/client-go v0.20.2 sigs.k8s.io/controller-runtime v0.6.3 ) diff --git a/go.sum b/go.sum index 9925cbbd0c..b97d9fd517 100644 --- a/go.sum +++ b/go.sum @@ -2,16 +2,47 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +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 h1:3ithwDMr7/3vpAMXiH+ZQnYbuIsh+OPhUPMFC9enmn0= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +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/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/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= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -33,6 +64,9 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +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/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -67,6 +101,7 @@ github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -74,12 +109,21 @@ github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2H github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/zapr v0.1.0 h1:h+WVe9j6HAA01niTJPA/kKH0i7e0rLZBCwauQFcRE54= github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= +github.com/go-logr/zapr v0.4.0 h1:uc1uML3hRYL9/ZZPdgHS/n8Nzo+eaYL/Efxkkamf7OM= +github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -134,19 +178,31 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 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/protobuf v0.0.0-20161109072736-4bd1920723d7/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.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 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 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= @@ -154,6 +210,8 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/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.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= @@ -163,15 +221,26 @@ github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= +github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/gnostic v0.5.3 h1:2qsuRm+bzgwSIKikigPASa2GhW8H2Dn4Qq7UxD8K/48= +github.com/googleapis/gnostic v0.5.3/go.mod h1:TRWw1s4gxBGjSe301Dai3c7wXJAZy57+/6tawkOvqHQ= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -185,6 +254,7 @@ github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+l github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -196,6 +266,7 @@ github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= @@ -205,6 +276,8 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= @@ -259,6 +332,8 @@ github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= @@ -296,6 +371,7 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -303,6 +379,8 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.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 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= @@ -314,21 +392,28 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.mongodb.org/atlas v0.5.1-0.20201208094933-0e2a93147ccd h1:522hIBk7NjCNro3wxslqPjnMUlg/A1JZVHTWudcOC50= -go.mongodb.org/atlas v0.5.1-0.20201208094933-0e2a93147ccd/go.mod h1:CIaBeO8GLHhtYLw7xSSXsw7N90Z4MFY87Oy9qcPyuEs= +go.mongodb.org/atlas v0.7.1 h1:hNBtwtKgmhB9vmSX/JyN/cArmhzyy4ihKpmXSMIc4mw= +go.mongodb.org/atlas v0.7.1/go.mod h1:CIaBeO8GLHhtYLw7xSSXsw7N90Z4MFY87Oy9qcPyuEs= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= @@ -341,18 +426,48 @@ golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= 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 h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -365,17 +480,33 @@ golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/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-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 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 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= 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 h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 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= @@ -391,30 +522,54 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +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-20190616124812-15dcb6c0061f/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-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd h1:5CtCZbICpIOFdgO940moixOPjc0178IU44m4EjOO5IY= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +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 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -423,40 +578,104 @@ golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 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-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-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-20190920225731-5eefd052ad72/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-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/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-20200304193943-95d2e580d8eb h1:iKlO7ROJc6SttHKlxzwGytRtBUqX4VARrNTgP2YLX5M= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0= gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= 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.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 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 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/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-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 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/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 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= 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 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -482,42 +701,65 @@ gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= 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 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.18.6 h1:osqrAXbOQjkKIWDTjrqxWQ3w0GkKb1KA1XkUGHHYpeE= k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI= +k8s.io/api v0.20.2 h1:y/HR22XDZY3pniu9hIFDLpUCPq2w5eQ6aV/VFQ7uJMw= +k8s.io/api v0.20.2/go.mod h1:d7n6Ehyzx+S+cE3VhTGfVNNqtGc/oL9DCdYYahlurV8= k8s.io/apiextensions-apiserver v0.18.6 h1:vDlk7cyFsDyfwn2rNAO2DbmUbvXy5yT5GE3rrqOzaMo= k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M= k8s.io/apimachinery v0.18.6 h1:RtFHnfGNfd1N0LeSrKCUznz5xtUP1elRGvHJbL3Ntag= k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= +k8s.io/apimachinery v0.20.2 h1:hFx6Sbt1oG0n6DZ+g4bFt5f6BoMkOjKWsQFu077M3Vg= +k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg= k8s.io/client-go v0.18.6 h1:I+oWqJbibLSGsZj8Xs8F0aWVXJVIoUHWaaJV3kUN/Zw= k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q= +k8s.io/client-go v0.20.2 h1:uuf+iIAbfnCSw8IGAv/Rg0giM+2bOzHLOsbbrwrdhNQ= +k8s.io/client-go v0.20.2/go.mod h1:kH5brqWqp7HDxUFKoEgiI4v8G1xzbe9giaCenUWJzgE= k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0 h1:Foj74zO6RbjjP4hBEKjnYtjjAhGg4jNynUdYF6fJrok= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6 h1:Oh3Mzx5pJ+yIumsAD0MOECPVeXsVot0UkiaCGVyfGQY= k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd h1:sOHNzJIkytDF6qadMNKhhDRpc6ODik8lVC6nOur7B2c= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200603063816-c1c6865ac451 h1:v8ud2Up6QK1lNOKFgiIVrZdMg7MpmSnvtrOieolJKoE= k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= sigs.k8s.io/controller-runtime v0.6.3 h1:SBbr+inLPEKhvlJtrvDcwIpm+uhDvp63Bl72xYJtoOE= sigs.k8s.io/controller-runtime v0.6.3/go.mod h1:WlZNXcM0++oyaQt4B7C2lEE5JYRs8vJUzRP4N4JpdAY= sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/pkg/api/v1/atlascluster_types.go b/pkg/api/v1/atlascluster_types.go index 5e58811966..d1534ae6f0 100644 --- a/pkg/api/v1/atlascluster_types.go +++ b/pkg/api/v1/atlascluster_types.go @@ -19,11 +19,12 @@ package v1 import ( "encoding/json" - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/util/kube" "go.mongodb.org/atlas/mongodbatlas" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status" + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/util/kube" ) func init() { @@ -71,8 +72,6 @@ type AtlasClusterSpec struct { Labels []LabelSpec `json:"labels,omitempty"` // Version of the cluster to deploy. - // +kubebuilder:validation:Enum="3.6";"4.0";"4.2";"4.4" - // +optional MongoDBMajorVersion string `json:"mongoDBMajorVersion,omitempty"` // Name of the cluster as it appears in Atlas. After Atlas creates the cluster, you can't change its name. diff --git a/pkg/api/v1/status/atlascluster.go b/pkg/api/v1/status/atlascluster.go index 765056a8a9..55cb4e8c25 100755 --- a/pkg/api/v1/status/atlascluster.go +++ b/pkg/api/v1/status/atlascluster.go @@ -1,6 +1,10 @@ package status -import "go.mongodb.org/atlas/mongodbatlas" +import ( + "go.mongodb.org/atlas/mongodbatlas" + + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/util/compat" +) // AtlasClusterStatus defines the observed state of AtlasCluster. type AtlasClusterStatus struct { @@ -21,7 +25,7 @@ type AtlasClusterStatus struct { MongoURIUpdated string `json:"mongoURIUpdated,omitempty"` } -// ConnectionStrings is a copy of mongodbatlas.ConnectionStrings for deepcopy compatibility purposes. +// ConnectionStrings contains configuration for applications use to connect to this cluster type ConnectionStrings struct { // Public mongodb:// connection string for this cluster. Standard string `json:"standard,omitempty"` @@ -29,18 +33,12 @@ type ConnectionStrings struct { // Public mongodb+srv:// connection string for this cluster. StandardSrv string `json:"standardSrv,omitempty"` - // TODO: update when the replacement is implemented in mongodbatlas - - // Deprecated: use connectionStrings.privateEndpoint[n].connectionString instead. - // Private-endpoint-aware mongodb://connection strings for each AWS PrivateLink private endpoint. - // Atlas returns this parameter only if you deployed a AWS PrivateLink private endpoint to the same regions as all of this cluster's nodes. - AwsPrivateLink map[string]string `json:"awsPrivateLink,omitempty"` + // Private endpoint connection strings. + // Each object describes the connection strings you can use to connect to this cluster through a private endpoint. + // Atlas returns this parameter only if you deployed a private endpoint to all regions to which you deployed this cluster's nodes. + PrivateEndpoint []PrivateEndpoint `json:"privateEndpoint,omitempty"` - // Deprecated: use connectionStrings.privateEndpoint[n].srvConnectionString instead. - // Private-endpoint-aware mongodb+srv:// connection strings for each AWS PrivateLink private endpoint. - AwsPrivateLinkSrv map[string]string `json:"awsPrivateLinkSrv,omitempty"` - - // Network-peering-endpoint-aware mongodb://connection strings for each interface VPC endpoint you configured to connect to this cluster. + // Network-peering-endpoint-aware mongodb:// connection strings for each interface VPC endpoint you configured to connect to this cluster. // Atlas returns this parameter only if you created a network peering connection to this cluster. Private string `json:"private,omitempty"` @@ -50,8 +48,41 @@ type ConnectionStrings struct { PrivateSrv string `json:"privateSrv,omitempty"` } -// Check compatibility with library type. -var _ = ConnectionStrings(mongodbatlas.ConnectionStrings{}) +// PrivateEndpoint connection strings. Each object describes the connection strings +// you can use to connect to this cluster through a private endpoint. +// Atlas returns this parameter only if you deployed a private endpoint to all regions +// to which you deployed this cluster's nodes. +type PrivateEndpoint struct { + // Private-endpoint-aware mongodb:// connection string for this private endpoint. + ConnectionString string `json:"connectionString,omitempty"` + + // Private endpoint through which you connect to Atlas when you use connectionStrings.privateEndpoint[n].connectionString or connectionStrings.privateEndpoint[n].srvConnectionString. + Endpoints []Endpoint `json:"endpoints,omitempty"` + + // Private-endpoint-aware mongodb+srv:// connection string for this private endpoint. + SRVConnectionString string `json:"srvConnectionString,omitempty"` + + // Type of MongoDB process that you connect to with the connection strings + // + // Atlas returns: + // + // • MONGOD for replica sets, or + // + // • MONGOS for sharded clusters + Type string `json:"type,omitempty"` +} + +// Endpoint through which you connect to Atlas +type Endpoint struct { + // Unique identifier of the private endpoint. + EndpointID string `json:"endpointId,omitempty"` + + // Cloud provider to which you deployed the private endpoint. Atlas returns AWS or AZURE. + ProviderName string `json:"providerName,omitempty"` + + // Region to which you deployed the private endpoint. + Region string `json:"region,omitempty"` +} // +k8s:deepcopy-gen=false @@ -72,7 +103,11 @@ func AtlasClusterMongoDBVersionOption(mongoDBVersion string) AtlasClusterStatusO func AtlasClusterConnectionStringsOption(connectionStrings *mongodbatlas.ConnectionStrings) AtlasClusterStatusOption { return func(s *AtlasClusterStatus) { - cs := ConnectionStrings(*connectionStrings) + cs := ConnectionStrings{} + err := compat.JSONCopy(&cs, connectionStrings) + if err != nil { + return + } s.ConnectionStrings = &cs } } diff --git a/pkg/api/v1/status/zz_generated.deepcopy.go b/pkg/api/v1/status/zz_generated.deepcopy.go index db28e9c32a..9469fb6d32 100644 --- a/pkg/api/v1/status/zz_generated.deepcopy.go +++ b/pkg/api/v1/status/zz_generated.deepcopy.go @@ -12,8 +12,6 @@ a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 package status -import () - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AtlasClusterStatus) DeepCopyInto(out *AtlasClusterStatus) { *out = *in @@ -92,18 +90,11 @@ func (in *Condition) DeepCopy() *Condition { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ConnectionStrings) DeepCopyInto(out *ConnectionStrings) { *out = *in - if in.AwsPrivateLink != nil { - in, out := &in.AwsPrivateLink, &out.AwsPrivateLink - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.AwsPrivateLinkSrv != nil { - in, out := &in.AwsPrivateLinkSrv, &out.AwsPrivateLinkSrv - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val + if in.PrivateEndpoint != nil { + in, out := &in.PrivateEndpoint, &out.PrivateEndpoint + *out = make([]PrivateEndpoint, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) } } } @@ -117,3 +108,38 @@ func (in *ConnectionStrings) DeepCopy() *ConnectionStrings { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Endpoint) DeepCopyInto(out *Endpoint) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Endpoint. +func (in *Endpoint) DeepCopy() *Endpoint { + if in == nil { + return nil + } + out := new(Endpoint) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PrivateEndpoint) DeepCopyInto(out *PrivateEndpoint) { + *out = *in + if in.Endpoints != nil { + in, out := &in.Endpoints, &out.Endpoints + *out = make([]Endpoint, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PrivateEndpoint. +func (in *PrivateEndpoint) DeepCopy() *PrivateEndpoint { + if in == nil { + return nil + } + out := new(PrivateEndpoint) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/controller/atlascluster/cluster.go b/pkg/controller/atlascluster/cluster.go index f085af703e..76be61fa60 100755 --- a/pkg/controller/atlascluster/cluster.go +++ b/pkg/controller/atlascluster/cluster.go @@ -2,17 +2,18 @@ package atlascluster import ( "context" - "encoding/json" "fmt" "net/http" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" + "go.mongodb.org/atlas/mongodbatlas" + "go.uber.org/zap" + mdbv1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/controller/atlas" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/controller/workflow" - "go.mongodb.org/atlas/mongodbatlas" - "go.uber.org/zap" + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/util/compat" ) func (r *AtlasClusterReconciler) ensureClusterState(log *zap.SugaredLogger, connection atlas.Connection, project *mdbv1.AtlasProject, cluster *mdbv1.AtlasCluster) (c *mongodbatlas.Cluster, _ workflow.Result) { @@ -82,11 +83,11 @@ func (r *AtlasClusterReconciler) ensureClusterState(log *zap.SugaredLogger, conn // Direct comparison is not feasible because Atlas will set a lot of fields to default values, so we need to apply our changes on top of that. func clusterMatchesSpec(log *zap.SugaredLogger, cluster *mongodbatlas.Cluster, spec mdbv1.AtlasClusterSpec) (bool, error) { clusterMerged := mongodbatlas.Cluster{} - if err := jsonCopy(&clusterMerged, cluster); err != nil { + if err := compat.JSONCopy(&clusterMerged, cluster); err != nil { return false, err } - if err := jsonCopy(&clusterMerged, spec); err != nil { + if err := compat.JSONCopy(&clusterMerged, spec); err != nil { return false, err } @@ -97,17 +98,3 @@ func clusterMatchesSpec(log *zap.SugaredLogger, cluster *mongodbatlas.Cluster, s return d == "", nil } - -func jsonCopy(dst, src interface{}) error { - b, err := json.Marshal(src) - if err != nil { - return err - } - - err = json.Unmarshal(b, &dst) - if err != nil { - return err - } - - return nil -} diff --git a/pkg/util/compat/jsoncopy.go b/pkg/util/compat/jsoncopy.go new file mode 100755 index 0000000000..ae3de37f78 --- /dev/null +++ b/pkg/util/compat/jsoncopy.go @@ -0,0 +1,18 @@ +package compat + +import "encoding/json" + +// JSONCopy will copy src to dst via JSON serialization/deserialization. +func JSONCopy(dst, src interface{}) error { + b, err := json.Marshal(src) + if err != nil { + return err + } + + err = json.Unmarshal(b, &dst) + if err != nil { + return err + } + + return nil +} diff --git a/pkg/util/compat/jsoncopy_test.go b/pkg/util/compat/jsoncopy_test.go new file mode 100644 index 0000000000..db1dad74af --- /dev/null +++ b/pkg/util/compat/jsoncopy_test.go @@ -0,0 +1,35 @@ +package compat_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + . "github.com/mongodb/mongodb-atlas-kubernetes/pkg/util/compat" +) + +// JSONCopy will copy src to dst via JSON serialization/deserialization. +func TestJSONCopy(t *testing.T) { + old := struct { + Field1 string `json:"field1"` + Field3 string `json:"field3"` + }{ + "old field1", + "old field3", + } + + new := struct { + Field1 string `json:"field1"` + Field2 string `json:"field2"` + }{ + "new field1", + "new field2", + } + + assert := assert.New(t) + err := JSONCopy(&old, new) + assert.NoError(err, "JSONCopy should not fail") + + assert.Equal("new field1", old.Field1, "Field1 should be overwritten") + assert.Equal("old field3", old.Field3, "Field3 should be left unchanged") +} From b3fe94e3a3de7aae34bc55c03685e45c1dfba7c3 Mon Sep 17 00:00:00 2001 From: Svetlana Maltseva <5437289+leo-ri@users.noreply.github.com> Date: Tue, 2 Feb 2021 12:52:47 +0300 Subject: [PATCH 04/19] tests: e2e local workaround --- .github/actions/deploy/entrypoint.sh | 2 +- .../actions/gen-install-scripts/entrypoint.sh | 4 +- Makefile | 4 ++ config/dev/kustomization.yaml | 2 +- scripts/e2e_local.sh | 12 ++++++ test/e2e/deploy_test.go | 19 +++++---- test/e2e/e2e_suite_test.go | 39 +++++++++++++++---- test/e2e/utils/cli.go | 15 +++++-- test/e2e/utils/utils.go | 2 +- 9 files changed, 76 insertions(+), 23 deletions(-) create mode 100644 scripts/e2e_local.sh diff --git a/.github/actions/deploy/entrypoint.sh b/.github/actions/deploy/entrypoint.sh index f71b77bc0e..7eadd81eb1 100644 --- a/.github/actions/deploy/entrypoint.sh +++ b/.github/actions/deploy/entrypoint.sh @@ -15,7 +15,7 @@ cd - && kustomize build config/dev | kubectl apply -f - # Ensuring the Atlas credentials Secret kubectl delete secrets my-atlas-key --ignore-not-found -n "${ns}" -kubectl create secret generic my-atlas-key --from-literal="orgId=${INPUT_ATLAS_ORG_ID}" --from-literal="publicApiKey=${INPUT_ATLAS_PUBLIC_KEY}" --from-literal="privateApiKey=${INPUT_ATLAS_PRIVATE_KEY}" -n mongodb-atlas-kubernetes-system +kubectl create secret generic my-atlas-key --from-literal="orgId=${INPUT_ATLAS_ORG_ID}" --from-literal="publicApiKey=${INPUT_ATLAS_PUBLIC_KEY}" --from-literal="privateApiKey=${INPUT_ATLAS_PRIVATE_KEY}" -n "${ns}" # Wait for the Operator to start cmd="while ! kubectl -n ${ns} get pods -l control-plane=controller-manager -o jsonpath={.items[0].status.phase} 2>/dev/null | grep -q Running ; do printf .; sleep 1; done" diff --git a/.github/actions/gen-install-scripts/entrypoint.sh b/.github/actions/gen-install-scripts/entrypoint.sh index 90fcb55d0a..6b7895af6a 100644 --- a/.github/actions/gen-install-scripts/entrypoint.sh +++ b/.github/actions/gen-install-scripts/entrypoint.sh @@ -1,11 +1,11 @@ #!/bin/sh target_dir="deploy" -mkdir "${target_dir}" +mkdir -p "${target_dir}" # Generate configuration and save it to `all-in-one` controller-gen crd:crdVersions=v1 rbac:roleName=manager-role webhook paths="./..." output:crd:artifacts:config=config/crd/bases cd config/manager && kustomize edit set image controller="${INPUT_IMAGE_URL}" -cd - && kustomize build "config/${INPUT_ENV}>" "${target_dir}/all-in-one.yaml" +cd - && kustomize build "config/${INPUT_ENV}" > "${target_dir}/all-in-one.yaml" cat "${target_dir}/all-in-one.yaml" diff --git a/Makefile b/Makefile index dfb26a411a..cfa61485d1 100644 --- a/Makefile +++ b/Makefile @@ -40,6 +40,10 @@ int-test: generate manifests ## Run integration tests test -f $(ENVTEST_ASSETS_DIR)/setup-envtest.sh || curl -sSLo $(ENVTEST_ASSETS_DIR)/setup-envtest.sh https://raw.githubusercontent.com/kubernetes-sigs/controller-runtime/v0.8.0/hack/setup-envtest.sh source $(ENVTEST_ASSETS_DIR)/setup-envtest.sh; fetch_envtest_tools $(ENVTEST_ASSETS_DIR); setup_envtest_env $(ENVTEST_ASSETS_DIR); ginkgo -v -p -nodes=4 ./test/int -coverprofile cover.out +.PHONY: e2e +e2e: + ./scripts/e2e_local.sh + .PHONY: manager manager: generate fmt vet ## Build manager binary go build -o bin/manager main.go diff --git a/config/dev/kustomization.yaml b/config/dev/kustomization.yaml index 7d5bf888d8..75ea775a62 100644 --- a/config/dev/kustomization.yaml +++ b/config/dev/kustomization.yaml @@ -1,4 +1,4 @@ - +namespace: mongodb-atlas-kubernetes-system resources: - ../default diff --git a/scripts/e2e_local.sh b/scripts/e2e_local.sh new file mode 100644 index 0000000000..fa4de65b78 --- /dev/null +++ b/scripts/e2e_local.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# act -j build-push +export MCLI_OPS_MANAGER_URL="https://cloud-qa.mongodb.com/" +export MCLI_PUBLIC_API_KEY=$(grep "ATLAS_PUBLIC_KEY" .actrc | cut -d "=" -f 2) +export MCLI_PRIVATE_API_KEY=$(grep "ATLAS_PRIVATE_KEY" .actrc | cut -d "=" -f 2) +export MCLI_ORG_ID=$(grep "ATLAS_ORG_ID" .actrc | cut -d "=" -f 2) + +export INPUT_IMAGE_URL=$(grep "DOCKER_REPO" .actrc | cut -d "=" -f 2):$(git rev-parse --abbrev-ref HEAD)-$(git rev-parse --short HEAD) +export INPUT_ENV=dev +./.github/actions/gen-install-scripts/entrypoint.sh + +ginkgo -v -x test/e2e \ No newline at end of file diff --git a/test/e2e/deploy_test.go b/test/e2e/deploy_test.go index ac54433124..f4a90c889d 100644 --- a/test/e2e/deploy_test.go +++ b/test/e2e/deploy_test.go @@ -20,6 +20,8 @@ var _ = Describe("Deploy simple cluster", func() { namespaceOperator := "mongodb-atlas-kubernetes-system" session := cli.Execute("kubectl", "create", "namespace", namespaceUserResources) Expect(session).ShouldNot(Say("created")) + session = cli.Execute("kubectl", "create", "namespace", namespaceOperator) + Expect(session).ShouldNot(Say("created")) userProjectConfig := cli.LoadUserProjectConfig("data/atlasproject.yaml") userClusterConfig := cli.LoadUserClusterConfig("data/atlascluster_basic.yaml") @@ -32,8 +34,13 @@ var _ = Describe("Deploy simple cluster", func() { By("Apply All-in-one configuration\n in ") session = cli.Execute("kubectl", "apply", "-f", ConfigAll) Eventually(session.Wait()).Should(Say("customresourcedefinition.apiextensions.k8s.io/atlasclusters.atlas.mongodb.com")) + Eventually( + cli.GetPodStatus(namespaceOperator), + "5m", "3s", + ).Should(Equal("Running")) By("Create secret") + session = cli.Execute("kubectl", "create", "secret", "generic", "my-atlas-key", "--from-literal=orgId="+os.Getenv("MCLI_ORG_ID"), "--from-literal=publicApiKey="+os.Getenv("MCLI_PUBLIC_API_KEY"), @@ -44,7 +51,6 @@ var _ = Describe("Deploy simple cluster", func() { By("Create Sample Project\n") session = cli.Execute("kubectl", "apply", "-f", ProjectSample, "-n", namespaceUserResources) - // Eventually(session).Should(Say("my-project created")) Eventually(session.Wait()).Should(Say("atlasproject.atlas.mongodb.com/my-project")) By("Sample Cluster\n") @@ -52,13 +58,13 @@ var _ = Describe("Deploy simple cluster", func() { Eventually(session.Wait()).Should(Say("atlascluster-sample created")) By("Wait creating and check that it was created") - projectID := cli.GetProjectID(userProjectConfig.Spec.Name) - Expect(projectID).ShouldNot(BeNil()) - GinkgoWriter.Write([]byte("projectID = " + projectID)) Eventually( - cli.GetPodStatus(namespaceOperator), + cli.IsProjectExist(userProjectConfig.Spec.Name), "5m", "3s", - ).Should(Equal("Running")) + ).Should(BeTrue()) + + projectID := cli.GetProjectID(userProjectConfig.Spec.Name) + GinkgoWriter.Write([]byte("projectID = " + projectID)) Eventually( cli.IsClusterExist(projectID, userClusterConfig.Spec.Name), @@ -88,7 +94,6 @@ var _ = Describe("Deploy simple cluster", func() { By("Wait creation") userClusterConfig = cli.LoadUserClusterConfig("data/updated_atlascluster_basic.yaml") - Expect(projectID).ShouldNot(BeNil()) Eventually( cli.GetClusterStatus(projectID, userClusterConfig.Spec.Name), "35m", "1m", diff --git a/test/e2e/e2e_suite_test.go b/test/e2e/e2e_suite_test.go index eabc6eba33..fcc8a035a4 100644 --- a/test/e2e/e2e_suite_test.go +++ b/test/e2e/e2e_suite_test.go @@ -1,6 +1,7 @@ package e2e_test import ( + "fmt" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "os" @@ -11,28 +12,52 @@ import ( const ( EventuallyTimeout = 60 * time.Second ConsistentlyTimeout = 1 * time.Second - //TODO data provider? + // TODO data provider? ConfigAll = "../../deploy/all-in-one.yaml" // basic configuration (release) ProjectSample = "data/atlasproject.yaml" ClusterSample = "data/atlascluster_basic.yaml" ) var ( - //default + // default Platform = "kind" K8sVersion = "v1.17.17" ) func TestE2e(t *testing.T) { - setUpMongoCLI() - SetDefaultEventuallyTimeout(EventuallyTimeout) - SetDefaultConsistentlyDuration(ConsistentlyTimeout) RegisterFailHandler(Fail) RunSpecs(t, "E2e Suite") } -//setUpMongoCLI initial setup -func setUpMongoCLI() { +var _ = SynchronizedBeforeSuite(func() []byte { + GinkgoWriter.Write([]byte("==============================Global FIRST Node Synchronized Before Each==============================\n")) + GinkgoWriter.Write([]byte("SetUp Global Timeout\n")) + SetDefaultEventuallyTimeout(EventuallyTimeout) + SetDefaultConsistentlyDuration(ConsistentlyTimeout) + checkUpMongoCLI() + GinkgoWriter.Write([]byte("==============================End of Global FIRST Node Synchronized Before Each=======================\n")) + return nil +}, func(_ []byte) { + GinkgoWriter.Write([]byte(fmt.Sprintf("==============================Global Node %d Synchronized Before Each==============================\n", GinkgoParallelNode()))) + if GinkgoParallelNode() != 1 { + Fail("Please Test suite cannot run in parallel") + } + GinkgoWriter.Write([]byte(fmt.Sprintf("==============================End of Global Node %d Synchronized Before Each========================\n", GinkgoParallelNode()))) +}) + +var _ = BeforeEach(func() { + GinkgoWriter.Write([]byte("==============================Global Before Each==============================\n")) + GinkgoWriter.Write([]byte("========================End of Global Before Each==============================\n")) +}) + +// setUpMongoCLI initial setup +func checkUpMongoCLI() { Platform = os.Getenv("K8s_PLATFORM") K8sVersion = os.Getenv("K8s_VERSION") + // additional checks + Expect(os.Getenv("MCLI_ORG_ID")).ShouldNot(BeEmpty()) + Expect(os.Getenv("MCLI_PUBLIC_API_KEY")).ShouldNot(BeEmpty()) + Expect(os.Getenv("MCLI_PRIVATE_API_KEY")).ShouldNot(BeEmpty()) + Expect(os.Getenv("MCLI_OPS_MANAGER_URL")).ShouldNot(BeEmpty()) + } diff --git a/test/e2e/utils/cli.go b/test/e2e/utils/cli.go index 3df78bf242..475a066a16 100644 --- a/test/e2e/utils/cli.go +++ b/test/e2e/utils/cli.go @@ -98,16 +98,23 @@ func GetClusterStatus(projectID string, clusterName string) func() string { } } -// TODO move +// GenKubeVersion TODO move func GenKubeVersion(fullVersion string) string { version := strings.Split(fullVersion, ".") return fmt.Sprintf("Major:\"%s\", Minor:\"%s\"", version[0], version[1]) } -// TODO move -func GetPodStatus(ns string) func() string{ - return func() string{ +// GetPodStatus TODO move +func GetPodStatus(ns string) func() string { + return func() string { session := Execute("kubectl", "get", "pods", "-l", "control-plane=controller-manager", "-o", "jsonpath={.items[0].status.phase}", "-n", ns) return string(session.Wait("1m").Out.Contents()) } } + +func GetGeneration(nc string) func() string { + return func() string { + session := Execute("kubeclt", "get", "atlascluster.atlas.mongodb.com/atlascluster-sample", "-n", nc, "-o", "jsonpath={.status.observedGeneration}") + return string(session.Out.Contents()) + } +} diff --git a/test/e2e/utils/utils.go b/test/e2e/utils/utils.go index 007e59fd05..fb0fe0b5f9 100644 --- a/test/e2e/utils/utils.go +++ b/test/e2e/utils/utils.go @@ -5,8 +5,8 @@ import ( "io/ioutil" "log" - "gopkg.in/yaml.v2" "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" + "gopkg.in/yaml.v2" ) // LoadUserProjectConfig load configuration into object From cd6a4d20424c2aa1033d4ca1105b76634c52e5d2 Mon Sep 17 00:00:00 2001 From: Svetlana Maltseva <5437289+leo-ri@users.noreply.github.com> Date: Tue, 2 Feb 2021 18:57:34 +0300 Subject: [PATCH 05/19] check --- .golangci.yml | 1 + scripts/e2e_local.sh | 18 ++++++++++++------ test/e2e/deploy_test.go | 9 ++++++++- test/e2e/e2e_suite_test.go | 8 ++++---- test/e2e/utils/cli.go | 4 ++-- test/e2e/utils/utils.go | 7 ++++--- 6 files changed, 31 insertions(+), 16 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index e869035c85..ebdf50b38e 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -86,5 +86,6 @@ issues: - path: test/e2e linters: - errcheck + - stylecheck max-issues-per-linter: 0 max-same-issues: 0 diff --git a/scripts/e2e_local.sh b/scripts/e2e_local.sh index fa4de65b78..165bdd26fe 100644 --- a/scripts/e2e_local.sh +++ b/scripts/e2e_local.sh @@ -1,12 +1,18 @@ #!/bin/sh -# act -j build-push -export MCLI_OPS_MANAGER_URL="https://cloud-qa.mongodb.com/" -export MCLI_PUBLIC_API_KEY=$(grep "ATLAS_PUBLIC_KEY" .actrc | cut -d "=" -f 2) -export MCLI_PRIVATE_API_KEY=$(grep "ATLAS_PRIVATE_KEY" .actrc | cut -d "=" -f 2) -export MCLI_ORG_ID=$(grep "ATLAS_ORG_ID" .actrc | cut -d "=" -f 2) +act -j build-push + +public_key=$(grep "ATLAS_PUBLIC_KEY" .actrc | cut -d "=" -f 2) +private_key=$(grep "ATLAS_PRIVATE_KEY" .actrc | cut -d "=" -f 2) +org_id=$(grep "ATLAS_ORG_ID" .actrc | cut -d "=" -f 2) +image=$(grep "DOCKER_REPO" .actrc | cut -d "=" -f 2):$(git rev-parse --abbrev-ref HEAD)-$(git rev-parse --short HEAD) -export INPUT_IMAGE_URL=$(grep "DOCKER_REPO" .actrc | cut -d "=" -f 2):$(git rev-parse --abbrev-ref HEAD)-$(git rev-parse --short HEAD) +export MCLI_OPS_MANAGER_URL="https://cloud-qa.mongodb.com/" +export MCLI_PUBLIC_API_KEY="${public_key}" +export MCLI_PRIVATE_API_KEY="${private_key}" +export MCLI_ORG_ID=org_id="${org_id}" +export INPUT_IMAGE_URL="${image}" export INPUT_ENV=dev + ./.github/actions/gen-install-scripts/entrypoint.sh ginkgo -v -x test/e2e \ No newline at end of file diff --git a/test/e2e/deploy_test.go b/test/e2e/deploy_test.go index f4a90c889d..a0ffe3b721 100644 --- a/test/e2e/deploy_test.go +++ b/test/e2e/deploy_test.go @@ -16,7 +16,7 @@ var _ = Describe("Deploy simple cluster", func() { It("Release sample all-in-one.yaml should work", func() { By("Prepare namespaces") - namespaceUserResources := uuid.NewRandom().String() // TODO + namespaceUserResources := "e2e-" + uuid.NewRandom().String() // TODO namespaceOperator := "mongodb-atlas-kubernetes-system" session := cli.Execute("kubectl", "create", "namespace", namespaceUserResources) Expect(session).ShouldNot(Say("created")) @@ -58,6 +58,7 @@ var _ = Describe("Deploy simple cluster", func() { Eventually(session.Wait()).Should(Say("atlascluster-sample created")) By("Wait creating and check that it was created") + Eventually(cli.GetGeneration(namespaceUserResources)).Should(Equal("1")) Eventually( cli.IsProjectExist(userProjectConfig.Spec.Name), "5m", "3s", @@ -94,6 +95,7 @@ var _ = Describe("Deploy simple cluster", func() { By("Wait creation") userClusterConfig = cli.LoadUserClusterConfig("data/updated_atlascluster_basic.yaml") + Eventually(cli.GetGeneration(namespaceUserResources)).Should(Equal("2")) Eventually( cli.GetClusterStatus(projectID, userClusterConfig.Spec.Name), "35m", "1m", @@ -115,5 +117,10 @@ var _ = Describe("Deploy simple cluster", func() { ).Should(BeFalse()) // By("Delete project") //TODO + // session = cli.Execute("kubectl", "delete", "-f", "data/atlasproject.yaml", "-n", namespaceUserResources) + // Eventually( + // cli.IsProjectExist(userProjectConfig.Spec.Name), + // "5m", "20s", + // ).Should(BeFalse()) }) }) diff --git a/test/e2e/e2e_suite_test.go b/test/e2e/e2e_suite_test.go index fcc8a035a4..8c5e7f2d94 100644 --- a/test/e2e/e2e_suite_test.go +++ b/test/e2e/e2e_suite_test.go @@ -2,11 +2,12 @@ package e2e_test import ( "fmt" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" "os" "testing" "time" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" ) const ( @@ -40,7 +41,7 @@ var _ = SynchronizedBeforeSuite(func() []byte { }, func(_ []byte) { GinkgoWriter.Write([]byte(fmt.Sprintf("==============================Global Node %d Synchronized Before Each==============================\n", GinkgoParallelNode()))) if GinkgoParallelNode() != 1 { - Fail("Please Test suite cannot run in parallel") + Fail("Please Test suite cannot run in parallel") // TODO prepare configurations for parallel } GinkgoWriter.Write([]byte(fmt.Sprintf("==============================End of Global Node %d Synchronized Before Each========================\n", GinkgoParallelNode()))) }) @@ -59,5 +60,4 @@ func checkUpMongoCLI() { Expect(os.Getenv("MCLI_PUBLIC_API_KEY")).ShouldNot(BeEmpty()) Expect(os.Getenv("MCLI_PRIVATE_API_KEY")).ShouldNot(BeEmpty()) Expect(os.Getenv("MCLI_OPS_MANAGER_URL")).ShouldNot(BeEmpty()) - } diff --git a/test/e2e/utils/cli.go b/test/e2e/utils/cli.go index 475a066a16..919a147405 100644 --- a/test/e2e/utils/cli.go +++ b/test/e2e/utils/cli.go @@ -114,7 +114,7 @@ func GetPodStatus(ns string) func() string { func GetGeneration(nc string) func() string { return func() string { - session := Execute("kubeclt", "get", "atlascluster.atlas.mongodb.com/atlascluster-sample", "-n", nc, "-o", "jsonpath={.status.observedGeneration}") - return string(session.Out.Contents()) + session := Execute("kubectl", "get", "atlascluster.atlas.mongodb.com/atlascluster-sample", "-n", nc, "-o", "jsonpath={.status.observedGeneration}") + return string(session.Wait("1m").Out.Contents()) } } diff --git a/test/e2e/utils/utils.go b/test/e2e/utils/utils.go index fb0fe0b5f9..6fdd5535bd 100644 --- a/test/e2e/utils/utils.go +++ b/test/e2e/utils/utils.go @@ -4,8 +4,9 @@ import ( "encoding/json" "io/ioutil" "log" + "path/filepath" - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" + v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" "gopkg.in/yaml.v2" ) @@ -26,9 +27,9 @@ func LoadUserClusterConfig(path string) *v1.AtlasCluster { // ReadInYAMLFileAndConvert reads in the yaml file given by the path given func ReadInYAMLFileAndConvert(pathToYamlFile string, cnfg interface{}) interface{} { // Read in the yaml file at the path given - yamlFile, err := ioutil.ReadFile(pathToYamlFile) + yamlFile, err := ioutil.ReadFile(filepath.Clean(pathToYamlFile)) if err != nil { - log.Printf("Error while parsing YAML file %v, error: %s", pathToYamlFile, err) + log.Printf("Error while parsing YAML file %v, error: %s", filepath.Clean(pathToYamlFile), err) } // Map yamlFile to interface From 796d16f934268555dfd96a4a7d9bababdb4b95e1 Mon Sep 17 00:00:00 2001 From: Svetlana Maltseva <5437289+leo-ri@users.noreply.github.com> Date: Wed, 3 Feb 2021 12:38:37 +0300 Subject: [PATCH 06/19] merge test workflows --- .github/workflows/e2e.yml | 98 -------------------------------------- .github/workflows/test.yml | 93 ++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 98 deletions(-) delete mode 100644 .github/workflows/e2e.yml diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml deleted file mode 100644 index a7d314ad61..0000000000 --- a/.github/workflows/e2e.yml +++ /dev/null @@ -1,98 +0,0 @@ -name: E2E test - -on: - push: - workflow_dispatch: - -jobs: - prepare-e2e: - name: Prepare E2E configuration and image - runs-on: ubuntu-latest - steps: - - - name: Check out code - uses: actions/checkout@v2.3.1 - - - name: Prepare tag - id: prepare - uses: ./.github/actions/set-tag - - - name: Push Atlas Operator to Registry - uses: docker/build-push-action@v1 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - repository: ${{ secrets.DOCKER_REPO }} - registry: ${{ secrets.DOCKER_REGISTRY }} - tags: ${{ steps.prepare.outputs.tag }} - - e2e: - name: E2E tests - needs: prepare-e2e - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - # k8s: ["1.17-kind", "1.19-kind", "1.17-opeshift"] # - - k8s: ["v1.18.15-kind"] # - - test: ["all-in-one"] # TODO refactor - steps: - - - name: Check out code - uses: actions/checkout@v2.3.1 - - - name: Prepare tag - id: prepare - uses: ./.github/actions/set-tag - - - name: Generate configuration for the tests - uses: ./.github/actions/gen-install-scripts - with: - IMAGE_URL: ${{ secrets.DOCKER_REPO }}:${{ steps.prepare.outputs.tag }} - ENV: dev - - - name: Set properties - id: properties - run: | - version=$(echo ${{ matrix.k8s }} | awk -F "-" '{print $1}') - platform=$(echo ${{ matrix.k8s }} | awk -F "-" '{print $2}') - echo "::set-output name=k8s_version::$version" - echo "::set-output name=k8s_platform::$platform" - - # run if platform = kind #TODO - - name: Create k8s Kind Cluster - if: ${{ steps.properties.outputs.k8s_platform == 'kind' && !env.ACT }} - uses: helm/kind-action@v1.1.0 - with: - node_image: kindest/node:${{ steps.properties.outputs.k8s_version }} - cluster_name: ${{ matrix.k8s }} - - - name: Setup Go - if: ${{ steps.properties.outputs.k8s_platform == 'kind' && !env.ACT }} - uses: actions/setup-go@v2 - with: - go-version: '1.15.6' - - - name: Install MongoCLI - run: | - sudo apt-get update - sudo apt-get install -y mongocli - mongocli --version - - - name: Run e2e test - if: ${{ steps.properties.outputs.k8s_platform == 'kind' && !env.ACT }} - env: - MCLI_PUBLIC_API_KEY: ${{ secrets.ATLAS_PUBLIC_KEY }} - MCLI_PRIVATE_API_KEY: ${{ secrets.ATLAS_PRIVATE_KEY }} - MCLI_ORG_ID: ${{ secrets.ATLAS_ORG_ID}} - MCLI_OPS_MANAGER_URL: "https://cloud-qa.mongodb.com/" - K8s_PLATFORM: "${{ steps.properties.outputs.k8s_platform }}" - K8s_VERSION: "${{ steps.properties.outputs.k8s_version }}" - TEST_NAME: "${{ matrix.test }}" - run: | - kubectl version - - go version - go get github.com/onsi/ginkgo/ginkgo && \ - go get github.com/onsi/gomega/... - ginkgo ./test/e2e -x -focus "${TEST_NAME}" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3737093cc4..f1a86bae17 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,6 +25,7 @@ jobs: - run: go version - name: Run testing run: CGO_ENABLED=0 go test -v $(go list ./pkg/...) + int-test: name: Integration tests runs-on: ubuntu-latest @@ -43,3 +44,95 @@ jobs: ATLAS_PUBLIC_KEY: ${{ secrets.ATLAS_PUBLIC_KEY }} ATLAS_PRIVATE_KEY: ${{ secrets.ATLAS_PRIVATE_KEY }} + prepare-e2e: + name: Prepare E2E configuration and image + needs: [unit-test, int-test] + runs-on: ubuntu-latest + steps: + + - name: Check out code + uses: actions/checkout@v2.3.1 + + - name: Prepare tag + id: prepare + uses: ./.github/actions/set-tag + + - name: Push Atlas Operator to Registry + uses: docker/build-push-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + repository: ${{ secrets.DOCKER_REPO }} + registry: ${{ secrets.DOCKER_REGISTRY }} + tags: ${{ steps.prepare.outputs.tag }} + + e2e: + name: E2E tests + needs: prepare-e2e + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + # k8s: ["1.17-kind", "1.19-kind", "1.17-opeshift"] # - + k8s: ["v1.18.15-kind"] # - + test: ["all-in-one"] # TODO refactor + steps: + + - name: Check out code + uses: actions/checkout@v2.3.1 + + - name: Prepare tag + id: prepare + uses: ./.github/actions/set-tag + + - name: Generate configuration for the tests + uses: ./.github/actions/gen-install-scripts + with: + IMAGE_URL: ${{ secrets.DOCKER_REPO }}:${{ steps.prepare.outputs.tag }} + ENV: dev + + - name: Set properties + id: properties + run: | + version=$(echo ${{ matrix.k8s }} | awk -F "-" '{print $1}') + platform=$(echo ${{ matrix.k8s }} | awk -F "-" '{print $2}') + echo "::set-output name=k8s_version::$version" + echo "::set-output name=k8s_platform::$platform" + + # run if platform = kind #TODO + - name: Create k8s Kind Cluster + if: ${{ steps.properties.outputs.k8s_platform == 'kind' && !env.ACT }} + uses: helm/kind-action@v1.1.0 + with: + node_image: kindest/node:${{ steps.properties.outputs.k8s_version }} + cluster_name: ${{ matrix.k8s }} + + - name: Setup Go + if: ${{ steps.properties.outputs.k8s_platform == 'kind' && !env.ACT }} + uses: actions/setup-go@v2 + with: + go-version: '1.15.6' + + - name: Install MongoCLI + run: | + sudo apt-get update + sudo apt-get install -y mongocli + mongocli --version + + - name: Run e2e test + if: ${{ steps.properties.outputs.k8s_platform == 'kind' && !env.ACT }} + env: + MCLI_PUBLIC_API_KEY: ${{ secrets.ATLAS_PUBLIC_KEY }} + MCLI_PRIVATE_API_KEY: ${{ secrets.ATLAS_PRIVATE_KEY }} + MCLI_ORG_ID: ${{ secrets.ATLAS_ORG_ID}} + MCLI_OPS_MANAGER_URL: "https://cloud-qa.mongodb.com/" + K8s_PLATFORM: "${{ steps.properties.outputs.k8s_platform }}" + K8s_VERSION: "${{ steps.properties.outputs.k8s_version }}" + TEST_NAME: "${{ matrix.test }}" + run: | + kubectl version + + go version + go get github.com/onsi/ginkgo/ginkgo && \ + go get github.com/onsi/gomega/... + ginkgo ./test/e2e -x -focus "${TEST_NAME}" From 1c164fd6c46f3b3c013909bd9b15cda3b1737d1e Mon Sep 17 00:00:00 2001 From: Svetlana Maltseva <5437289+leo-ri@users.noreply.github.com> Date: Wed, 3 Feb 2021 16:14:51 +0300 Subject: [PATCH 07/19] change timeout for update --- test/e2e/deploy_test.go | 4 ++-- test/e2e/utils/cli.go | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/test/e2e/deploy_test.go b/test/e2e/deploy_test.go index a0ffe3b721..a7fef3a7ed 100644 --- a/test/e2e/deploy_test.go +++ b/test/e2e/deploy_test.go @@ -61,7 +61,7 @@ var _ = Describe("Deploy simple cluster", func() { Eventually(cli.GetGeneration(namespaceUserResources)).Should(Equal("1")) Eventually( cli.IsProjectExist(userProjectConfig.Spec.Name), - "5m", "3s", + "7m", "10s", ).Should(BeTrue()) projectID := cli.GetProjectID(userProjectConfig.Spec.Name) @@ -98,7 +98,7 @@ var _ = Describe("Deploy simple cluster", func() { Eventually(cli.GetGeneration(namespaceUserResources)).Should(Equal("2")) Eventually( cli.GetClusterStatus(projectID, userClusterConfig.Spec.Name), - "35m", "1m", + "50m", "1m", //max time 35 ?? ).Should(Equal("IDLE")) uCluster := cli.GetClustersInfo(projectID, userClusterConfig.Spec.Name) diff --git a/test/e2e/utils/cli.go b/test/e2e/utils/cli.go index 919a147405..98333d198c 100644 --- a/test/e2e/utils/cli.go +++ b/test/e2e/utils/cli.go @@ -59,9 +59,10 @@ func GetProjectID(name string) string { func GetClustersInfo(projectID string, name string) mongodbatlas.Cluster { session := Execute("mongocli", "atlas", "clusters", "describe", name, "--projectId", projectID, "-o", "json") - output := session.Wait("1m").Out.Contents() + EventuallyWithOffset(1, session).Should(gexec.Exit(0)) + output := session.Out.Contents() var cluster mongodbatlas.Cluster - Expect(json.Unmarshal(output, &cluster)).ShouldNot(HaveOccurred()) + ExpectWithOffset(1, json.Unmarshal(output, &cluster)).ShouldNot(HaveOccurred()) return cluster } From 2c427da80de576358ce78a73b495b9bd0484937f Mon Sep 17 00:00:00 2001 From: Svetlana Maltseva <5437289+leo-ri@users.noreply.github.com> Date: Wed, 3 Feb 2021 16:58:25 +0300 Subject: [PATCH 08/19] lint --- test/e2e/deploy_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/e2e/deploy_test.go b/test/e2e/deploy_test.go index a7fef3a7ed..5a5eab8ff0 100644 --- a/test/e2e/deploy_test.go +++ b/test/e2e/deploy_test.go @@ -98,7 +98,7 @@ var _ = Describe("Deploy simple cluster", func() { Eventually(cli.GetGeneration(namespaceUserResources)).Should(Equal("2")) Eventually( cli.GetClusterStatus(projectID, userClusterConfig.Spec.Name), - "50m", "1m", //max time 35 ?? + "50m", "1m", // max time 35 ?? ).Should(Equal("IDLE")) uCluster := cli.GetClustersInfo(projectID, userClusterConfig.Spec.Name) @@ -116,7 +116,7 @@ var _ = Describe("Deploy simple cluster", func() { "10m", "1m", ).Should(BeFalse()) - // By("Delete project") //TODO + // By("Delete project") // TODO // session = cli.Execute("kubectl", "delete", "-f", "data/atlasproject.yaml", "-n", namespaceUserResources) // Eventually( // cli.IsProjectExist(userProjectConfig.Spec.Name), From 66400de001464d439ac809b85c73fee27558c0d7 Mon Sep 17 00:00:00 2001 From: Svetlana Maltseva <5437289+leo-ri@users.noreply.github.com> Date: Wed, 3 Feb 2021 19:02:37 +0300 Subject: [PATCH 09/19] fixed go mod --- go.mod | 8 +- go.sum | 244 --------------------------------------------------------- 2 files changed, 3 insertions(+), 249 deletions(-) diff --git a/go.mod b/go.mod index 0c474703f4..1aa1779aea 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,8 @@ module github.com/mongodb/mongodb-atlas-kubernetes go 1.15 require ( - github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 // indirect github.com/go-logr/zapr v0.1.0 github.com/google/go-cmp v0.5.4 - github.com/googleapis/gnostic v0.5.3 // indirect github.com/mongodb-forks/digest v1.0.2 github.com/onsi/ginkgo v1.14.2 github.com/onsi/gomega v1.10.1 @@ -15,8 +13,8 @@ require ( go.mongodb.org/atlas v0.7.1 go.uber.org/zap v1.16.0 gopkg.in/yaml.v2 v2.3.0 - k8s.io/api v0.20.2 - k8s.io/apimachinery v0.20.2 - k8s.io/client-go v0.20.2 + k8s.io/api v0.18.6 + k8s.io/apimachinery v0.18.6 + k8s.io/client-go v0.18.6 sigs.k8s.io/controller-runtime v0.6.3 ) diff --git a/go.sum b/go.sum index dfdd54cfa7..6302519ede 100644 --- a/go.sum +++ b/go.sum @@ -2,47 +2,16 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -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 h1:3ithwDMr7/3vpAMXiH+ZQnYbuIsh+OPhUPMFC9enmn0= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -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/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/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= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -63,12 +32,7 @@ github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -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/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -103,7 +67,6 @@ github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -111,21 +74,12 @@ github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2H github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/zapr v0.1.0 h1:h+WVe9j6HAA01niTJPA/kKH0i7e0rLZBCwauQFcRE54= github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= -github.com/go-logr/zapr v0.4.0 h1:uc1uML3hRYL9/ZZPdgHS/n8Nzo+eaYL/Efxkkamf7OM= -github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -180,31 +134,19 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 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/protobuf v0.0.0-20161109072736-4bd1920723d7/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.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 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 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= @@ -212,8 +154,6 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/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.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= @@ -223,26 +163,15 @@ github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= -github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.3 h1:2qsuRm+bzgwSIKikigPASa2GhW8H2Dn4Qq7UxD8K/48= -github.com/googleapis/gnostic v0.5.3/go.mod h1:TRWw1s4gxBGjSe301Dai3c7wXJAZy57+/6tawkOvqHQ= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -256,7 +185,6 @@ github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+l github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -268,7 +196,6 @@ github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= @@ -278,8 +205,6 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= @@ -334,8 +259,6 @@ github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= @@ -373,7 +296,6 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -381,8 +303,6 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.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 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= @@ -400,22 +320,15 @@ go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qL go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= @@ -428,48 +341,18 @@ golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= 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 h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -482,33 +365,17 @@ golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/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-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 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 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= 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 h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 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= @@ -524,54 +391,30 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-20190616124812-15dcb6c0061f/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-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd h1:5CtCZbICpIOFdgO940moixOPjc0178IU44m4EjOO5IY= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -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 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -580,104 +423,40 @@ golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 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-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-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-20190920225731-5eefd052ad72/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-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/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-20200304193943-95d2e580d8eb h1:iKlO7ROJc6SttHKlxzwGytRtBUqX4VARrNTgP2YLX5M= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0= gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= 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.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 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 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/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-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 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/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 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= 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 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -703,65 +482,42 @@ gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= 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 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.18.6 h1:osqrAXbOQjkKIWDTjrqxWQ3w0GkKb1KA1XkUGHHYpeE= k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI= -k8s.io/api v0.20.2 h1:y/HR22XDZY3pniu9hIFDLpUCPq2w5eQ6aV/VFQ7uJMw= -k8s.io/api v0.20.2/go.mod h1:d7n6Ehyzx+S+cE3VhTGfVNNqtGc/oL9DCdYYahlurV8= k8s.io/apiextensions-apiserver v0.18.6 h1:vDlk7cyFsDyfwn2rNAO2DbmUbvXy5yT5GE3rrqOzaMo= k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M= k8s.io/apimachinery v0.18.6 h1:RtFHnfGNfd1N0LeSrKCUznz5xtUP1elRGvHJbL3Ntag= k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= -k8s.io/apimachinery v0.20.2 h1:hFx6Sbt1oG0n6DZ+g4bFt5f6BoMkOjKWsQFu077M3Vg= -k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg= k8s.io/client-go v0.18.6 h1:I+oWqJbibLSGsZj8Xs8F0aWVXJVIoUHWaaJV3kUN/Zw= k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q= -k8s.io/client-go v0.20.2 h1:uuf+iIAbfnCSw8IGAv/Rg0giM+2bOzHLOsbbrwrdhNQ= -k8s.io/client-go v0.20.2/go.mod h1:kH5brqWqp7HDxUFKoEgiI4v8G1xzbe9giaCenUWJzgE= k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0 h1:Foj74zO6RbjjP4hBEKjnYtjjAhGg4jNynUdYF6fJrok= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6 h1:Oh3Mzx5pJ+yIumsAD0MOECPVeXsVot0UkiaCGVyfGQY= k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd h1:sOHNzJIkytDF6qadMNKhhDRpc6ODik8lVC6nOur7B2c= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200603063816-c1c6865ac451 h1:v8ud2Up6QK1lNOKFgiIVrZdMg7MpmSnvtrOieolJKoE= k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= sigs.k8s.io/controller-runtime v0.6.3 h1:SBbr+inLPEKhvlJtrvDcwIpm+uhDvp63Bl72xYJtoOE= sigs.k8s.io/controller-runtime v0.6.3/go.mod h1:WlZNXcM0++oyaQt4B7C2lEE5JYRs8vJUzRP4N4JpdAY= sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From c27f16aefbf93f725c4dec0ec4d1beca479a0bfa Mon Sep 17 00:00:00 2001 From: Svetlana Maltseva <5437289+leo-ri@users.noreply.github.com> Date: Sat, 6 Feb 2021 01:54:39 +0300 Subject: [PATCH 10/19] conf update --- .github/workflows/push-image.yml | 5 +- .github/workflows/test.yml | 5 +- Makefile | 2 +- .../{deploy_test.go => configuration_test.go} | 52 +++++++++++++------ test/e2e/data/atlassecret.yaml | 8 --- test/e2e/utils/cli.go | 8 +++ test/e2e/utils/cluster.go | 14 +++++ test/e2e/utils/project.go | 49 +++++++++++++++++ test/e2e/utils/utils.go | 25 +++++++-- 9 files changed, 135 insertions(+), 33 deletions(-) rename test/e2e/{deploy_test.go => configuration_test.go} (69%) delete mode 100644 test/e2e/data/atlassecret.yaml create mode 100644 test/e2e/utils/cluster.go create mode 100644 test/e2e/utils/project.go diff --git a/.github/workflows/push-image.yml b/.github/workflows/push-image.yml index 42b57f423b..1e526d23e4 100644 --- a/.github/workflows/push-image.yml +++ b/.github/workflows/push-image.yml @@ -1,12 +1,9 @@ # Triggered by Pull Request or Manually (from GitHub UI) events +# TODO remove after removing scripts/e2e_local.sh name: Publish image to Registry on: - pull_request: - push: - branches: - - main workflow_dispatch: jobs: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f1a86bae17..656a785034 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -46,7 +46,7 @@ jobs: prepare-e2e: name: Prepare E2E configuration and image - needs: [unit-test, int-test] + needs: [unit-test] runs-on: ubuntu-latest steps: @@ -136,3 +136,6 @@ jobs: go get github.com/onsi/ginkgo/ginkgo && \ go get github.com/onsi/gomega/... ginkgo ./test/e2e -x -focus "${TEST_NAME}" + + +# TODO if int test failed - stop e2e, add job for cleanup Atlas projects/clusters \ No newline at end of file diff --git a/Makefile b/Makefile index cfa61485d1..14f6a4305d 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,7 @@ int-test: generate manifests ## Run integration tests source $(ENVTEST_ASSETS_DIR)/setup-envtest.sh; fetch_envtest_tools $(ENVTEST_ASSETS_DIR); setup_envtest_env $(ENVTEST_ASSETS_DIR); ginkgo -v -p -nodes=4 ./test/int -coverprofile cover.out .PHONY: e2e -e2e: +e2e: run-kind ./scripts/e2e_local.sh .PHONY: manager diff --git a/test/e2e/deploy_test.go b/test/e2e/configuration_test.go similarity index 69% rename from test/e2e/deploy_test.go rename to test/e2e/configuration_test.go index 5a5eab8ff0..cc4954cfc1 100644 --- a/test/e2e/deploy_test.go +++ b/test/e2e/configuration_test.go @@ -5,25 +5,43 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" + // . "github.com/onsi/ginkgo/extensions/table" "github.com/pborman/uuid" - cli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" . "github.com/onsi/gomega/gbytes" "github.com/onsi/gomega/gexec" + + "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" + cli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" ) var _ = Describe("Deploy simple cluster", func() { + + It("Release sample all-in-one.yaml should work", func() { - By("Prepare namespaces") - namespaceUserResources := "e2e-" + uuid.NewRandom().String() // TODO + By("Prepare namespaces and project configuration") // TODO clusters/keys will be a bit later + id := uuid.NewRandom().String() + // TODO move it + namespaceUserResources := "e2e-" + id namespaceOperator := "mongodb-atlas-kubernetes-system" + keyName := "my-atlas-key" + pName := id + k8sProjectName := "k-" + id + ProjectSampleFile := "data/"+pName+".yaml" + ClusterSampleFile := "data/atlascluster_basic.yaml" // TODO put it to dataprovider + GinkgoWriter.Write([]byte(namespaceUserResources)) session := cli.Execute("kubectl", "create", "namespace", namespaceUserResources) - Expect(session).ShouldNot(Say("created")) - session = cli.Execute("kubectl", "create", "namespace", namespaceOperator) - Expect(session).ShouldNot(Say("created")) - userProjectConfig := cli.LoadUserProjectConfig("data/atlasproject.yaml") - userClusterConfig := cli.LoadUserClusterConfig("data/atlascluster_basic.yaml") + Expect(session.Wait()).Should(Say("created")) + + project := utils.NewProject().ProjectName(pName).SecretRef(keyName).CompleteK8sConfig(k8sProjectName) + utils.SaveToFile(ProjectSampleFile, project) + + userProjectConfig := cli.LoadUserProjectConfig(ProjectSampleFile) + userClusterConfig := cli.LoadUserClusterConfig(ClusterSampleFile) + userClusterConfig.Spec.Project.Name = k8sProjectName + clusterData, _ := utils.JSONToYAMLConvert(userClusterConfig) + utils.SaveToFile(ClusterSampleFile, clusterData) By("Check Kubernetes/MongoCLI version\n") session = cli.Execute("kubectl", "version") @@ -40,7 +58,6 @@ var _ = Describe("Deploy simple cluster", func() { ).Should(Equal("Running")) By("Create secret") - session = cli.Execute("kubectl", "create", "secret", "generic", "my-atlas-key", "--from-literal=orgId="+os.Getenv("MCLI_ORG_ID"), "--from-literal=publicApiKey="+os.Getenv("MCLI_PUBLIC_API_KEY"), @@ -50,14 +67,15 @@ var _ = Describe("Deploy simple cluster", func() { Eventually(session.Wait()).Should(Say("my-atlas-key created")) By("Create Sample Project\n") - session = cli.Execute("kubectl", "apply", "-f", ProjectSample, "-n", namespaceUserResources) - Eventually(session.Wait()).Should(Say("atlasproject.atlas.mongodb.com/my-project")) + session = cli.Execute("kubectl", "apply", "-f", ProjectSampleFile, "-n", namespaceUserResources) + Eventually(session.Wait()).Should(Say("atlasproject.atlas.mongodb.com/"+k8sProjectName + " created")) By("Sample Cluster\n") session = cli.Execute("kubectl", "apply", "-f", ClusterSample, "-n", namespaceUserResources) - Eventually(session.Wait()).Should(Say("atlascluster-sample created")) + Eventually(session.Wait()).Should(Say("created")) By("Wait creating and check that it was created") + Eventually(cli.GetStatus(namespaceUserResources, "atlasproject.atlas.mongodb.com/"+k8sProjectName)) Eventually(cli.GetGeneration(namespaceUserResources)).Should(Equal("1")) Eventually( cli.IsProjectExist(userProjectConfig.Spec.Name), @@ -66,7 +84,6 @@ var _ = Describe("Deploy simple cluster", func() { projectID := cli.GetProjectID(userProjectConfig.Spec.Name) GinkgoWriter.Write([]byte("projectID = " + projectID)) - Eventually( cli.IsClusterExist(projectID, userClusterConfig.Spec.Name), "5m", "1s", @@ -90,11 +107,15 @@ var _ = Describe("Deploy simple cluster", func() { ).Should(Equal(userClusterConfig.Spec.ProviderSettings.RegionName)) By("Update cluster\n") - session = cli.Execute("kubectl", "apply", "-f", "data/updated_atlascluster_basic.yaml", "-n", namespaceUserResources) // TODO param + // userClusterConfig := cli.LoadUserClusterConfig(ClusterSampleFile) + userClusterConfig.Spec.ProviderSettings.InstanceSizeName = "M20" + clusterData, _ = utils.JSONToYAMLConvert(userClusterConfig) + utils.SaveToFile(ClusterSampleFile, clusterData) + + session = cli.Execute("kubectl", "apply", "-f", ClusterSampleFile, "-n", namespaceUserResources) // TODO param Eventually(session.Wait()).Should(Say("atlascluster-sample configured")) By("Wait creation") - userClusterConfig = cli.LoadUserClusterConfig("data/updated_atlascluster_basic.yaml") Eventually(cli.GetGeneration(namespaceUserResources)).Should(Equal("2")) Eventually( cli.GetClusterStatus(projectID, userClusterConfig.Spec.Name), @@ -116,6 +137,7 @@ var _ = Describe("Deploy simple cluster", func() { "10m", "1m", ).Should(BeFalse()) + // By("Delete project") // TODO // session = cli.Execute("kubectl", "delete", "-f", "data/atlasproject.yaml", "-n", namespaceUserResources) // Eventually( diff --git a/test/e2e/data/atlassecret.yaml b/test/e2e/data/atlassecret.yaml deleted file mode 100644 index 4ab11bfeb8..0000000000 --- a/test/e2e/data/atlassecret.yaml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: my-atlas-key -data: - orgId: id - privateApiKey: keyPriv - publicApiKey: keyPub diff --git a/test/e2e/utils/cli.go b/test/e2e/utils/cli.go index 98333d198c..3f31f073d6 100644 --- a/test/e2e/utils/cli.go +++ b/test/e2e/utils/cli.go @@ -119,3 +119,11 @@ func GetGeneration(nc string) func() string { return string(session.Wait("1m").Out.Contents()) } } + +// GetStatus TODO move +func GetStatus(nc string, atlasname string) func() string { + return func() string { + session := Execute("kubectl", "get", "atlascluster.atlas.mongodb.com/"+atlasname, "-n", nc, "-o", "{.status.conditions[?(@.type=='Ready')].status}") + return string(session.Wait("1m").Out.Contents()) + } +} diff --git a/test/e2e/utils/cluster.go b/test/e2e/utils/cluster.go new file mode 100644 index 0000000000..834234455a --- /dev/null +++ b/test/e2e/utils/cluster.go @@ -0,0 +1,14 @@ +package utils + +import ( + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type AC struct { + metav1.TypeMeta `json:",inline"` + ObjectMeta *metav1.ObjectMeta `json:"metadata,omitempty"` + Spec ClusterSpec `json:"spec,omitempty"` +} + +type ClusterSpec v1.AtlasClusterSpec diff --git a/test/e2e/utils/project.go b/test/e2e/utils/project.go new file mode 100644 index 0000000000..971201b534 --- /dev/null +++ b/test/e2e/utils/project.go @@ -0,0 +1,49 @@ +package utils + +import ( + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type ISpec interface { + ProjectName(string) ISpec + SecretRef(string) ISpec + // TODO WhiteIP + CompleteK8sConfig(string) []byte +} + +type ProjectSpec v1.AtlasProjectSpec + +type ap struct { + metav1.TypeMeta `json:",inline"` + ObjectMeta *metav1.ObjectMeta `json:"metadata,omitempty"` + Spec ProjectSpec `json:"spec,omitempty"` +} + +func NewProject() ISpec { + return &ProjectSpec{} +} + +func (s *ProjectSpec) ProjectName(name string) ISpec { + s.Name = name + return s +} + +func (s *ProjectSpec) SecretRef(name string) ISpec { + s.ConnectionSecret = &v1.ResourceRef{Name: name} + return s +} + +func (s ProjectSpec) CompleteK8sConfig(k8sname string) []byte { + var t ap + t.TypeMeta = metav1.TypeMeta{ + APIVersion: "atlas.mongodb.com/v1", + Kind: "AtlasProject", + } + t.ObjectMeta = &metav1.ObjectMeta{ + Name: k8sname, + } + t.Spec = s + yamlConf, _ := JSONToYAMLConvert(t) + return yamlConf +} diff --git a/test/e2e/utils/utils.go b/test/e2e/utils/utils.go index 6fdd5535bd..d2e302bddf 100644 --- a/test/e2e/utils/utils.go +++ b/test/e2e/utils/utils.go @@ -2,12 +2,14 @@ package utils import ( "encoding/json" + "io/ioutil" "log" "path/filepath" + "gopkg.in/yaml.v3" + v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" - "gopkg.in/yaml.v2" ) // LoadUserProjectConfig load configuration into object @@ -18,10 +20,25 @@ func LoadUserProjectConfig(path string) *v1.AtlasProject { } // LoadUserClusterConfig load configuration into object -func LoadUserClusterConfig(path string) *v1.AtlasCluster { - var config v1.AtlasCluster +func LoadUserClusterConfig(path string) AC { + var config AC ReadInYAMLFileAndConvert(path, &config) - return &config + return config +} + +func SaveToFile(path string, data []byte) { + ioutil.WriteFile(path, data, 0777) +} + + +func JSONToYAMLConvert(cnfg interface{}) ([]byte, error) { + var jsonI interface{} + j, _ := json.Marshal(cnfg) + err := yaml.Unmarshal(j, &jsonI) + if err != nil { + return nil, err + } + return yaml.Marshal(jsonI) } // ReadInYAMLFileAndConvert reads in the yaml file given by the path given From ac46abb501938b068e62494ec4b88360d285a7ff Mon Sep 17 00:00:00 2001 From: Svetlana Maltseva <5437289+leo-ri@users.noreply.github.com> Date: Mon, 8 Feb 2021 12:52:37 +0300 Subject: [PATCH 11/19] lint --- test/e2e/configuration_test.go | 7 ++----- test/e2e/utils/cluster.go | 6 +++--- test/e2e/utils/utils.go | 5 ++--- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/test/e2e/configuration_test.go b/test/e2e/configuration_test.go index cc4954cfc1..89d0851857 100644 --- a/test/e2e/configuration_test.go +++ b/test/e2e/configuration_test.go @@ -17,8 +17,6 @@ import ( var _ = Describe("Deploy simple cluster", func() { - - It("Release sample all-in-one.yaml should work", func() { By("Prepare namespaces and project configuration") // TODO clusters/keys will be a bit later id := uuid.NewRandom().String() @@ -28,7 +26,7 @@ var _ = Describe("Deploy simple cluster", func() { keyName := "my-atlas-key" pName := id k8sProjectName := "k-" + id - ProjectSampleFile := "data/"+pName+".yaml" + ProjectSampleFile := "data/" + pName + ".yaml" ClusterSampleFile := "data/atlascluster_basic.yaml" // TODO put it to dataprovider GinkgoWriter.Write([]byte(namespaceUserResources)) session := cli.Execute("kubectl", "create", "namespace", namespaceUserResources) @@ -68,7 +66,7 @@ var _ = Describe("Deploy simple cluster", func() { By("Create Sample Project\n") session = cli.Execute("kubectl", "apply", "-f", ProjectSampleFile, "-n", namespaceUserResources) - Eventually(session.Wait()).Should(Say("atlasproject.atlas.mongodb.com/"+k8sProjectName + " created")) + Eventually(session.Wait()).Should(Say("atlasproject.atlas.mongodb.com/" + k8sProjectName + " created")) By("Sample Cluster\n") session = cli.Execute("kubectl", "apply", "-f", ClusterSample, "-n", namespaceUserResources) @@ -137,7 +135,6 @@ var _ = Describe("Deploy simple cluster", func() { "10m", "1m", ).Should(BeFalse()) - // By("Delete project") // TODO // session = cli.Execute("kubectl", "delete", "-f", "data/atlasproject.yaml", "-n", namespaceUserResources) // Eventually( diff --git a/test/e2e/utils/cluster.go b/test/e2e/utils/cluster.go index 834234455a..7640ce0d5b 100644 --- a/test/e2e/utils/cluster.go +++ b/test/e2e/utils/cluster.go @@ -6,9 +6,9 @@ import ( ) type AC struct { - metav1.TypeMeta `json:",inline"` - ObjectMeta *metav1.ObjectMeta `json:"metadata,omitempty"` - Spec ClusterSpec `json:"spec,omitempty"` + metav1.TypeMeta `json:",inline"` + ObjectMeta *metav1.ObjectMeta `json:"metadata,omitempty"` + Spec ClusterSpec `json:"spec,omitempty"` } type ClusterSpec v1.AtlasClusterSpec diff --git a/test/e2e/utils/utils.go b/test/e2e/utils/utils.go index d2e302bddf..514cbbb198 100644 --- a/test/e2e/utils/utils.go +++ b/test/e2e/utils/utils.go @@ -7,7 +7,7 @@ import ( "log" "path/filepath" - "gopkg.in/yaml.v3" + yaml "gopkg.in/yaml.v3" v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" ) @@ -27,10 +27,9 @@ func LoadUserClusterConfig(path string) AC { } func SaveToFile(path string, data []byte) { - ioutil.WriteFile(path, data, 0777) + ioutil.WriteFile(path, data, 0777) //nolint:gosec // kubectl apply (?) } - func JSONToYAMLConvert(cnfg interface{}) ([]byte, error) { var jsonI interface{} j, _ := json.Marshal(cnfg) From bdf7a75b47058dde231138728d3f6371510e7878 Mon Sep 17 00:00:00 2001 From: Svetlana Maltseva <5437289+leo-ri@users.noreply.github.com> Date: Mon, 8 Feb 2021 13:04:37 +0300 Subject: [PATCH 12/19] gomod --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 8c20a522f8..577fbdb6ad 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/stretchr/testify v1.7.0 go.mongodb.org/atlas v0.7.1 go.uber.org/zap v1.16.0 - gopkg.in/yaml.v2 v2.3.0 + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c k8s.io/api v0.18.6 k8s.io/apimachinery v0.18.6 k8s.io/client-go v0.18.6 From 2680c08d3668681c7d3719d9fbe38f8fdae8c1a1 Mon Sep 17 00:00:00 2001 From: Svetlana Maltseva <5437289+leo-ri@users.noreply.github.com> Date: Mon, 8 Feb 2021 14:24:25 +0300 Subject: [PATCH 13/19] fix export, waiting project --- scripts/e2e_local.sh | 2 +- test/e2e/utils/cli.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/e2e_local.sh b/scripts/e2e_local.sh index 165bdd26fe..0484699635 100644 --- a/scripts/e2e_local.sh +++ b/scripts/e2e_local.sh @@ -9,7 +9,7 @@ image=$(grep "DOCKER_REPO" .actrc | cut -d "=" -f 2):$(git rev-parse --abbrev-re export MCLI_OPS_MANAGER_URL="https://cloud-qa.mongodb.com/" export MCLI_PUBLIC_API_KEY="${public_key}" export MCLI_PRIVATE_API_KEY="${private_key}" -export MCLI_ORG_ID=org_id="${org_id}" +export MCLI_ORG_ID="${org_id}" export INPUT_IMAGE_URL="${image}" export INPUT_ENV=dev diff --git a/test/e2e/utils/cli.go b/test/e2e/utils/cli.go index 3f31f073d6..89b1c4e067 100644 --- a/test/e2e/utils/cli.go +++ b/test/e2e/utils/cli.go @@ -42,7 +42,7 @@ func GetProjects() mongodbatlas.Projects { session := Execute("mongocli", "iam", "projects", "list", "-o", "json") output := session.Wait("1m").Out.Contents() var projects mongodbatlas.Projects - ExpectWithOffset(1, json.Unmarshal(output, &projects)).ShouldNot(HaveOccurred()) + json.Unmarshal(output, &projects) return projects } From ab4e33b5f697f4dfb907f9fc5a1a48ae8cd29de1 Mon Sep 17 00:00:00 2001 From: Svetlana Maltseva <5437289+leo-ri@users.noreply.github.com> Date: Mon, 8 Feb 2021 15:18:44 +0300 Subject: [PATCH 14/19] lint + fixes --- test/e2e/configuration_test.go | 4 ++-- test/e2e/utils/cli.go | 2 +- test/e2e/utils/cluster.go | 3 ++- test/e2e/utils/project.go | 3 ++- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/test/e2e/configuration_test.go b/test/e2e/configuration_test.go index 89d0851857..e51470f04d 100644 --- a/test/e2e/configuration_test.go +++ b/test/e2e/configuration_test.go @@ -73,7 +73,7 @@ var _ = Describe("Deploy simple cluster", func() { Eventually(session.Wait()).Should(Say("created")) By("Wait creating and check that it was created") - Eventually(cli.GetStatus(namespaceUserResources, "atlasproject.atlas.mongodb.com/"+k8sProjectName)) + Eventually(cli.GetStatus(namespaceUserResources, "atlasproject.atlas.mongodb.com/"+k8sProjectName)).Should(Equal("True")) Eventually(cli.GetGeneration(namespaceUserResources)).Should(Equal("1")) Eventually( cli.IsProjectExist(userProjectConfig.Spec.Name), @@ -105,7 +105,6 @@ var _ = Describe("Deploy simple cluster", func() { ).Should(Equal(userClusterConfig.Spec.ProviderSettings.RegionName)) By("Update cluster\n") - // userClusterConfig := cli.LoadUserClusterConfig(ClusterSampleFile) userClusterConfig.Spec.ProviderSettings.InstanceSizeName = "M20" clusterData, _ = utils.JSONToYAMLConvert(userClusterConfig) utils.SaveToFile(ClusterSampleFile, clusterData) @@ -114,6 +113,7 @@ var _ = Describe("Deploy simple cluster", func() { Eventually(session.Wait()).Should(Say("atlascluster-sample configured")) By("Wait creation") + Eventually(cli.GetStatus(namespaceUserResources, "atlasproject.atlas.mongodb.com/"+k8sProjectName)).Should(Equal("True")) Eventually(cli.GetGeneration(namespaceUserResources)).Should(Equal("2")) Eventually( cli.GetClusterStatus(projectID, userClusterConfig.Spec.Name), diff --git a/test/e2e/utils/cli.go b/test/e2e/utils/cli.go index 89b1c4e067..a892199b83 100644 --- a/test/e2e/utils/cli.go +++ b/test/e2e/utils/cli.go @@ -123,7 +123,7 @@ func GetGeneration(nc string) func() string { // GetStatus TODO move func GetStatus(nc string, atlasname string) func() string { return func() string { - session := Execute("kubectl", "get", "atlascluster.atlas.mongodb.com/"+atlasname, "-n", nc, "-o", "{.status.conditions[?(@.type=='Ready')].status}") + session := Execute("kubectl", "get", atlasname, "-n", nc, "-o", "jsonpath={.status.conditions[?(@.type=='Ready')].status}") return string(session.Wait("1m").Out.Contents()) } } diff --git a/test/e2e/utils/cluster.go b/test/e2e/utils/cluster.go index 7640ce0d5b..5ce1808d01 100644 --- a/test/e2e/utils/cluster.go +++ b/test/e2e/utils/cluster.go @@ -1,8 +1,9 @@ package utils import ( - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" ) type AC struct { diff --git a/test/e2e/utils/project.go b/test/e2e/utils/project.go index 971201b534..371b235aff 100644 --- a/test/e2e/utils/project.go +++ b/test/e2e/utils/project.go @@ -1,8 +1,9 @@ package utils import ( - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" ) type ISpec interface { From b2807fc11dd49756a71677283a2308394f61f3c9 Mon Sep 17 00:00:00 2001 From: Svetlana Maltseva <5437289+leo-ri@users.noreply.github.com> Date: Mon, 8 Feb 2021 15:59:36 +0300 Subject: [PATCH 15/19] split cli.go into kubectl and mongocli --- test/e2e/configuration_test.go | 15 +++++------ test/e2e/utils/cluster.go | 2 +- test/e2e/utils/kubectl.go | 37 ++++++++++++++++++++++++++ test/e2e/utils/{cli.go => mongocli.go} | 30 --------------------- test/e2e/utils/project.go | 2 +- 5 files changed, 46 insertions(+), 40 deletions(-) create mode 100644 test/e2e/utils/kubectl.go rename test/e2e/utils/{cli.go => mongocli.go} (71%) diff --git a/test/e2e/configuration_test.go b/test/e2e/configuration_test.go index e51470f04d..17d186e62f 100644 --- a/test/e2e/configuration_test.go +++ b/test/e2e/configuration_test.go @@ -5,13 +5,12 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - // . "github.com/onsi/ginkgo/extensions/table" + "github.com/pborman/uuid" . "github.com/onsi/gomega/gbytes" "github.com/onsi/gomega/gexec" - "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" cli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" ) @@ -32,14 +31,14 @@ var _ = Describe("Deploy simple cluster", func() { session := cli.Execute("kubectl", "create", "namespace", namespaceUserResources) Expect(session.Wait()).Should(Say("created")) - project := utils.NewProject().ProjectName(pName).SecretRef(keyName).CompleteK8sConfig(k8sProjectName) - utils.SaveToFile(ProjectSampleFile, project) + project := cli.NewProject().ProjectName(pName).SecretRef(keyName).CompleteK8sConfig(k8sProjectName) + cli.SaveToFile(ProjectSampleFile, project) userProjectConfig := cli.LoadUserProjectConfig(ProjectSampleFile) userClusterConfig := cli.LoadUserClusterConfig(ClusterSampleFile) userClusterConfig.Spec.Project.Name = k8sProjectName - clusterData, _ := utils.JSONToYAMLConvert(userClusterConfig) - utils.SaveToFile(ClusterSampleFile, clusterData) + clusterData, _ := cli.JSONToYAMLConvert(userClusterConfig) + cli.SaveToFile(ClusterSampleFile, clusterData) By("Check Kubernetes/MongoCLI version\n") session = cli.Execute("kubectl", "version") @@ -106,8 +105,8 @@ var _ = Describe("Deploy simple cluster", func() { By("Update cluster\n") userClusterConfig.Spec.ProviderSettings.InstanceSizeName = "M20" - clusterData, _ = utils.JSONToYAMLConvert(userClusterConfig) - utils.SaveToFile(ClusterSampleFile, clusterData) + clusterData, _ = cli.JSONToYAMLConvert(userClusterConfig) + cli.SaveToFile(ClusterSampleFile, clusterData) session = cli.Execute("kubectl", "apply", "-f", ClusterSampleFile, "-n", namespaceUserResources) // TODO param Eventually(session.Wait()).Should(Say("atlascluster-sample configured")) diff --git a/test/e2e/utils/cluster.go b/test/e2e/utils/cluster.go index 5ce1808d01..ad32fc56fe 100644 --- a/test/e2e/utils/cluster.go +++ b/test/e2e/utils/cluster.go @@ -3,7 +3,7 @@ package utils import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" + v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" ) type AC struct { diff --git a/test/e2e/utils/kubectl.go b/test/e2e/utils/kubectl.go new file mode 100644 index 0000000000..812d6d8383 --- /dev/null +++ b/test/e2e/utils/kubectl.go @@ -0,0 +1,37 @@ +package utils + +import ( + "fmt" + "strings" + // "github.com/onsi/gomega/gexec" +) + +// GenKubeVersion +func GenKubeVersion(fullVersion string) string { + version := strings.Split(fullVersion, ".") + return fmt.Sprintf("Major:\"%s\", Minor:\"%s\"", version[0], version[1]) +} + +// GetPodStatus status.phase +func GetPodStatus(ns string) func() string { + return func() string { + session := Execute("kubectl", "get", "pods", "-l", "control-plane=controller-manager", "-o", "jsonpath={.items[0].status.phase}", "-n", ns) + return string(session.Wait("1m").Out.Contents()) + } +} + +// GetGeneration .status.observedGeneration +func GetGeneration(nc string) func() string { + return func() string { + session := Execute("kubectl", "get", "atlascluster.atlas.mongodb.com/atlascluster-sample", "-n", nc, "-o", "jsonpath={.status.observedGeneration}") + return string(session.Wait("1m").Out.Contents()) + } +} + +// GetStatus .status.conditions.type=Ready.status +func GetStatus(nc string, atlasname string) func() string { + return func() string { + session := Execute("kubectl", "get", atlasname, "-n", nc, "-o", "jsonpath={.status.conditions[?(@.type=='Ready')].status}") + return string(session.Wait("1m").Out.Contents()) + } +} diff --git a/test/e2e/utils/cli.go b/test/e2e/utils/mongocli.go similarity index 71% rename from test/e2e/utils/cli.go rename to test/e2e/utils/mongocli.go index a892199b83..6fd2b75ddc 100644 --- a/test/e2e/utils/cli.go +++ b/test/e2e/utils/mongocli.go @@ -5,7 +5,6 @@ import ( "os/exec" "encoding/json" - "strings" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -98,32 +97,3 @@ func GetClusterStatus(projectID string, clusterName string) func() string { return result.StateName } } - -// GenKubeVersion TODO move -func GenKubeVersion(fullVersion string) string { - version := strings.Split(fullVersion, ".") - return fmt.Sprintf("Major:\"%s\", Minor:\"%s\"", version[0], version[1]) -} - -// GetPodStatus TODO move -func GetPodStatus(ns string) func() string { - return func() string { - session := Execute("kubectl", "get", "pods", "-l", "control-plane=controller-manager", "-o", "jsonpath={.items[0].status.phase}", "-n", ns) - return string(session.Wait("1m").Out.Contents()) - } -} - -func GetGeneration(nc string) func() string { - return func() string { - session := Execute("kubectl", "get", "atlascluster.atlas.mongodb.com/atlascluster-sample", "-n", nc, "-o", "jsonpath={.status.observedGeneration}") - return string(session.Wait("1m").Out.Contents()) - } -} - -// GetStatus TODO move -func GetStatus(nc string, atlasname string) func() string { - return func() string { - session := Execute("kubectl", "get", atlasname, "-n", nc, "-o", "jsonpath={.status.conditions[?(@.type=='Ready')].status}") - return string(session.Wait("1m").Out.Contents()) - } -} diff --git a/test/e2e/utils/project.go b/test/e2e/utils/project.go index 371b235aff..10080aa788 100644 --- a/test/e2e/utils/project.go +++ b/test/e2e/utils/project.go @@ -3,7 +3,7 @@ package utils import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" + v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" ) type ISpec interface { From 7300d286a2b6bfddba45b779d75e2d141a4ca0b1 Mon Sep 17 00:00:00 2001 From: Svetlana Maltseva <5437289+leo-ri@users.noreply.github.com> Date: Tue, 9 Feb 2021 01:12:17 +0300 Subject: [PATCH 16/19] check kube statename --- test/e2e/configuration_test.go | 52 +++++++++++++++++++++------------- test/e2e/e2e_suite_test.go | 22 +++----------- test/e2e/utils/kubectl.go | 45 +++++++++++++++++++++++++---- test/e2e/utils/mongocli.go | 46 +++++++++++++++--------------- 4 files changed, 99 insertions(+), 66 deletions(-) diff --git a/test/e2e/configuration_test.go b/test/e2e/configuration_test.go index 17d186e62f..3d3cf60fde 100644 --- a/test/e2e/configuration_test.go +++ b/test/e2e/configuration_test.go @@ -16,15 +16,24 @@ import ( var _ = Describe("Deploy simple cluster", func() { + var ID string + + var _ = AfterEach(func() { + GinkgoWriter.Write([]byte(ID)) + Eventually(cli.DeleteNamespace("ns-" + ID)).Should(Say("deleted")) + // cli.DeleteCluster(ID, "cluster45") // TODO struct + }) + It("Release sample all-in-one.yaml should work", func() { By("Prepare namespaces and project configuration") // TODO clusters/keys will be a bit later - id := uuid.NewRandom().String() + ID = uuid.NewRandom().String() + // TODO move it - namespaceUserResources := "e2e-" + id + namespaceUserResources := "ns-" + ID namespaceOperator := "mongodb-atlas-kubernetes-system" keyName := "my-atlas-key" - pName := id - k8sProjectName := "k-" + id + pName := ID + k8sProjectName := "k-" + ID ProjectSampleFile := "data/" + pName + ".yaml" ClusterSampleFile := "data/atlascluster_basic.yaml" // TODO put it to dataprovider GinkgoWriter.Write([]byte(namespaceUserResources)) @@ -37,6 +46,7 @@ var _ = Describe("Deploy simple cluster", func() { userProjectConfig := cli.LoadUserProjectConfig(ProjectSampleFile) userClusterConfig := cli.LoadUserClusterConfig(ClusterSampleFile) userClusterConfig.Spec.Project.Name = k8sProjectName + userClusterConfig.Spec.ProviderSettings.InstanceSizeName = "M10" clusterData, _ := cli.JSONToYAMLConvert(userClusterConfig) cli.SaveToFile(ClusterSampleFile, clusterData) @@ -46,7 +56,7 @@ var _ = Describe("Deploy simple cluster", func() { session = cli.Execute("mongocli", "--version") Eventually(session).Should(gexec.Exit(0)) - By("Apply All-in-one configuration\n in ") + By("Apply All-in-one configuration\n") session = cli.Execute("kubectl", "apply", "-f", ConfigAll) Eventually(session.Wait()).Should(Say("customresourcedefinition.apiextensions.k8s.io/atlasclusters.atlas.mongodb.com")) Eventually( @@ -71,26 +81,25 @@ var _ = Describe("Deploy simple cluster", func() { session = cli.Execute("kubectl", "apply", "-f", ClusterSample, "-n", namespaceUserResources) Eventually(session.Wait()).Should(Say("created")) - By("Wait creating and check that it was created") + By("Wait project creation") Eventually(cli.GetStatus(namespaceUserResources, "atlasproject.atlas.mongodb.com/"+k8sProjectName)).Should(Equal("True")) Eventually(cli.GetGeneration(namespaceUserResources)).Should(Equal("1")) - Eventually( + Expect( cli.IsProjectExist(userProjectConfig.Spec.Name), - "7m", "10s", ).Should(BeTrue()) - projectID := cli.GetProjectID(userProjectConfig.Spec.Name) + projectID := cli.GetProjectResource(namespaceUserResources, "atlasproject.atlas.mongodb.com/"+k8sProjectName).Status.ID + By("Wait cluster creation") GinkgoWriter.Write([]byte("projectID = " + projectID)) - Eventually( - cli.IsClusterExist(projectID, userClusterConfig.Spec.Name), - "5m", "1s", - ).Should(BeTrue()) - - Eventually( - cli.GetClusterStatus(projectID, userClusterConfig.Spec.Name), + Eventually(cli.GetK8sClusterStateName( + namespaceUserResources, "atlascluster.atlas.mongodb.com/"+userClusterConfig.ObjectMeta.Name), "35m", "1m", ).Should(Equal("IDLE")) + Expect( + cli.GetClusterStateName(projectID, userClusterConfig.Spec.Name), + ).Should(Equal("IDLE")) + By("check cluster Attribute") // TODO ... cluster := cli.GetClustersInfo(projectID, userClusterConfig.Spec.Name) Expect( @@ -114,9 +123,12 @@ var _ = Describe("Deploy simple cluster", func() { By("Wait creation") Eventually(cli.GetStatus(namespaceUserResources, "atlasproject.atlas.mongodb.com/"+k8sProjectName)).Should(Equal("True")) Eventually(cli.GetGeneration(namespaceUserResources)).Should(Equal("2")) - Eventually( - cli.GetClusterStatus(projectID, userClusterConfig.Spec.Name), - "50m", "1m", // max time 35 ?? + Eventually(cli.GetK8sClusterStateName( + namespaceUserResources, "atlascluster.atlas.mongodb.com/"+userClusterConfig.ObjectMeta.Name), + "45m", "1m", + ).Should(Equal("IDLE")) + Expect( + cli.GetClusterStateName(projectID, userClusterConfig.Spec.Name), ).Should(Equal("IDLE")) uCluster := cli.GetClustersInfo(projectID, userClusterConfig.Spec.Name) @@ -130,7 +142,7 @@ var _ = Describe("Deploy simple cluster", func() { session = cli.Execute("kubectl", "delete", "-f", "data/updated_atlascluster_basic.yaml", "-n", namespaceUserResources) Eventually(session.Wait("7m")).Should(gexec.Exit(0)) Eventually( - cli.IsClusterExist(projectID, userClusterConfig.Spec.Name), + func() bool { return cli.IsClusterExist(projectID, userClusterConfig.Spec.Name) }, "10m", "1m", ).Should(BeFalse()) diff --git a/test/e2e/e2e_suite_test.go b/test/e2e/e2e_suite_test.go index 8c5e7f2d94..51ae09da4b 100644 --- a/test/e2e/e2e_suite_test.go +++ b/test/e2e/e2e_suite_test.go @@ -1,7 +1,6 @@ package e2e_test import ( - "fmt" "os" "testing" "time" @@ -14,7 +13,7 @@ const ( EventuallyTimeout = 60 * time.Second ConsistentlyTimeout = 1 * time.Second // TODO data provider? - ConfigAll = "../../deploy/all-in-one.yaml" // basic configuration (release) + ConfigAll = "../../deploy/" // Released generated files ProjectSample = "data/atlasproject.yaml" ClusterSample = "data/atlascluster_basic.yaml" ) @@ -30,25 +29,12 @@ func TestE2e(t *testing.T) { RunSpecs(t, "E2e Suite") } -var _ = SynchronizedBeforeSuite(func() []byte { - GinkgoWriter.Write([]byte("==============================Global FIRST Node Synchronized Before Each==============================\n")) - GinkgoWriter.Write([]byte("SetUp Global Timeout\n")) +var _ = BeforeSuite(func() { + GinkgoWriter.Write([]byte("==============================Before==============================\n")) SetDefaultEventuallyTimeout(EventuallyTimeout) SetDefaultConsistentlyDuration(ConsistentlyTimeout) checkUpMongoCLI() - GinkgoWriter.Write([]byte("==============================End of Global FIRST Node Synchronized Before Each=======================\n")) - return nil -}, func(_ []byte) { - GinkgoWriter.Write([]byte(fmt.Sprintf("==============================Global Node %d Synchronized Before Each==============================\n", GinkgoParallelNode()))) - if GinkgoParallelNode() != 1 { - Fail("Please Test suite cannot run in parallel") // TODO prepare configurations for parallel - } - GinkgoWriter.Write([]byte(fmt.Sprintf("==============================End of Global Node %d Synchronized Before Each========================\n", GinkgoParallelNode()))) -}) - -var _ = BeforeEach(func() { - GinkgoWriter.Write([]byte("==============================Global Before Each==============================\n")) - GinkgoWriter.Write([]byte("========================End of Global Before Each==============================\n")) + GinkgoWriter.Write([]byte("========================End of Before==============================\n")) }) // setUpMongoCLI initial setup diff --git a/test/e2e/utils/kubectl.go b/test/e2e/utils/kubectl.go index 812d6d8383..4317a825ad 100644 --- a/test/e2e/utils/kubectl.go +++ b/test/e2e/utils/kubectl.go @@ -3,7 +3,13 @@ package utils import ( "fmt" "strings" - // "github.com/onsi/gomega/gexec" + + "encoding/json" + + . "github.com/onsi/gomega" + . "github.com/onsi/gomega/gbytes" + + v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" ) // GenKubeVersion @@ -21,17 +27,46 @@ func GetPodStatus(ns string) func() string { } // GetGeneration .status.observedGeneration -func GetGeneration(nc string) func() string { +func GetGeneration(ns string) func() string { return func() string { - session := Execute("kubectl", "get", "atlascluster.atlas.mongodb.com/atlascluster-sample", "-n", nc, "-o", "jsonpath={.status.observedGeneration}") + session := Execute("kubectl", "get", "atlascluster.atlas.mongodb.com/atlascluster-sample", "-n", ns, "-o", "jsonpath={.status.observedGeneration}") return string(session.Wait("1m").Out.Contents()) } } // GetStatus .status.conditions.type=Ready.status -func GetStatus(nc string, atlasname string) func() string { +func GetStatus(ns string, atlasname string) func() string { return func() string { - session := Execute("kubectl", "get", atlasname, "-n", nc, "-o", "jsonpath={.status.conditions[?(@.type=='Ready')].status}") + session := Execute("kubectl", "get", atlasname, "-n", ns, "-o", "jsonpath={.status.conditions[?(@.type=='Ready')].status}") return string(session.Wait("1m").Out.Contents()) } } + +// GetProjectResource +func GetProjectResource(namespace, rName string) v1.AtlasProject { + session := Execute("kubectl", "get", rName, "-n", namespace, "-o", "json") + output := session.Wait("1m").Out.Contents() + var project v1.AtlasProject + ExpectWithOffset(1, json.Unmarshal(output, &project)).ShouldNot(HaveOccurred()) + return project +} + +// GetClusterResource +func GetClusterResource(namespace, rName string) v1.AtlasCluster { + session := Execute("kubectl", "get", rName, "-n", namespace, "-o", "json") + output := session.Wait("1m").Out.Contents() + var cluster v1.AtlasCluster + ExpectWithOffset(1, json.Unmarshal(output, &cluster)).ShouldNot(HaveOccurred()) + return cluster +} + +func GetK8sClusterStateName(ns, rName string) func() string { + return func() string { + return GetClusterResource(ns, rName).Status.StateName + } +} + +func DeleteNamespace(ns string) *Buffer { + session := Execute("kubectl", "delete", "namespace", ns) + return session.Wait().Out +} diff --git a/test/e2e/utils/mongocli.go b/test/e2e/utils/mongocli.go index 6fd2b75ddc..4dbbcc3d79 100644 --- a/test/e2e/utils/mongocli.go +++ b/test/e2e/utils/mongocli.go @@ -8,6 +8,7 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" + . "github.com/onsi/gomega/gbytes" "github.com/onsi/gomega/gexec" "go.mongodb.org/atlas/mongodbatlas" ) @@ -65,35 +66,34 @@ func GetClustersInfo(projectID string, name string) mongodbatlas.Cluster { return cluster } -func IsProjectExist(name string) func() bool { - return func() bool { - projects := GetProjects().Results - for _, p := range projects { - if p.Name == name { - return true - } +func DeleteCluster(projectID, clusterName string) *Buffer { + session := Execute("mongocli", "atlas", "cluster", "delete", clusterName, "--projectId", projectID, "--force") + return session.Wait().Out +} + +func IsProjectExist(name string) bool { + projects := GetProjects().Results + for _, p := range projects { + if p.Name == name { + return true } - return false } + return false } -func IsClusterExist(projectID string, name string) func() bool { - return func() bool { - clusters := GetClusters(projectID) - // if clusters - for _, c := range clusters { - GinkgoWriter.Write([]byte(c.Name + name + "\n")) - if c.Name == name { - return true - } +func IsClusterExist(projectID string, name string) bool { + clusters := GetClusters(projectID) + // if clusters + for _, c := range clusters { + GinkgoWriter.Write([]byte(c.Name + name + "\n")) + if c.Name == name { + return true } - return false } + return false } -func GetClusterStatus(projectID string, clusterName string) func() string { - return func() string { - result := GetClustersInfo(projectID, clusterName) - return result.StateName - } +func GetClusterStateName(projectID string, clusterName string) string { + result := GetClustersInfo(projectID, clusterName) + return result.StateName } From 5da2bd0e0c112e954e42ff38a36e896c288b2f81 Mon Sep 17 00:00:00 2001 From: Svetlana Maltseva <5437289+leo-ri@users.noreply.github.com> Date: Tue, 9 Feb 2021 17:29:05 +0300 Subject: [PATCH 17/19] move kube/mongocli to different package --- test/e2e/cli/cli.go | 15 ++++++ test/e2e/{utils => cli/kube}/kubectl.go | 15 +++--- test/e2e/{utils => cli/mongocli}/mongocli.go | 23 +++------ test/e2e/configuration_test.go | 54 ++++++++++---------- 4 files changed, 59 insertions(+), 48 deletions(-) create mode 100644 test/e2e/cli/cli.go rename test/e2e/{utils => cli/kube}/kubectl.go (69%) rename test/e2e/{utils => cli/mongocli}/mongocli.go (74%) diff --git a/test/e2e/cli/cli.go b/test/e2e/cli/cli.go new file mode 100644 index 0000000000..8190eb9262 --- /dev/null +++ b/test/e2e/cli/cli.go @@ -0,0 +1,15 @@ +package cli + +import ( + "os/exec" + + . "github.com/onsi/ginkgo" + "github.com/onsi/gomega/gexec" +) + +func Execute(command string, args ...string) *gexec.Session { + // GinkgoWriter.Write([]byte("\n " + command + " " + strings.Join(args, " "))) // TODO for the local run only + cmd := exec.Command(command, args...) + session, _ := gexec.Start(cmd, GinkgoWriter, GinkgoWriter) + return session +} \ No newline at end of file diff --git a/test/e2e/utils/kubectl.go b/test/e2e/cli/kube/kubectl.go similarity index 69% rename from test/e2e/utils/kubectl.go rename to test/e2e/cli/kube/kubectl.go index 4317a825ad..30cb6fefb8 100644 --- a/test/e2e/utils/kubectl.go +++ b/test/e2e/cli/kube/kubectl.go @@ -1,4 +1,4 @@ -package utils +package kube import ( "fmt" @@ -10,6 +10,7 @@ import ( . "github.com/onsi/gomega/gbytes" v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1" + cli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli" ) // GenKubeVersion @@ -21,7 +22,7 @@ func GenKubeVersion(fullVersion string) string { // GetPodStatus status.phase func GetPodStatus(ns string) func() string { return func() string { - session := Execute("kubectl", "get", "pods", "-l", "control-plane=controller-manager", "-o", "jsonpath={.items[0].status.phase}", "-n", ns) + session := cli.Execute("kubectl", "get", "pods", "-l", "control-plane=controller-manager", "-o", "jsonpath={.items[0].status.phase}", "-n", ns) return string(session.Wait("1m").Out.Contents()) } } @@ -29,7 +30,7 @@ func GetPodStatus(ns string) func() string { // GetGeneration .status.observedGeneration func GetGeneration(ns string) func() string { return func() string { - session := Execute("kubectl", "get", "atlascluster.atlas.mongodb.com/atlascluster-sample", "-n", ns, "-o", "jsonpath={.status.observedGeneration}") + session := cli.Execute("kubectl", "get", "atlascluster.atlas.mongodb.com/atlascluster-sample", "-n", ns, "-o", "jsonpath={.status.observedGeneration}") return string(session.Wait("1m").Out.Contents()) } } @@ -37,14 +38,14 @@ func GetGeneration(ns string) func() string { // GetStatus .status.conditions.type=Ready.status func GetStatus(ns string, atlasname string) func() string { return func() string { - session := Execute("kubectl", "get", atlasname, "-n", ns, "-o", "jsonpath={.status.conditions[?(@.type=='Ready')].status}") + session := cli.Execute("kubectl", "get", atlasname, "-n", ns, "-o", "jsonpath={.status.conditions[?(@.type=='Ready')].status}") return string(session.Wait("1m").Out.Contents()) } } // GetProjectResource func GetProjectResource(namespace, rName string) v1.AtlasProject { - session := Execute("kubectl", "get", rName, "-n", namespace, "-o", "json") + session := cli.Execute("kubectl", "get", rName, "-n", namespace, "-o", "json") output := session.Wait("1m").Out.Contents() var project v1.AtlasProject ExpectWithOffset(1, json.Unmarshal(output, &project)).ShouldNot(HaveOccurred()) @@ -53,7 +54,7 @@ func GetProjectResource(namespace, rName string) v1.AtlasProject { // GetClusterResource func GetClusterResource(namespace, rName string) v1.AtlasCluster { - session := Execute("kubectl", "get", rName, "-n", namespace, "-o", "json") + session := cli.Execute("kubectl", "get", rName, "-n", namespace, "-o", "json") output := session.Wait("1m").Out.Contents() var cluster v1.AtlasCluster ExpectWithOffset(1, json.Unmarshal(output, &cluster)).ShouldNot(HaveOccurred()) @@ -67,6 +68,6 @@ func GetK8sClusterStateName(ns, rName string) func() string { } func DeleteNamespace(ns string) *Buffer { - session := Execute("kubectl", "delete", "namespace", ns) + session := cli.Execute("kubectl", "delete", "namespace", ns) return session.Wait().Out } diff --git a/test/e2e/utils/mongocli.go b/test/e2e/cli/mongocli/mongocli.go similarity index 74% rename from test/e2e/utils/mongocli.go rename to test/e2e/cli/mongocli/mongocli.go index 4dbbcc3d79..c1c52adde2 100644 --- a/test/e2e/utils/mongocli.go +++ b/test/e2e/cli/mongocli/mongocli.go @@ -1,27 +1,20 @@ -package utils +package mongocli import ( - "fmt" - "os/exec" - "encoding/json" + "fmt" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" . "github.com/onsi/gomega/gbytes" "github.com/onsi/gomega/gexec" "go.mongodb.org/atlas/mongodbatlas" -) -func Execute(command string, args ...string) *gexec.Session { - // GinkgoWriter.Write([]byte("\n " + command + " " + strings.Join(args, " "))) //TODO for the local run only - cmd := exec.Command(command, args...) - session, _ := gexec.Start(cmd, GinkgoWriter, GinkgoWriter) - return session -} + cli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli" +) func GetClusters(projectID string) []mongodbatlas.Cluster { - session := Execute("mongocli", "atlas", "clusters", "list", "--projectId", projectID, "-o", "json") + session := cli.Execute("mongocli", "atlas", "clusters", "list", "--projectId", projectID, "-o", "json") output := session.Wait("1m").Out.Contents() var clusters []mongodbatlas.Cluster ExpectWithOffset(1, json.Unmarshal(output, &clusters)).ShouldNot(HaveOccurred()) @@ -39,7 +32,7 @@ func GetClusterByName(projectID string, name string) mongodbatlas.Cluster { } func GetProjects() mongodbatlas.Projects { - session := Execute("mongocli", "iam", "projects", "list", "-o", "json") + session := cli.Execute("mongocli", "iam", "projects", "list", "-o", "json") output := session.Wait("1m").Out.Contents() var projects mongodbatlas.Projects json.Unmarshal(output, &projects) @@ -58,7 +51,7 @@ func GetProjectID(name string) string { } func GetClustersInfo(projectID string, name string) mongodbatlas.Cluster { - session := Execute("mongocli", "atlas", "clusters", "describe", name, "--projectId", projectID, "-o", "json") + session := cli.Execute("mongocli", "atlas", "clusters", "describe", name, "--projectId", projectID, "-o", "json") EventuallyWithOffset(1, session).Should(gexec.Exit(0)) output := session.Out.Contents() var cluster mongodbatlas.Cluster @@ -67,7 +60,7 @@ func GetClustersInfo(projectID string, name string) mongodbatlas.Cluster { } func DeleteCluster(projectID, clusterName string) *Buffer { - session := Execute("mongocli", "atlas", "cluster", "delete", clusterName, "--projectId", projectID, "--force") + session := cli.Execute("mongocli", "atlas", "cluster", "delete", clusterName, "--projectId", projectID, "--force") return session.Wait().Out } diff --git a/test/e2e/configuration_test.go b/test/e2e/configuration_test.go index 3d3cf60fde..0e3e3ca896 100644 --- a/test/e2e/configuration_test.go +++ b/test/e2e/configuration_test.go @@ -11,7 +11,10 @@ import ( . "github.com/onsi/gomega/gbytes" "github.com/onsi/gomega/gexec" - cli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" + cli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli" + kube "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/kube" + mongocli "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/cli/mongocli" + utils "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/utils" ) var _ = Describe("Deploy simple cluster", func() { @@ -20,14 +23,13 @@ var _ = Describe("Deploy simple cluster", func() { var _ = AfterEach(func() { GinkgoWriter.Write([]byte(ID)) - Eventually(cli.DeleteNamespace("ns-" + ID)).Should(Say("deleted")) - // cli.DeleteCluster(ID, "cluster45") // TODO struct + Eventually(kube.DeleteNamespace("ns-" + ID)).Should(Say("deleted")) + // mongocli.DeleteCluster(ID, "cluster45") // TODO struct }) It("Release sample all-in-one.yaml should work", func() { By("Prepare namespaces and project configuration") // TODO clusters/keys will be a bit later ID = uuid.NewRandom().String() - // TODO move it namespaceUserResources := "ns-" + ID namespaceOperator := "mongodb-atlas-kubernetes-system" @@ -40,15 +42,15 @@ var _ = Describe("Deploy simple cluster", func() { session := cli.Execute("kubectl", "create", "namespace", namespaceUserResources) Expect(session.Wait()).Should(Say("created")) - project := cli.NewProject().ProjectName(pName).SecretRef(keyName).CompleteK8sConfig(k8sProjectName) - cli.SaveToFile(ProjectSampleFile, project) + project := utils.NewProject().ProjectName(pName).SecretRef(keyName).CompleteK8sConfig(k8sProjectName) + utils.SaveToFile(ProjectSampleFile, project) - userProjectConfig := cli.LoadUserProjectConfig(ProjectSampleFile) - userClusterConfig := cli.LoadUserClusterConfig(ClusterSampleFile) + userProjectConfig := utils.LoadUserProjectConfig(ProjectSampleFile) + userClusterConfig := utils.LoadUserClusterConfig(ClusterSampleFile) userClusterConfig.Spec.Project.Name = k8sProjectName userClusterConfig.Spec.ProviderSettings.InstanceSizeName = "M10" - clusterData, _ := cli.JSONToYAMLConvert(userClusterConfig) - cli.SaveToFile(ClusterSampleFile, clusterData) + clusterData, _ := utils.JSONToYAMLConvert(userClusterConfig) + utils.SaveToFile(ClusterSampleFile, clusterData) By("Check Kubernetes/MongoCLI version\n") session = cli.Execute("kubectl", "version") @@ -60,7 +62,7 @@ var _ = Describe("Deploy simple cluster", func() { session = cli.Execute("kubectl", "apply", "-f", ConfigAll) Eventually(session.Wait()).Should(Say("customresourcedefinition.apiextensions.k8s.io/atlasclusters.atlas.mongodb.com")) Eventually( - cli.GetPodStatus(namespaceOperator), + kube.GetPodStatus(namespaceOperator), "5m", "3s", ).Should(Equal("Running")) @@ -82,26 +84,26 @@ var _ = Describe("Deploy simple cluster", func() { Eventually(session.Wait()).Should(Say("created")) By("Wait project creation") - Eventually(cli.GetStatus(namespaceUserResources, "atlasproject.atlas.mongodb.com/"+k8sProjectName)).Should(Equal("True")) - Eventually(cli.GetGeneration(namespaceUserResources)).Should(Equal("1")) + Eventually(kube.GetStatus(namespaceUserResources, "atlasproject.atlas.mongodb.com/"+k8sProjectName)).Should(Equal("True")) + Eventually(kube.GetGeneration(namespaceUserResources)).Should(Equal("1")) Expect( - cli.IsProjectExist(userProjectConfig.Spec.Name), + mongocli.IsProjectExist(userProjectConfig.Spec.Name), ).Should(BeTrue()) - projectID := cli.GetProjectResource(namespaceUserResources, "atlasproject.atlas.mongodb.com/"+k8sProjectName).Status.ID + projectID := kube.GetProjectResource(namespaceUserResources, "atlasproject.atlas.mongodb.com/"+k8sProjectName).Status.ID By("Wait cluster creation") GinkgoWriter.Write([]byte("projectID = " + projectID)) - Eventually(cli.GetK8sClusterStateName( + Eventually(kube.GetK8sClusterStateName( namespaceUserResources, "atlascluster.atlas.mongodb.com/"+userClusterConfig.ObjectMeta.Name), "35m", "1m", ).Should(Equal("IDLE")) Expect( - cli.GetClusterStateName(projectID, userClusterConfig.Spec.Name), + mongocli.GetClusterStateName(projectID, userClusterConfig.Spec.Name), ).Should(Equal("IDLE")) By("check cluster Attribute") // TODO ... - cluster := cli.GetClustersInfo(projectID, userClusterConfig.Spec.Name) + cluster := mongocli.GetClustersInfo(projectID, userClusterConfig.Spec.Name) Expect( cluster.ProviderSettings.InstanceSizeName, ).Should(Equal(userClusterConfig.Spec.ProviderSettings.InstanceSizeName)) @@ -114,24 +116,24 @@ var _ = Describe("Deploy simple cluster", func() { By("Update cluster\n") userClusterConfig.Spec.ProviderSettings.InstanceSizeName = "M20" - clusterData, _ = cli.JSONToYAMLConvert(userClusterConfig) - cli.SaveToFile(ClusterSampleFile, clusterData) + clusterData, _ = utils.JSONToYAMLConvert(userClusterConfig) + utils.SaveToFile(ClusterSampleFile, clusterData) session = cli.Execute("kubectl", "apply", "-f", ClusterSampleFile, "-n", namespaceUserResources) // TODO param Eventually(session.Wait()).Should(Say("atlascluster-sample configured")) By("Wait creation") - Eventually(cli.GetStatus(namespaceUserResources, "atlasproject.atlas.mongodb.com/"+k8sProjectName)).Should(Equal("True")) - Eventually(cli.GetGeneration(namespaceUserResources)).Should(Equal("2")) - Eventually(cli.GetK8sClusterStateName( + Eventually(kube.GetStatus(namespaceUserResources, "atlasproject.atlas.mongodb.com/"+k8sProjectName)).Should(Equal("True")) + Eventually(kube.GetGeneration(namespaceUserResources)).Should(Equal("2")) + Eventually(kube.GetK8sClusterStateName( namespaceUserResources, "atlascluster.atlas.mongodb.com/"+userClusterConfig.ObjectMeta.Name), "45m", "1m", ).Should(Equal("IDLE")) Expect( - cli.GetClusterStateName(projectID, userClusterConfig.Spec.Name), + mongocli.GetClusterStateName(projectID, userClusterConfig.Spec.Name), ).Should(Equal("IDLE")) - uCluster := cli.GetClustersInfo(projectID, userClusterConfig.Spec.Name) + uCluster := mongocli.GetClustersInfo(projectID, userClusterConfig.Spec.Name) Expect( uCluster.ProviderSettings.InstanceSizeName, ).Should(Equal( @@ -142,7 +144,7 @@ var _ = Describe("Deploy simple cluster", func() { session = cli.Execute("kubectl", "delete", "-f", "data/updated_atlascluster_basic.yaml", "-n", namespaceUserResources) Eventually(session.Wait("7m")).Should(gexec.Exit(0)) Eventually( - func() bool { return cli.IsClusterExist(projectID, userClusterConfig.Spec.Name) }, + func() bool { return mongocli.IsClusterExist(projectID, userClusterConfig.Spec.Name) }, "10m", "1m", ).Should(BeFalse()) From a3eb5691c57b721b4493a0853200d8da5e8d00eb Mon Sep 17 00:00:00 2001 From: Svetlana <5437289+leo-ri@users.noreply.github.com> Date: Tue, 9 Feb 2021 17:51:11 +0300 Subject: [PATCH 18/19] Update cli.go --- test/e2e/cli/cli.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/cli/cli.go b/test/e2e/cli/cli.go index 8190eb9262..8cd67cd9bc 100644 --- a/test/e2e/cli/cli.go +++ b/test/e2e/cli/cli.go @@ -12,4 +12,4 @@ func Execute(command string, args ...string) *gexec.Session { cmd := exec.Command(command, args...) session, _ := gexec.Start(cmd, GinkgoWriter, GinkgoWriter) return session -} \ No newline at end of file +} From fcb5bb1972489ef4b6f2c61c82733a8d8f0ad1a6 Mon Sep 17 00:00:00 2001 From: Svetlana Maltseva <5437289+leo-ri@users.noreply.github.com> Date: Wed, 10 Feb 2021 12:46:59 +0300 Subject: [PATCH 19/19] renaming --- .github/workflows/test.yml | 4 ++-- test/e2e/cli/kube/kubectl.go | 4 ++-- test/e2e/configuration_test.go | 4 ++-- test/e2e/e2e_suite_test.go | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 656a785034..ea1de424f0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -126,8 +126,8 @@ jobs: MCLI_PRIVATE_API_KEY: ${{ secrets.ATLAS_PRIVATE_KEY }} MCLI_ORG_ID: ${{ secrets.ATLAS_ORG_ID}} MCLI_OPS_MANAGER_URL: "https://cloud-qa.mongodb.com/" - K8s_PLATFORM: "${{ steps.properties.outputs.k8s_platform }}" - K8s_VERSION: "${{ steps.properties.outputs.k8s_version }}" + K8S_PLATFORM: "${{ steps.properties.outputs.k8s_platform }}" + K8S_VERSION: "${{ steps.properties.outputs.k8s_version }}" TEST_NAME: "${{ matrix.test }}" run: | kubectl version diff --git a/test/e2e/cli/kube/kubectl.go b/test/e2e/cli/kube/kubectl.go index 30cb6fefb8..bdd53c23e0 100644 --- a/test/e2e/cli/kube/kubectl.go +++ b/test/e2e/cli/kube/kubectl.go @@ -35,8 +35,8 @@ func GetGeneration(ns string) func() string { } } -// GetStatus .status.conditions.type=Ready.status -func GetStatus(ns string, atlasname string) func() string { +// GetStatusCondition .status.conditions.type=Ready.status +func GetStatusCondition(ns string, atlasname string) func() string { return func() string { session := cli.Execute("kubectl", "get", atlasname, "-n", ns, "-o", "jsonpath={.status.conditions[?(@.type=='Ready')].status}") return string(session.Wait("1m").Out.Contents()) diff --git a/test/e2e/configuration_test.go b/test/e2e/configuration_test.go index 0e3e3ca896..b4d5e26a7c 100644 --- a/test/e2e/configuration_test.go +++ b/test/e2e/configuration_test.go @@ -84,7 +84,7 @@ var _ = Describe("Deploy simple cluster", func() { Eventually(session.Wait()).Should(Say("created")) By("Wait project creation") - Eventually(kube.GetStatus(namespaceUserResources, "atlasproject.atlas.mongodb.com/"+k8sProjectName)).Should(Equal("True")) + Eventually(kube.GetStatusCondition(namespaceUserResources, "atlasproject.atlas.mongodb.com/"+k8sProjectName)).Should(Equal("True")) Eventually(kube.GetGeneration(namespaceUserResources)).Should(Equal("1")) Expect( mongocli.IsProjectExist(userProjectConfig.Spec.Name), @@ -123,7 +123,7 @@ var _ = Describe("Deploy simple cluster", func() { Eventually(session.Wait()).Should(Say("atlascluster-sample configured")) By("Wait creation") - Eventually(kube.GetStatus(namespaceUserResources, "atlasproject.atlas.mongodb.com/"+k8sProjectName)).Should(Equal("True")) + Eventually(kube.GetStatusCondition(namespaceUserResources, "atlasproject.atlas.mongodb.com/"+k8sProjectName)).Should(Equal("True")) Eventually(kube.GetGeneration(namespaceUserResources)).Should(Equal("2")) Eventually(kube.GetK8sClusterStateName( namespaceUserResources, "atlascluster.atlas.mongodb.com/"+userClusterConfig.ObjectMeta.Name), diff --git a/test/e2e/e2e_suite_test.go b/test/e2e/e2e_suite_test.go index 51ae09da4b..cdc299b340 100644 --- a/test/e2e/e2e_suite_test.go +++ b/test/e2e/e2e_suite_test.go @@ -39,8 +39,8 @@ var _ = BeforeSuite(func() { // setUpMongoCLI initial setup func checkUpMongoCLI() { - Platform = os.Getenv("K8s_PLATFORM") - K8sVersion = os.Getenv("K8s_VERSION") + Platform = os.Getenv("K8S_PLATFORM") + K8sVersion = os.Getenv("K8S_VERSION") // additional checks Expect(os.Getenv("MCLI_ORG_ID")).ShouldNot(BeEmpty()) Expect(os.Getenv("MCLI_PUBLIC_API_KEY")).ShouldNot(BeEmpty())