From 4a17d268bdcfb03dc39c02fefc8292ebadd84713 Mon Sep 17 00:00:00 2001 From: rimas Date: Fri, 5 Mar 2021 18:47:37 +0200 Subject: [PATCH] Signed-off-by: rimas --- .circleci/config.yml | 40 ++ .gitignore | 4 + .goreleaser.yml | 23 + CONTRIBUTING.md | 3 + LICENSE | 201 ++++++ Makefile | 18 + OWNERS | 14 + README.md | 283 ++++++++ cmd/cleanup.go | 233 ++++++ cmd/convert.go | 185 +++++ cmd/environment.go | 51 ++ cmd/move_config.go | 95 +++ cmd/root.go | 70 ++ code-of-conduct.md | 3 + completion.yaml | 34 + go.mod | 24 + go.sum | 1399 +++++++++++++++++++++++++++++++++++++ helm-2to3.png | Bin 0 -> 34781 bytes main.go | 31 + pkg/common/common.go | 22 + pkg/utils/utils.go | 275 ++++++++ pkg/v2/release.go | 209 ++++++ pkg/v2/utils.go | 93 +++ pkg/v3/connect.go | 55 ++ pkg/v3/release.go | 379 ++++++++++ pkg/v3/utils.go | 53 ++ plugin.yaml | 8 + scripts/install_plugin.sh | 43 ++ scripts/tag.sh | 10 + 29 files changed, 3858 insertions(+) create mode 100644 .circleci/config.yml create mode 100644 .gitignore create mode 100644 .goreleaser.yml create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 OWNERS create mode 100644 README.md create mode 100644 cmd/cleanup.go create mode 100644 cmd/convert.go create mode 100644 cmd/environment.go create mode 100644 cmd/move_config.go create mode 100644 cmd/root.go create mode 100644 code-of-conduct.md create mode 100644 completion.yaml create mode 100644 go.mod create mode 100644 go.sum create mode 100644 helm-2to3.png create mode 100644 main.go create mode 100644 pkg/common/common.go create mode 100644 pkg/utils/utils.go create mode 100644 pkg/v2/release.go create mode 100644 pkg/v2/utils.go create mode 100644 pkg/v3/connect.go create mode 100644 pkg/v3/release.go create mode 100644 pkg/v3/utils.go create mode 100644 plugin.yaml create mode 100755 scripts/install_plugin.sh create mode 100755 scripts/tag.sh diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..540db37 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,40 @@ +version: 2 +jobs: + lint: + docker: + - image: koalaman/shellcheck-alpine + steps: + - checkout + - run: + name: lint + command: | + shellcheck -x scripts/tag.sh + shellcheck -x scripts/install_plugin.sh + untagged-build: + docker: + - image: circleci/golang:1.16 + working_directory: /go/src/github.com/helm/helm-2to3 + steps: + - checkout + - run: make build + tagged-build: + docker: + - image: circleci/golang:1.16 + working_directory: /go/src/github.com/helm/helm-2to3 + steps: + - checkout + - run: curl -sL https://git.io/goreleaser | bash +workflows: + version: 2 + untagged-build: + jobs: + - lint + - untagged-build + tagged-build: + jobs: + - tagged-build: + filters: + tags: + only: /^v.*/ + branches: + ignore: /.*/ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6546d0e --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +2to3 +bin/ +tmp/ +releases/ diff --git a/.goreleaser.yml b/.goreleaser.yml new file mode 100644 index 0000000..d26ed18 --- /dev/null +++ b/.goreleaser.yml @@ -0,0 +1,23 @@ +builds: + - main: main.go + binary: 2to3 + env: + - CGO_ENABLED=0 + goos: + - darwin + - linux + - windows + goarch: + - amd64 + - arm64 +archives: + - id: archive + format: tar.gz + files: + - README.md + - LICENSE + - plugin.yaml + - completion.yaml + - scripts/install_plugin.sh +checksum: + name_template: 'checksums.txt' diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..8627d71 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,3 @@ +# Contributing Guidelines + +The Helm 2to3 plugin project accepts contributions via GitHub pull requests. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..621df21 --- /dev/null +++ b/Makefile @@ -0,0 +1,18 @@ +HELM_PLUGIN_NAME := 2to3 +LDFLAGS := "-X main.version=${VERSION}" +MOD_PROXY_URL ?= https://goproxy.io + +.PHONY: build +build: + export CGO_ENABLED=0 && \ + go build -o bin/${HELM_PLUGIN_NAME} -ldflags $(LDFLAGS) ./main.go + +.PHONY: bootstrap +bootstrap: + export GO111MODULE=on && \ + export GOPROXY=$(MOD_PROXY_URL) && \ + go mod download + +.PHONY: tag +tag: + @scripts/tag.sh diff --git a/OWNERS b/OWNERS new file mode 100644 index 0000000..43157b4 --- /dev/null +++ b/OWNERS @@ -0,0 +1,14 @@ +maintainers: + - adamreese + - bacongobbler + - fibonacci1729 + - hickeyma + - jdolitsky + - mattfarina + - michelleN + - prydonius + - rimusz + - SlickNik + - technosophos + - thomastaylor312 + - viglesiasce diff --git a/README.md b/README.md new file mode 100644 index 0000000..28d4928 --- /dev/null +++ b/README.md @@ -0,0 +1,283 @@ +# Helm 2to3 Plugin + +[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) +[![Go Report Card](https://goreportcard.com/badge/github.com/helm/helm-2to3)](https://goreportcard.com/report/github.com/helm/helm-2to3) +[![CircleCI](https://circleci.com/gh/helm/helm-2to3/tree/master.svg?style=svg)](https://circleci.com/gh/helm/helm-2to3/tree/master) +[![Release](https://img.shields.io/github/release/helm/helm-2to3.svg?style=flat-square)](https://github.com/helm/helm-2to3/releases/latest) + +![diagram](./helm-2to3.png) + +**Helm v3 plugin which migrates and cleans up Helm v2 configuration and releases in-place to Helm v3** + +## Overview + +One of the most important aspects of upgrading to a new major release of Helm is the +migration of data. This is especially true of Helm v2 to v3 considering the architectural +changes between the releases. The `2to3` plugin helps with this migration by supporting: + +- Migration of [Helm v2 configuration](#migrate-helm-v2-configuration). +- Migration of [Helm v2 releases](#migrate-helm-v2-releases). +- [Clean up](#clean-up-helm-v2-data) Helm v2 configuration, release data and Tiller deployment. + +## Readme before migration + +***WARNING:*** All data migrations carry a level of risk. Helm v2 migration is no different. +You should be aware of any risks specific to your environment and prepare a data migration +strategy for your needs. + +Here are some suggestions to mitigate against potential risks during migration: + +- Perform a data backup of the following: + - Helm v2 home folder. + - Release data from the cluster. Refer to [How Helm Uses ConfigMaps to Store Data](http://technosophos.com/2017/03/23/how-helm-uses-configmaps-to-store-data.html) + for details on how Helm v2 store release data in the cluster. This should apply + similarly if Helm v2 is configured for secrets. +- Avoid performing operations with Helm v3 until data migration is complete and you are + satisfied that it is working as expected. Otherwise, Helm v3 data might be overwritten. + The operations to avoid are chart install, adding repositories, plugin install etc. +- The recommended data migration path is as follows: + 1. Backup v2 data, as suggested above. + 2. Migrate [Helm v2 configuration](#migrate-helm-v2-configuration). + 3. Migrate [Helm v2 releases](#migrate-helm-v2-releases). + 4. When happy that Helm v3 is managing Helm v2 data as expected, then [clean up](#clean-up-helm-v2-data) Helm v2 data. + *Note:*: Only use the plugin to do clean up. Using `helm`, `kubectl` or other tools could lead to data loss and an indeterminate + state for the release(s). + +**Note:** +A Helm v2 client: + +- can manage 1 to many Kubernetes clusters. +- can connect to 1 to many Tiller instances for a cluster. + +This means that you have to cognisant of this when migrating as releases are deployed into clusters by Tiller and +its namespace. You have to therefore be aware of migrating for each cluster and each Tiller instance that is managed +by the Helm v2 client instance. [Clean up](#clean-up-helm-v2-data) should only be run once all migration for a Helm v2 client is complete. + +## Prerequisite + +- Helm v2 client installed on a system which manages releases on one to many clusters +- Helm v3 client with `2to3` plugin installed on the same system +- Access to the cluster(s) that Helm v2 client is managing and which Helm v3 will manage after migration. This access is similar to `kubectl` access using [kubeconfig files](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/). + The `--kubeconfig` and `--kube-context` flags can be used with the `convert` and `cleanup` commands to set the kubeconfig path and context to override the environment configuration. +- Access to the `tiller` namespace for required RBAC roles. If `Tillerless` setup, then a service account with the proper cluster wide RBAC roles will need to be used. If not used, `forbidden` errors will be thrown when trying to access restricted resources. + +## Recommended Prior to Migration + +This is a list of recommendations prior to migration: + +- [Latest](https://github.com/helm/helm/releases/tag/v2.17.0) Helm v2 version. +- [Latest](https://github.com/helm/helm/releases) Helm v3 version. +- Update Helm v2 releases to supported Kubernetes APIs prior to migrating. Check out [Deprecated Kubernetes APIs](https://v2.helm.sh/docs/using_helm/#deprecated-kubernetes-apis) docs and Helm [mapkubeapis plugin](https://github.com/hickeyma/helm-mapkubeapis) for more details. +- Upgrade Kubernetes clusters to [supported versions](https://kubernetes.io/docs/setup/release/version-skew-policy/). + +## Install + +Based on the version in `plugin.yaml`, release binary will be downloaded from GitHub: + +```console +$ helm plugin install https://github.com/helm/helm-2to3.git +Downloading and installing helm-2to3 v0.1.3 ... +https://github.com/helm/helm-2to3/releases/download/v0.1.3/helm-2to3_0.1.3_darwin_amd64.tar.gz +Installed plugin: 2to3 +``` + +### For Windows (using WSL) + +Helm's plugin install hook system relies on `/bin/sh`, regardless of the operating system present. Windows users can work around this by using Helm under [WSL](https://docs.microsoft.com/en-us/windows/wsl/install-win10). + +```console +$ wget https://get.helm.sh/helm-v3.0.0-linux-amd64.tar.gz +$ tar xzf helm-v3.0.0-linux-amd64.tar.gz +$ ./linux-amd64/helm plugin install https://github.com/helm/helm-2to3 +``` + +## Usage + +### Migrate Helm v2 configuration + +Migrate Helm v2 configuration in-place to Helm v3: + +```console +$ helm 2to3 move config [flags] + +Flags: + + --dry-run simulate a command + --skip-confirmation if set, skips confirmation message before performing move + -h, --help help for move +``` + +It will migrate: + +- Chart starters +- Repositories +- Plugins + +**Note:** + +- The `move config` command will create the Helm v3 config and data folders if they don't exist, and will override the `repositories.yaml` file if it does exist. +- For migration it uses default Helm v2 home and v3 config and data folders. To override those folders you need to set environment variables +`HELM_V2_HOME`, `HELM_V3_CONFIG` and `HELM_V3_DATA`: + +```console +$ export HELM_V2_HOME=$PWD/.helm2 +$ export HELM_V3_CONFIG=$PWD/.helm3 +$ export HELM_V3_DATA=$PWD/.helm3 +$ helm 2to3 move config +``` + +#### Readme after configuration migration + +- After running the command, check that all Helm v2 plugins work fine with the Helm v3. If any issue with a plugin, remove it (` plugin remove`) and +re-add (` plugin install`) it as required. +- The repository file `repositories.yaml` is copied to Helm v3 which contains references to repositories added in Helm v2. Local respoitories are not copied to Helm v3. +You should remove all local repositories from Helm v3 using ` repo remove` and re-add where necessary using ` repo add`. This is a necessary refresh to align references +for Helm v3. +- When you are happy with your repository list, update the Helm v3 repo ` repo update`. This cleans up any Helm v2 cache references from Helm v3. + +### Migrate Helm v2 releases + +Migrate Helm v2 releases in-place to Helm v3 + +```console +$ helm 2to3 convert [flags] RELEASE + +Flags: + + --delete-v2-releases v2 release versions are deleted after migration. By default, the v2 release versions are retained + --dry-run simulate a command + -h, --help help for convert + --kube-context string name of the kubeconfig context to use + --kubeconfig string path to the kubeconfig file + -l, --label string label to select Tiller resources by (default "OWNER=TILLER") + -s, --release-storage string v2 release storage type/object. It can be 'secrets' or 'configmaps'. This is only used with the 'tiller-out-cluster' flag (default "secrets") + --release-versions-max int limit the maximum number of versions converted per release. Use 0 for no limit (default 10) + -t, --tiller-ns string namespace of Tiller (default "kube-system") + --tiller-out-cluster when Tiller is not running in the cluster e.g. Tillerless +``` + +**Note:** There is a limit set on the number of versions/revisions of a release that are converted. It is defaulted to 10 but can be configured with the `--release-versions-max` flag. +When the limit set is less that the actual number of versions then only the latest release versions up to the limit will be converted. Older release versions with not be converted. +If `--delete-v2-releases` is set, these older versions will remain in Helm v2 storage but will no longer be visible to Helm v2 commands like `helm list`. [Clean up](#clean-up-helm-v2-data) +will remove them from storage. + +### Clean up Helm v2 data + +Clean up Helm v2 configuration, release data and Tiller deployment: + +```console +$ helm 2to3 cleanup [flags] + +Flags: + + --config-cleanup if set, configuration cleanup performed + --dry-run simulate a command + -h, --help help for cleanup + --kube-context string name of the kubeconfig context to use + --kubeconfig string path to the kubeconfig file + -l, --label string label to select Tiller resources by (default "OWNER=TILLER") + --name string the release name. When it is specified, the named release and its versions will be removed only. Should not be used with other cleanup operations + --release-cleanup if set, release data cleanup performed + -s, --release-storage string v2 release storage type/object. It can be 'secrets' or 'configmaps'. This is only used with the 'tiller-out-cluster' flag (default "secrets") + --skip-confirmation if set, skips confirmation message before performing cleanup + --tiller-cleanup if set, Tiller cleanup performed + -t, --tiller-ns string namespace of Tiller (default "kube-system") + --tiller-out-cluster when Tiller is not running in the cluster e.g. Tillerless +``` + +A full clean will remove the: + +- Configuration (Helm home directory) +- v2 release data +- Tiller deployment + +**Note:** Before performing a full or release data clean, remove any Helm v2 releases which have not been migrated to Helm v3 and are unwanted. They can be removed using the Helm v2 `delete` command. If they are not removed before clean up of the v2 release data then the Kubernetes resources deployed by the Helm release will remain in your cluster. In other words, the resources will be 'orphaned' without any Helm release associated. + +Cleanup of individual parts can be performed using the following flags: + +- `--config-cleanup` for configuration +- `--release-cleanup` for v2 release data +- `--tiller-cleanup` for Tiller deployment +- `--name` for a release and its versions. This is a singular operation and is not to be used with the other cleanup operations. + +If none of these flags are set, then full cleanup is performed. + +The cleanup uses the default Helm v2 home folder. +To override this folder you need to set the environment variable `HELM_V2_HOME`: + +```console +$ export HELM_V2_HOME=$PWD/.helm2 +$ helm 2to3 cleanup +``` + +**Warning:** The full `cleanup` command will remove the Helm v2 Configuration, Release Data and Tiller Deployment. +It cleans up all releases managed by Helm v2. It will not be possible to restore them if you haven't made a backup of the releases. +Helm v2 will not be usable afterwards. Full cleanup should only be run once all migration (clusters and Tiller instances) for a Helm v2 client instance is complete. +Helm v2 may also become unusable depending on cleanup of individual parts. + +## Troubleshooting + +***Q. I get an error when I try to do a chart dependency update in Helm v3 after configuration migration*** + +Error might be similar to the following: + +```console +$ helm dep update chrt-1/ +Hang tight while we grab the latest from your chart repositories... +...Unable to get an update from the "local" chart repository (http://127.0.0.1:8879/charts): +Get http://127.0.0.1:8879/charts/index.yaml: dial tcp 127.0.0.1:8879: connect: connection refused +...Successfully got an update from the "stable" chart repository +Update Complete. ⎈Happy Helming!⎈ +Error: open /home/usr1/.cache/helm/repository/local-index.yaml: no such file or directory +``` + +A. Local respoitories are not copied to Helm v3. You therefore need to remove all local repositories from Helm v3 using ` repo remove` and re-add where +required using ` repo add`. This is a necessary refresh to align references for Helm v3 and remove the conflict. It is worthwhile to also refresh the +repository list afterwards: ` repo update`. You should then be able to run the chart dependency update command successfully. + +***Q. I get an error when I try to do a helm upgrade in Helm v3 after migration*** + +Error might be similar to the following: + +```console +$ helm upgrade nginx bitnami/nginx +Error: failed to download "bitnami/nginx" (hint: running `helm repo update` may help) +``` + +A. This can happen when there are conflicts in the local repository list that Helm v3 cannot resolve. This can be fixed by running the `helm repo update` command. + +## Frequently Asked Questions + +***Q. How do you perform Helm v2 release migration as a batch operation?*** + +A. You can perform batch migration of releases using a command as follows: + +```console +$ kubectl get [configmap|secret] -n \ + -l "OWNER=TILLER" | awk '{print $1}' | grep -v NAME | cut -d '.' -f1 | uniq | xargs -n1 helm 2to3 convert +``` + +An example of migrating releases which are stored as ConfigMaps in Tiller namespace `kube-system`: + +```console +$ kubectl get configmap -n kube-system -l "OWNER=TILLER" \ + | awk '{print $1}' | grep -v NAME | cut -d '.' -f1 | uniq | xargs -n1 helm 2to3 convert +``` + +## Developer (From Source) Install + +If you would like to handle the build yourself, this is the recommended way to do it. + +You must first have [Go v1.13](http://golang.org) installed, and then you run: + +```console +$ mkdir -p ${GOPATH}/src/github.com/helm +$ cd $_ +$ git clone git@github.com:helm/helm-2to3.git +$ cd helm-2to3 +$ make build +$ export HELM_LINTER_PLUGIN_NO_INSTALL_HOOK=true +$ helm plugin install /helm-2to3 +``` + +That last command will use the binary that you built. diff --git a/cmd/cleanup.go b/cmd/cleanup.go new file mode 100644 index 0000000..e35f7f7 --- /dev/null +++ b/cmd/cleanup.go @@ -0,0 +1,233 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cmd + +import ( + "errors" + "fmt" + "io" + "log" + "strings" + + "github.com/spf13/cobra" + + "github.com/helm/helm-2to3/pkg/common" + utils "github.com/helm/helm-2to3/pkg/utils" + v2 "github.com/helm/helm-2to3/pkg/v2" +) + +var ( + configCleanup bool + releaseName string + releaseCleanup bool + skipConfirmation bool + tillerCleanup bool +) + +type CleanupOptions struct { + ConfigCleanup bool + DryRun bool + ReleaseName string + ReleaseCleanup bool + SkipConfirmation bool + StorageType string + TillerCleanup bool + TillerLabel string + TillerNamespace string + TillerOutCluster bool +} + +func newCleanupCmd(out io.Writer) *cobra.Command { + cmd := &cobra.Command{ + Use: "cleanup", + Short: "cleanup Helm v2 configuration, release data and Tiller deployment", + Args: func(cmd *cobra.Command, args []string) error { + return nil + }, + RunE: runCleanup, + } + + flags := cmd.Flags() + settings.AddFlags(flags) + + flags.BoolVar(&configCleanup, "config-cleanup", false, "if set, configuration cleanup performed") + flags.StringVar(&releaseName, "name", "", "the release name. When it is specified, the named release and its versions will be removed only. Should not be used with other cleanup operations") + flags.BoolVar(&releaseCleanup, "release-cleanup", false, "if set, release data cleanup performed") + flags.BoolVar(&skipConfirmation, "skip-confirmation", false, "if set, skips confirmation message before performing cleanup") + flags.BoolVar(&tillerCleanup, "tiller-cleanup", false, "if set, Tiller cleanup performed") + + return cmd +} + +func runCleanup(cmd *cobra.Command, args []string) error { + cleanupOptions := CleanupOptions{ + ConfigCleanup: configCleanup, + DryRun: settings.DryRun, + ReleaseCleanup: releaseCleanup, + ReleaseName: releaseName, + SkipConfirmation: skipConfirmation, + StorageType: settings.ReleaseStorage, + TillerCleanup: tillerCleanup, + TillerLabel: settings.Label, + TillerNamespace: settings.TillerNamespace, + TillerOutCluster: settings.TillerOutCluster, + } + + kubeConfig := common.KubeConfig{ + Context: settings.KubeContext, + File: settings.KubeConfigFile, + } + + return Cleanup(cleanupOptions, kubeConfig) +} + +// Cleanup will delete all release data for in specified namespace and owner label. It will remove +// the Tiller server deployed as per namespace and owner label. It is also delete the Helm gv2 home directory +// which contains the Helm configuration. Helm v2 will be unusable after this operation. +func Cleanup(cleanupOptions CleanupOptions, kubeConfig common.KubeConfig) error { + var message strings.Builder + + if cleanupOptions.ReleaseName != "" { + if cleanupOptions.ConfigCleanup || cleanupOptions.TillerCleanup { + return errors.New("cleanup of a specific release is a singular operation. Other operations like configuration cleanup or Tiller cleanup are not allowed in conjunction with the operation") + } + cleanupOptions.ReleaseCleanup = true + } else { + if !cleanupOptions.ConfigCleanup && !cleanupOptions.ReleaseCleanup && !cleanupOptions.TillerCleanup { + cleanupOptions.ConfigCleanup = true + cleanupOptions.ReleaseCleanup = true + cleanupOptions.TillerCleanup = true + } + } + + if cleanupOptions.DryRun { + log.Println("NOTE: This is in dry-run mode, the following actions will not be executed.") + log.Println("Run without --dry-run to take the actions described below:") + log.Println() + } + + fmt.Fprint(&message, "WARNING: ") + if cleanupOptions.ConfigCleanup { + fmt.Fprint(&message, "\"Helm v2 Configuration\" ") + } + if cleanupOptions.ReleaseCleanup { + if cleanupOptions.ReleaseName == "" { + fmt.Fprint(&message, "\"Release Data\" ") + } else { + fmt.Fprint(&message, fmt.Sprintf("\"Release '%s' Data\" ", cleanupOptions.ReleaseName)) + } + } + if cleanupOptions.TillerCleanup { + fmt.Fprint(&message, "\"Tiller\" ") + } + fmt.Fprintln(&message, "will be removed. ") + if cleanupOptions.ReleaseCleanup && cleanupOptions.ReleaseName == "" { + fmt.Fprintln(&message, "This will clean up all releases managed by Helm v2. It will not be possible to restore them if you haven't made a backup of the releases.") + } + if cleanupOptions.ReleaseName == "" { + fmt.Fprintln(&message, "Helm v2 may not be usable afterwards.") + } + + fmt.Println(message.String()) + + var doCleanup bool + var err error + if cleanupOptions.SkipConfirmation { + log.Println("Skipping confirmation before performing cleanup.") + doCleanup = true + err = nil + } else { + doCleanup, err = utils.AskConfirmation("Cleanup", "cleanup Helm v2 data") + } + if err != nil { + return err + } + if !doCleanup { + log.Println("Cleanup will not proceed as the user didn't answer (Y|y) in order to continue.") + return nil + } + + log.Printf("\nHelm v2 data will be cleaned up.\n") + + if cleanupOptions.ReleaseCleanup { + if cleanupOptions.ReleaseName == "" { + log.Println("[Helm 2] Releases will be deleted.") + } else { + log.Printf("[Helm 2] Release '%s' will be deleted.\n", cleanupOptions.ReleaseName) + } + retrieveOptions := v2.RetrieveOptions{ + ReleaseName: cleanupOptions.ReleaseName, + TillerNamespace: cleanupOptions.TillerNamespace, + TillerLabel: cleanupOptions.TillerLabel, + TillerOutCluster: cleanupOptions.TillerOutCluster, + StorageType: cleanupOptions.StorageType, + } + if cleanupOptions.ReleaseName == "" { + err = v2.DeleteAllReleaseVersions(retrieveOptions, kubeConfig, cleanupOptions.DryRun) + } else { + // Get the releases versions as its the versions that are deleted + v2Releases, err := v2.GetReleaseVersions(retrieveOptions, kubeConfig) + if err != nil { + return err + } + versions := []int32{} + v2RelVerLen := len(v2Releases) + for i := 0; i < v2RelVerLen; i++ { + v2Release := v2Releases[i] + versions = append(versions, v2Release.Version) + } + deleteOptions := v2.DeleteOptions{ + DryRun: cleanupOptions.DryRun, + Versions: versions, + } + err = v2.DeleteReleaseVersions(retrieveOptions, deleteOptions, kubeConfig) + } + if err != nil { + return err + } + if !cleanupOptions.DryRun { + if cleanupOptions.ReleaseName == "" { + log.Println("[Helm 2] Releases deleted.") + } else { + log.Printf("[Helm 2] Release '%s' deleted.\n", cleanupOptions.ReleaseName) + } + } + } + + if !cleanupOptions.TillerOutCluster && cleanupOptions.TillerCleanup { + log.Printf("[Helm 2] Tiller in \"%s\" namespace will be removed.\n", cleanupOptions.TillerNamespace) + err = v2.RemoveTiller(cleanupOptions.TillerNamespace, cleanupOptions.DryRun) + if err != nil { + return err + } + if !cleanupOptions.DryRun { + log.Printf("[Helm 2] Tiller in \"%s\" namespace was removed.\n", cleanupOptions.TillerNamespace) + } + } + + if cleanupOptions.ConfigCleanup { + err = v2.RemoveHomeFolder(cleanupOptions.DryRun) + if err != nil { + return err + } + } + + if !cleanupOptions.DryRun { + log.Println("Helm v2 data was cleaned up successfully.") + } + return nil +} diff --git a/cmd/convert.go b/cmd/convert.go new file mode 100644 index 0000000..04a8b39 --- /dev/null +++ b/cmd/convert.go @@ -0,0 +1,185 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cmd + +import ( + "errors" + "io" + "log" + + "github.com/spf13/cobra" + v2rel "k8s.io/helm/pkg/proto/hapi/release" + + common "github.com/helm/helm-2to3/pkg/common" + v2 "github.com/helm/helm-2to3/pkg/v2" + v3 "github.com/helm/helm-2to3/pkg/v3" +) + +var ( + deletev2Releases bool + maxReleaseVersions int +) + +type ConvertOptions struct { + DeleteRelease bool + DryRun bool + MaxReleaseVersions int + ReleaseName string + StorageType string + TillerLabel string + TillerNamespace string + TillerOutCluster bool +} + +func newConvertCmd(out io.Writer) *cobra.Command { + cmd := &cobra.Command{ + Use: "convert [flags] RELEASE", + Short: "migrate Helm v2 release in-place to Helm v3", + Args: func(cmd *cobra.Command, args []string) error { + if len(args) != 1 { + return errors.New("name of release to be converted has to be defined") + } + return nil + }, + + RunE: runConvert, + } + + flags := cmd.Flags() + settings.AddFlags(flags) + + flags.BoolVar(&deletev2Releases, "delete-v2-releases", false, "v2 release versions are deleted after migration. By default, the v2 release versions are retained") + flags.IntVar(&maxReleaseVersions, "release-versions-max", 10, "limit the maximum number of versions converted per release. Use 0 for no limit") + + return cmd + +} + +func runConvert(cmd *cobra.Command, args []string) error { + releaseName := args[0] + if settings.ReleaseStorage != "configmaps" && settings.ReleaseStorage != "secrets" { + return errors.New("release-storage flag needs to be 'configmaps' or 'secrets'") + } + convertOptions := ConvertOptions{ + DeleteRelease: deletev2Releases, + DryRun: settings.DryRun, + MaxReleaseVersions: maxReleaseVersions, + ReleaseName: releaseName, + StorageType: settings.ReleaseStorage, + TillerLabel: settings.Label, + TillerNamespace: settings.TillerNamespace, + TillerOutCluster: settings.TillerOutCluster, + } + kubeConfig := common.KubeConfig{ + Context: settings.KubeContext, + File: settings.KubeConfigFile, + } + + return Convert(convertOptions, kubeConfig) +} + +// Convert converts Helm 2 release into Helm 3 release. It maps the Helm v2 release versions +// of the release into Helm v3 equivalent and stores the release versions. The underlying Kubernetes resources +// are untouched. Note: The namespaces of each release version need to exist in the Kubernetes cluster. +// The Helm 2 release is retained by default, unless the '--delete-v2-releases' flag is set. +func Convert(convertOptions ConvertOptions, kubeConfig common.KubeConfig) error { + if convertOptions.DryRun { + log.Println("NOTE: This is in dry-run mode, the following actions will not be executed.") + log.Println("Run without --dry-run to take the actions described below:") + log.Println() + } + + log.Printf("Release \"%s\" will be converted from Helm v2 to Helm v3.\n", convertOptions.ReleaseName) + + log.Printf("[Helm 3] Release \"%s\" will be created.\n", convertOptions.ReleaseName) + + retrieveOptions := v2.RetrieveOptions{ + ReleaseName: convertOptions.ReleaseName, + TillerNamespace: convertOptions.TillerNamespace, + TillerLabel: convertOptions.TillerLabel, + TillerOutCluster: convertOptions.TillerOutCluster, + StorageType: convertOptions.StorageType, + } + v2Releases, err := v2.GetReleaseVersions(retrieveOptions, kubeConfig) + if err != nil { + return err + } + + // Limit release versions to migrate. + // Limit is based on newest versions. + v2RelVerLen := len(v2Releases) + startIndex := 0 + if convertOptions.MaxReleaseVersions > 0 && convertOptions.MaxReleaseVersions < v2RelVerLen { + log.Println() + log.Printf("NOTE: The max release versions \"%d\" is less than the actual release versions \"%d\".", convertOptions.MaxReleaseVersions, v2RelVerLen) + log.Printf("This means only \"%d\" of the latest release versions will be converted.", convertOptions.MaxReleaseVersions) + if convertOptions.DeleteRelease { + log.Println("This also means some versions will remain in Helm v2 storage that will no longer be visible to Helm v2 commands like 'helm list'. Plugin 'cleanup' command will remove them from storage.") + } + log.Println() + startIndex = v2RelVerLen - convertOptions.MaxReleaseVersions + } + + versions := []int32{} + for i := startIndex; i < v2RelVerLen; i++ { + v2Release := v2Releases[i] + relVerName := v2.GetReleaseVersionName(convertOptions.ReleaseName, v2Release.Version) + log.Printf("[Helm 3] ReleaseVersion \"%s\" will be created.\n", relVerName) + if !convertOptions.DryRun { + if err := createV3ReleaseVersion(v2Release, kubeConfig); err != nil { + return err + } + log.Printf("[Helm 3] ReleaseVersion \"%s\" created.\n", relVerName) + } + versions = append(versions, v2Release.Version) + } + if !convertOptions.DryRun { + log.Printf("[Helm 3] Release \"%s\" created.\n", convertOptions.ReleaseName) + } + + if convertOptions.DeleteRelease { + log.Printf("[Helm 2] Release \"%s\" will be deleted.\n", convertOptions.ReleaseName) + deleteOptions := v2.DeleteOptions{ + DryRun: convertOptions.DryRun, + Versions: versions, + } + if err := v2.DeleteReleaseVersions(retrieveOptions, deleteOptions, kubeConfig); err != nil { + return err + } + if !convertOptions.DryRun { + log.Printf("[Helm 2] Release \"%s\" deleted.\n", convertOptions.ReleaseName) + + log.Printf("Release \"%s\" was converted successfully from Helm v2 to Helm v3.\n", convertOptions.ReleaseName) + } + } else { + if !convertOptions.DryRun { + log.Printf("Release \"%s\" was converted successfully from Helm v2 to Helm v3.\n", convertOptions.ReleaseName) + log.Println("Note: The v2 release information still remains and should be removed to avoid conflicts with the migrated v3 release.") + log.Println("v2 release information should only be removed using `helm 2to3` cleanup and when all releases have been migrated over.") + } + } + + return nil +} + +func createV3ReleaseVersion(v2Release *v2rel.Release, kubeConfig common.KubeConfig) error { + v3Release, err := v3.CreateRelease(v2Release) + if err != nil { + return err + } + return v3.StoreRelease(v3Release, kubeConfig) +} diff --git a/cmd/environment.go b/cmd/environment.go new file mode 100644 index 0000000..af595b3 --- /dev/null +++ b/cmd/environment.go @@ -0,0 +1,51 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cmd + +import "github.com/spf13/pflag" + +type EnvSettings struct { + DryRun bool + KubeConfigFile string + KubeContext string + Label string + ReleaseStorage string + TillerNamespace string + TillerOutCluster bool +} + +func New() *EnvSettings { + envSettings := EnvSettings{} + return &envSettings +} + +// AddBaseFlags binds base flags to the given flagset. +func (s *EnvSettings) AddBaseFlags(fs *pflag.FlagSet) { + fs.BoolVar(&s.DryRun, "dry-run", false, "simulate a command") +} + +// AddFlags binds flags to the given flagset. +func (s *EnvSettings) AddFlags(fs *pflag.FlagSet) { + s.AddBaseFlags(fs) + fs.StringVar(&s.KubeConfigFile, "kubeconfig", "", "path to the kubeconfig file") + fs.StringVar(&s.KubeContext, "kube-context", s.KubeContext, "name of the kubeconfig context to use") + fs.StringVarP(&s.TillerNamespace, "tiller-ns", "t", "kube-system", "namespace of Tiller") + fs.StringVarP(&s.Label, "label", "l", "OWNER=TILLER", "label to select Tiller resources by") + fs.BoolVar(&s.TillerOutCluster, "tiller-out-cluster", false, "when Tiller is not running in the cluster e.g. Tillerless") + fs.StringVarP(&s.ReleaseStorage, "release-storage", "s", "secrets", "v2 release storage type/object. It can be 'secrets' or 'configmaps'. This is only used with the 'tiller-out-cluster' flag") + +} diff --git a/cmd/move_config.go b/cmd/move_config.go new file mode 100644 index 0000000..944f947 --- /dev/null +++ b/cmd/move_config.go @@ -0,0 +1,95 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cmd + +import ( + "errors" + "io" + "log" + + "github.com/spf13/cobra" + + utils "github.com/helm/helm-2to3/pkg/utils" +) + +func newMoveConfigCmd(out io.Writer) *cobra.Command { + cmd := &cobra.Command{ + Use: "move config", + Short: "migrate Helm v2 configuration in-place to Helm v3", + Args: func(cmd *cobra.Command, args []string) error { + if len(args) != 1 { + return errors.New("config argument has to be specified") + } + return nil + }, + RunE: runMove, + } + + flags := cmd.Flags() + settings.AddBaseFlags(flags) + flags.BoolVar(&skipConfirmation, "skip-confirmation", false, "if set, skips confirmation message before performing move") + return cmd +} + +func runMove(cmd *cobra.Command, args []string) error { + moveArgName := args[0] + + if moveArgName != "config" { + return errors.New("config argument has to be specified") + } + + return Move(settings.DryRun) +} + +// Moves/copies v2 configuration to v2 configuration. It copies repository config, +// plugins and starters. It does not copy cache. +func Move(dryRun bool) error { + var err error + var doConfig bool + if dryRun { + log.Println("NOTE: This is in dry-run mode, the following actions will not be executed.") + log.Println("Run without --dry-run to take the actions described below:") + log.Println() + } + + log.Println("WARNING: Helm v3 configuration may be overwritten during this operation.") + log.Println() + if skipConfirmation { + + log.Println("Skipping confirmation before performing move configuration.") + doConfig = true + } else { + doConfig, err = utils.AskConfirmation("Move config", "move the v2 configuration") + if err != nil { + return err + } + } + if !doConfig { + log.Println("Move will not proceed as the user didn't answer (Y|y) in order to continue.") + return nil + } + + log.Println("\nHelm v2 configuration will be moved to Helm v3 configuration.") + err = utils.Copyv2HomeTov3(dryRun) + if err != nil { + return err + } + if !dryRun { + log.Println("Helm v2 configuration was moved successfully to Helm v3 configuration.") + } + return nil +} diff --git a/cmd/root.go b/cmd/root.go new file mode 100644 index 0000000..4f4bc24 --- /dev/null +++ b/cmd/root.go @@ -0,0 +1,70 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cmd + +import ( + "errors" + "io" + "os" + + "github.com/spf13/cobra" +) + +var ( + settings *EnvSettings +) + +func NewRootCmd(out io.Writer, args []string) *cobra.Command { + cmd := &cobra.Command{ + Use: "2to3", + Short: "Migrate and Cleanup Helm v2 configuration and releases in-place to Helm v3", + Long: "Migrate and Cleanup Helm v2 configuration and releases in-place to Helm v3", + SilenceUsage: true, + Args: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + return errors.New("no arguments accepted") + } + return nil + }, + } + + flags := cmd.PersistentFlags() + flags.Parse(args) + settings = new(EnvSettings) + + // When run with the Helm plugin framework, Helm plugins are not passed the + // plugin flags that correspond to Helm global flags e.g. helm 2to3 convert --kube-context ... + // The flag values are set to corresponding environment variables instead. + // The flags are passed as expected when run directly using the binary. + // The below allows to use Helm's --kube-context global flag. + if ctx := os.Getenv("HELM_KUBECONTEXT"); ctx != "" { + settings.KubeContext = ctx + } + + // Note that the plugin's --kubeconfig flag is set by the Helm plugin framework to + // the KUBECONFIG environment variable instead of being passed into the plugin. + // That variable is transparently handled by the helm-plugin-utils package so does not + // need to be explicitely handled here. + + cmd.AddCommand( + newCleanupCmd(out), + newConvertCmd(out), + newMoveConfigCmd(out), + ) + + return cmd +} diff --git a/code-of-conduct.md b/code-of-conduct.md new file mode 100644 index 0000000..91ccaf0 --- /dev/null +++ b/code-of-conduct.md @@ -0,0 +1,3 @@ +# Community Code of Conduct + +Helm follows the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md). diff --git a/completion.yaml b/completion.yaml new file mode 100644 index 0000000..cf8a59d --- /dev/null +++ b/completion.yaml @@ -0,0 +1,34 @@ +commands: +- name: cleanup + flags: + - config-cleanup + - dry-run + - l + - label + - name + - release-cleanup + - s + - release-storage + - skip-confirmation + - tiller-cleanup + - t + - tiller-ns + - tiller-out-cluster +- name: convert + flags: + - delete-v2-releases + - dry-run + - l + - label + - s + - release-storage + - release-versions-max + - t + - tiller-ns + - tiller-out-cluster +- name: move + commands: + - name: config + flags: + - dry-run + - skip-confirmation diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..f839906 --- /dev/null +++ b/go.mod @@ -0,0 +1,24 @@ +module github.com/helm/helm-2to3 + +go 1.16 + +require ( + github.com/Masterminds/semver v1.5.0 // indirect + github.com/golang/protobuf v1.4.3 + github.com/maorfr/helm-plugin-utils v0.0.0-20200827170302-51b70049c73f + github.com/mitchellh/go-homedir v1.1.0 + github.com/pkg/errors v0.9.1 + github.com/spf13/cobra v1.1.1 + github.com/spf13/pflag v1.0.5 + github.com/ugorji/go v1.1.4 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect + helm.sh/helm/v3 v3.5.2 + k8s.io/apimachinery v0.20.2 + k8s.io/helm v2.17.0+incompatible +) + +replace ( + github.com/Azure/go-autorest => github.com/Azure/go-autorest v13.3.2+incompatible + github.com/docker/distribution => github.com/docker/distribution v0.0.0-20191216044856-a8371794149d + gotest.tools => gotest.tools/v3 v3.0.2 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..60bf15d --- /dev/null +++ b/go.sum @@ -0,0 +1,1399 @@ +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0 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.51.0 h1:PvKAVQWCtlGUSlZkGW3QLelKaWq7KYv/MW1EboG8bfM= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0 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/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +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/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v13.3.2+incompatible h1:VxzPyuhtnlBOzc4IWCZHqpyH2d+QMLQEuy3wREyY4oc= +github.com/Azure/go-autorest v13.3.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.9.0 h1:MRvx8gncNaXJqOoLmhNjUAKh33JJF8LyxPhomEtOsjs= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.9.6 h1:5YWtOnckcudzIw8lPPBcWOnmIFWMtHci1ZWAZulMSx0= +github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest v0.11.1 h1:eVvIXUKiTgv++6YnWb42DUA1YL7qDugnKP0HljexdnQ= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest/adal v0.5.0 h1:q2gDruN08/guU9vAjuPWff0+QIrpH6ediguzdAzXAUU= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.2 h1:O1X4oexUxnZCaEUGsvMnr8ZGj8HI37tNezwY4npRqA0= +github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +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 h1:Y3bBUV4rTuxenJJs41HU3qmqsb+auo+a3Lz+PlJPpL0= +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 h1:YGrhWfrgtFs84+h0o46rJrlmsZtyZRg470CqAXTZaGM= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +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 h1:Ww5g4zThfD/6cLb4z6xxgeyDa7QDkizMkJKe0ysZXp0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/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 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= +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/DATA-DOG/go-sqlmock v1.4.1 h1:ThlnYciV1iM/V0OSF/dtkqWb6xo5qITT1TJBG1MRDJM= +github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU= +github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= +github.com/Masterminds/goutils v1.1.0 h1:zukEsf/1JZwCMgHiK3GZftabmxiCw4apj3a28RPBiVg= +github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.0.3 h1:znjIyLfpXEDQjOIEWh+ehwpTU14UzUPub3c3sm36u14= +github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.1.0 h1:Y2lUDsFKVRSYGojLJ1yLxSXdMmMYTYls0rCvoqmMUQk= +github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig/v3 v3.0.2 h1:wz22D0CiSctrliXiI9ZO3HoNApweeRGftyDN+BQa3B8= +github.com/Masterminds/sprig/v3 v3.0.2/go.mod h1:oesJ8kPONMONaZgtiHNzUShJbksypC5kWczhZAf6+aU= +github.com/Masterminds/sprig/v3 v3.1.0 h1:j7GpgZ7PdFqNsmncycTHsLmVPf5/3wJtlgW9TNDYD9Y= +github.com/Masterminds/sprig/v3 v3.1.0/go.mod h1:ONGMf7UfYGAbMXCZmQLy8x3lCDIPrEZE/rU8pmrbihA= +github.com/Masterminds/sprig/v3 v3.2.0 h1:P1ekkbuU73Ui/wS0nK1HOM37hh4xdfZo485UPf8rc+Y= +github.com/Masterminds/sprig/v3 v3.2.0/go.mod h1:tWhwTbUTndesPNeF0C900vKoq283u6zp4APT9vaF3SI= +github.com/Masterminds/squirrel v1.4.0 h1:he5i/EXixZxrBUWcxzDYMiju9WZ3ld/l7QBNuo/eN3w= +github.com/Masterminds/squirrel v1.4.0/go.mod h1:yaPeOnPG5ZRwL9oKdTsO/prlkPbXWZlRVMQ/gGlzIuA= +github.com/Masterminds/squirrel v1.5.0 h1:JukIZisrUXadA9pl3rMkjhiamxiB0cXiu+HGp/Y8cY8= +github.com/Masterminds/squirrel v1.5.0/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= +github.com/Masterminds/vcs v1.13.1/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/hcsshim v0.8.7 h1:ptnOoufxGSzauVTsdE+wMYnCWA301PdoN4xg5oRdZpg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 h1:zV3ejI06GQ59hwDQAvmK1qxOQGB3WuVTRoY0okPTAv0= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= +github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/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/bshuster-repo/logrus-logstash-hook v0.4.1 h1:pgAtgj+A31JBVtEHu2uHuEx0n+2ukqUJnS2vVe5pQNA= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= +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/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +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/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f h1:tSNMc+rJDfmYntojat8lljbt1mgKNpTxUZJsSzJ9Y1s= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2 h1:ForxmXkA6tPIvffbrDAcPUIB32QgXkt2XFj+F0UxetA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.4 h1:3o0smo5SKY7H6AJCmJhsnCjR2/V2T8VmiHt7seN2/kI= +github.com/containerd/containerd v1.3.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200107194136-26c1120b8d41 h1:kIFnQBO7rQ0XkMe6xEwbybYHBEaWmh/f++laI6Emt7M= +github.com/containerd/continuity v0.0.0-20200107194136-26c1120b8d41/go.mod h1:Dq467ZllaHgAtVp4p1xUQWBrFXR9s/wyoTpG8zOJGkY= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= +github.com/deislabs/oras v0.8.1 h1:If674KraJVpujYR00rzdi0QAmW4BxzMJPVAZJKuhQ0c= +github.com/deislabs/oras v0.8.1/go.mod h1:Mx0rMSbBNaNfY9hjpccEnxkOqJL6KGjtxNHPLC4G4As= +github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v0.0.0-20200130152716-5d0cf8839492 h1:FwssHbCDJD025h+BchanCwE1Q8fyMgqDr2mOQAWOLGw= +github.com/docker/cli v0.0.0-20200130152716-5d0cf8839492/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v0.0.0-20191216044856-a8371794149d h1:jC8tT/S0OGx2cswpeUTn4gOIea8P08lD3VFQT0cOZ50= +github.com/docker/distribution v0.0.0-20191216044856-a8371794149d/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20200203170920-46ec8731fbce h1:KXS1Jg+ddGcWA8e1N7cupxaHHZhit5rB9tfDU+mfjyY= +github.com/docker/docker v1.4.2-0.20200203170920-46ec8731fbce/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ= +github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916 h1:yWHOI+vFjEsAakUTSrtqc/SAHrhSkmn48pqjidZX3QA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e h1:p1yVGRW3nmb85p1Sh1ZJSDm4A4iKLS5QNbvUHMgGu/M= +github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= +github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +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/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= +github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= +github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= +github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7 h1:LofdAjjjqCSXMwLGgOgnE+rdPuvX9DxCqaHwKy7i/ko= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-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-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= +github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= +github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= +github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= +github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= +github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= +github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= +github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= +github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.1 h1:OQl5ys5MBea7OGCdvPbBJWRgnhC/fGona6QKfvFeau8= +github.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= +github.com/gobuffalo/logger v1.0.1 h1:ZEgyRGgAm4ZAhAO45YXMs5Fp+bzGLESFewzAVBMKuTg= +github.com/gobuffalo/logger v1.0.1/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= +github.com/gobuffalo/packd v0.3.0 h1:eMwymTkA1uXsqxS0Tpoop3Lc0u3kTfiMBE6nKtQU4g4= +github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= +github.com/gobuffalo/packr/v2 v2.7.1 h1:n3CIW5T17T8v4GGK5sWXLVWJhCz7b5aNLSxW6gYim4o= +github.com/gobuffalo/packr/v2 v2.7.1/go.mod h1:qYEvAazPaVxy7Y7KR0W8qYEE+RymX74kETFqjFoFlOc= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godror/godror v0.13.3/go.mod h1:2ouUT4kdhUBk7TAkHWD4SN0CdI0pgEQbo8FVHhbSKWg= +github.com/gofrs/flock v0.7.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef 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 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/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/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho= +github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8= +github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 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 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/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 h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.1.0 h1:rVsPeBmXbYv4If/cumu1AzZPwV58q433hvONV1UEZoI= +github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/gophercloud/gophercloud v0.1.0 h1:P/nh25+rzXouhytV2pUHBb65fnds26Ghl8/391+sT5o= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33 h1:893HsJqtxp9z1SF76gg6hY70hRY1wVlTSnC/h1yUDCo= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.2 h1:zoNxOV7WjqXptQOVngLmcSQgXmgk4NMz1HibBchjl/I= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= +github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= +github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/xstrings v1.2.0 h1:yPeWdRnmynF7p+lLYz0H2tthW9lqhMJrQV/U7yy4wX0= +github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= +github.com/huandu/xstrings v1.3.1 h1:4jgBlKK6tLKFvO8u5pmYjG91cqytmDCDvGh7ECVFfFs= +github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +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.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= +github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +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/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +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= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.7.0 h1:h93mCPfUSkaul3Ka/VG8uZdmW1uMHDGxzu0NWHuJmHY= +github.com/lib/pq v1.7.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg= +github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.9.0 h1:L8nSXQQzAYByakOFMTwpjRoHsMJklur4Gi59b6VivR8= +github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/maorfr/helm-plugin-utils v0.0.0-20200216074820-36d2fcf6ae86 h1:vid6FPDLVrjL2MJa51eFFO/N85bqKPocGbeIxEhCW/U= +github.com/maorfr/helm-plugin-utils v0.0.0-20200216074820-36d2fcf6ae86/go.mod h1:p3gwmRSFqbWw6plBpR0sKl3n3vpu8kX70gvCJKMvvCA= +github.com/maorfr/helm-plugin-utils v0.0.0-20200827170302-51b70049c73f h1:Xc2+XDUJlImouFGtu9WG2D+Nq7+IvUhTSb3wv3ufatY= +github.com/maorfr/helm-plugin-utils v0.0.0-20200827170302-51b70049c73f/go.mod h1:2kexG48txGH8ZZfckCcl006XNZHFHjkQLjzOi/+U9dM= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-oci8 v0.0.7/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= +github.com/mattn/go-runewidth v0.0.2 h1:UnlwIPBGaTZfPQ6T1IGzPI0EkYAQmT9fAEJ/poFC63o= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-shellwords v1.0.9/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.12.0 h1:u/x3mp++qUxvYfulZ4HKOvVO0JWhk7HtE8lWhbGz/Do= +github.com/mattn/go-sqlite3 v1.12.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f h1:2+myh5ml7lgEU/51gbeLHfKGNfgEQQIWrlbdaOsidbQ= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd h1:aY7OQNf2XqY/JQ6qREWamhI/81os/agb2BAGpcx5yWI= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1 h1:GlxAyO6x8rfZYN9Tt0Kti5a/cP41iuiO2yYT0IJGY8Y= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +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/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= +github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0 h1:miYCvYqFXtl/J9FIy8eNpBfYthAEFg+Ys0XyUVEcDsc= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.4.0 h1:LUa41nrWTQNGhzdsZ5lTnkwbNjj6rXTdazA1cSdjkOY= +github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rubenv/sql-migrate v0.0.0-20200616145509-8d140a17f351 h1:HXr/qUllAWv9riaI4zh2eXWKmCSDqVS/XH1MRHLKRwk= +github.com/rubenv/sql-migrate v0.0.0-20200616145509-8d140a17f351/go.mod h1:DCgfY80j8GYL7MLEfvcpSFvjD0L5yZq/aZUJmhZklyg= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +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= +github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 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 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xeipuuv/gojsonschema v1.1.0 h1:ngVtJC9TY/lg0AA/1k48FYhBrhRoFlEmWzsehpNAaZg= +github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= +github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.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.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs= +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/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/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-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d h1:9FCpayM9Egr1baVnV1SX0H87m+XB0B8S0hAMi99X/3U= +golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/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-20190125153040-c74c464bbbf2/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-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-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= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/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-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +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 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI= +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-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +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 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs= +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= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +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-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/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-20190916202348-b4ddaad3f8a3 h1:7TYNF4UdlohbFwpNH04CoPMp1cHUZgO1Ebq5r2hIjfo= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/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-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f h1:68K/z8GLUxV76xGSqwTWw2gyk/jwn79LUL43rES2g8o= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/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 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +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 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-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-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/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-20190328211700-ab21143f2384/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-20190624222133-a101b041ded4/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-20191004055002-72853e10c5a3/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/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/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-20200103221440-774c71fcf114/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/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +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= +gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +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.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +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/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= +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-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= +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 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a h1:pOwg4OoaRYScjmR4LlLgdtnyoHYTSAVhhqe5uPdpII8= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +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 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk= +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/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/gorp.v1 v1.7.2 h1:j3DWlAyGVv8whO7AcIWznQ2Yj7yJkn34B8s63GViAAw= +gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= +gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +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= +gotest.tools v1.4.0 h1:BjtEgfuw8Qyd+jPvQz8CfoxiO/UjFEidWinwEXZiWv0= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2 h1:kG1BFyqVHuQoVQiR1bWGnfz/fmHvvuiSPIV7rvl360E= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +helm.sh/helm/v3 v3.1.3 h1:5ZGCmJ/KkAxELcDFnBPOjmD3skpRkyqwo7aAxjfN0IU= +helm.sh/helm/v3 v3.1.3/go.mod h1:WYsFJuMASa/4XUqLyv54s0U/f3mlAaRErGmyy4z921g= +helm.sh/helm/v3 v3.3.0 h1:7BUpW5NI1pauKDnIh0ju53pNc3Ra/UyqqBr0b5OgBwY= +helm.sh/helm/v3 v3.3.0/go.mod h1:cWRDbGk4EiIL0/+jN0GI8T7m96Cps81/ta1kcacl85g= +helm.sh/helm/v3 v3.4.2 h1:ML8oFGsLQ36rawntKLFW1l/n8pI/bPB3c8947eQmDWo= +helm.sh/helm/v3 v3.4.2/go.mod h1:O4USJi4CwjSHEPPYmw2NpA1omXiaKu8ePA3cbxk66RQ= +helm.sh/helm/v3 v3.5.1 h1:XPn6xyH4Lcbx0sdUsVttt2E9jH2oJddpLLZtQH0XNfQ= +helm.sh/helm/v3 v3.5.1/go.mod h1:bjwXfmGAF+SEuJZ2AtN1xmTuz4FqaNYOJrXP+vtj6Tw= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.0.0-20191016110408-35e52d86657a/go.mod h1:/L5qH+AD540e7Cetbui1tuJeXdmNhO8jM6VkXeDdDhQ= +k8s.io/api v0.17.2 h1:NF1UFXcKN7/OOv1uxdRz3qfra8AHsPav5M93hlV9+Dc= +k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= +k8s.io/api v0.18.4 h1:8x49nBRxuXGUlDlwlWd3RMY1SayZrzFfxea3UZSkFw4= +k8s.io/api v0.18.4/go.mod h1:lOIQAKYgai1+vz9J7YcDZwC26Z0zQewYOGWdyIPUUQ4= +k8s.io/api v0.18.6 h1:osqrAXbOQjkKIWDTjrqxWQ3w0GkKb1KA1XkUGHHYpeE= +k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI= +k8s.io/api v0.18.8 h1:aIKUzJPb96f3fKec2lxtY7acZC9gQNDLVhfSGpxBAC4= +k8s.io/api v0.18.8/go.mod h1:d/CXqwWv+Z2XEG1LgceeDmHQwpUJhROPx16SlxJgERY= +k8s.io/api v0.19.4 h1:I+1I4cgJYuCDgiLNjKx7SLmIbwgj9w7N7Zr5vSIdwpo= +k8s.io/api v0.19.4/go.mod h1:SbtJ2aHCItirzdJ36YslycFNzWADYH3tgOhvBEFtZAk= +k8s.io/api v0.20.1 h1:ud1c3W3YNzGd6ABJlbFfKXBKXO+1KdGfcgGGNgFR03E= +k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= +k8s.io/apiextensions-apiserver v0.17.2 h1:cP579D2hSZNuO/rZj9XFRzwJNYb41DbNANJb6Kolpss= +k8s.io/apiextensions-apiserver v0.17.2/go.mod h1:4KdMpjkEjjDI2pPfBA15OscyNldHWdBCfsWMDWAmSTs= +k8s.io/apiextensions-apiserver v0.18.4 h1:Y3HGERmS8t9u12YNUFoOISqefaoGRuTc43AYCLzWmWE= +k8s.io/apiextensions-apiserver v0.18.4/go.mod h1:NYeyeYq4SIpFlPxSAB6jHPIdvu3hL0pc36wuRChybio= +k8s.io/apiextensions-apiserver v0.19.4 h1:D9ak9T012tb3vcGFWYmbQuj9SCC8YM4zhA4XZqsAQC4= +k8s.io/apiextensions-apiserver v0.19.4/go.mod h1:B9rpH/nu4JBCtuUp3zTTk8DEjZUupZTBEec7/2zNRYw= +k8s.io/apiextensions-apiserver v0.20.1 h1:ZrXQeslal+6zKM/HjDXLzThlz/vPSxrfK3OqL8txgVQ= +k8s.io/apiextensions-apiserver v0.20.1/go.mod h1:ntnrZV+6a3dB504qwC5PN/Yg9PBiDNt1EVqbW2kORVk= +k8s.io/apimachinery v0.0.0-20191004115801-a2eda9f80ab8/go.mod h1:llRdnznGEAqC3DcNm6yEj472xaFVfLM7hnYofMb12tQ= +k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= +k8s.io/apimachinery v0.17.8 h1:zXvd8rYMAjRJXpILP9tdAiUnFIENM9EmHuE81apIoms= +k8s.io/apimachinery v0.17.8/go.mod h1:Lg8zZ5iC/O8UjCqW6DNhcQG2m4TdjF9kwG3891OWbbA= +k8s.io/apimachinery v0.18.4/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= +k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= +k8s.io/apimachinery v0.18.8 h1:jimPrycCqgx2QPearX3to1JePz7wSbVLq+7PdBTTwQ0= +k8s.io/apimachinery v0.18.8/go.mod h1:6sQd+iHEqmOtALqOFjSWp2KZ9F0wlU/nWm0ZgsYWMig= +k8s.io/apimachinery v0.19.4 h1:+ZoddM7nbzrDCp0T3SWnyxqf8cbWPT2fkZImoyvHUG0= +k8s.io/apimachinery v0.19.4/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= +k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.2 h1:hFx6Sbt1oG0n6DZ+g4bFt5f6BoMkOjKWsQFu077M3Vg= +k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apiserver v0.17.2/go.mod h1:lBmw/TtQdtxvrTk0e2cgtOxHizXI+d0mmGQURIHQZlo= +k8s.io/apiserver v0.18.4/go.mod h1:q+zoFct5ABNnYkGIaGQ3bcbUNdmPyOCoEBcg51LChY8= +k8s.io/apiserver v0.19.4/go.mod h1:X8WRHCR1UGZDd7HpV0QDc1h/6VbbpAeAGyxSh8yzZXw= +k8s.io/apiserver v0.20.1 h1:yEqdkxlnQbxi/3e74cp0X16h140fpvPrNnNRAJBDuBk= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= +k8s.io/cli-runtime v0.17.2 h1:YH4txSplyGudvxjhAJeHEtXc7Tr/16clKGfN076ydGk= +k8s.io/cli-runtime v0.17.2/go.mod h1:aa8t9ziyQdbkuizkNLAw3qe3srSyWh9zlSB7zTqRNPI= +k8s.io/cli-runtime v0.18.4 h1:IUx7quIOb4gbQ4M+B1ksF/PTBovQuL5tXWzplX3t+FM= +k8s.io/cli-runtime v0.18.4/go.mod h1:9/hS/Cuf7NVzWR5F/5tyS6xsnclxoPLVtwhnkJG1Y4g= +k8s.io/cli-runtime v0.19.4 h1:FPpoqFbWsFzRbZNRI+o/+iiLFmWMYTmBueIj3OaNVTI= +k8s.io/cli-runtime v0.19.4/go.mod h1:m8G32dVbKOeaX1foGhleLEvNd6REvU7YnZyWn5//9rw= +k8s.io/cli-runtime v0.20.1 h1:fJhRQ9EfTpJpCqSFOAqnYLuu5aAM7yyORWZ26qW1jJc= +k8s.io/cli-runtime v0.20.1/go.mod h1:6wkMM16ZXTi7Ow3JLYPe10bS+XBnIkL6V9dmEz0mbuY= +k8s.io/client-go v0.0.0-20191016111102-bec269661e48/go.mod h1:hrwktSwYGI4JK+TJA3dMaFyyvHVi/aLarVHpbs8bgCU= +k8s.io/client-go v0.17.2 h1:ndIfkfXEGrNhLIgkr0+qhRguSD3u6DCmonepn1O6NYc= +k8s.io/client-go v0.17.2/go.mod h1:QAzRgsa0C2xl4/eVpeVAZMvikCn8Nm81yqVx3Kk9XYI= +k8s.io/client-go v0.18.4 h1:un55V1Q/B3JO3A76eS0kUSywgGK/WR3BQ8fHQjNa6Zc= +k8s.io/client-go v0.18.4/go.mod h1:f5sXwL4yAZRkAtzOxRWUhA/N8XzGCb+nPZI8PfobZ9g= +k8s.io/client-go v0.19.4 h1:85D3mDNoLF+xqpyE9Dh/OtrJDyJrSRKkHmDXIbEzer8= +k8s.io/client-go v0.19.4/go.mod h1:ZrEy7+wj9PjH5VMBCuu/BDlvtUAku0oVFk4MmnW9mWA= +k8s.io/client-go v0.20.1 h1:Qquik0xNFbK9aUG92pxHYsyfea5/RPO9o9bSywNor+M= +k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= +k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= +k8s.io/code-generator v0.18.4/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= +k8s.io/code-generator v0.19.4/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= +k8s.io/code-generator v0.20.1/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= +k8s.io/component-base v0.17.2 h1:0XHf+cerTvL9I5Xwn9v+0jmqzGAZI7zNydv4tL6Cw6A= +k8s.io/component-base v0.17.2/go.mod h1:zMPW3g5aH7cHJpKYQ/ZsGMcgbsA/VyhEugF3QT1awLs= +k8s.io/component-base v0.18.4 h1:Kr53Fp1iCGNsl9Uv4VcRvLy7YyIqi9oaJOQ7SXtKI98= +k8s.io/component-base v0.18.4/go.mod h1:7jr/Ef5PGmKwQhyAz/pjByxJbC58mhKAhiaDu0vXfPk= +k8s.io/component-base v0.19.4 h1:HobPRToQ8KJ9ubRju6PUAk9I5V1GNMJZ4PyWbiWA0uI= +k8s.io/component-base v0.19.4/go.mod h1:ZzuSLlsWhajIDEkKF73j64Gz/5o0AgON08FgRbEPI70= +k8s.io/component-base v0.20.1 h1:6OQaHr205NSl24t5wOF2IhdrlxZTWEZwuGlLvBgaeIg= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-helpers v0.20.1/go.mod h1:Q8trCj1zyLNdeur6pD2QvsF8d/nWVfK71YjN5+qVXy4= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190822140433-26a664648505/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/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/helm v2.16.9+incompatible h1:yFz+WVaV9SA/DwOjTU8h7vGRs1EzKHF18OSF6dQ5w3o= +k8s.io/helm v2.16.9+incompatible/go.mod h1:LZzlS4LQBHfciFOurYBFkCMTaZ0D1l+p0teMg7TSULI= +k8s.io/helm v2.16.10+incompatible h1:eFksERw3joHEL62TrcDX8I5fgEQJvit4qxxPXAkYTyQ= +k8s.io/helm v2.16.10+incompatible/go.mod h1:LZzlS4LQBHfciFOurYBFkCMTaZ0D1l+p0teMg7TSULI= +k8s.io/helm v2.17.0+incompatible h1:Bpn6o1wKLYqKM3+Osh8e+1/K2g/GsQJ4F4yNF2+deao= +k8s.io/helm v2.17.0+incompatible/go.mod h1:LZzlS4LQBHfciFOurYBFkCMTaZ0D1l+p0teMg7TSULI= +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 v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +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.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.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-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +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-20200410145947-bcb3869e6f29 h1:NeQXVJ2XFSkRoPzRo8AId01ZER+j8oV4SZADT4iBOXQ= +k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= +k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6 h1:+WnxoVtG8TMiudHBSEtrVL1egv36TkkJm+bA8AxicmQ= +k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd h1:sOHNzJIkytDF6qadMNKhhDRpc6ODik8lVC6nOur7B2c= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kubectl v0.17.2 h1:QZR8Q6lWiVRjwKslekdbN5WPMp53dS/17j5e+oi5XVU= +k8s.io/kubectl v0.17.2/go.mod h1:y4rfLV0n6aPmvbRCqZQjvOp3ezxsFgpqL+zF5jH/lxk= +k8s.io/kubectl v0.18.4 h1:l9DUYPTEMs1+qNtoqPpTyaJOosvj7l7tQqphCO1K52s= +k8s.io/kubectl v0.18.4/go.mod h1:EzB+nfeUWk6fm6giXQ8P4Fayw3dsN+M7Wjy23mTRtB0= +k8s.io/kubectl v0.19.4 h1:XFrHibf5fS4Ot8h3EnzdVsKrYj+pndlzKbwPkfra5hI= +k8s.io/kubectl v0.19.4/go.mod h1:XPmlu4DJEYgD83pvZFeKF8+MSvGnYGqunbFSrJsqHv0= +k8s.io/kubectl v0.20.1 h1:7h1vSrL/B3hLrhlCJhbTADElPKDbx+oVUt3+QDSXxBo= +k8s.io/kubectl v0.20.1/go.mod h1:2bE0JLYTRDVKDiTREFsjLAx4R2GvUtL/mGYFXfFFMzY= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/metrics v0.17.2/go.mod h1:3TkNHET4ROd+NfzNxkjoVfQ0Ob4iZnaHmSEA4vYpwLw= +k8s.io/metrics v0.18.4/go.mod h1:luze4fyI9JG4eLDZy0kFdYEebqNfi0QrG4xNEbPkHOs= +k8s.io/metrics v0.19.4/go.mod h1:a0gvAzrxQPw2ouBqnXI7X9qlggpPkKAFgWU/Py+KZiU= +k8s.io/metrics v0.20.1/go.mod h1:JhpBE/fad3yRGsgEpiZz5FQQM5wJ18OTLkD7Tv40c0s= +k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20191114184206-e782cd3c129f h1:GiPwtSzdP43eI1hpPCbROQCCIgCuiMMNF8YUVLF3vJo= +k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89 h1:d4vVOjXm687F1iLSP2q3lyPPuyvTUt3aVoBpi2DqRsU= +k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20200731180307-f00132d28269 h1:2b6RJdHYnDNUuhjtbs+OPAjIKDGT8Qikfg91WbEYC0k= +k8s.io/utils v0.0.0-20200731180307-f00132d28269/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= +modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= +modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +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/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0= +sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e h1:4Z09Hglb792X0kfOBBJUPFEyvVfQWrYT/l8h5EKA6JQ= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= +sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE= +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.1 h1:YXTMot5Qz/X1iBRJhAt+vI+HVttY0WkSqqhKxQ0xVbA= +sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +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 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= +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= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI= diff --git a/helm-2to3.png b/helm-2to3.png new file mode 100644 index 0000000000000000000000000000000000000000..a5372385cb70137f06d9935adbbc760fad650f13 GIT binary patch literal 34781 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 ZfjEjQa1SEwX&(&qkrb5^sTMK_{9h|oS?mA+ literal 0 HcmV?d00001 diff --git a/main.go b/main.go new file mode 100644 index 0000000..24f4f76 --- /dev/null +++ b/main.go @@ -0,0 +1,31 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "os" + + "github.com/helm/helm-2to3/cmd" +) + +func main() { + migrateCmd := cmd.NewRootCmd(os.Stdout, os.Args[1:]) + + if err := migrateCmd.Execute(); err != nil { + os.Exit(1) + } +} diff --git a/pkg/common/common.go b/pkg/common/common.go new file mode 100644 index 0000000..2f0c396 --- /dev/null +++ b/pkg/common/common.go @@ -0,0 +1,22 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package common + +type KubeConfig struct { + Context string + File string +} diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go new file mode 100644 index 0000000..25c18d4 --- /dev/null +++ b/pkg/utils/utils.go @@ -0,0 +1,275 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v2v3 + +import ( + "bufio" + "fmt" + "io/ioutil" + "log" + "os" + "path/filepath" + "strings" + + "github.com/pkg/errors" + + v2 "github.com/helm/helm-2to3/pkg/v2" + v3 "github.com/helm/helm-2to3/pkg/v3" +) + +// Copyv2HomeTov3 copies the v2 home directory to the v3 home directory . +// Note that this is not a direct 1-1 copy +func Copyv2HomeTov3(dryRun bool) error { + v2HomeDir := v2.HomeDir() + log.Printf("[Helm 2] Home directory: %s\n", v2HomeDir) + v3ConfigDir := v3.ConfigDir() + log.Printf("[Helm 3] Config directory: %s\n", v3ConfigDir) + v3DataDir := v3.DataDir() + log.Printf("[Helm 3] Data directory: %s\n", v3DataDir) + v3CacheDir := v3.CacheDir() + log.Printf("[Helm 3] Cache directory: %s\n", v3CacheDir) + + // Create Helm v3 config directory if needed + log.Printf("[Helm 3] Create config folder \"%s\" .\n", v3ConfigDir) + var err error + if !dryRun { + err = ensureDir(v3ConfigDir) + if err != nil { + return fmt.Errorf("[Helm 3] Failed to create config folder \"%s\" due to the following error: %s", v3ConfigDir, err) + } + log.Printf("[Helm 3] Config folder \"%s\" created.\n", v3ConfigDir) + } + + // Move repo config + v2RepoConfig := filepath.Join(v2HomeDir, "repository", "repositories.yaml") + v3RepoConfig := filepath.Join(v3ConfigDir, "repositories.yaml") + log.Printf("[Helm 2] repositories file \"%s\" will copy to [Helm 3] config folder \"%s\" .\n", v2RepoConfig, v3RepoConfig) + if !dryRun { + err = copyFile(v2RepoConfig, v3RepoConfig) + if err != nil { + return fmt.Errorf("Failed to copy [Helm 2] repository file \"%s\" due to the following error: %s", v2RepoConfig, err) + } + log.Printf("[Helm 2] repositories file \"%s\" copied successfully to [Helm 3] config folder \"%s\" .\n", v2RepoConfig, v3RepoConfig) + } + + // Not moving local repo and its cache, as it is safer to recreate: e.g. v2HomeDir/repository/local v2HomeDir/repository/cache + + // Create Helm v3 cache directory if needed + log.Printf("[Helm 3] Create cache folder \"%s\" .\n", v3CacheDir) + if !dryRun { + err = ensureDir(v3CacheDir) + if err != nil { + return fmt.Errorf("[Helm 3] Failed to create cache folder \"%s\" due to the following error: %s", v3CacheDir, err) + } + log.Printf("[Helm 3] cache folder \"%s\" created.\n", v3CacheDir) + } + + // Create Helm v3 data directory if needed + log.Printf("[Helm 3] Create data folder \"%s\" .\n", v3DataDir) + if !dryRun { + err = ensureDir(v3DataDir) + if err != nil { + return fmt.Errorf("[Helm 3] Failed to create data folder \"%s\" due to the following error: %s", v3DataDir, err) + } + log.Printf("[Helm 3] data folder \"%s\" created.\n", v3DataDir) + } + + // Handle plugins + v2Plugins := filepath.Join(v2HomeDir, "cache", "plugins") + plugins, _ := pathExists(v2Plugins) + if plugins { + // Move plugins + v2Plugins := filepath.Join(v2HomeDir, "cache", "plugins") + v3Plugins := filepath.Join(v3CacheDir, "plugins") + log.Printf("[Helm 2] plugins \"%s\" will copy to [Helm 3] cache folder \"%s\" .\n", v2Plugins, v3Plugins) + if !dryRun { + err = copyDir(v2Plugins, v3Plugins) + if err != nil { + return fmt.Errorf("Failed to copy [Helm 2] plugins directory \"%s\" due to the following error: %s", v2Plugins, err) + } + log.Printf("[Helm 2] plugins \"%s\" copied successfully to [Helm 3] cache folder \"%s\" .\n", v2Plugins, v3Plugins) + } + + // Recreate the plugin symbolic links for v3 path + v2Links := filepath.Join(v2HomeDir, "plugins") + log.Printf("[Helm 2] plugin symbolic links \"%s\" will copy to [Helm 3] data folder \"%s\" .\n", v2Links, v3DataDir) + if !dryRun { + err = reCreatePluginSymLinks(v2Links, v3DataDir, v3CacheDir) + if err != nil { + return fmt.Errorf("Failed to copy [Helm 2] plugin links \"%s\" due to the following error: %s", v2Links, err) + } + log.Printf("[Helm 2] plugin links \"%s\" copied successfully to [Helm 3] data folder \"%s\" .\n", v2Links, v3DataDir) + } + } + + // Move starters + v2Starters := filepath.Join(v2HomeDir, "starters") + v3Starters := filepath.Join(v3DataDir, "starters") + log.Printf("[Helm 2] starters \"%s\" will copy to [Helm 3] data folder \"%s\" .\n", v2Starters, v3Starters) + if !dryRun { + err = copyDir(v2Starters, v3Starters) + if err != nil { + return fmt.Errorf("Failed to copy [Helm 2] starters \"%s\" due to the following error: %s", v2Starters, err) + } + log.Printf("[Helm 2] starters \"%s\" copied successfully to [Helm 3] data folder \"%s\" .\n", v2Starters, v3Starters) + } + + return nil +} + +// AskConfirmation provides a prompt for user to confirm continuation with operation +func AskConfirmation(operation, specificMsg string) (bool, error) { + fmt.Printf("[%s/confirm] Are you sure you want to %s? [y/N]: ", operation, specificMsg) + + scanner := bufio.NewScanner(os.Stdin) + scanner.Scan() + if err := scanner.Err(); err != nil { + return false, errors.Wrap(err, "couldn't read from standard input") + } + answer := scanner.Text() + if strings.ToLower(answer) == "y" || strings.ToLower(answer) == "yes" { + return true, nil + } + return false, nil +} + +func copyFile(srcFileName, destFileName string) error { + input, err := ioutil.ReadFile(srcFileName) + if err != nil { + return err + } + st, err := os.Stat(srcFileName) + if err != nil { + return err + } + err = ioutil.WriteFile(destFileName, input, st.Mode()) + if err != nil { + return err + } + + return nil +} + +func copyDir(srcDirName, destDirName string) error { + err := ensureDir(destDirName) + if err != nil { + return fmt.Errorf("Failed to create folder \"%s\" due to the following error: %s", destDirName, err) + } + + directory, _ := os.Open(srcDirName) + objects, err := directory.Readdir(-1) + if err != nil { + return fmt.Errorf("Failed to copy directory due to the following error: %s", err) + } + for _, obj := range objects { + srcFileName := filepath.Join(srcDirName, obj.Name()) + destFileName := filepath.Join(destDirName, obj.Name()) + if obj.IsDir() { + // create sub-directories - recursively + err = copyDir(srcFileName, destFileName) + if err != nil { + return fmt.Errorf("Failed to copy folder \"%s\" to folder \"%s\" due to the following error: %s", srcFileName, destFileName, err) + } + } else { + fileInfo, err := os.Lstat(srcFileName) + if err != nil { + return fmt.Errorf("Failed to check file \"%s\" stats due to the following error: %s", srcFileName, err) + } + if fileInfo.Mode()&os.ModeSymlink != 0 { + err = copySymLink(obj, srcDirName, destDirName) + if err != nil { + return fmt.Errorf("Failed to create symlink for \"%s\" due to the following error: %s", obj.Name(), err) + } + } else { + err = copyFile(srcFileName, destFileName) + if err != nil { + return fmt.Errorf("Failed to copy file \"%s\" to \"%s\" due to the following error: %s", srcFileName, destFileName, err) + } + } + } + } + + return nil +} + +func ensureDir(dirName string) error { + err := os.MkdirAll(dirName, os.ModePerm) + if err != nil && !os.IsExist(err) { + return err + } + return nil +} + +func pathExists(path string) (bool, error) { + _, err := os.Stat(path) + if err == nil { + return true, nil + } + if os.IsNotExist(err) { + return false, nil + } + return true, err +} + +func copySymLink(fileInfo os.FileInfo, srcDirName, destDirName string) error { + originFileName, err := os.Readlink(filepath.Join(srcDirName, fileInfo.Name())) + if err != nil { + return err + } + newSymLinkName := filepath.Join(destDirName, fileInfo.Name()) + err = os.Symlink(originFileName, newSymLinkName) + if err != nil && !os.IsExist(err) { + return err + } + return nil +} + +func reCreatePluginSymLinks(srcDirName, v3DataDir, v3CacheDir string) error { + v3PluginDataDir := filepath.Join(v3DataDir, "plugins") + err := ensureDir(v3PluginDataDir) + if err != nil { + return fmt.Errorf("Failed to create folder \"%s\" due to the following error: %s", v3PluginDataDir, err) + } + directory, _ := os.Open(srcDirName) + objects, err := directory.Readdir(-1) + if err != nil { + return fmt.Errorf("Failed to re-create symlinks due to the following error: %s", err) + } + for _, obj := range objects { + srcFileName := filepath.Join(srcDirName, obj.Name()) + if !obj.IsDir() { + fileInfo, err := os.Lstat(srcFileName) + if err != nil { + return fmt.Errorf("Failed to check file \"%s\" stats due to the following error: %s", srcFileName, err) + } + if fileInfo.Mode()&os.ModeSymlink != 0 { + symLinkName := obj.Name() + newFullSymLinkName := filepath.Join(v3PluginDataDir, symLinkName) + origFullFileName, err := os.Readlink(filepath.Join(srcDirName, fileInfo.Name())) + if err != nil { + return fmt.Errorf("Failed to re-create symlink for \"%s\" due to the following error: %s", symLinkName, err) + } + newFullFileName := filepath.Join(v3CacheDir, "plugins", filepath.Base(origFullFileName)) + err = os.Symlink(newFullFileName, newFullSymLinkName) + if err != nil && !os.IsExist(err) { + return fmt.Errorf("Failed to re-create symlink for \"%s\" due to the following error: %s", newFullSymLinkName, err) + } + } + } + } + return nil +} diff --git a/pkg/v2/release.go b/pkg/v2/release.go new file mode 100644 index 0000000..fd6d5d2 --- /dev/null +++ b/pkg/v2/release.go @@ -0,0 +1,209 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v2 + +import ( + "context" + "fmt" + "log" + "sort" + + utils "github.com/maorfr/helm-plugin-utils/pkg" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + rls "k8s.io/helm/pkg/proto/hapi/release" + + common "github.com/helm/helm-2to3/pkg/common" +) + +type RetrieveOptions struct { + ReleaseName string + StorageType string + TillerLabel string + TillerNamespace string + TillerOutCluster bool +} + +type DeleteOptions struct { + DryRun bool + Versions []int32 +} + +// ByReleaseVersion implements sort.Interface based on the rls.Release Version field +type ByReleaseVersion []*rls.Release + +func (releases ByReleaseVersion) Len() int { return len(releases) } +func (releases ByReleaseVersion) Less(i, j int) bool { + return releases[i].Version < releases[j].Version +} +func (releases ByReleaseVersion) Swap(i, j int) { releases[i], releases[j] = releases[j], releases[i] } + +// GetReleaseVersions returns all release versions from Helm v2 storage for a specified release.. +// It is based on Tiller namespace and labels like owner of storage. +func GetReleaseVersions(retOpts RetrieveOptions, kubeConfig common.KubeConfig) ([]*rls.Release, error) { + releases, err := getReleases(retOpts, kubeConfig) + if err != nil { + return nil, err + } + if len(releases) <= 0 { + return nil, fmt.Errorf("%s has no deployed releases\n", retOpts.ReleaseName) + } + + return releases, nil + +} + +// DeleteReleaseVersions deletes all release data from Helm v2 storage for a specified release. +// It is based on Tiller namespace and labels like owner of storage. +func DeleteReleaseVersions(retOpts RetrieveOptions, delOpts DeleteOptions, kubeConfig common.KubeConfig) error { + for _, ver := range delOpts.Versions { + relVerName := fmt.Sprintf("%s.v%d", retOpts.ReleaseName, ver) + log.Printf("[Helm 2] ReleaseVersion \"%s\" will be deleted.\n", relVerName) + if !delOpts.DryRun { + if err := deleteRelease(retOpts, relVerName, kubeConfig); err != nil { + return fmt.Errorf("[Helm 2] ReleaseVersion \"%s\" failed to delete with error: %s.\n", relVerName, err) + } + log.Printf("[Helm 2] ReleaseVersion \"%s\" deleted.\n", relVerName) + } + } + + return nil +} + +// DeleteReleaseVersions deletes all release data from Helm v2 storage. +// It is based on Tiller namespace and labels like owner of storage. +func DeleteAllReleaseVersions(retOpts RetrieveOptions, kubeConfig common.KubeConfig, dryRun bool) error { + if retOpts.TillerNamespace == "" { + retOpts.TillerNamespace = "kube-system" + } + if retOpts.TillerLabel == "" { + retOpts.TillerLabel = "OWNER=TILLER" + } + if retOpts.StorageType == "" { + retOpts.StorageType = "configmaps" + } + + // Get all release versions stored for that namespace and owner + releases, err := getReleases(retOpts, kubeConfig) + if err != nil { + return err + } + releaseLen := len(releases) + if releaseLen <= 0 { + log.Printf("[Helm 2] no deployed releases for namespace: %s, owner: %s\n", retOpts.TillerNamespace, retOpts.TillerLabel) + return nil + } + + // Delete each release version from storage + for i := 0; i < releaseLen; i++ { + release := releases[i] + relVerName := GetReleaseVersionName(release.Name, release.Version) + log.Printf("[Helm 2] ReleaseVersion \"%s\" will be deleted.\n", relVerName) + if !dryRun { + if err := deleteRelease(retOpts, relVerName, kubeConfig); err != nil { + return fmt.Errorf("[Helm 2] ReleaseVersion \"%s\" failed to delete with error: %s.\n", relVerName, err) + } + log.Printf("[Helm 2] ReleaseVersion \"%s\" deleted.\n", relVerName) + } + } + return nil +} + +func getReleases(retOpts RetrieveOptions, kubeConfig common.KubeConfig) ([]*rls.Release, error) { + if retOpts.TillerNamespace == "" { + retOpts.TillerNamespace = "kube-system" + } + if retOpts.TillerLabel == "" { + retOpts.TillerLabel = "OWNER=TILLER" + } + if retOpts.ReleaseName != "" { + retOpts.TillerLabel += fmt.Sprintf(",NAME=%s", retOpts.ReleaseName) + } + if retOpts.StorageType == "" { + retOpts.StorageType = "configmaps" + } + storage := getStorageType(retOpts, kubeConfig) + clientSet := utils.GetClientSetWithKubeConfig(kubeConfig.File, kubeConfig.Context) + var releases []*rls.Release + switch storage { + case "secrets": + secrets, err := clientSet.CoreV1().Secrets(retOpts.TillerNamespace).List(context.Background(), metav1.ListOptions{ + LabelSelector: retOpts.TillerLabel, + }) + if err != nil { + return nil, err + } + for _, item := range secrets.Items { + release := getRelease((string)(item.Data["release"])) + if release == nil { + continue + } + releases = append(releases, release) + } + case "configmaps": + configMaps, err := clientSet.CoreV1().ConfigMaps(retOpts.TillerNamespace).List(context.Background(), metav1.ListOptions{ + LabelSelector: retOpts.TillerLabel, + }) + if err != nil { + return nil, err + } + for _, item := range configMaps.Items { + release := getRelease(item.Data["release"]) + if release == nil { + continue + } + releases = append(releases, release) + } + } + + sort.Sort(ByReleaseVersion(releases)) + + return releases, nil +} + +func getStorageType(retOpts RetrieveOptions, kubeConfig common.KubeConfig) string { + var storage string + if !retOpts.TillerOutCluster { + storage = utils.GetTillerStorageWithKubeConfig(retOpts.TillerNamespace, kubeConfig.File, kubeConfig.Context) + } else { + storage = retOpts.StorageType + } + return storage +} + +func getRelease(itemReleaseData string) *rls.Release { + data, _ := utils.DecodeRelease(itemReleaseData) + return data +} + +func deleteRelease(retOpts RetrieveOptions, releaseVersionName string, kubeConfig common.KubeConfig) error { + if retOpts.TillerNamespace == "" { + retOpts.TillerNamespace = "kube-system" + } + if retOpts.StorageType == "" { + retOpts.StorageType = "configmaps" + } + storage := getStorageType(retOpts, kubeConfig) + clientSet := utils.GetClientSetWithKubeConfig(kubeConfig.File, kubeConfig.Context) + switch storage { + case "secrets": + return clientSet.CoreV1().Secrets(retOpts.TillerNamespace).Delete(context.Background(), releaseVersionName, metav1.DeleteOptions{}) + case "configmaps": + return clientSet.CoreV1().ConfigMaps(retOpts.TillerNamespace).Delete(context.Background(), releaseVersionName, metav1.DeleteOptions{}) + } + return nil +} diff --git a/pkg/v2/utils.go b/pkg/v2/utils.go new file mode 100644 index 0000000..175e066 --- /dev/null +++ b/pkg/v2/utils.go @@ -0,0 +1,93 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v2 + +import ( + "fmt" + "log" + "os" + "path/filepath" + "strings" + + utils "github.com/maorfr/helm-plugin-utils/pkg" + "github.com/mitchellh/go-homedir" +) + +const sep = string(filepath.Separator) + +// RemoveHomeFolder removes the v2 Helm home folder +func RemoveHomeFolder(dryRun bool) error { + homeDir := HomeDir() + log.Printf("[Helm 2] Home folder \"%s\" will be deleted.\n", homeDir) + if !dryRun { + if err := os.RemoveAll(homeDir); err != nil { + return fmt.Errorf("[Helm 2] Failed to delete \"%s\" due to the following error: %s.\n", homeDir, err) + } + log.Printf("[Helm 2] Home folder \"%s\" deleted.\n", homeDir) + } + return nil + +} + +// RemoveTiller removes Tiller service in a particular namespace from the cluster +func RemoveTiller(tillerNamespace string, dryRun bool) error { + if tillerNamespace == "" { + tillerNamespace = "kube-system" + } + if !dryRun { + log.Printf("[Helm 2] Tiller \"%s\" in \"%s\" namespace will be removed.\n", "deploy", tillerNamespace) + err := executeKubsDeleteTillerCmd(tillerNamespace, "deploy") + if err != nil { + return err + } + log.Printf("[Helm 2] Tiller \"%s\" in \"%s\" namespace was removed successfully.\n", "deploy", tillerNamespace) + + log.Printf("[Helm 2] Tiller \"%s\" in \"%s\" namespace will be removed.\n", "service", tillerNamespace) + err = executeKubsDeleteTillerCmd(tillerNamespace, "service") + if err != nil { + return err + } + log.Printf("[Helm 2] Tiller \"%s\" in \"%s\" namespace was removed successfully.\n", "service", tillerNamespace) + } + return nil +} + +// HomeDir return the Helm home folder +func HomeDir() string { + if homeDir, exists := os.LookupEnv("HELM_V2_HOME"); exists { + return homeDir + } + + homeDir, _ := homedir.Dir() + defaultDir := homeDir + sep + ".helm" + return defaultDir +} + +// GetReleaseVersionName returns release version name +func GetReleaseVersionName(releaseName string, releaseVersion int32) string { + return fmt.Sprintf("%s.v%d", releaseName, releaseVersion) +} + +func executeKubsDeleteTillerCmd(tillerNamespace, label string) error { + delLabel := label + "/tiller-deploy" + applyCmd := []string{"kubectl", "delete", "--namespace", tillerNamespace, delLabel} + output := utils.Execute(applyCmd) + if !strings.Contains(string(output), "\"tiller-deploy\" deleted") { + return fmt.Errorf("[Helm 2] Failed to remove Tiller \"%s\" in \"%s\" namespace due to the following error: %s", label, tillerNamespace, string(output)) + } + return nil +} diff --git a/pkg/v3/connect.go b/pkg/v3/connect.go new file mode 100644 index 0000000..c54d61c --- /dev/null +++ b/pkg/v3/connect.go @@ -0,0 +1,55 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v3 + +import ( + "fmt" + "log" + "os" + + "helm.sh/helm/v3/pkg/action" + "helm.sh/helm/v3/pkg/cli" + + common "github.com/helm/helm-2to3/pkg/common" +) + +var ( + settings = cli.New() +) + +// GetActionConfig returns action configuration based on Helm env +func GetActionConfig(namespace string, kubeConfig common.KubeConfig) (*action.Configuration, error) { + actionConfig := new(action.Configuration) + + // Add kube config settings passed by user + settings.KubeConfig = kubeConfig.File + settings.KubeContext = kubeConfig.Context + + err := actionConfig.Init(settings.RESTClientGetter(), namespace, os.Getenv("HELM_DRIVER"), debug) + if err != nil { + return nil, err + } + + return actionConfig, err +} + +func debug(format string, v ...interface{}) { + if settings.Debug { + format = fmt.Sprintf("[debug] %s\n", format) + log.Output(2, fmt.Sprintf(format, v...)) + } +} diff --git a/pkg/v3/release.go b/pkg/v3/release.go new file mode 100644 index 0000000..1d42081 --- /dev/null +++ b/pkg/v3/release.go @@ -0,0 +1,379 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v3 + +import ( + "fmt" + "strings" + stdtime "time" + + "github.com/golang/protobuf/ptypes" + "github.com/golang/protobuf/ptypes/any" + timestamp "github.com/golang/protobuf/ptypes/timestamp" + + "helm.sh/helm/v3/pkg/chart" + "helm.sh/helm/v3/pkg/release" + "helm.sh/helm/v3/pkg/time" + + v2chrtutil "k8s.io/helm/pkg/chartutil" + v2chart "k8s.io/helm/pkg/proto/hapi/chart" + v2rls "k8s.io/helm/pkg/proto/hapi/release" + + common "github.com/helm/helm-2to3/pkg/common" +) + +// CreateRelease create a v3 release object from v2 release object +func CreateRelease(v2Rel *v2rls.Release) (*release.Release, error) { + if v2Rel.Chart == nil || v2Rel.Info == nil { + return nil, fmt.Errorf("No v2 chart or info metadata") + } + chrt, err := mapv2ChartTov3Chart(v2Rel.Chart) + if err != nil { + return nil, err + } + config, err := mapConfig(v2Rel.Config) + if err != nil { + return nil, err + } + first, err := mapTimestampToTime(v2Rel.Info.FirstDeployed) + if err != nil { + return nil, err + } + last, err := mapTimestampToTime(v2Rel.Info.LastDeployed) + if err != nil { + return nil, err + } + deleted, err := mapTimestampToTime(v2Rel.Info.Deleted) + if err != nil { + return nil, err + } + v3StatusStr, err := mapStatus(v2Rel.Info) + if err != nil { + return nil, err + } + + hooks, err := mapHooks(v2Rel.Hooks, v2Rel.Info.Status.LastTestSuiteRun) + if err != nil { + return nil, err + } + + return &release.Release{ + Name: v2Rel.Name, + Namespace: v2Rel.Namespace, + Chart: chrt, + Config: config, + Info: &release.Info{ + FirstDeployed: first, + LastDeployed: last, + Description: v2Rel.Info.Description, + Deleted: deleted, + Status: release.Status(v3StatusStr), + Notes: v2Rel.Info.Status.Notes, + }, + Manifest: v2Rel.Manifest, + Hooks: hooks, + Version: int(v2Rel.Version), + }, nil +} + +// StoreRelease stores a release object in Helm v3 storage +func StoreRelease(rel *release.Release, kubeConfig common.KubeConfig) error { + cfg, err := GetActionConfig(rel.Namespace, kubeConfig) + if err != nil { + return err + } + + return cfg.Releases.Create(rel) +} + +func mapv2ChartTov3Chart(v2Chrt *v2chart.Chart) (*chart.Chart, error) { + v3Chrt := new(chart.Chart) + v3Chrt.Metadata = mapMetadata(v2Chrt) + v3Chrt.Templates = mapTemplates(v2Chrt.Templates) + err := mapDependencies(v2Chrt.Dependencies, v3Chrt) + if err != nil { + return nil, err + } + if v3Chrt.Values, err = mapConfig(v2Chrt.Values); err != nil { + return nil, err + } + v3Chrt.Files = mapFiles(v2Chrt.Files) + // Schema is set to nil as Schema wass introduced in Helm v3 + v3Chrt.Schema = nil + // Lock is set to nil because v2 does not save the requirements lock file details + // v3 should gather data as need be from the chart dependencies + v3Chrt.Lock = nil + return v3Chrt, nil +} + +func mapMetadata(v2Chrt *v2chart.Chart) *chart.Metadata { + if v2Chrt.Metadata == nil { + return nil + } + metadata := new(chart.Metadata) + metadata.Name = v2Chrt.Metadata.Name + metadata.Home = v2Chrt.Metadata.Home + metadata.Sources = v2Chrt.Metadata.Sources + metadata.Version = v2Chrt.Metadata.Version + metadata.Description = v2Chrt.Metadata.Description + metadata.Keywords = v2Chrt.Metadata.Keywords + metadata.Maintainers = mapMaintainers(v2Chrt.Metadata.Maintainers) + metadata.Icon = v2Chrt.Metadata.Icon + metadata.APIVersion = v2Chrt.Metadata.ApiVersion + metadata.Condition = v2Chrt.Metadata.Condition + metadata.Tags = v2Chrt.Metadata.Tags + metadata.AppVersion = v2Chrt.Metadata.AppVersion + metadata.Deprecated = v2Chrt.Metadata.Deprecated + metadata.Annotations = v2Chrt.Metadata.Annotations + metadata.KubeVersion = v2Chrt.Metadata.KubeVersion + // v2 does not save the dependency metadata from requirements, so setting to nil + // v3 should gather data as need be from the chart dependencies + metadata.Dependencies = nil + //Default to application + metadata.Type = "application" + return metadata +} + +func mapMaintainers(v2Maintainers []*v2chart.Maintainer) []*chart.Maintainer { + if v2Maintainers == nil { + return nil + } + maintainers := []*chart.Maintainer{} + for _, val := range v2Maintainers { + maintainer := new(chart.Maintainer) + maintainer.Name = val.Name + maintainer.Email = val.Email + maintainer.URL = val.Url + maintainers = append(maintainers, maintainer) + } + return maintainers +} + +func mapTemplates(v2Templates []*v2chart.Template) []*chart.File { + if v2Templates == nil { + return nil + } + files := []*chart.File{} + for _, val := range v2Templates { + file := new(chart.File) + file.Name = val.Name + file.Data = val.Data + files = append(files, file) + } + return files +} + +func mapDependencies(v2Dependencies []*v2chart.Chart, chart *chart.Chart) error { + if v2Dependencies == nil { + return nil + } + for _, val := range v2Dependencies { + dependency, err := mapv2ChartTov3Chart(val) + if err != nil { + return err + } + chart.AddDependency(dependency) + } + return nil +} + +func mapConfig(v2Config *v2chart.Config) (map[string]interface{}, error) { + if v2Config == nil { + return nil, nil + } + values, err := v2chrtutil.ReadValues([]byte(v2Config.Raw)) + if err != nil { + return nil, err + } + return values, nil +} + +func mapFiles(v2Files []*any.Any) []*chart.File { + if mapFiles == nil { + return nil + } + files := []*chart.File{} + for _, f := range v2Files { + file := new(chart.File) + file.Name = f.TypeUrl + file.Data = f.Value + files = append(files, file) + } + return files +} + +func mapStatus(v2Info *v2rls.Info) (string, error) { + v2StatusStr, ok := v2rls.Status_Code_name[int32(v2Info.Status.Code)] + if !ok { + return "", fmt.Errorf("Failed to get v2 status") + } + // map to v3 status + lowerCaseStr := strings.ToLower(v2StatusStr) + v3StatusStr := strings.ReplaceAll(lowerCaseStr, "_", "-") + if v3StatusStr == "deleted" { + v3StatusStr = "uninstalled" + } + if v3StatusStr == "deleting" { + v3StatusStr = "uninstalling" + } + return v3StatusStr, nil +} + +func mapHooks(v2Hooks []*v2rls.Hook, v2LastTestSuiteRun *v2rls.TestSuite) ([]*release.Hook, error) { + if v2Hooks == nil { + return nil, nil + } + hooks := []*release.Hook{} + for _, val := range v2Hooks { + hook := new(release.Hook) + hook.Name = val.Name + hook.Kind = val.Kind + hook.Path = val.Path + hook.Manifest = val.Manifest + events, err := mapHookEvents(val.Events) + if err != nil { + return nil, err + } + hook.Events = events + hook.Weight = int(val.Weight) + if err != nil { + return nil, err + } + policies, err := mapHookDeletePolicies(val.DeletePolicies) + if err != nil { + return nil, err + } + hook.DeletePolicies = policies + var lastRun *release.HookExecution + lastRun, err = mapTestSuiteToHookExecution(hook.Name, v2LastTestSuiteRun) + if err != nil { + return nil, err + } + if lastRun != nil { + hook.LastRun = *lastRun + } + hooks = append(hooks, hook) + } + return hooks, nil +} + +func mapHookEvents(v2HookEvents []v2rls.Hook_Event) ([]release.HookEvent, error) { + if v2HookEvents == nil { + return nil, nil + } + hookEvents := []release.HookEvent{} + for _, val := range v2HookEvents { + v2EventStr, ok := v2rls.Hook_Event_name[int32(val)] + if !ok { + return nil, fmt.Errorf("Failed to get the v2 hook event string") + } + + // map to v3 hook event + lowerCaseStr := strings.ToLower(v2EventStr) + v3EventStr := strings.ReplaceAll(lowerCaseStr, "_", "-") + if strings.Contains(v3EventStr, "release-test") { + v3EventStr = "test" + } + + event := release.HookEvent(v3EventStr) + hookEvents = append(hookEvents, event) + } + return hookEvents, nil +} + +func mapHookDeletePolicies(v2HookDelPolicies []v2rls.Hook_DeletePolicy) ([]release.HookDeletePolicy, error) { + if v2HookDelPolicies == nil { + return nil, nil + } + hookDelPolicies := []release.HookDeletePolicy{} + for _, val := range v2HookDelPolicies { + v2PolicyStr, ok := v2rls.Hook_DeletePolicy_name[int32(val)] + if !ok { + return nil, fmt.Errorf("Failed to get the v2 hook delete policy") + } + + // map to v3 hook delete policy + lowerCaseStr := strings.ToLower(v2PolicyStr) + v3PolicyStr := strings.ReplaceAll(lowerCaseStr, "_", "-") + if !strings.Contains(v3PolicyStr, "before-hook-creation") { + v3PolicyStr = "hook-" + v3PolicyStr + } + + policy := release.HookDeletePolicy(strings.ToLower(v3PolicyStr)) + hookDelPolicies = append(hookDelPolicies, policy) + } + return hookDelPolicies, nil +} + +func mapTimestampToTime(ts *timestamp.Timestamp) (time.Time, error) { + var mappedTime stdtime.Time + var err error + if ts != nil { + mappedTime, err = ptypes.Timestamp(ts) + if err != nil { + return time.Time{Time: mappedTime}, err + } + } + return time.Time{Time: mappedTime}, nil +} + +func mapTestSuiteToHookExecution(hookName string, testSuite *v2rls.TestSuite) (*release.HookExecution, error) { + if testSuite == nil { + return nil, nil + } + + testSuiteResLen := len(testSuite.Results) + + if testSuiteResLen <= 0 { + return nil, nil + } + + for i := 0; i < testSuiteResLen; i++ { + testRun := testSuite.Results[i] + if testRun.Name != hookName { + continue + } + hookEx := new(release.HookExecution) + var err error + hookEx.StartedAt, err = mapTimestampToTime(testRun.StartedAt) + if err != nil { + return nil, err + } + hookEx.CompletedAt, err = mapTimestampToTime(testRun.CompletedAt) + if err != nil { + return nil, err + } + v2RunStatusStr, ok := v2rls.TestRun_Status_name[int32(testRun.Status)] + if !ok { + return nil, fmt.Errorf("Failed to get the v2 test run status") + } + + // Map to v3 test run status + v3RunStatusStr := strings.ToLower(v2RunStatusStr) + if v3RunStatusStr == "success" { + v3RunStatusStr = "Succeeded" + } + if v3RunStatusStr == "failure" { + v3RunStatusStr = "Failed" + } + + hookEx.Phase = release.HookPhase(strings.Title(v3RunStatusStr)) + return hookEx, nil + } + + return nil, nil +} diff --git a/pkg/v3/utils.go b/pkg/v3/utils.go new file mode 100644 index 0000000..9da318e --- /dev/null +++ b/pkg/v3/utils.go @@ -0,0 +1,53 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v3 + +import ( + "os" + + "helm.sh/helm/v3/pkg/helmpath" +) + +// ConfigDir returns the v2 config directory +func ConfigDir() string { + if homeDir, exists := os.LookupEnv("HELM_V3_CONFIG"); exists { + return homeDir + } + + defaultDir := helmpath.ConfigPath() + return defaultDir +} + +// DataDir returns the v3 data directory +func DataDir() string { + if homeDir, exists := os.LookupEnv("HELM_V3_DATA"); exists { + return homeDir + } + + defaultDir := helmpath.DataPath() + return defaultDir +} + +// CacheDir returns the v3 data directory +func CacheDir() string { + if homeDir, exists := os.LookupEnv("HELM_V3_CACHE"); exists { + return homeDir + } + + defaultDir := helmpath.CachePath() + return defaultDir +} diff --git a/plugin.yaml b/plugin.yaml new file mode 100644 index 0000000..5543e7f --- /dev/null +++ b/plugin.yaml @@ -0,0 +1,8 @@ +name: "2to3" +version: "0.8.1" +usage: "migrate and cleanup Helm v2 configuration and releases in-place to Helm v3" +description: "migrate and cleanup Helm v2 configuration and releases in-place to Helm v3" +command: "$HELM_PLUGIN_DIR/bin/2to3" +hooks: + install: "cd $HELM_PLUGIN_DIR; scripts/install_plugin.sh" + update: "cd $HELM_PLUGIN_DIR; scripts/install_plugin.sh" diff --git a/scripts/install_plugin.sh b/scripts/install_plugin.sh new file mode 100755 index 0000000..0b428e3 --- /dev/null +++ b/scripts/install_plugin.sh @@ -0,0 +1,43 @@ +#!/bin/sh -e + +if [ -n "${HELM_LINTER_PLUGIN_NO_INSTALL_HOOK}" ]; then + echo "Development mode: not downloading versioned release." + exit 0 +fi + +# shellcheck disable=SC2002 +version="$(cat plugin.yaml | grep "version" | cut -d '"' -f 2)" +echo "Downloading and installing helm-2to3 v${version} ..." + +url="" +if [ "$(uname)" = "Darwin" ]; then + url="https://github.com/helm/helm-2to3/releases/download/v${version}/helm-2to3_${version}_darwin_amd64.tar.gz" +elif [ "$(uname)" = "Linux" ] ; then + if [ "$(uname -m)" = "aarch64" ] || [ "$(uname -m)" = "arm64" ]; then + url="https://github.com/helm/helm-2to3/releases/download/v${version}/helm-2to3_${version}_linux_arm64.tar.gz" + else + url="https://github.com/helm/helm-2to3/releases/download/v${version}/helm-2to3_${version}_linux_amd64.tar.gz" + fi +else + url="https://github.com/helm/helm-2to3/releases/download/v${version}/helm-2to3_${version}_windows_amd64.tar.gz" +fi + +echo "$url" + +mkdir -p "bin" +mkdir -p "releases/v${version}" + +# Download with curl if possible. +# shellcheck disable=SC2230 +if [ -x "$(which curl 2>/dev/null)" ]; then + curl -sSL "${url}" -o "releases/v${version}.tar.gz" +else + wget -q "${url}" -O "releases/v${version}.tar.gz" +fi +tar xzf "releases/v${version}.tar.gz" -C "releases/v${version}" +mv "releases/v${version}/2to3" "bin/2to3" || \ + mv "releases/v${version}/2to3.exe" "bin/2to3" +mv "releases/v${version}/completion.yaml" . +mv "releases/v${version}/plugin.yaml" . +mv "releases/v${version}/README.md" . +mv "releases/v${version}/LICENSE" . diff --git a/scripts/tag.sh b/scripts/tag.sh new file mode 100755 index 0000000..e88e8c4 --- /dev/null +++ b/scripts/tag.sh @@ -0,0 +1,10 @@ +#!/bin/sh -e + +# shellcheck disable=SC2002 +tag="$(cat plugin.yaml | grep "version" | cut -d '"' -f 2)" +echo "Tagging helm-2to3 with v${tag} ..." + +git checkout master +git pull +git tag -a -m "Release v$tag" "v$tag" +git push origin refs/tags/v"$tag"