From a6dc2d6b82db46387907b39182365f378949fd59 Mon Sep 17 00:00:00 2001 From: Niels ten Boom Date: Tue, 31 Mar 2020 10:44:21 +0200 Subject: [PATCH 1/7] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5671d70..1bec745 100644 --- a/README.md +++ b/README.md @@ -47,4 +47,4 @@ Time taken to upload **1.6M unique keys** from S3 is `3m 33secs`. Check this [PR ### Worker -There can be only 1 worker working at the time. The worker is responsible for reading the `batchUpload` requests from the Redis Queue and execute them 1 by 1. \ No newline at end of file +There can be only 1 worker working at the time. The worker is responsible for reading the `batchUpload` requests from the Redis Queue and execute them 1 by 1. From 0d31bfd89b15010a38bc98542493639e6e34144d Mon Sep 17 00:00:00 2001 From: Davide Berdin Date: Mon, 2 Nov 2020 16:35:56 +0100 Subject: [PATCH 2/7] Redis credentials (#44) * Update issue templates * OSS (#42) * removing sensitive information for opensourcing the project * add chart for deploying phoenix * remove hardcoded port * Update README.md * Create docker-publish.yml * Update README.md * Update README.md * Create LICENSE * Update README.md * Guidelines (#43) * Create CODE_OF_CONDUCT.md * Create CONTRIBUTING.md * Update README.md * Update README.md * Create USERS.md * Update README.md * Update README.md * bump redis client version, add DB_PASSWORD for redis password, fix worker queue * typo in error checking * add new ENV to chart Co-authored-by: Niels ten Boom --- .github/ISSUE_TEMPLATE/bug_report.md | 38 +++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 +++ .github/workflows/docker-publish.yml | 56 +++++++ .gitignore | 3 +- CODE_OF_CONDUCT.md | 76 ++++++++++ CONTRIBUTING.md | 29 ++++ LICENSE | 21 +++ README.md | 59 +++----- USERS.md | 5 + chart/Chart.yaml | 5 + chart/README.md | 50 +++++++ chart/templates/NOTES.txt | 19 +++ chart/templates/_helpers.tpl | 33 +++++ chart/templates/ingress.yaml | 33 +++++ chart/templates/internal-configmap.yaml | 6 + chart/templates/internal-deployment.yaml | 47 ++++++ chart/templates/internal-service.yaml | 23 +++ chart/templates/public-configmap.yaml | 6 + chart/templates/public-deployment.yaml | 49 ++++++ chart/templates/public-secrets.yaml | 15 ++ chart/templates/public-service.yaml | 24 +++ chart/templates/redis-master-deployment.yaml | 29 ++++ chart/templates/redis-master-service.yaml | 18 +++ chart/templates/redis-slave-deployment.yaml | 26 ++++ chart/templates/redis-slave-service.yaml | 17 +++ chart/templates/worker-configmap.yaml | 6 + chart/templates/worker-deployment.yaml | 39 +++++ chart/values.yaml | 81 ++++++++++ cmd/internal.go | 7 +- cmd/public.go | 5 +- cmd/root.go | 15 +- cmd/worker.go | 13 +- docker-compose.yaml | 1 + docs/images/batch_upload.png | Bin 40241 -> 0 bytes .../production.postman_environment.json | 19 --- fixtures/test_model.csv | 5 - go.mod | 23 +-- go.sum | 73 +++------ internal/batch.go | 1 + internal/routes_test.go | 9 +- middleware/worker.go | 5 +- models/model_test.go | 9 +- pkg/db/redis.go | 2 +- pkg/db/redis_test.go | 23 +-- public/recommend_test.go | 3 +- public/routes_test.go | 9 +- stress/bin/body.json | 9 -- stress/bin/stress.sh | 3 - stress/main.go | 139 ------------------ stress/results/benchmark.txt | 63 -------- worker/worker.go | 26 +++- 51 files changed, 898 insertions(+), 397 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/docker-publish.yml create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 USERS.md create mode 100644 chart/Chart.yaml create mode 100644 chart/README.md create mode 100644 chart/templates/NOTES.txt create mode 100644 chart/templates/_helpers.tpl create mode 100644 chart/templates/ingress.yaml create mode 100644 chart/templates/internal-configmap.yaml create mode 100644 chart/templates/internal-deployment.yaml create mode 100644 chart/templates/internal-service.yaml create mode 100644 chart/templates/public-configmap.yaml create mode 100644 chart/templates/public-deployment.yaml create mode 100644 chart/templates/public-secrets.yaml create mode 100644 chart/templates/public-service.yaml create mode 100644 chart/templates/redis-master-deployment.yaml create mode 100644 chart/templates/redis-master-service.yaml create mode 100644 chart/templates/redis-slave-deployment.yaml create mode 100644 chart/templates/redis-slave-service.yaml create mode 100644 chart/templates/worker-configmap.yaml create mode 100644 chart/templates/worker-deployment.yaml create mode 100644 chart/values.yaml delete mode 100644 docs/images/batch_upload.png delete mode 100644 docs/postman/production.postman_environment.json delete mode 100644 fixtures/test_model.csv delete mode 100644 stress/bin/body.json delete mode 100755 stress/bin/stress.sh delete mode 100644 stress/main.go delete mode 100644 stress/results/benchmark.txt diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..dd84ea7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..bbcbbe7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml new file mode 100644 index 0000000..d8a70ed --- /dev/null +++ b/.github/workflows/docker-publish.yml @@ -0,0 +1,56 @@ +name: Docker + +on: + push: + # Publish `master` as Docker `latest` image. + branches: + - master + + # Publish `v1.2.3` tags as releases. + tags: + - v* + + # Run tests for any PRs. + pull_request: + +env: + # TODO: Change variable to your image's name. + IMAGE_NAME: phoenix + +jobs: + # Push image to GitHub Packages. + # See also https://docs.docker.com/docker-hub/builds/ + push: + runs-on: ubuntu-latest + if: github.event_name == 'push' + + steps: + - uses: actions/checkout@v2 + + - name: Build image + run: docker build . --file Dockerfile --tag $IMAGE_NAME + + - name: Log into registry + run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login docker.pkg.github.com -u ${{ github.actor }} --password-stdin + + - name: Push image + run: | + IMAGE_ID=docker.pkg.github.com/${{ github.repository }}/$IMAGE_NAME + + # Change all uppercase to lowercase + IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]') + + # Strip git ref prefix from version + VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,') + + # Strip "v" prefix from tag name + [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//') + + # Use Docker `latest` tag convention + [ "$VERSION" == "master" ] && VERSION=latest + + echo IMAGE_ID=$IMAGE_ID + echo VERSION=$VERSION + + docker tag $IMAGE_NAME $IMAGE_ID:$VERSION + docker push $IMAGE_ID:$VERSION diff --git a/.gitignore b/.gitignore index 2a3a917..325e4a8 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ .localstack/ .vscode/ data/ -.idea \ No newline at end of file +.idea +.DS_Store \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..6f6834c --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at davide.berdin@rtl.nl. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..c339ccf --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,29 @@ +## How to contribute to Phoenix + +#### **Did you find a bug?** + +* **Ensure the bug was not already reported** by searching on GitHub under [Issues](https://github.com/rtlnl/phoenix/issues). + +* If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/rtlnl/phoenix/issues/new). Be sure to include a **title and clear description**, as much relevant information as possible, and a **code sample** or an **executable test case** demonstrating the expected behavior that is not occurring. + +#### **Did you write a patch that fixes a bug?** + +* Open a new GitHub pull request with the patch. + +* Ensure the PR description clearly describes the problem and solution. Include the relevant issue number if applicable. + +#### **Did you fix whitespace, format code, or make a purely cosmetic patch?** + +Changes that are cosmetic in nature and do not add anything substantial to the stability, functionality, or testability of Phoenix will generally not be accepted. + +#### **Do you intend to add a new feature or change an existing one?** + +* Suggest your change in the [Issue](https://github.com/rtlnl/phoenix/issues) and start writing code. + +#### **Do you have questions about the source code?** + +* Ask any question about how to use Phoenix in the [Issues](https://github.com/rtlnl/phoenix/issues) section + +Thanks! :heart: :heart: :heart: + +Phoenix Team diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1a9b828 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 RTL Nederland + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 1bec745..da3595a 100644 --- a/README.md +++ b/README.md @@ -1,50 +1,37 @@ -# Phoenix project +![Docker](https://github.com/rtlnl/phoenix/workflows/Docker/badge.svg?branch=master) [![Go Report Card](https://goreportcard.com/badge/github.com/rtlnl/phoenix)](https://goreportcard.com/report/github.com/rtlnl/phoenix) -The Project is divided in two main parts: +# Phoenix -- Public APIs -- Internal APIs -- Worker +gopher-phoenix -## How to start +Phoenix is the **delivery recommendation systems** that is used at RTL Nederland. These APIs are able to deliver millions of recommendations per day. We use Phoenix for powering [Videoland](https://www.videoland.com/) and [RTL Nieuws](https://www.rtlnieuws.nl/). Our data science team works very hard to generate tailored recommendations to each user and we, as the platform team, make sure that these recommendations are actually delivered. -Assuming that you have `go`, `docker` and `docker-compose` installed in your machine, run `docker-compose up -d` to spin up Redis and localstack (for local S3). +Simple, yet powerful API for delivery recommendations -After having the services up and running, assuming that you have your Go environment in your `PATH`, you should be able to start directly with `go run main.go --help`. This command should print the `help` message. +* **Easy to understand** - push and get data from Redis very quickly +* **Fast in deliverying** - the combination of Go, Redis and Allegro cache makes the project blazing fast +* **Smart in storing** - the APIs avoid the overload of the Redis database by using a worker for bulk uplaod -Proceed by running `go run main.go internal` for the internal APIs (or `go run main.go public` for the public APIs) +We have being used in production since December 2019 and we haven't had a single downtime since. So far, we have delivered more than 350M recommendations to our users. The average request latency is `35ms`. -If you need to upload some files to the local S3, use the following commands after `localstack` has been created: +## Quick start -- `aws --endpoint-url=http://localhost:4572 s3 mb s3://test` to create a bucket in local S3 -- `aws --endpoint-url=http://localhost:4572 s3api put-bucket-acl --bucket test --acl public-read` to set up a policy for testing with local s3 -- `aws --endpoint-url=http://localhost:4572 s3 cp ~/Desktop/data.csv s3://test/content/20190713/` to copy a file to local S3 +Assuming that you have `go`, `docker` and `docker-compose` installed in your machine, you need to have 3 terminals open that points to the directory where the project is. Do the following -## How to run tests +1. In terminal number 1, run `docker-compose up -d` to spin up Redis and localstack (for local S3) +2. In terminal number 1 run `go run main.go worker` for the Worker service +3. In terminal number 2 run `go run main.go internal` for the Internal APIs +4. In terminal number 3 run `go run main.go public` for the Public APIs -To run all the tests, use the following command: +Now you are ready to go :rocket: -```bash -$: go clean -testcache && go test -race ./... -``` +## Docs -The first part is to avoid that Go will cache the result of the tests. This could lead to some evaluation errors -if you change some tests. Better without cache. +The documentation for developing and using Phoenix is available in the [wiki](https://github.com/rtlnl/phoenix/wiki) -## How to perform manual tests +## Join the Phoenix Community +In order to contribute to Phoenix, see the [CONTRIBUTING](CONTRIBUTING.md) file for how to go get started. +If your company or your product is using Phoenix, please let us know by adding yourself to the Phoenix [users](USERS.md) file. -For manual testing of endpoints on the different environments, a [Postman collection](docs/postman/Phoenix.postman_collection.json) has been included in the `docs` directory. - -## Batch Upload - -The APIs gives the possibility to read a file from S3 and upload it to Redis. To avoid timeouts and having the client hanging waiting for the response, the APIs has a simple `checking` mechanism. The picture below explain how the process works - -![](/docs/images/batch_upload.png) - -The process of uploading the file from S3 to Redis is delegated to a separate `go routine`. The client should store the `batchID` that is returned from the initial request `(POST /v1/batch)` and ask for the status with `GET /v1/batch/status/:id`. - -Time taken to upload **1.6M unique keys** from S3 is `3m 33secs`. Check this [PR](https://github.com/rtlnl/phoenix/pull/5) for more information - -### Worker - -There can be only 1 worker working at the time. The worker is responsible for reading the `batchUpload` requests from the Redis Queue and execute them 1 by 1. +## License +Phoenix is licensed under MIT license as found in the [LICENSE](LICENSE.md) file. \ No newline at end of file diff --git a/USERS.md b/USERS.md new file mode 100644 index 0000000..672d7c7 --- /dev/null +++ b/USERS.md @@ -0,0 +1,5 @@ +# who is using Phoenix + +* RTL Nederland +* Videoland +* RTL Nieuws diff --git a/chart/Chart.yaml b/chart/Chart.yaml new file mode 100644 index 0000000..f99182c --- /dev/null +++ b/chart/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +appVersion: "1.0" +description: A Helm chart for Phoenix APIs +name: api +version: 0.3.0 diff --git a/chart/README.md b/chart/README.md new file mode 100644 index 0000000..54c5182 --- /dev/null +++ b/chart/README.md @@ -0,0 +1,50 @@ +# Phoenix + +Current chart version is `0.3.0`. + +## Deploy Phoenix + +The default values will create all the services that are required to make Phoenix work out of the box. Make sure you are setting properly the `ENV` variables to connect to `S3`. To install the chart simply run the below command: + +```bash +$: helm upgrade --install phoenix ./chart -f values.yaml --namespace phoenix --debug --recreate-pods +``` + +If you find something that doesn't work, please open up an Issue or a PR! We :heart: contibutions + +## Chart Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| fullnameOverride | string | `""` | | +| nameOverride | string | `""` | | +| image.pullPolicy | string | `"Always"` | Image pull policy | +| image.repository | string | `"docker.pkg.github.com/rtlnl/phoenix/phoenix"` | Image repository name | +| image.tag | string | `"latest"` | Image tag | +| ingress.annotations | object | `{}` | Ingress annotations (values are templated) | +| ingress.enabled | bool | `false` | Enables Ingress | +| ingress.hosts | array | `[]` | Ingress accepted hostnames | +| internal.affinity | object | `{}` | Affinity settings for pod assignment | +| internal.data | string | `{}` | ENV Varibles to be set for the internal service | +| internal.nodeSelector | object | `{}` | Node labels for pod assignment | +| internal.replicaCount | int | `1` | Number of nodes | +| internal.resources | object | `{}` | CPU/Memory resource requests/limits | +| internal.service.port | int | `8081` | Kubernetes port where service is exposed | +| internal.service.type | string | `"ClusterIP"` | Kubernetes service type | +| internal.tolerations | object | `{}` | Toleration labels for pod assignment | +| public.affinity | object | `{}` | Affinity settings for pod assignment | +| public.data | string | `{}` | ENV Varibles to be set for the public service | +| public.nodeSelector | object | `{}` | Node labels for pod assignment | +| public.replicaCount | int | `1` | Number of nodes | +| public.resources | object | `{}` | CPU/Memory resource requests/limits | +| public.secrets | object | `{}` | Secrets to add to the public service | +| public.service.port | int | `8082` | Kubernetes port where service is exposed | +| public.service.type | string | `"ClusterIP"` | Kubernetes service type | +| public.tolerations | object | `{}` | Toleration labels for pod assignment | +| redis.enabled | bool | `true` | Enable the deployment of a local redis instance | +| redis.resources | object | `{}` | CPU/Memory resource requests/limits | +| worker.affinity | object | `{}` | Affinity settings for pod assignment | +| worker.data | string | `{}` | ENV Varibles to be set for the worker service | +| worker.replicaCount | int | `1` | Number of nodes | +| worker.resources | object | `{}` | CPU/Memory resource requests/limits | +| worker.tolerations | object | `{}` | Toleration labels for pod assignment | diff --git a/chart/templates/NOTES.txt b/chart/templates/NOTES.txt new file mode 100644 index 0000000..6bdffaa --- /dev/null +++ b/chart/templates/NOTES.txt @@ -0,0 +1,19 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} +{{- range .Values.ingress.hosts }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ . }}{{ $.Values.ingress.path }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "api.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get svc -w {{ include "api.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "api.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "api.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl port-forward $POD_NAME 8080:80 +{{- end }} diff --git a/chart/templates/_helpers.tpl b/chart/templates/_helpers.tpl new file mode 100644 index 0000000..8a1e843 --- /dev/null +++ b/chart/templates/_helpers.tpl @@ -0,0 +1,33 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "api.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "api.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "api.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + diff --git a/chart/templates/ingress.yaml b/chart/templates/ingress.yaml new file mode 100644 index 0000000..127b9d4 --- /dev/null +++ b/chart/templates/ingress.yaml @@ -0,0 +1,33 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "api.fullname" . -}} +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: {{ include "api.name" . }}-ingress + labels: + app.kubernetes.io/name: {{ include "api.name" . }} + helm.sh/chart: {{ include "api.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + {{- if .Values.ingress.annotations }} + annotations: + {{- range $key, $value := .Values.ingress.annotations }} + {{ $key }}: {{ tpl $value $ | quote }} + {{- end }} + {{- end }} +spec: + rules: + {{- range .Values.ingress.hosts }} + - host: {{ . | quote }} + http: + paths: + - path: /internal + backend: + serviceName: {{ $fullName }}-internal + servicePort: http + - path: /public + backend: + serviceName: {{ $fullName }}-public + servicePort: http + {{- end }} +{{- end }} diff --git a/chart/templates/internal-configmap.yaml b/chart/templates/internal-configmap.yaml new file mode 100644 index 0000000..fe1e796 --- /dev/null +++ b/chart/templates/internal-configmap.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "api.fullname" . }}-internal +data: +{{ toYaml .Values.internal.data | indent 4 }} \ No newline at end of file diff --git a/chart/templates/internal-deployment.yaml b/chart/templates/internal-deployment.yaml new file mode 100644 index 0000000..5f6afaa --- /dev/null +++ b/chart/templates/internal-deployment.yaml @@ -0,0 +1,47 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "api.fullname" . }}-internal + labels: + app.kubernetes.io/name: {{ include "api.name" . }}-internal + helm.sh/chart: {{ include "api.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} +spec: + replicas: {{ .Values.internal.replicaCount }} + selector: + matchLabels: + app.kubernetes.io/name: {{ include "api.name" . }}-internal + app.kubernetes.io/instance: {{ .Release.Name }} + template: + metadata: + labels: + app.kubernetes.io/name: {{ include "api.name" . }}-internal + app.kubernetes.io/instance: {{ .Release.Name }} + spec: + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + args: ["internal"] + envFrom: + - configMapRef: + name: {{ include "api.fullname" . }}-internal + ports: + - name: http + containerPort: {{ .Values.internal.service.port }} + protocol: TCP + livenessProbe: + httpGet: + path: / + port: http + readinessProbe: + httpGet: + path: / + port: http + resources: +{{ toYaml .Values.internal.resources | indent 12 }} + affinity: +{{ toYaml .Values.internal.affinity | indent 8 }} + tolerations: +{{ toYaml .Values.internal.tolerations | indent 8 }} diff --git a/chart/templates/internal-service.yaml b/chart/templates/internal-service.yaml new file mode 100644 index 0000000..4782552 --- /dev/null +++ b/chart/templates/internal-service.yaml @@ -0,0 +1,23 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "api.fullname" . }}-internal + labels: + app.kubernetes.io/name: {{ include "api.name" . }}-internal + helm.sh/chart: {{ include "api.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + annotations: + prometheus.io/path: "/metrics" + prometheus.io/scheme: http + prometheus.io/scrape: "true" + prometheus.io/port: "9900" +spec: + type: {{ .Values.internal.service.type }} + ports: + - port: {{ .Values.internal.service.port }} + protocol: TCP + name: http + selector: + app.kubernetes.io/name: {{ include "api.name" . }}-internal + app.kubernetes.io/instance: {{ .Release.Name }} diff --git a/chart/templates/public-configmap.yaml b/chart/templates/public-configmap.yaml new file mode 100644 index 0000000..fba1ce3 --- /dev/null +++ b/chart/templates/public-configmap.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "api.fullname" . }}-public +data: +{{ toYaml .Values.public.data | indent 4 }} \ No newline at end of file diff --git a/chart/templates/public-deployment.yaml b/chart/templates/public-deployment.yaml new file mode 100644 index 0000000..b801f13 --- /dev/null +++ b/chart/templates/public-deployment.yaml @@ -0,0 +1,49 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "api.fullname" . }}-public + labels: + app.kubernetes.io/name: {{ include "api.name" . }}-public + helm.sh/chart: {{ include "api.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} +spec: + replicas: {{ .Values.public.replicaCount }} + selector: + matchLabels: + app.kubernetes.io/name: {{ include "api.name" . }}-public + app.kubernetes.io/instance: {{ .Release.Name }} + template: + metadata: + labels: + app.kubernetes.io/name: {{ include "api.name" . }}-public + app.kubernetes.io/instance: {{ .Release.Name }} + spec: + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + args: ["public"] + imagePullPolicy: {{ .Values.image.pullPolicy }} + envFrom: + - configMapRef: + name: {{ include "api.fullname" . }}-public + - secretRef: + name: {{ include "api.fullname" . }}-public-secret + ports: + - name: http + containerPort: {{ .Values.public.service.port }} + protocol: TCP + livenessProbe: + httpGet: + path: / + port: http + readinessProbe: + httpGet: + path: / + port: http + resources: +{{ toYaml .Values.public.resources | indent 12 }} + affinity: +{{ toYaml .Values.public.affinity | indent 8 }} + tolerations: +{{ toYaml .Values.internal.tolerations | indent 8 }} diff --git a/chart/templates/public-secrets.yaml b/chart/templates/public-secrets.yaml new file mode 100644 index 0000000..de2644b --- /dev/null +++ b/chart/templates/public-secrets.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "api.fullname" . }}-public-secret + namespace: {{ .Values.namespace }} + labels: + app.kubernetes.io/name: {{ include "api.name" . }}-public + helm.sh/chart: {{ include "api.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +type: Opaque +data: +{{- if .Values.public.secrets }} +{{ toYaml .Values.public.secrets | indent 2 }} +{{- end }} \ No newline at end of file diff --git a/chart/templates/public-service.yaml b/chart/templates/public-service.yaml new file mode 100644 index 0000000..791c96d --- /dev/null +++ b/chart/templates/public-service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "api.fullname" . }}-public + labels: + app.kubernetes.io/name: {{ include "api.name" . }}-public + helm.sh/chart: {{ include "api.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + annotations: + prometheus.io/path: "/metrics" + prometheus.io/scheme: http + prometheus.io/scrape: "true" + prometheus.io/port: "9900" +spec: + type: {{ .Values.public.service.type }} + ports: + - port: {{ .Values.public.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + app.kubernetes.io/name: {{ include "api.name" . }}-public + app.kubernetes.io/instance: {{ .Release.Name }} diff --git a/chart/templates/redis-master-deployment.yaml b/chart/templates/redis-master-deployment.yaml new file mode 100644 index 0000000..b806f0c --- /dev/null +++ b/chart/templates/redis-master-deployment.yaml @@ -0,0 +1,29 @@ +{{- if and .Values.redis.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: redis-master +spec: + selector: + matchLabels: + app: redis + role: master + tier: backend + replicas: 1 + template: + metadata: + labels: + app: redis + role: master + tier: backend + spec: + containers: + - name: master + image: redis + resources: + requests: + cpu: {{ .Values.redis.resources.cpu }} + memory: {{ .Values.redis.resources.memory }} + ports: + - containerPort: 6379 +{{- end }} \ No newline at end of file diff --git a/chart/templates/redis-master-service.yaml b/chart/templates/redis-master-service.yaml new file mode 100644 index 0000000..ef15ae9 --- /dev/null +++ b/chart/templates/redis-master-service.yaml @@ -0,0 +1,18 @@ +{{- if and .Values.redis.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: redis-master + labels: + app: redis + role: master + tier: backend +spec: + ports: + - port: 6379 + targetPort: 6379 + selector: + app: redis + role: master + tier: backend +{{- end }} \ No newline at end of file diff --git a/chart/templates/redis-slave-deployment.yaml b/chart/templates/redis-slave-deployment.yaml new file mode 100644 index 0000000..b64154e --- /dev/null +++ b/chart/templates/redis-slave-deployment.yaml @@ -0,0 +1,26 @@ +{{- if and .Values.redis.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: redis-slave +spec: + selector: + matchLabels: + app: redis + role: slave + tier: backend + replicas: 0 + template: + metadata: + labels: + app: redis + role: slave + tier: backend + spec: + containers: + - name: slave + image: redis + command: ["redis-server", "--slaveof", "redis-master", "6379"] + ports: + - containerPort: 6379 +{{- end }} \ No newline at end of file diff --git a/chart/templates/redis-slave-service.yaml b/chart/templates/redis-slave-service.yaml new file mode 100644 index 0000000..3d65732 --- /dev/null +++ b/chart/templates/redis-slave-service.yaml @@ -0,0 +1,17 @@ +{{- if and .Values.redis.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: redis-slave + labels: + app: redis + role: slave + tier: backend +spec: + ports: + - port: 6379 + selector: + app: redis + role: slave + tier: backend +{{- end }} \ No newline at end of file diff --git a/chart/templates/worker-configmap.yaml b/chart/templates/worker-configmap.yaml new file mode 100644 index 0000000..828f8e2 --- /dev/null +++ b/chart/templates/worker-configmap.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "api.fullname" . }}-worker +data: +{{ toYaml .Values.worker.data | indent 4 }} \ No newline at end of file diff --git a/chart/templates/worker-deployment.yaml b/chart/templates/worker-deployment.yaml new file mode 100644 index 0000000..004f06e --- /dev/null +++ b/chart/templates/worker-deployment.yaml @@ -0,0 +1,39 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "api.fullname" . }}-worker + labels: + app.kubernetes.io/name: {{ include "api.name" . }}-worker + helm.sh/chart: {{ include "api.chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} +spec: + replicas: {{ .Values.worker.replicaCount }} + strategy: + # for the worker we need to brutally kill the pod to unlock the db + type: Recreate + rollingUpdate: null + selector: + matchLabels: + app.kubernetes.io/name: {{ include "api.name" . }}-worker + app.kubernetes.io/instance: {{ .Release.Name }} + template: + metadata: + labels: + app.kubernetes.io/name: {{ include "api.name" . }}-worker + app.kubernetes.io/instance: {{ .Release.Name }} + spec: + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + args: ["worker"] + imagePullPolicy: {{ .Values.image.pullPolicy }} + envFrom: + - configMapRef: + name: {{ include "api.fullname" . }}-worker + resources: +{{ toYaml .Values.worker.resources | indent 12 }} + affinity: +{{ toYaml .Values.public.affinity | indent 8 }} + tolerations: +{{ toYaml .Values.internal.tolerations | indent 8 }} \ No newline at end of file diff --git a/chart/values.yaml b/chart/values.yaml new file mode 100644 index 0000000..dfe1490 --- /dev/null +++ b/chart/values.yaml @@ -0,0 +1,81 @@ +# Declare variables to be passed into your templates. +nameOverride: "" +fullnameOverride: "" + +image: + repository: repository/phoenix:latest + tag: latest + pullPolicy: Always + +ingress: + enabled: false + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + - chart-example.local + +internal: + replicaCount: 1 + + service: + type: ClusterIP + port: 8081 + + data: + # all the env variables can be found here: https://github.com/rtlnl/phoenix/blob/master/cmd/internal.go#L64 + DB_HOST: "redis-master.phoenix:6379" + DB_PASSWORD: "" + S3_REGION: "us-west-1" + S3_ENDPOINT: "s3.eu-west-1.amazonaws.com" + S3_DISABLE_SSL: "false" + + resources: {} + nodeSelector: {} + tolerations: {} + affinity: {} + +public: + replicaCount: 1 + + service: + type: ClusterIP + port: 8082 + + data: + DB_HOST: "redis-master.phoenix:6379" + DB_PASSWORD: "" + # Other ENV you can set in the configmap + # You can find all the possible variables here: https://github.com/rtlnl/phoenix/blob/master/cmd/public.go#L102 + # REC_LOGS_TYPE: "kafka" + # REC_LOGS_BROKERS: "kafka-broker-0:9092,kafka-broker-1:9092,kafka-broker-3:9092" + # REC_LOGS_TOPIC: "my.topic" + # REC_LOGS_SASLMECHANISM: "PLAIN" + # GIN_MODE: "release" + + secrets: {} + # env variables that you would store as secret + # REC_LOGS_USERNAME: "dXNlcm5hbWU=" + # REC_LOGS_PASSWORD: "cGFzc3dvcmQ=" + resources: {} + nodeSelector: {} + tolerations: {} + affinity: {} + +worker: + replicaCount: 1 + + data: + # all the env variables can be found here: https://github.com/rtlnl/phoenix/blob/master/cmd/worker.go#L79 + WORKER_BROKER_URL: "edis-master.phoenix:6379" + WORKER_PASSWORD: "" + + resources: {} + tolerations: {} + affinity: {} + +redis: + enabled: true + resources: {} + # cpu: 100m + # memory: 100Mi diff --git a/cmd/internal.go b/cmd/internal.go index adae4f7..e521adb 100644 --- a/cmd/internal.go +++ b/cmd/internal.go @@ -26,6 +26,7 @@ var internalCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { addr := viper.GetString(addressInternalFlag) dbHost := viper.GetString(dbHostInternalFlag) + dbPassword := viper.GetString(dbPasswordInternalFlag) s3Region := viper.GetString(s3RegionFlag) s3Endpoint := viper.GetString(s3EndpointFlag) s3DisableSSL := viper.GetBool(s3DisableSSLFlag) @@ -38,7 +39,7 @@ var internalCmd = &cobra.Command{ } // instantiate Redis client - redisClient, err := db.NewRedisClient(dbHost) + redisClient, err := db.NewRedisClient(dbHost, db.Password(dbPassword)) if err != nil { panic(err) } @@ -48,7 +49,7 @@ var internalCmd = &cobra.Command{ middlewares = append(middlewares, md.DB(redisClient)) middlewares = append(middlewares, md.AWSSession(s3Region, s3Endpoint, s3DisableSSL)) middlewares = append(middlewares, md.Cors()) - middlewares = append(middlewares, md.NewWorker(dbHost, workerProducerName, workerQueueName)) + middlewares = append(middlewares, md.NewWorker(redisClient, workerProducerName, workerQueueName)) i, err := internal.NewInternalAPI(middlewares...) if err != nil { @@ -68,6 +69,7 @@ func init() { f.String(addressInternalFlag, ":8081", "server address") f.String(dbHostInternalFlag, "127.0.0.1:6379", "database host") + f.String(dbPasswordInternalFlag, "qwerty", "database password") f.String(s3RegionFlag, "eu-west-1", "s3 region") f.String(s3EndpointFlag, "localhost:4572", "s3 endpoint") f.Bool(s3DisableSSLFlag, true, "disable SSL verification for s3") @@ -75,6 +77,7 @@ func init() { viper.BindEnv(addressInternalFlag, "ADDRESS_HOST") viper.BindEnv(dbHostInternalFlag, "DB_HOST") + viper.BindEnv(dbPasswordInternalFlag, "DB_PASSWORD") viper.BindEnv(s3RegionFlag, "S3_REGION") viper.BindEnv(s3EndpointFlag, "S3_ENDPOINT") viper.BindEnv(s3DisableSSLFlag, "S3_DISABLE_SSL") diff --git a/cmd/public.go b/cmd/public.go index c7163f6..fea11f5 100644 --- a/cmd/public.go +++ b/cmd/public.go @@ -39,6 +39,7 @@ APIs for serving the personalized content.`, // read parameters in input addr := viper.GetString(addressPublicFlag) dbHost := viper.GetString(dbHostPublicFlag) + dbPassword := viper.GetString(dbPasswordPublicFlag) logType := viper.GetString(recommendationLogsFlag) logDebug := viper.GetBool(logDebugFlag) @@ -49,7 +50,7 @@ APIs for serving the personalized content.`, } // instantiate Redis client - redisClient, err := db.NewRedisClient(dbHost) + redisClient, err := db.NewRedisClient(dbHost, db.Password(dbPassword)) if err != nil { panic(err) } @@ -107,6 +108,7 @@ func init() { // mandatory parameters f.StringP(addressPublicFlag, "a", ":8082", "server address") f.StringP(dbHostPublicFlag, "d", "127.0.0.1:6379", "database host") + f.String(dbPasswordPublicFlag, "qwerty", "database password") f.Bool(logDebugFlag, false, "sets log level to debug") // optional parameters @@ -121,6 +123,7 @@ func init() { viper.BindEnv(addressPublicFlag, "ADDRESS_HOST") viper.BindEnv(dbHostPublicFlag, "DB_HOST") + viper.BindEnv(dbPasswordPublicFlag, "DB_PASSWORD") viper.BindEnv(logDebugFlag, "LOG_DEBUG") viper.BindEnv(recommendationLogsFlag, "REC_LOGS_TYPE") viper.BindEnv(recommendationKafkaBrokersFlag, "REC_LOGS_BROKERS") diff --git a/cmd/root.go b/cmd/root.go index 704b0df..acc38b2 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -7,12 +7,15 @@ import ( ) var ( - addressPublicFlag = "address-host-public" - dbHostPublicFlag = "db-host-public" - addressInternalFlag = "address-host-internal" - dbHostInternalFlag = "db-host-internal" - workerBrokerFlag = "worker-broker-url" - logDebugFlag = "debug" + addressPublicFlag = "address-host-public" + dbHostPublicFlag = "db-host-public" + dbPasswordPublicFlag = "db-password-public" + addressInternalFlag = "address-host-internal" + dbHostInternalFlag = "db-host-internal" + dbPasswordInternalFlag = "db-password-internal" + workerBrokerFlag = "worker-broker-url" + workerPasswordFlag = "worker-password" + logDebugFlag = "debug" ) // rootCmd represents the base command when called without any subcommands diff --git a/cmd/worker.go b/cmd/worker.go index 00b4065..320b3e5 100644 --- a/cmd/worker.go +++ b/cmd/worker.go @@ -27,22 +27,23 @@ var workerCmd = &cobra.Command{ that will be executed one they arrive.`, Run: func(cmd *cobra.Command, args []string) { brokerWorker := viper.GetString(workerBrokerFlag) + passwordWorker := viper.GetString(workerPasswordFlag) // instantiate Redis client - redisClient, err := db.NewRedisClient(brokerWorker) + rc, err := db.NewRedisClient(brokerWorker, db.Password(passwordWorker)) if err != nil { panic(err) } - l, err := redisClient.Lock(worker.WorkerLockKey) - defer redisClient.Unlock(worker.WorkerLockKey) + l, err := rc.Lock(worker.WorkerLockKey) + defer rc.Unlock(worker.WorkerLockKey) if l == false || err != nil { log.Error().Err(err).Msg("REDIS failed to acquire lock") os.Exit(0) } - w, err := worker.New(brokerWorker, workerConsumerName, workerQueueName) + w, err := worker.New(rc.Client, workerConsumerName, workerQueueName) if err != nil { panic(err) } @@ -61,7 +62,7 @@ var workerCmd = &cobra.Command{ for { select { case <-ticker.C: - if err := redisClient.ExtendTTL(worker.WorkerLockKey); err != nil { + if err := rc.ExtendTTL(worker.WorkerLockKey); err != nil { log.Error().Msg(err.Error()) w.Close() break EXITLOOP @@ -82,8 +83,10 @@ func init() { f := workerCmd.PersistentFlags() f.String(workerBrokerFlag, "127.0.0.1:6379", "broker url for the workers") + f.String(workerPasswordFlag, "qwerty", "broker password") viper.BindEnv(workerBrokerFlag, "WORKER_BROKER_URL") + viper.BindEnv(workerPasswordFlag, "WORKER_PASSWORD") viper.BindPFlags(f) } diff --git a/docker-compose.yaml b/docker-compose.yaml index a184871..6caabd3 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -21,6 +21,7 @@ services: restart: always command: - "redis-server" + - "--requirepass qwerty" - "--appendonly yes" ports: - "6379:6379" diff --git a/docs/images/batch_upload.png b/docs/images/batch_upload.png deleted file mode 100644 index 34cf0722fbe62a489652cdc12e9222cba5374eee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40241 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 Date: Mon, 2 Nov 2020 17:13:32 +0100 Subject: [PATCH 3/7] remove default password from tests and cli --- cmd/internal.go | 2 +- cmd/public.go | 2 +- cmd/worker.go | 2 +- docker-compose.yaml | 2 +- internal/routes_test.go | 2 +- models/model_test.go | 2 +- pkg/db/redis_test.go | 2 +- public/routes_test.go | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cmd/internal.go b/cmd/internal.go index e521adb..93a6ee5 100644 --- a/cmd/internal.go +++ b/cmd/internal.go @@ -69,7 +69,7 @@ func init() { f.String(addressInternalFlag, ":8081", "server address") f.String(dbHostInternalFlag, "127.0.0.1:6379", "database host") - f.String(dbPasswordInternalFlag, "qwerty", "database password") + f.String(dbPasswordInternalFlag, "", "database password") f.String(s3RegionFlag, "eu-west-1", "s3 region") f.String(s3EndpointFlag, "localhost:4572", "s3 endpoint") f.Bool(s3DisableSSLFlag, true, "disable SSL verification for s3") diff --git a/cmd/public.go b/cmd/public.go index fea11f5..5bb2089 100644 --- a/cmd/public.go +++ b/cmd/public.go @@ -108,7 +108,7 @@ func init() { // mandatory parameters f.StringP(addressPublicFlag, "a", ":8082", "server address") f.StringP(dbHostPublicFlag, "d", "127.0.0.1:6379", "database host") - f.String(dbPasswordPublicFlag, "qwerty", "database password") + f.String(dbPasswordPublicFlag, "", "database password") f.Bool(logDebugFlag, false, "sets log level to debug") // optional parameters diff --git a/cmd/worker.go b/cmd/worker.go index 320b3e5..2c60088 100644 --- a/cmd/worker.go +++ b/cmd/worker.go @@ -83,7 +83,7 @@ func init() { f := workerCmd.PersistentFlags() f.String(workerBrokerFlag, "127.0.0.1:6379", "broker url for the workers") - f.String(workerPasswordFlag, "qwerty", "broker password") + f.String(workerPasswordFlag, "", "broker password") viper.BindEnv(workerBrokerFlag, "WORKER_BROKER_URL") viper.BindEnv(workerPasswordFlag, "WORKER_PASSWORD") diff --git a/docker-compose.yaml b/docker-compose.yaml index 6caabd3..f220df4 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -21,7 +21,7 @@ services: restart: always command: - "redis-server" - - "--requirepass qwerty" + # - "--requirepass qwerty" - "--appendonly yes" ports: - "6379:6379" diff --git a/internal/routes_test.go b/internal/routes_test.go index b9a3dd4..f1c78f0 100644 --- a/internal/routes_test.go +++ b/internal/routes_test.go @@ -16,7 +16,7 @@ import ( var ( testDBHost = utils.GetEnv("DB_HOST", "127.0.0.1:6379") - testDBPassword = utils.GetEnv("DB_PASSWORD", "qwerty") + testDBPassword = utils.GetEnv("DB_PASSWORD", "") testBucket = "test" testEndpoint = "localhost:4572" testRegion = "eu-west-1" diff --git a/models/model_test.go b/models/model_test.go index 687de75..90911dd 100644 --- a/models/model_test.go +++ b/models/model_test.go @@ -12,7 +12,7 @@ import ( var ( testDBHost = utils.GetEnv("DB_HOST", "127.0.0.1:6379") - testDBPassword = utils.GetEnv("DB_PASSWORD", "qwerty") + testDBPassword = utils.GetEnv("DB_PASSWORD", "") ) func TestMain(m *testing.M) { diff --git a/pkg/db/redis_test.go b/pkg/db/redis_test.go index c78b7f2..47b91f6 100644 --- a/pkg/db/redis_test.go +++ b/pkg/db/redis_test.go @@ -11,7 +11,7 @@ import ( var ( testRedisHost = utils.GetDefault(os.Getenv("DB_HOST"), "127.0.0.1:6379") - testRedisPassword = utils.GetDefault(os.Getenv("DB_PASSWORD"), "qwerty") + testRedisPassword = utils.GetDefault(os.Getenv("DB_PASSWORD"), "") ) func TestNewRedis(t *testing.T) { diff --git a/public/routes_test.go b/public/routes_test.go index 386601e..57db147 100644 --- a/public/routes_test.go +++ b/public/routes_test.go @@ -25,7 +25,7 @@ import ( var ( testDBHost = utils.GetEnv("DB_HOST", "127.0.0.1:6379") - testDBPassword = utils.GetEnv("DB_PASSWORD", "qwerty") + testDBPassword = utils.GetEnv("DB_PASSWORD", "") ) var router *gin.Engine From bed276d710e60d9118c61d4672536071aeab73e9 Mon Sep 17 00:00:00 2001 From: Bjorn Mooijekind Date: Tue, 3 Aug 2021 11:24:47 +0200 Subject: [PATCH 4/7] bumbing up versions to remove vulnerabilites (#47) * Development (#45) * Update README.md * Redis credentials (#44) * Update issue templates * OSS (#42) * removing sensitive information for opensourcing the project * add chart for deploying phoenix * remove hardcoded port * Update README.md * Create docker-publish.yml * Update README.md * Update README.md * Create LICENSE * Update README.md * Guidelines (#43) * Create CODE_OF_CONDUCT.md * Create CONTRIBUTING.md * Update README.md * Update README.md * Create USERS.md * Update README.md * Update README.md * bump redis client version, add DB_PASSWORD for redis password, fix worker queue * typo in error checking * add new ENV to chart Co-authored-by: Niels ten Boom * remove default password from tests and cli Co-authored-by: Niels ten Boom * Bugfix chart (#46) * add missing nodeselectors + fixed wrong refs * proper line endings * bumbing up versions to remove vulnerabilites * pinning alpine image to 3.13 Co-authored-by: Davide Berdin Co-authored-by: Niels ten Boom Co-authored-by: Yi Wang --- .gitignore | 1 + Dockerfile | 4 +- Dockerfile.tests | 2 +- Makefile | 4 +- chart/templates/internal-deployment.yaml | 2 + chart/templates/public-deployment.yaml | 4 +- chart/templates/worker-deployment.yaml | 6 +- chart/values.yaml | 1 + go.mod | 39 +- go.sum | 608 ++++++++++++++++++----- 10 files changed, 504 insertions(+), 167 deletions(-) diff --git a/.gitignore b/.gitignore index 325e4a8..2b0646c 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ # Test binary, build with `go test -c` *.test +/bin .localstack/ .vscode/ data/ diff --git a/Dockerfile b/Dockerfile index 7fa13e6..6946bfa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # build stage -FROM golang:1.13 as builder +FROM golang:1.16 as builder ENV GO111MODULE=on @@ -18,7 +18,7 @@ COPY . . RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./bin/api # final stage -FROM alpine:3.9 +FROM alpine:3.13 COPY --from=builder /app /app RUN apk update && \ diff --git a/Dockerfile.tests b/Dockerfile.tests index 61bb160..c2e75c9 100644 --- a/Dockerfile.tests +++ b/Dockerfile.tests @@ -1,4 +1,4 @@ -FROM golang:1.13 +FROM golang:1.16 ENV GO111MODULE=on diff --git a/Makefile b/Makefile index 7757b79..df8c757 100644 --- a/Makefile +++ b/Makefile @@ -35,10 +35,10 @@ coverage: docker-all: docker-build docker-image docker-build: - @docker run -i --rm -v "$(PWD):/go/src/$(PKG)" -w /go/src/$(PKG) golang:1.10 make build OS=linux ARCH=amd64 + @docker run -i --rm -v "$(PWD):/go/src/$(PKG)" -w /go/src/$(PKG) golang:1.16 make build OS=linux ARCH=amd64 docker-test: - @docker run -i --rm -v "$(PWD):/go/src/$(PKG)" -w /go/src/$(PKG) --network greeny_default golang:1.10 make test + @docker run -i --rm -v "$(PWD):/go/src/$(PKG)" -w /go/src/$(PKG) --network phoenix_default golang:1.16 make test docker-image: @docker build -t $(IMAGE):$(VERSION) . diff --git a/chart/templates/internal-deployment.yaml b/chart/templates/internal-deployment.yaml index 5f6afaa..d17a113 100644 --- a/chart/templates/internal-deployment.yaml +++ b/chart/templates/internal-deployment.yaml @@ -45,3 +45,5 @@ spec: {{ toYaml .Values.internal.affinity | indent 8 }} tolerations: {{ toYaml .Values.internal.tolerations | indent 8 }} + nodeSelector: +{{ toYaml .Values.internal.nodeSelector | indent 8 }} diff --git a/chart/templates/public-deployment.yaml b/chart/templates/public-deployment.yaml index b801f13..a0cb31c 100644 --- a/chart/templates/public-deployment.yaml +++ b/chart/templates/public-deployment.yaml @@ -46,4 +46,6 @@ spec: affinity: {{ toYaml .Values.public.affinity | indent 8 }} tolerations: -{{ toYaml .Values.internal.tolerations | indent 8 }} +{{ toYaml .Values.public.tolerations | indent 8 }} + nodeSelector: +{{ toYaml .Values.public.nodeSelector | indent 8 }} diff --git a/chart/templates/worker-deployment.yaml b/chart/templates/worker-deployment.yaml index 004f06e..7915d5b 100644 --- a/chart/templates/worker-deployment.yaml +++ b/chart/templates/worker-deployment.yaml @@ -34,6 +34,8 @@ spec: resources: {{ toYaml .Values.worker.resources | indent 12 }} affinity: -{{ toYaml .Values.public.affinity | indent 8 }} +{{ toYaml .Values.worker.affinity | indent 8 }} tolerations: -{{ toYaml .Values.internal.tolerations | indent 8 }} \ No newline at end of file +{{ toYaml .Values.worker.tolerations | indent 8 }} + nodeSelector: +{{ toYaml .Values.worker.nodeSelector | indent 8 }} diff --git a/chart/values.yaml b/chart/values.yaml index 421d904..f3cbf98 100644 --- a/chart/values.yaml +++ b/chart/values.yaml @@ -71,6 +71,7 @@ worker: WORKER_PASSWORD: "" resources: {} + nodeSelector: {} tolerations: {} affinity: {} diff --git a/go.mod b/go.mod index 32c5fdc..e861c09 100644 --- a/go.mod +++ b/go.mod @@ -1,33 +1,24 @@ module github.com/rtlnl/phoenix -go 1.13 +go 1.15 require ( - github.com/Shopify/sarama v1.24.0 + github.com/Shopify/sarama v1.29.0 github.com/adjust/rmq/v3 v3.0.0 github.com/allegro/bigcache v1.2.1 - github.com/aws/aws-sdk-go v1.25.8 - github.com/banzaicloud/go-gin-prometheus v0.0.0-20190417120951-df9373ad5327 + github.com/aws/aws-sdk-go v1.38.55 + github.com/banzaicloud/go-gin-prometheus v0.1.0 github.com/davecgh/go-spew v1.1.1 - github.com/elastic/go-elasticsearch/v7 v7.4.1 - github.com/gin-contrib/cors v1.3.0 - github.com/gin-contrib/sse v0.1.0 // indirect - github.com/gin-gonic/gin v1.4.0 - github.com/go-playground/locales v0.12.1 // indirect - github.com/go-playground/universal-translator v0.16.0 // indirect + github.com/elastic/go-elasticsearch/v7 v7.13.1 + github.com/gin-contrib/cors v1.3.1 + github.com/gin-gonic/gin v1.7.2 github.com/go-redis/redis/v7 v7.4.0 - github.com/google/uuid v1.1.1 - github.com/json-iterator/go v1.1.7 - github.com/klauspost/cpuid v1.2.1 // indirect - github.com/leodido/go-urn v1.1.0 // indirect - github.com/mattn/go-isatty v0.0.8 // indirect - github.com/prometheus/client_golang v1.2.1 - github.com/rs/zerolog v1.15.0 - github.com/spf13/cobra v0.0.5 - github.com/spf13/viper v1.4.0 - github.com/stretchr/testify v1.5.1 - github.com/ugorji/go v1.1.7 // indirect - golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc // indirect - golang.org/x/net v0.0.0-20191007182048-72f939374954 // indirect - gopkg.in/go-playground/validator.v9 v9.29.1 + github.com/google/uuid v1.2.0 + github.com/json-iterator/go v1.1.11 + github.com/prometheus/client_golang v1.10.0 + github.com/rs/zerolog v1.22.0 + github.com/spf13/cobra v1.1.3 + github.com/spf13/viper v1.7.1 + github.com/stretchr/testify v1.7.0 + gopkg.in/go-playground/validator.v9 v9.31.0 ) diff --git a/go.sum b/go.sum index a8639f3..ebf402a 100644 --- a/go.sum +++ b/go.sum @@ -1,148 +1,294 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +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/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= 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/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/Shopify/sarama v1.24.0 h1:99vo5VAgQybHwZwiOy/RX/S3i0somjGxur3pLeheqzI= -github.com/Shopify/sarama v1.24.0/go.mod h1:fGP8eQ6PugKEI0iUETYYtnP6d1pH/bdDMTel1X5ajsU= -github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/sarama v1.29.0 h1:ARid8o8oieau9XrHI55f/L3EoRAhm9px6sonbD7yuUE= +github.com/Shopify/sarama v1.29.0/go.mod h1:2QpgD79wpdAESqNQMxNc0KYMkycd4slxGdV3TWSVqrU= 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/adjust/rmq/v3 v3.0.0 h1:+tfWjcbcK+O09WTEa/wzmxmGuvC0FgtKCbNKjI8aXmY= github.com/adjust/rmq/v3 v3.0.0/go.mod h1:rji/DBwOpm3DfRfSYS/w8IrVRMz9+P+ffm4nQXPC0Bw= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= 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/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aws/aws-sdk-go v1.25.8 h1:n7I+HUUXjun2CsX7JK+1hpRIkZrlKhd3nayeb+Xmavs= -github.com/aws/aws-sdk-go v1.25.8/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/banzaicloud/go-gin-prometheus v0.0.0-20190417120951-df9373ad5327 h1:d0Xar9+x8sDe89lek4UGRr8LWjIsxMJgxWwh6RlsWOU= -github.com/banzaicloud/go-gin-prometheus v0.0.0-20190417120951-df9373ad5327/go.mod h1:1eXhK1Ld1vRFbNpqi8Eu1ktCCk5LARA1Tbdl8EsAfgE= +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/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/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.38.55 h1:1Wv5CE1Zy0hJ6MJUQ1ekFiCsNKBK5W69+towYQ1P4Vs= +github.com/aws/aws-sdk-go v1.38.55/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/banzaicloud/go-gin-prometheus v0.1.0 h1:zetacN1k3svVc7DtzGfpHA49uO0G8cwsiP5qSuUUQKs= +github.com/banzaicloud/go-gin-prometheus v0.1.0/go.mod h1:1eXhK1Ld1vRFbNpqi8Eu1ktCCk5LARA1Tbdl8EsAfgE= 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/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +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.0 h1:yTUvW7Vhb89inJ+8irsUqiWjh8iT6sQPZiQzI6ReGkA= -github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= +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/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/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/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= 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-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/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/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/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q= +github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/elastic/go-elasticsearch/v7 v7.4.1 h1:Kd/cwKNF5+tABpJ0t39Aucvb5QtYc8RAzy4nwVn1NnM= -github.com/elastic/go-elasticsearch/v7 v7.4.1/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elastic/go-elasticsearch/v7 v7.13.1 h1:PaM3V69wPlnwR+ne50rSKKn0RNDYnnOFQcuGEI0ce80= +github.com/elastic/go-elasticsearch/v7 v7.13.1/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= +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/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/frankban/quicktest v1.4.1 h1:Wv2VwvNn73pAdFIVUQRXYDFp31lXKbqblIXo/Q5GPSg= -github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= +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/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= 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/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/cors v1.3.0 h1:PolezCc89peu+NgkIWt9OB01Kbzt6IP0J/JvkG6xxlg= -github.com/gin-contrib/cors v1.3.0/go.mod h1:artPvLlhkF7oG06nK8v3U8TNz6IeX+w1uzCSEId5/Vc= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-contrib/cors v1.3.1 h1:doAsuITavI4IOcd0Y19U4B+O0dNWihRyX//nn4sEmgA= +github.com/gin-contrib/cors v1.3.1/go.mod h1:jjEJ4268OPZUcU7k9Pm653S7lXUGcqMADzFA61xsmDk= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.4.0 h1:3tMoCCfM7ppqsR0ptz/wi1impNpT7/9wQtMZ8lr1mCQ= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= +github.com/gin-gonic/gin v1.7.2 h1:Tg03T9yM2xa8j6I3Z3oqLaQRSmKvxPd6g/2HJ6zICFA= +github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= 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-playground/locales v0.12.1 h1:2FITxuFt/xuCNP1Acdhv62OzaCiviiE4kotfhkmOqEc= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= -github.com/go-playground/universal-translator v0.16.0 h1:X++omBR/4cE2MNg91AoC3rmGrCjJ8eAeUP/K/EKx4DM= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= -github.com/go-redis/redis/v7 v7.2.0 h1:CrCexy/jYWZjW0AyVoHlcJUeZN19VWlbepTh1Vq6dJs= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-redis/redis/v7 v7.2.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= -github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4= github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +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/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/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/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 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/protobuf v1.3.3/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.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/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -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/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +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/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.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= +github.com/google/uuid v1.2.0/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/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +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/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 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/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= +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 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 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-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= +github.com/hashicorp/go-uuid v1.0.2/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/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +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/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03 h1:FUwcHNlEqkqLjLBdCp5PRlCFijNjvcYANOZXzCfXwCM= -github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem8= +github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.2 h1:6ZIM6b/JJN0X8UM43ZOM6Z4SJzla+a/u7scXFJzodkA= +github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= +github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +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/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.8.2 h1:Bx0qjetmNjdFXASH02NSAREKpiaDwkO1DRZ3dV2KCcs= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/klauspost/compress v1.12.2 h1:2KCfW3I9M7nSc5wOqXAlW2v2U6v+w6cbjvbfp+OykW8= +github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 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.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/leodido/go-urn v1.1.0 h1:Sm1gr51B1kKyfD2BlRcLSiEkffoG96g6TPv6eRoEiB8= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= -github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +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/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +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/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= 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/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 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/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 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -152,194 +298,386 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN 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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +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/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/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.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +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 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pierrec/lz4 v2.2.6+incompatible h1:6aCX4/YZ9v8q69hTyiR7dNLnTA3fgtKHVVW5BCd5Znw= -github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +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/pierrec/lz4 v2.6.0+incompatible h1:Ix9yFKn1nSPBLFl/yZknTp8TU5G4Ps0JDmguYK6iH1A= +github.com/pierrec/lz4 v2.6.0+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 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +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 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/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8= +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/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.2.1 h1:JnMpQc6ppsNgw9QPAGF6Dod479itz7lvlsMzzNayLOI= -github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.10.0 h1:/o0BDeWzLWXNZ+4q5gXltUvaMpJqckTa+jTNoB+z4cg= +github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= +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/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM= +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/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/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.18.0 h1:WCVKW7aL6LEe1uryfI9dnEc2ZqNB1Fn0ok930v0iL1Y= +github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzrgykg80hfFph1mryUeLRsUfoocVVmRY= +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/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a h1:9ZKAASQSHhDYGoxY8uLVpewe1GDZ2vu2Tr/vTdVAkFQ= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/zerolog v1.15.0 h1:uPRuwkWF4J6fGsJ2R0Gn2jB1EQiav9k3S6CSdygQJXY= -github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/rs/zerolog v1.22.0 h1:XrVUjV4K+izZpKXZHlPrYQiDtmdGiCylnT4i43AAWxg= +github.com/rs/zerolog v1.22.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= +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/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2 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/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +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 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= 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/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +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/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +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.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= +github.com/spf13/viper v1.7.1/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 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +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 v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk= -github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v1.0.0 h1:d9X0esnoa3dFsV0FG35rAT0RIhYFlPq7MiP+DW89La0= -github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +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/xdg/scram v1.0.3/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v1.0.3/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 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/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +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/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/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-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc h1:c0o/qxkaO2LF5t6fQrT4b5hzyggAkLLlCUjqfRxd8Q4= -golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b h1:7mWr3k41Qtv8XlltBkDkl8LoP3mpSgBW8BUoxtEdbXg= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/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/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.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-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-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 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191007182048-72f939374954 h1:JGZucVF/L/TotR719NbujzadOZ2AgnYlqphQGHDCKaU= -golang.org/x/net v0.0.0-20191007182048-72f939374954/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-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210427231257-85d9c07bbe3a h1:njMmldwFTyDLqonHMagNXKBWptTBeDZOdblgaDsNEGQ= +golang.org/x/net v0.0.0-20210427231257-85d9c07bbe3a/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/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-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/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-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-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-20191010194322-b09406accb47 h1:/XfQ9z7ib8eEJX2hdgFTZJ/ntt0swNk5oYBziWeTCvY= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e h1:N7DeIrjYszNmSW409R3frPPwglRwMkXSBzwVbkOjLLA= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/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-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= +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-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-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-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +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/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= +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/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= 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/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/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.21.0 h1:G+97AoqBnmZIT91cLG/EkCoK9NSelj64P8bOHHNmGn0= +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/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.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 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 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +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/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/go-playground/validator.v9 v9.29.1 h1:SvGtYmN60a5CVKTOzMSyfzWDeZRxRuGvRQyEAKbw1xc= gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= -gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0 h1:1duIyWiTaYvVx3YX2CYtpJbUFd7/UuPYCfgXtQ3VTbI= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.2.3 h1:hHMV/yKPwMnJhPuPx7pH2Uw/3Qyf+thJYlisUc44010= -gopkg.in/jcmturner/gokrb5.v7 v7.2.3/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0 h1:QHIUxTX1ISuAv9dD2wJ9HWQVuWDX/Zc0PfeC2tjc4rU= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/go-playground/validator.v9 v9.31.0 h1:bmXmP2RSNtFES+bn4uYuHT7iJFJv7Vj+an+ZQdDaD1M= +gopkg.in/go-playground/validator.v9 v9.31.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= 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 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= 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/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +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= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= From 06c62d231941488987a0a56c7e3f0a1e1a849237 Mon Sep 17 00:00:00 2001 From: Yi Wang Date: Tue, 3 Aug 2021 11:47:20 +0200 Subject: [PATCH 5/7] go mod tidy --- Dockerfile.tests | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Dockerfile.tests b/Dockerfile.tests index c2e75c9..6efd037 100644 --- a/Dockerfile.tests +++ b/Dockerfile.tests @@ -10,6 +10,8 @@ RUN apt-get update && \ COPY go.mod . COPY go.sum . +RUN go mod tidy RUN go mod download + COPY . . From 843cea6e497e5791a30c20dd1933b5747ffd28d8 Mon Sep 17 00:00:00 2001 From: Yi Wang Date: Tue, 3 Aug 2021 11:50:37 +0200 Subject: [PATCH 6/7] go mod tidy --- Dockerfile.tests | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile.tests b/Dockerfile.tests index 6efd037..3d7f105 100644 --- a/Dockerfile.tests +++ b/Dockerfile.tests @@ -10,8 +10,8 @@ RUN apt-get update && \ COPY go.mod . COPY go.sum . -RUN go mod tidy RUN go mod download +RUN go mod tidy COPY . . From 17df3d00c4700c244a39f3b657c49689377809c5 Mon Sep 17 00:00:00 2001 From: wangyi Date: Tue, 3 Aug 2021 14:39:27 +0200 Subject: [PATCH 7/7] fix go mod 1.16 issue (#49) --- Dockerfile | 2 +- Dockerfile.tests | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6946bfa..e7e1831 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,7 +15,7 @@ RUN go mod download COPY . . -RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./bin/api +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./bin/api -mod=mod # final stage FROM alpine:3.13 diff --git a/Dockerfile.tests b/Dockerfile.tests index 3d7f105..293434f 100644 --- a/Dockerfile.tests +++ b/Dockerfile.tests @@ -1,6 +1,7 @@ FROM golang:1.16 ENV GO111MODULE=on +ENV GOFLAGS=-mod=mod WORKDIR /app @@ -12,6 +13,4 @@ COPY go.sum . RUN go mod download -RUN go mod tidy - COPY . .