From 922c445979f19d35a6dedd92ef3eab9cb2ce4355 Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Wed, 28 Oct 2020 21:35:46 +0900 Subject: [PATCH 01/14] feat: Run Variant command as Kubernetes controller See examples/controller for more information. --- README.md | 1 + examples/controller/README.md | 192 +++++++++++++++++ examples/controller/main.variant | 21 ++ examples/controller/reconcilation.yaml | 9 + examples/controller/resource.1.yaml | 7 + examples/controller/resource.2.yaml | 7 + examples/controller/variant.crds.yaml | 31 +++ go.mod | 14 ++ go.sum | 200 +++++++++++++++++ main.go | 60 +++++- pkg/controller/controller.go | 284 +++++++++++++++++++++++++ 11 files changed, 825 insertions(+), 1 deletion(-) create mode 100644 examples/controller/README.md create mode 100644 examples/controller/main.variant create mode 100644 examples/controller/reconcilation.yaml create mode 100644 examples/controller/resource.1.yaml create mode 100644 examples/controller/resource.2.yaml create mode 100644 examples/controller/variant.crds.yaml create mode 100644 pkg/controller/controller.go diff --git a/README.md b/README.md index 5ff96e5..802371d 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ - **Embeddable**: Easy embedding in any Golang application - **Easy distribution**: Build a single-executable of your command with Golang - **Dependency Management**: Dependent files, executable binaries and docker-run shims can be automatically installed and updated with the [variantdev/mod](https://github.com/variantdev/mod) integration. Example: [module](https://github.com/mumoshu/variant2/tree/master/examples/module) +- **Run as a Kubernetes controller**: You can easily turn your Variant command into a Kubernetes controller. See [examples/controller](examples/controller) - **Integrations**: Integrates nicely with Slack, GitHub. You can run Variant command in response to Slack message, GitHub issue comment, commit push, etc. # Getting Started diff --git a/examples/controller/README.md b/examples/controller/README.md new file mode 100644 index 0000000..123cb14 --- /dev/null +++ b/examples/controller/README.md @@ -0,0 +1,192 @@ +# Running your Variant command as a Kubernetes controller + +Running `variant` with a few environment variables allows you to turn your command into a Kubernetes controller. + +Let's say your command had a pair of jobs to upsert and destroy the your stack by using e.g. Terraform and/or Helmfile: + +- `variant run apply --env prod --ref abcd1234` +- `variant run destroy --env prod --ref abcd1234` + +```console +$ cat main.variant +option "env" { + type = string +} + +option "ref" { + type = string +} + +job "apply" { + exec { + command = "echo" + args = ["Deploying ${opt.ref} to ${opt.env}"] + } +} + +job "destroy" { + exec { + command = "echo" + args = ["Destroying ${opt.env}"] + } +} +``` + +You can turn this into a Kubernetes controller by setting `_JOB_ON_APPLY` to the job ran on resource creation or update, +and `_JOB_ON_DESTROY` to the job ran on resource deletion. The only remaining required envvar is `VARIANT_CONTROLLER_NAME`, +which must be set to whatever name that the controller uses as the name of itself. + +As we've seen in the example in the beginning of this section, the on-apply job is `apply` and the on-destroy job is `destroy` so that `variant` invocation +should look like: + +```console +$ VARIANT_CONTROLLER_JOB_ON_APPLY=apply \ + VARIANT_CONTROLLER_JOB_ON_DESTROY=destroy \ + VARIANT_CONTROLLER_NAME=resource \ + variant +``` + +`variant` uses `core.variant.run/v1beta1` `Resource` as the resource to be reconciled by the controller. + +That being said, you can let the controller reconcile your resource by creating a `Resource` object with correct arguments - +`env` and `ref` in this example - under the object's `spec` field: + +```console +$ kubectl apply -f <(cat EOS +apiVersion: core.variant.run/v1beta1 +kind: Resource +metadata: + name: myresource +spec: + env: preview + ref: abc1234 +EOS +) +``` + +Within a few seconds, the controller will reconcile your `Resource` by running `variant run apply --env preview --ref abc1234`. + +You can verify that by tailing controller logs by `kubectl logs`, or browsing the `Reconcilation` object that is created by +the controller to record the reconcilation details: + +```console +$ kubectl get reconcilation +NAME AGE +myresource-2 12m +``` + +```console +$ kubectl get -o yaml reconcilation myresource-2 +apiVersion: core.variant.run/v1beta1 +kind: Reconcilation +metadata: + creationTimestamp: "2020-10-28T12:05:55Z" + generation: 1 + labels: + core.variant.run/controller: resource + core.variant.run/event: apply + core.variant.run/pod: YOUR_HOST_OR_POD_NAME + name: myresource-2 + namespace: default +spec: + combinedLogs: + data: | + Deploying abc2345 to preview + job: apply + resource: + env: preview + ref: abc2345 +``` + +Updating the `Resource` object will result in `variant` running `variant run apply` with the updated arguments: + +```console +$ kubectl apply -f <(cat < k8s.io/api v0.0.0-20190918155943-95b840bb6a1f + k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783 => k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783 + k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655 => k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655 + k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible => k8s.io/client-go v0.0.0-20190918160344-1fbdaa4c8d90 ) diff --git a/go.sum b/go.sum index 43723f7..079dfa7 100644 --- a/go.sum +++ b/go.sum @@ -58,9 +58,11 @@ github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX github.com/Azure/go-autorest v11.7.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v13.2.0+incompatible h1:jK9tnWNPzdvf5gTuueYWLCfIvAhg15iZ2f6+qkD43s8= github.com/Azure/go-autorest v13.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.1.0/go.mod h1:AKyIcETwSUFxIcs/Wnq/C+kwCtlEYGUVd7FPNb2slmg= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.2 h1:6AWuh3uWrsZJcNoCHrCF/+g4aKPCU39kaMO6/qrnK/4= github.com/Azure/go-autorest/autorest v0.9.2/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest/adal v0.1.0/go.mod h1:MeS4XhScH55IST095THyTxElntu7WqB7pNbZo8Q5G3E= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= github.com/Azure/go-autorest/autorest/adal v0.6.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= github.com/Azure/go-autorest/autorest/adal v0.7.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= @@ -85,6 +87,7 @@ github.com/Azure/go-autorest/autorest/validation v0.2.0 h1:15vMO4y76dehZSq7pAaOL github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.1.0/go.mod h1:ROEEAFwXycQw7Sn3DXNtEedEvdeRAgDr0izn4z5Ij88= github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-ntlmssp v0.0.0-20180810175552-4a21cbd618b4/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= @@ -105,6 +108,7 @@ github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZC github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Microsoft/go-winio v0.4.13 h1:Hmi80lzZuI/CaYmlJp/b+FjZdRZhKu9c2mDVqKlLWVs= github.com/Microsoft/go-winio v0.4.13/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw= @@ -119,6 +123,11 @@ github.com/PaesslerAG/jsonpath v0.1.0 h1:gADYeifvlqK3R3i2cR5B4DGgxLXIPb3TRTH1mGi github.com/PaesslerAG/jsonpath v0.1.0/go.mod h1:4BzmtoM/PI8fPO4aQGIusjGxGir2BzcV0grWtFzq1Y8= github.com/PaesslerAG/jsonpath v0.1.1 h1:c1/AToHQMVsduPAa4Vh6xp2U0evy4t8SWp8imEsylIk= github.com/PaesslerAG/jsonpath v0.1.1/go.mod h1:lVboNxFGal/VwW6d9JzIy56bUsYAP6tH/x80vjnCseY= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/SAP/go-hdb v0.14.1 h1:hkw4ozGZ/i4eak7ZuGkY5e0hxiXFdNUBNhr4AvZVNFE= github.com/SAP/go-hdb v0.14.1/go.mod h1:7fdQLVC2lER3urZLjZCm0AuMQfApof92n3aylBPEkMo= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= @@ -172,6 +181,8 @@ github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf h1:eg0MeVzsP1G42dRafH3vf+al2vQIJU0YHX+1Tw87oco= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM= github.com/aws/aws-sdk-go v1.19.39/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.22.2/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -189,6 +200,7 @@ github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= +github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmatcuk/doublestar v1.1.5 h1:2bNwBOmhyFEFcoB3tGvTD5xanq+4kyOZlB8wFYbMjkk= github.com/bmatcuk/doublestar v1.1.5/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= @@ -226,20 +238,27 @@ github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcju github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc h1:TP+534wVlf61smEIq1nwLLAjQVEK2EADoW3CX9AuT+8= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/coreos/bbolt v1.3.0/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/bbolt v1.3.1-coreos.6/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.15+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-oidc v2.0.0+incompatible h1:+RStIopZ8wooMx+Vs5Bt8zMXxV1ABl5LbakNExNmZIg= github.com/coreos/go-oidc v2.0.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creasty/defaults v1.2.1/go.mod h1:CIEEvs7oIVZm30R8VxtFJs+4k201gReYyuYHJxZc68I= github.com/creasty/defaults v1.3.0 h1:uG+RAxYbJgOPCOdKEcec9ZJXeva7Y6mj/8egdzwmLtw= github.com/creasty/defaults v1.3.0/go.mod h1:CIEEvs7oIVZm30R8VxtFJs+4k201gReYyuYHJxZc68I= +github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -255,6 +274,7 @@ github.com/docker/distribution v0.0.0-20171011171712-7484e51bf6af h1:ujR+JcSHkOZ github.com/docker/distribution v0.0.0-20171011171712-7484e51bf6af/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= @@ -263,6 +283,7 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/duosecurity/duo_api_golang v0.0.0-20190308151101-6c680f768e74 h1:2MIhn2R6oXQbgW5yHfS+d6YqyMfXiu2L55rFZC4UD/M= github.com/duosecurity/duo_api_golang v0.0.0-20190308151101-6c680f768e74/go.mod h1:UqXY1lYT/ERa4OEAywUqdok1T4RCRdArkhic1Opuavo= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -275,11 +296,14 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.0.0-20190203023257-5858425f7550/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 h1:Ghm4eQYC0nEPnSJdVkTrXpu9KtoVCSo1hg7mtI7G9KU= @@ -304,9 +328,13 @@ github.com/gammazero/deque v0.0.0-20190130191400-2afb3858e9c7 h1:D2LrfOPgGHQprIx github.com/gammazero/deque v0.0.0-20190130191400-2afb3858e9c7/go.mod h1:GeIq9qoE43YdGnDXURnmKTnGg15pQz4mYkXSTChbneI= github.com/gammazero/workerpool v0.0.0-20190406235159-88d534f22b56 h1:VzbudKn/nvxYKOdzgkEBS6SSreRjAgoJ+ZeS4wPFkgc= github.com/gammazero/workerpool v0.0.0-20190406235159-88d534f22b56/go.mod h1:w9RqFVO2BM3xwWEcAB8Fwp0OviTBBEiRmSBDfbXnd3w= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= @@ -320,9 +348,46 @@ github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTD github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= +github.com/go-logr/zapr v0.1.1 h1:qXBXPDdNncunGs7XeEpsJt8wCjYBygluzfdLO0G5baE= +github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= +github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= +github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= +github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= +github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-playground/locales v0.12.1 h1:2FITxuFt/xuCNP1Acdhv62OzaCiviiE4kotfhkmOqEc= github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= @@ -362,11 +427,14 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= 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-20180513044358-24b0969c4cb7/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/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= @@ -378,6 +446,8 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -426,8 +496,11 @@ github.com/google/go-github/v27 v27.0.6 h1:oiOZuBmGHvrGM1X9uNUAUlLgp5r1UUO/M/Knb github.com/google/go-github/v27 v27.0.6/go.mod h1:/0Gr8pJ55COkmv+S/yPKCczSkUPIM/LnFyubufRNIS0= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf h1:+RRA9JqSOZFfKrOeqr2z77+8R2RKyh8PG66dcu1V0ck= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= 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= @@ -446,7 +519,11 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= +github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= github.com/gophercloud/gophercloud v0.0.0-20190208042652-bc37892e1968/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gophercloud/utils v0.0.0-20190128072930-fbb6ab446f01/go.mod h1:wjDF8z83zTeg5eMLml5EBSlAhbF7G8DobyI1YsMuyzw= github.com/gopherjs/gopherjs v0.0.0-20180628210949-0892b62f0d9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= @@ -466,10 +543,13 @@ github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQ github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/goware/prefixer v0.0.0-20160118172347-395022866408 h1:Y9iQJfEqnN3/Nce9cOegemcy/9Ai5k3huT6E80F3zaw= github.com/goware/prefixer v0.0.0-20160118172347-395022866408/go.mod h1:PE1ycukgRPJ7bJ9a1fdfQ9j8i/cEcRAoLZzbxYpNB/s= +github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20190222133341-cfaf5686ec79/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= 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.3.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.4.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= @@ -547,6 +627,7 @@ github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09 github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E= 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.0.0-20180201235237-0fb14efe8c47/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 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/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= @@ -651,7 +732,9 @@ github.com/iancoleman/strcase v0.0.0-20190422225806-e506e3ef7365/go.mod h1:SK73t github.com/iancoleman/strcase v0.0.0-20191112232945-16388991a334 h1:VHgatEHNcBFEB7inlalqfNqw65aNkM1lGX2yt3NmbS8= github.com/iancoleman/strcase v0.0.0-20191112232945-16388991a334/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= @@ -681,10 +764,13 @@ github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/joyent/triton-go v0.0.0-20180313100802-d8f9c0314926/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA= github.com/joyent/triton-go v0.0.0-20190112182421-51ffac552869/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA= +github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= 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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -705,6 +791,7 @@ github.com/keybase/go-crypto v0.0.0-20161004153544-93f5b35093ba/go.mod h1:ghbZsc github.com/keybase/go-crypto v0.0.0-20190403132359-d65b6b94177f h1:Gsc9mVHLRqBjMgdQCghN9NObCcRncDqxJvBvEaIIQEo= github.com/keybase/go-crypto v0.0.0-20190403132359-d65b6b94177f/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v0.0.0-20161130080628-0de1eaf82fa3/go.mod h1:jxZFDH7ILpTPQTk+E2s+z4CUas9lVNjIuKR4c5/zKgM= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= @@ -723,6 +810,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.4 h1:5Myjjh3JY/NaAi4IsUbHADytDyl1VE1Y9PXDlL+P/VQ= github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5 h1:hyz3dwM5QLc1Rfoz4FuWJQG5BN7tc6K1MndAUnGpQr4= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 h1:MtvEpTB6LX3vkb4ax0b5D2DHbNAUsen0Gx5wZoq3lV4= @@ -744,6 +833,10 @@ github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQ github.com/lusis/go-artifactory v0.0.0-20160115162124-7e4ce345df82/go.mod h1:y54tfGmO3NKssKveTEFFzH8C/akrSOy/iW9qEAUDV84= github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11 h1:YFh+sjyJTMQSYjKwM4dFKhJPJC/wfo98tPUc17HdoYw= github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11/go.mod h1:Ah2dBMoxZEqk118as2T4u4fjfXarE0pPnMJaArZQZsI= github.com/masterzen/simplexml v0.0.0-20160608183007-4572e39b1ab9/go.mod h1:kCEbxUJlNDEBNbdQMkPSp6yaKcRXVI6f4ddk8Riv4bc= @@ -808,14 +901,17 @@ github.com/mitchellh/pointerstructure v0.0.0-20190430161007-f252a8fd71c8/go.mod github.com/mitchellh/prefixedio v0.0.0-20190213213902-5733675afd51/go.mod h1:kB1naBgV9ORnkiTVeyJOI1DavaJkG4oNIq0Af6ZVKUo= github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mozilla-services/yaml v0.0.0-20180922153656-28ffe5d0cafb h1:wj4n5+b4t84Qze8N/n0PKpaBTlbA7g7nTYG01h16mh0= github.com/mozilla-services/yaml v0.0.0-20180922153656-28ffe5d0cafb/go.mod h1:Is/Ucts/yU/mWyGR8yELRoO46mejouKsJfQLAIfTR18= github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nbutton23/zxcvbn-go v0.0.0-20160627004424-a22cb81b2ecd/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= @@ -830,14 +926,20 @@ github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.4.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.3.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= @@ -861,8 +963,11 @@ github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaR github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pbnjay/strptime v0.0.0-20140226051138-5c05b0d668c9 h1:4lfz0keanz7/gAlvJ7lAe9zmE08HXxifBZJC0AdeGKo= github.com/pbnjay/strptime v0.0.0-20140226051138-5c05b0d668c9/go.mod h1:6Hr+C/olSdkdL3z68MlyXWzwhvwmwN7KuUFXGb3PoOk= +github.com/pborman/uuid v0.0.0-20170612153648-e790cca94e6c/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.1.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= 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= @@ -873,15 +978,18 @@ github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.1/go.mod h1:6gapUrK/U1TAN7ciCoNRIdVC5sbdBTUh1DKN0g6uH7E= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 h1:J9b7z+QKAmPf4YLrFg6oQUotqHQeUNWwkvo7jZp1GLU= github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/otp v1.1.0 h1:q2gMsMuMl3JzneUaAX1MRGxLvOG6bzXV51hivBaStf0= github.com/pquerna/otp v1.1.0/go.mod h1:Zad1CMQfSQZI5KLpahDiSUX4tMMREnXw98IvL1nhgMk= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829 h1:D+CiwcpGTW6pL6bv6KI3KbyEyCKyS+1JWS2h8PNDnGA= @@ -890,6 +998,7 @@ github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612/go.mod h1: github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f h1:BVwpUVJDADN2ufcGik7W992pyps0wZ888b/y9GXcLTU= 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/common v0.0.0-20180518154759-7600349dcfe1/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= @@ -903,10 +1012,13 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1 h1:/K3IL0Z1quvmJ7X0A1AwNEK7CRkVK3YwfOU/QAL4WGg= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190315082738-e56f2e22fc76 h1:glJ8HXGaePtQl0vo01o6x8viTBt7BaxOyXbvC9XV6VY= +github.com/prometheus/procfs v0.0.0-20190315082738-e56f2e22fc76/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -962,6 +1074,7 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1 github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= @@ -969,6 +1082,7 @@ github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod github.com/spf13/afero v1.1.0/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.2/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= @@ -977,6 +1091,7 @@ 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/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= @@ -991,6 +1106,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -1000,6 +1116,8 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.0 h1:DMOzIV76tmoDNE9pX6RSN0aDtCYeCg5VueieJaAo1uw= github.com/stretchr/testify v1.5.0/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/summerwind/whitebox-controller v0.7.1 h1:+ERGiGPqm7C7DvXyimTJ3OwO3iw5y7snjWpoSf/D06w= +github.com/summerwind/whitebox-controller v0.7.1/go.mod h1:3SZitDnhxTw8TbjTNFoIBPVEiGnHSzP0XotKGd7Fy0Y= github.com/svanharmelen/jsonapi v0.0.0-20180618144545-0c0828c3f16d/go.mod h1:BSTlc8jOjh0niykqEGVXOLXdi9o0r0kR8tCYiMvjFgw= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/tebeka/strftime v0.1.3 h1:5HQXOqWKYRFfNyBMNVc9z5+QzuBtIXy03psIhtdJYto= @@ -1105,20 +1223,29 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.9.1 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20180608092829-8ac0e0d97ce4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190222235706-ffb98f73852f/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-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -1126,6 +1253,7 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= @@ -1133,7 +1261,9 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6 h1:Sy5bstxEqwwbYs6n0/pBuxKENqOeZUgD45Gp3Q3pqLg= golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= @@ -1169,12 +1299,15 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20170915142106-8351a756f30f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180112015858-5ccada7d0a7b/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1186,13 +1319,16 @@ golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190206173232-65e2d4e15006/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190502183928-7f726cade0ab/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191009170851-d66e71096ffb/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191021144547-ec77196f6094 h1:5O4U9trLjNpuhpynaDsqwCk+Tw6seqJz1EbqbnzHrc8= @@ -1227,7 +1363,9 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20171026204733-164713f0dfce/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180117170059-2c42eef0765b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1242,10 +1380,12 @@ golang.org/x/sys v0.0.0-20181213200352-4d1cda033e06/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181218192612-074acd46bca6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181221143128-b4a75ba826a6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/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= @@ -1257,6 +1397,7 @@ golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190529164535-6a60838ec259/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190530182044-ad28b68e88f1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1276,9 +1417,11 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d h1:nc5K6ox/4lTFbMVSL9WRR81ixkcwXThoiF6yf+R9scA= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915090833-1cbadb444a80/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20171227012246-e19ae1496984/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= @@ -1293,12 +1436,15 @@ golang.org/x/tools v0.0.0-20170915040203-e531a2a1c15f/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/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-20190121143147-24cd39ecf745/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1311,6 +1457,7 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-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= @@ -1342,6 +1489,11 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gomodules.xyz/jsonpatch/v2 v2.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0= +gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= +gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= @@ -1367,6 +1519,7 @@ google.golang.org/api v0.20.0 h1:jz2KixHX7EcCPiQrySzPdnYT7DbINAypCqKZ1Z7GM40= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.21.0 h1:zS+Q/CJJnVlXpXQVIz+lH0ZT2lBuT2ac7XD8Y/3w6hY= google.golang.org/api v0.32.0 h1:Le77IccnTqEa8ryp9wIpX5W3zYm7Gf9LhOp9PHcwFts= +google.golang.org/api v0.34.0 h1:k40adF3uR+6x/+hO5Dh4ZFUqFp67vxvbpafFiJxl10A= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1432,6 +1585,8 @@ gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUy 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/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= @@ -1452,14 +1607,17 @@ gopkg.in/ini.v1 v1.42.0 h1:7N3gPTt50s8GuLortA00n8AqRTk75qOP98+mTPpgzRk= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/ory-am/dockertest.v3 v3.3.4/go.mod h1:s9mmoLkaGeAh97qygnNj4xWkiN7e1SKekYC6CovU+ek= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1 h1:SK5KegNXmKmqE342YYN2qPHEnUYeoMiXXl1poUlI+o4= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.0.0/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= @@ -1488,24 +1646,66 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= +k8s.io/api v0.0.0-20190409021203-6e4e0e4f393b/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= k8s.io/api v0.0.0-20190409092523-d687e77c8ae9 h1:c9UEl5z8gk1DGh/g3snETZ+a52YeR9VdbX/3BQ4PHas= k8s.io/api v0.0.0-20190409092523-d687e77c8ae9/go.mod h1:FQEUn50aaytlU65qqBn/w+5ugllHwrBzKm7DzbnXdzE= +k8s.io/api v0.0.0-20190918155943-95b840bb6a1f h1:8FRUST8oUkEI45WYKyD8ed7Ad0Kg5v11zHyPkEVb2xo= +k8s.io/api v0.0.0-20190918155943-95b840bb6a1f/go.mod h1:uWuOHnjmNrtQomJrvEBg0c0HRNyQ+8KTEERVsK0PW48= +k8s.io/apiextensions-apiserver v0.0.0-20190409022649-727a075fdec8/go.mod h1:IxkesAMoaCRoLrPJdZNZUQp9NfZnzqaVzLhb2VEQzXE= +k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783 h1:V6ndwCPoao1yZ52agqOKaUAl7DYWVGiXjV7ePA2i610= +k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783/go.mod h1:xvae1SZB3E17UpV59AWc271W/Ph25N+bjPyR63X6tPY= +k8s.io/apimachinery v0.0.0-20190404173353-6a84e37a896d/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= k8s.io/apimachinery v0.0.0-20190409092423-760d1845f48b h1:fVkKJL9FIpA8LSJyHVM00MP45q1WJ7+af77vcxmQP4g= k8s.io/apimachinery v0.0.0-20190409092423-760d1845f48b/go.mod h1:FW86P8YXVLsbuplGMZeb20J3jYHscrDqw4jELaFJvRU= +k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655 h1:CS1tBQz3HOXiseWZu6ZicKX361CZLT97UFnnPx0aqBw= +k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655/go.mod h1:nL6pwRT8NgfF8TT68DBI8uEePRt89cSvoXUVqbkWHq4= +k8s.io/apiserver v0.0.0-20190918160949-bfa5e2e684ad/go.mod h1:XPCXEwhjaFN29a8NldXA901ElnKeKLrLtREO9ZhFyhg= +k8s.io/client-go v0.0.0-20190918160344-1fbdaa4c8d90 h1:mLmhKUm1X+pXu0zXMEzNsOF5E2kKFGe5o6BZBIIqA6A= +k8s.io/client-go v0.0.0-20190918160344-1fbdaa4c8d90/go.mod h1:J69/JveO6XESwVgG53q3Uz5OSfgsv4uxpScmmyYOOlk= +k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible h1:U5Bt+dab9K8qaUmXINrkXO135kA11/i5Kg1RUydgaMQ= +k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= +k8s.io/code-generator v0.0.0-20190912054826-cd179ad6a269/go.mod h1:V5BD6M4CyaN5m+VthcclXWsVcT1Hu+glwa1bi3MIsyE= +k8s.io/component-base v0.0.0-20190918160511-547f6c5d7090/go.mod h1:933PBGtQFJky3TEwYx4aEPZ4IxqhWh3R6DCmzqIn1hA= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.0.0-20190306015804-8e90cee79f82/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.3 h1:niceAagH1tzskmaie/icWd7ci1wbG7Bf2c6YGcQv+3c= k8s.io/klog v0.3.3/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= +k8s.io/kube-openapi v0.0.0-20190306001800-15615b16d372/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/utils v0.0.0-20190506122338-8fab8cb257d5/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= +k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= layeh.com/radius v0.0.0-20190322222518-890bc1058917 h1:BDXFaFzUt5EIqe/4wrTc4AcYZWP6iC6Ult+jQWLh5eU= layeh.com/radius v0.0.0-20190322222518-890bc1058917/go.mod h1:fywZKyu//X7iRzaxLgPWsvc0L26IUpVvE/aeIL2JtIQ= +modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= +modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/controller-runtime v0.2.0/go.mod h1:ZHqrRDZi3f6BzONcvlUxkqCKgwasGk5FZrnSv9TVZF4= +sigs.k8s.io/controller-runtime v0.4.0 h1:wATM6/m+3w8lj8FXNaO6Fs/rq/vqoOjO1Q116Z9NPsg= +sigs.k8s.io/controller-runtime v0.4.0/go.mod h1:ApC79lpY3PHW9xj/w9pj+lYkLgwAAUZwfXkME1Lajns= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= +sigs.k8s.io/testing_frameworks v0.1.1/go.mod h1:VVBKrHmJ6Ekkfz284YKhQePcdycOzNH9qL6ht1zEr/U= +sigs.k8s.io/testing_frameworks v0.1.2 h1:vK0+tvjF0BZ/RYFeZ1E6BYBwHJJXhjuZ3TdsEKH+UQM= +sigs.k8s.io/testing_frameworks v0.1.2/go.mod h1:ToQrwSC3s8Xf/lADdZp3Mktcql9CG0UAmdJG9th5i0w= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= diff --git a/main.go b/main.go index e7122c7..8283f85 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,15 @@ package variant -import "fmt" +import ( + "bytes" + "fmt" + "io" + "os" + + "github.com/mumoshu/variant2/pkg/controller" + "golang.org/x/sync/errgroup" + "golang.org/x/xerrors" +) func RunMain(env Env, opts ...Option) error { cmd, path, args := GetPathAndArgsFromEnv(env) @@ -16,5 +25,54 @@ func RunMain(env Env, opts ...Option) error { return fmt.Errorf("loading command: %w", err) } + if controller.RunRequested() { + return controller.Run(func(args []string) (string, error) { + buf := &bytes.Buffer{} + + outRead, outWrite := io.Pipe() + outBuf := io.TeeReader(outRead, buf) + + errRead, errWrite := io.Pipe() + errBuf := io.TeeReader(errRead, buf) + + eg := &errgroup.Group{} + + eg.Go(func() error { + if _, err := io.Copy(os.Stdout, outBuf); err != nil { + return xerrors.Errorf("copying to stdout: %w", err) + } + + return nil + }) + + eg.Go(func() error { + if _, err := io.Copy(os.Stderr, errBuf); err != nil { + return xerrors.Errorf("copying to stderr: %w", err) + } + + return nil + }) + + err := m.Run(args, RunOptions{ + Stdout: outWrite, + Stderr: errWrite, + DisableLocking: false, + }) + + outWrite.Close() + errWrite.Close() + + if egErr := eg.Wait(); egErr != nil { + panic(egErr) + } + + if err != nil { + return "", xerrors.Errorf("running command: %w", err) + } + + return buf.String(), err + }) + } + return m.Run(args, RunOptions{DisableLocking: false}) } diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go new file mode 100644 index 0000000..4e46620 --- /dev/null +++ b/pkg/controller/controller.go @@ -0,0 +1,284 @@ +package controller + +import ( + "context" + "fmt" + "os" + "strings" + + "github.com/summerwind/whitebox-controller/handler" + "github.com/summerwind/whitebox-controller/reconciler/state" + "golang.org/x/xerrors" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "sigs.k8s.io/controller-runtime/pkg/client" + kconfig "sigs.k8s.io/controller-runtime/pkg/client/config" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + "sigs.k8s.io/controller-runtime/pkg/runtime/signals" + + _ "k8s.io/client-go/plugin/pkg/client/auth/azure" + _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" + _ "k8s.io/client-go/plugin/pkg/client/auth/oidc" + + "github.com/summerwind/whitebox-controller/config" + "github.com/summerwind/whitebox-controller/manager" +) + +const ( + EnvPrefix = "VARIANT_CONTROLLER_" +) + +func RunRequested() bool { + for _, env := range os.Environ() { + if strings.HasPrefix(env, EnvPrefix) { + return true + } + } + + return false +} + +const ( + coreGroup = "core.variant.run" + coreVersion = "v1beta1" +) + +var ( + reconcilationGroupVersionKind = schema.GroupVersionKind{ + Group: coreGroup, + Version: coreVersion, + Kind: "Reconcilation", + } +) + +func Run(run func([]string) (string, error)) (finalErr error) { + logf.SetLogger(logf.ZapLogger(false)) + + defer func() { + if finalErr != nil { + logf.Log.Error(finalErr, "Error while running controller") + } + }() + + kc, err := kconfig.GetConfig() + if err != nil { + return xerrors.Errorf("getting kubernetes client config: %w", err) + } + + getEnv := func(n string) (string, string) { + name := EnvPrefix + n + value := os.Getenv(name) + + return name, value + } + + controllerNameEnv, controllerName := getEnv("NAME") + if controllerName == "" { + return fmt.Errorf("missing required environment variable: %s", controllerNameEnv) + } + + log := logf.Log.WithName(controllerName) + + _, forAPIVersion := getEnv("FOR_API_VERSION") + if forAPIVersion == "" { + forAPIVersion = coreGroup + "/" + coreVersion + } + + _, forKind := getEnv("FOR_KIND") + if forKind == "" { + forKind = "Resource" + } + + _, resyncPeriod := getEnv("RESYNC_PERIOD") + + groupVersion := strings.Split(forAPIVersion, "/") + group := groupVersion[0] + version := groupVersion[1] + + jobOnApplyEnv, jobOnApply := getEnv("JOB_ON_APPLY") + if jobOnApply == "" { + return fmt.Errorf("missing required environment variable: %s", jobOnApplyEnv) + } + + jobOnDestroyEnv, jobOnDestroy := getEnv("JOB_ON_DESTROY") + if jobOnDestroy == "" { + return fmt.Errorf("missing required environment variable: %s", jobOnDestroyEnv) + } + + var runtimeClient client.Client + + podName, err := os.Hostname() + if err != nil { + return xerrors.Errorf("getting pod name from hostname: %w", err) + } + + logReconcilation := func(orig *unstructured.Unstructured, job, combinedLogs string) error { + name := orig.GetName() + namespace := orig.GetNamespace() + + st := &unstructured.Unstructured{} + st.SetGroupVersionKind(orig.GroupVersionKind()) + + if err := runtimeClient.Get(context.TODO(), client.ObjectKey{Namespace: namespace, Name: name}, st); err != nil { + return fmt.Errorf("getting object %q: %w", name, err) + } + + gen, ok, err := unstructured.NestedInt64(st.Object, "metadata", "generation") + if !ok { + return fmt.Errorf("missing Resource.Generation: %w", err) + } + + if err != nil { + return xerrors.Errorf("getting metadata.generation from %s: %w", name, err) + } + + reconName := name + "-" + fmt.Sprintf("%d", gen) + + obj := newReconcilation() + + var update bool + + getErr := runtimeClient.Get(context.TODO(), client.ObjectKey{Namespace: namespace, Name: reconName}, obj) + if getErr != nil { + if !errors.IsNotFound(getErr) { + return fmt.Errorf("getting reconcilation object: %w", err) + } + } else { + update = true + } + + // Use of GenerateName results in 404 + //obj.SetGenerateName(name + "-") + obj.SetName(reconName) + // Missing Namespace results in 404 + obj.SetNamespace(namespace) + obj.SetLabels(map[string]string{ + "core.variant.run/event": "apply", + "core.variant.run/controller": controllerName, + "core.variant.run/pod": podName, + }) + spec, ok, err := unstructured.NestedMap(st.Object, "spec") + if !ok { + return fmt.Errorf("missing Resource.Spec: %w", err) + } + + if err != nil { + return xerrors.Errorf("calling unstructured.NestedMap: %w", err) + } + + unstructured.SetNestedField(obj.Object, job, "spec", "job") + unstructured.SetNestedMap(obj.Object, spec, "spec", "resource") + unstructured.SetNestedField(obj.Object, combinedLogs, "spec", "combinedLogs", "data") + + if update { + if err := runtimeClient.Update(context.TODO(), obj); err != nil { + return fmt.Errorf("updating reconcilation object: %w", err) + } + } else { + if err := runtimeClient.Create(context.TODO(), obj); err != nil { + return fmt.Errorf("creating reconcilation object: %w", err) + } + } + + return nil + } + + handle := func(st *state.State, job string) (finalErr error) { + args := strings.Split(job, " ") + m, found, err := unstructured.NestedMap(st.Object.Object, "spec") + if !found { + return fmt.Errorf(`"spec" field not found: %v`, st.Object.Object) + } + + if err != nil { + return xerrors.Errorf("getting nested map from the object: %w", err) + } + + for k, v := range m { + args = append(args, "--"+k, fmt.Sprintf("%v", v)) + } + + log.Info("Running Variant", "args", strings.Join(args, " ")) + + args = append([]string{"run"}, args...) + + combinedLogs, err := run(args) + if err != nil { + return xerrors.Errorf("executing %v: %w", args, err) + } + + if err := logReconcilation(st.Object, job, combinedLogs); err != nil { + return xerrors.Errorf("logging result of %q: %w", job, err) + } + + return nil + } + + applyHandler := StateHandlerFunc(func(st *state.State) error { + return handle(st, jobOnApply) + }) + + destroyHandler := StateHandlerFunc(func(st *state.State) error { + return handle(st, jobOnDestroy) + }) + + c := &config.Config{ + Name: controllerName, + Resources: []*config.ResourceConfig{ + { + GroupVersionKind: schema.GroupVersionKind{ + Group: group, + Version: version, + Kind: forKind, + }, + Reconciler: &config.ReconcilerConfig{ + HandlerConfig: config.HandlerConfig{ + StateHandler: applyHandler, + }, + }, + Finalizer: &config.HandlerConfig{ + StateHandler: destroyHandler, + }, + ResyncPeriod: resyncPeriod, + }, + }, + Webhook: nil, + } + + mgr, err := manager.New(c, kc) + if err != nil { + return xerrors.Errorf("creating controller-manager: %w", err) + } + + runtimeClient = mgr.GetClient() + + err = mgr.Start(signals.SetupSignalHandler()) + if err != nil { + return xerrors.Errorf("starting controller-manager: %w", err) + } + + return err +} + +func newReconcilation() *unstructured.Unstructured { + obj := &unstructured.Unstructured{} + + obj.SetGroupVersionKind(reconcilationGroupVersionKind) + + return obj +} + +func StateHandlerFunc(f func(*state.State) error) handler.StateHandler { + return &stateHandler{ + f: f, + } +} + +type stateHandler struct { + f func(*state.State) error +} + +func (h stateHandler) HandleState(s *state.State) error { + return h.f(s) +} From b9801fb1103dcb1cb6ddd21223d20298f9e22be4 Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Wed, 28 Oct 2020 21:43:07 +0900 Subject: [PATCH 02/14] Introduce advanced configuration for the controller --- examples/controller/README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/examples/controller/README.md b/examples/controller/README.md index 123cb14..85d4747 100644 --- a/examples/controller/README.md +++ b/examples/controller/README.md @@ -190,3 +190,24 @@ The list of tools may include: - Helm - Helmfile - Waypoint + +## Advanced configuration + +- Using non-default CRD + +### Using non-default CRD + +You can use different apiVersion than the default `core.variant.run/v1beta1` by setting `_FOR_API_VERSION`, +and different kind than the default `Resource` by setting `_FOR_KIND`. + +For example, to let the controller watch and reconcile `whatever.example.com/v1alpha1` `MyCustomStack` objects, run `variant` +like: + +```console +$ VARIANT_CONTROLLER_JOB_ON_APPLY=apply \ + VARIANT_CONTROLLER_JOB_ON_DESTROY=destroy \ + VARIANT_CONTROLLER_NAME=my-custom-stack \ + VARIANT_CONTROLLER_FOR_API_VERSION=whatever.example.com/v1alpha1 \ + VARIANT_CONTROLLER_FOR_KIND=MyCustomStack \ + variant +``` From 8892686e6c3874f7ed9c13e594bc88e2fff5f18f Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Wed, 28 Oct 2020 21:49:14 +0900 Subject: [PATCH 03/14] Bump to Go 1.15 mainly for build consistency The build and tests are passing on my macOS and Go 1.15 so it should pass on Actions as well with the same setup (Go 1.15) --- .github/workflows/ci.yml | 4 ++-- go.mod | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0dd0851..b27c59e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,7 +6,7 @@ jobs: strategy: matrix: go: - - 1.13.4 + - 1.15 name: Go ${{ matrix.go }} build steps: - uses: actions/checkout@master @@ -32,7 +32,7 @@ jobs: strategy: matrix: go: - - 1.13.4 + - 1.15 name: Go ${{ matrix.go }} build steps: - uses: actions/checkout@master diff --git a/go.mod b/go.mod index a52be2c..d6f6b82 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/mumoshu/variant2 -go 1.13 +go 1.15 require ( github.com/AlecAivazis/survey/v2 v2.0.5 From ca1e5e51ae1cdb43d3e3a6da1279e23339017ab8 Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Thu, 29 Oct 2020 08:58:17 +0900 Subject: [PATCH 04/14] Bump controller-runtime and k8s.io dependencies To see if this passes builds on Actions --- go.mod | 19 +++----- go.sum | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index d6f6b82..b8239f7 100644 --- a/go.mod +++ b/go.mod @@ -38,23 +38,18 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/zclconf/go-cty v1.2.1 github.com/zclconf/go-cty-yaml v1.0.1 - golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6 // indirect golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4 // indirect golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 gopkg.in/go-playground/validator.v9 v9.31.0 // indirect gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c - k8s.io/api v0.0.0-20190918155943-95b840bb6a1f // indirect - k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783 // indirect - k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655 - k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible + k8s.io/api v0.18.9 // indirect + k8s.io/apiextensions-apiserver v0.18.9 // indirect + k8s.io/apimachinery v0.18.9 + k8s.io/cli-runtime v0.18.9 // indirect + k8s.io/client-go v0.18.9 k8s.io/klog v1.0.0 // indirect - sigs.k8s.io/controller-runtime v0.4.0 + sigs.k8s.io/controller-runtime v0.6.3 ) -replace ( - k8s.io/api v0.0.0-20190918155943-95b840bb6a1f => k8s.io/api v0.0.0-20190918155943-95b840bb6a1f - k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783 => k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783 - k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655 => k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655 - k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible => k8s.io/client-go v0.0.0-20190918160344-1fbdaa4c8d90 -) +replace github.com/summerwind/whitebox-controller v0.7.1 => github.com/mumoshu/whitebox-controller v0.5.1-0.20201028130131-ac7a0743254b diff --git a/go.sum b/go.sum index 079dfa7..8787a30 100644 --- a/go.sum +++ b/go.sum @@ -140,6 +140,7 @@ github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki github.com/agext/levenshtein v1.2.2 h1:0S/Yg6LYmFJ5stwQeRp6EeOcCbj7xiqQSdNelsXvaqE= github.com/agext/levenshtein v1.2.2/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/agl/ed25519 v0.0.0-20150830182803-278e1ec8e8a6/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/alecthomas/go-thrift v0.0.0-20170109061633-7914173639b2/go.mod h1:CxCgO+NdpMdi9SsTlGbc0W+/UNxO3I0AabOEJZ3w61w= github.com/alecthomas/kong v0.2.1/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= github.com/alecthomas/participle v0.4.2-0.20191220090139-9fbceec1d131 h1:iPgE4wTIM/fgSreWdpxnKXxaGOgGwfPqc2aVPq2BFSU= @@ -156,6 +157,7 @@ github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190620160927-9418d7b0cd0f/go.mod github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190103054945-8205d1f41e70/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/aliyun/aliyun-tablestore-go-sdk v4.1.2+incompatible/go.mod h1:LDQHRZylxvcg8H7wBIDfvO5g/cy4/sz1iucBlc2l3Jw= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antchfx/xpath v0.0.0-20190129040759-c8489ed3251e/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk= github.com/antchfx/xquery v0.0.0-20180515051857-ad5b8c7a47b0/go.mod h1:LzD22aAzDP8/dyiCKFp31He4m2GPjl0AFyzDtZzUu9M= @@ -195,6 +197,8 @@ github.com/aws/aws-sdk-go v1.29.34/go.mod h1:1KvfttTE3SPKMpo8g2c6jL3ZKfXtFvKscTg github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= 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/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -233,6 +237,7 @@ github.com/cloudfoundry-community/go-cfclient v0.0.0-20190201205600-f136f9222381 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc h1:TP+534wVlf61smEIq1nwLLAjQVEK2EADoW3CX9AuT+8= @@ -250,11 +255,13 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee 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-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creasty/defaults v1.2.1/go.mod h1:CIEEvs7oIVZm30R8VxtFJs+4k201gReYyuYHJxZc68I= github.com/creasty/defaults v1.3.0 h1:uG+RAxYbJgOPCOdKEcec9ZJXeva7Y6mj/8egdzwmLtw= github.com/creasty/defaults v1.3.0/go.mod h1:CIEEvs7oIVZm30R8VxtFJs+4k201gReYyuYHJxZc68I= @@ -296,6 +303,7 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -306,6 +314,8 @@ github.com/evanphx/json-patch v0.0.0-20190203023257-5858425f7550/go.mod h1:50XU6 github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 h1:Ghm4eQYC0nEPnSJdVkTrXpu9KtoVCSo1hg7mtI7G9KU= github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -320,6 +330,8 @@ github.com/frankban/quicktest v1.4.1 h1:Wv2VwvNn73pAdFIVUQRXYDFp31lXKbqblIXo/Q5G github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fujiwara/tfstate-lookup v0.0.4 h1:NGH9y+U4RDO3ooMYjK+fq1iYAkrBfCNZbZwX4HqQnBo= github.com/fujiwara/tfstate-lookup v0.0.4/go.mod h1:kluvnw25uJ8bszZldMoewWxylt7QFvuzTGN+Rr911qs= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa h1:RDBNVkRviHZtvDvId8XSGPu3rmpmSe+wKRcEWNgsfWU= @@ -358,6 +370,7 @@ github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70t github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= @@ -365,29 +378,37 @@ github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+ github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= +github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= +github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= +github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-playground/locales v0.12.1 h1:2FITxuFt/xuCNP1Acdhv62OzaCiviiE4kotfhkmOqEc= github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= @@ -429,6 +450,8 @@ github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= 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= @@ -457,6 +480,13 @@ github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= @@ -501,6 +531,8 @@ github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf h1:+RRA9JqSOZFfKrOeq github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= 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= @@ -519,6 +551,7 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= @@ -554,6 +587,7 @@ github.com/grpc-ecosystem/grpc-gateway v1.4.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpg github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hashicorp/aws-sdk-go-base v0.4.0/go.mod h1:eRhlz3c4nhqxFZJAahJEFL7gh6Jyj5rQmQc7F9eHFyQ= @@ -737,6 +771,7 @@ github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= @@ -771,6 +806,9 @@ github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwK 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.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -829,6 +867,7 @@ github.com/lestrrat-go/strftime v1.0.1/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR7 github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lusis/go-artifactory v0.0.0-20160115162124-7e4ce345df82/go.mod h1:y54tfGmO3NKssKveTEFFzH8C/akrSOy/iW9qEAUDV84= github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -837,6 +876,8 @@ github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11 h1:YFh+sjyJTMQSYjKwM4dFKhJPJC/wfo98tPUc17HdoYw= github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11/go.mod h1:Ah2dBMoxZEqk118as2T4u4fjfXarE0pPnMJaArZQZsI= github.com/masterzen/simplexml v0.0.0-20160608183007-4572e39b1ab9/go.mod h1:kCEbxUJlNDEBNbdQMkPSp6yaKcRXVI6f4ddk8Riv4bc= @@ -911,7 +952,10 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/mozilla-services/yaml v0.0.0-20180922153656-28ffe5d0cafb h1:wj4n5+b4t84Qze8N/n0PKpaBTlbA7g7nTYG01h16mh0= github.com/mozilla-services/yaml v0.0.0-20180922153656-28ffe5d0cafb/go.mod h1:Is/Ucts/yU/mWyGR8yELRoO46mejouKsJfQLAIfTR18= github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mumoshu/whitebox-controller v0.5.1-0.20201028130131-ac7a0743254b h1:RxRIkwj/TLTaqIOLhgyqD/YjloYgOxNH4K8azDRB7+M= +github.com/mumoshu/whitebox-controller v0.5.1-0.20201028130131-ac7a0743254b/go.mod h1:bBLfYiUnKUchd3431YvwEuhs5scokk3f7bF9YSjeYcU= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nbutton23/zxcvbn-go v0.0.0-20160627004424-a22cb81b2ecd/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= @@ -922,6 +966,8 @@ github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a github.com/nlopes/slack v0.6.0 h1:jt0jxVQGhssx1Ib7naAOZEZcGdtIhTzkP0nopK0AsRA= github.com/nlopes/slack v0.6.0/go.mod h1:JzQ9m3PMAqcpeCam7UaHSuBuupz7CmpjehYMayT6YOk= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -932,6 +978,9 @@ github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.3.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= @@ -940,6 +989,10 @@ github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= github.com/onsi/gomega v1.5.0/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.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= @@ -994,6 +1047,8 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829 h1:D+CiwcpGTW6pL6bv6KI3KbyEyCKyS+1JWS2h8PNDnGA= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f h1:BVwpUVJDADN2ufcGik7W992pyps0wZ888b/y9GXcLTU= @@ -1001,11 +1056,15 @@ github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1: 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.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20180518154759-7600349dcfe1/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0 h1:kUZDBDTdBVBYBj5Tmh2NZLlF60mfjA27rM34b+cVwNU= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/procfs v0.0.0-20180612222113-7d6f385de8be/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -1014,6 +1073,9 @@ github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1 h1:/K3IL0Z1quvmJ github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190315082738-e56f2e22fc76 h1:glJ8HXGaePtQl0vo01o6x8viTBt7BaxOyXbvC9XV6VY= github.com/prometheus/procfs v0.0.0-20190315082738-e56f2e22fc76/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.11 h1:DhHlBtkHWPYi8O2y31JkK0TF+DGM+51OopZjH/Ia5qI= +github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= @@ -1179,6 +1241,7 @@ github.com/variantdev/vals v0.0.0-20191123083656-fc61ba6e8746 h1:uVcemWq1J1f3X49 github.com/variantdev/vals v0.0.0-20191123083656-fc61ba6e8746/go.mod h1:6Ma8+ZOzCxDY5cBSaoRQqE3E5IBaD9BYLfdUMmSsgHg= github.com/variantdev/vals v0.4.0 h1:O1O7/sWhlvozcY2DjZBzlE1notxwVo6UBT1+w7HsO/k= github.com/variantdev/vals v0.4.0/go.mod h1:28iJwAamsfHevGLXO7QKmVWmwa79xM06sRjw8eGY73U= +github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= github.com/vmihailenco/msgpack v4.0.1+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= @@ -1207,7 +1270,13 @@ github.com/zclconf/go-cty-yaml v1.0.1 h1:up11wlgAaDvlAGENcFDnZgkn0qUJurso7k6EpUR github.com/zclconf/go-cty-yaml v1.0.1/go.mod h1:IP3Ylp0wQpYm50IHK8OZWKMu6sPJIUgKa8XhiVHura0= go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20190412021913-f29b1ada1971/go.mod h1:KSGwdbiFchh5KIC9My2+ZVl5/3ANcwohw50dpPwa2cw= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mozilla.org/gopgagent v0.0.0-20170926210634-4d7ea76ff71a h1:N7VD+PwpJME2ZfQT8+ejxwA4Ow10IkGbU0MGf94ll8k= go.mozilla.org/gopgagent v0.0.0-20170926210634-4d7ea76ff71a/go.mod h1:YDKUvO0b//78PaaEro6CAPH6NqohCmL2Cwju5XI2HoE= go.mozilla.org/sops v0.0.0-20190611200209-e9e1e87723c8 h1:RGVnXInLdDvAWF8mT1gAl4M/6g4GyIRB0ltFPV7PtT4= @@ -1226,12 +1295,16 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.9.1 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20180608092829-8ac0e0d97ce4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1254,12 +1327,15 @@ golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6 h1:Sy5bstxEqwwbYs6n0/pBuxKENqOeZUgD45Gp3Q3pqLg= golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1330,6 +1406,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191009170851-d66e71096ffb/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191021144547-ec77196f6094 h1:5O4U9trLjNpuhpynaDsqwCk+Tw6seqJz1EbqbnzHrc8= golang.org/x/net v0.0.0-20191021144547-ec77196f6094/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1341,6 +1419,8 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1402,11 +1482,17 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/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-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1426,6 +1512,8 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= @@ -1444,6 +1532,7 @@ golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/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-20190121143147-24cd39ecf745/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1458,10 +1547,12 @@ golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191026034945-b2104f82a97d h1:QFO0Wgcqcp8nI9hbisKDTBsmfwrvLswk2T73QDZZgVo= golang.org/x/tools v0.0.0-20191026034945-b2104f82a97d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1571,6 +1662,7 @@ google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij google.golang.org/grpc v1.22.0 h1:J0UbZOIrCAl+fpTOf8YLs4dJo8L/owV4LYVtAXQoPkw= google.golang.org/grpc v1.22.0/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.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -1578,6 +1670,13 @@ google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0 h1:bO/TA4OxCOummhSf10siHuG7vJOiwh7SpRpFZDkOgl4= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +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/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d h1:TxyelI5cVkbREznMhfzycHdkp5cLA7DpE+GKjSslYhM= @@ -1621,6 +1720,7 @@ gopkg.in/yaml.v2 v2.0.0/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/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= @@ -1651,23 +1751,43 @@ k8s.io/api v0.0.0-20190409092523-d687e77c8ae9 h1:c9UEl5z8gk1DGh/g3snETZ+a52YeR9V k8s.io/api v0.0.0-20190409092523-d687e77c8ae9/go.mod h1:FQEUn50aaytlU65qqBn/w+5ugllHwrBzKm7DzbnXdzE= k8s.io/api v0.0.0-20190918155943-95b840bb6a1f h1:8FRUST8oUkEI45WYKyD8ed7Ad0Kg5v11zHyPkEVb2xo= k8s.io/api v0.0.0-20190918155943-95b840bb6a1f/go.mod h1:uWuOHnjmNrtQomJrvEBg0c0HRNyQ+8KTEERVsK0PW48= +k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI= +k8s.io/api v0.18.9 h1:7VDtivqwbvLOf8hmXSd/PDSSbpCBq49MELg84EYBYiQ= +k8s.io/api v0.18.9/go.mod h1:9u/h6sUh6FxfErv7QqetX1EB3yBMIYOBXzdcf0Gf0rc= k8s.io/apiextensions-apiserver v0.0.0-20190409022649-727a075fdec8/go.mod h1:IxkesAMoaCRoLrPJdZNZUQp9NfZnzqaVzLhb2VEQzXE= k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783 h1:V6ndwCPoao1yZ52agqOKaUAl7DYWVGiXjV7ePA2i610= k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783/go.mod h1:xvae1SZB3E17UpV59AWc271W/Ph25N+bjPyR63X6tPY= +k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M= +k8s.io/apiextensions-apiserver v0.18.9 h1:tVEf8rVKh5BnXORnYYCztjbf6CSyGNMt/rAIEyfU00Q= +k8s.io/apiextensions-apiserver v0.18.9/go.mod h1:JagmAhU0TVENzgUZqHJsjCSDh7YuV5o6g01G1Fwh7zI= k8s.io/apimachinery v0.0.0-20190404173353-6a84e37a896d/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= k8s.io/apimachinery v0.0.0-20190409092423-760d1845f48b h1:fVkKJL9FIpA8LSJyHVM00MP45q1WJ7+af77vcxmQP4g= k8s.io/apimachinery v0.0.0-20190409092423-760d1845f48b/go.mod h1:FW86P8YXVLsbuplGMZeb20J3jYHscrDqw4jELaFJvRU= k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655 h1:CS1tBQz3HOXiseWZu6ZicKX361CZLT97UFnnPx0aqBw= k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655/go.mod h1:nL6pwRT8NgfF8TT68DBI8uEePRt89cSvoXUVqbkWHq4= +k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= +k8s.io/apimachinery v0.18.9 h1:3ZABKQx3F3xPWlsGhCfUl8W+JXRRblV6Wo2A3zn0pvY= +k8s.io/apimachinery v0.18.9/go.mod h1:PF5taHbXgTEJLU+xMypMmYTXTWPJ5LaW8bfsisxnEXk= k8s.io/apiserver v0.0.0-20190918160949-bfa5e2e684ad/go.mod h1:XPCXEwhjaFN29a8NldXA901ElnKeKLrLtREO9ZhFyhg= +k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg= +k8s.io/apiserver v0.18.9/go.mod h1:vXQzMtUCLsGg1Bh+7Jo2mZKHpHZFCZn8eTNSepcIA1M= +k8s.io/cli-runtime v0.18.9/go.mod h1:Pw7UPmZd/wIlGd7DWGTUWA7qn92jCeybNeiS5WYJI6A= k8s.io/client-go v0.0.0-20190918160344-1fbdaa4c8d90 h1:mLmhKUm1X+pXu0zXMEzNsOF5E2kKFGe5o6BZBIIqA6A= k8s.io/client-go v0.0.0-20190918160344-1fbdaa4c8d90/go.mod h1:J69/JveO6XESwVgG53q3Uz5OSfgsv4uxpScmmyYOOlk= +k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q= +k8s.io/client-go v0.18.9 h1:sPHX49yOtUqv1fl49TwV3f8cC0N3etSnwgFGsIsXnZc= +k8s.io/client-go v0.18.9/go.mod h1:UjkEetDmr40P9NX0Ok3Idt08FCf2I4mIHgjFsot77uY= k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible h1:U5Bt+dab9K8qaUmXINrkXO135kA11/i5Kg1RUydgaMQ= k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= k8s.io/code-generator v0.0.0-20190912054826-cd179ad6a269/go.mod h1:V5BD6M4CyaN5m+VthcclXWsVcT1Hu+glwa1bi3MIsyE= +k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= +k8s.io/code-generator v0.18.9/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= k8s.io/component-base v0.0.0-20190918160511-547f6c5d7090/go.mod h1:933PBGtQFJky3TEwYx4aEPZ4IxqhWh3R6DCmzqIn1hA= +k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14= +k8s.io/component-base v0.18.9/go.mod h1:tUo4qZtV8m7t/U+0DgY+fcnn4BFZ480fZdzxOkWH4zk= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.0.0-20190306015804-8e90cee79f82/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= @@ -1677,14 +1797,21 @@ k8s.io/klog v0.3.3/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.0.0 h1:Foj74zO6RbjjP4hBEKjnYtjjAhGg4jNynUdYF6fJrok= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20190306001800-15615b16d372/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf h1:EYm5AW/UUDbnmnI+gK0TJDVK9qPLhM+sRHYanNKw0EQ= k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6 h1:Oh3Mzx5pJ+yIumsAD0MOECPVeXsVot0UkiaCGVyfGQY= +k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= k8s.io/utils v0.0.0-20190506122338-8fab8cb257d5/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200603063816-c1c6865ac451 h1:v8ud2Up6QK1lNOKFgiIVrZdMg7MpmSnvtrOieolJKoE= +k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= layeh.com/radius v0.0.0-20190322222518-890bc1058917 h1:BDXFaFzUt5EIqe/4wrTc4AcYZWP6iC6Ult+jQWLh5eU= layeh.com/radius v0.0.0-20190322222518-890bc1058917/go.mod h1:fywZKyu//X7iRzaxLgPWsvc0L26IUpVvE/aeIL2JtIQ= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= @@ -1698,15 +1825,24 @@ mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskX rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= sigs.k8s.io/controller-runtime v0.2.0/go.mod h1:ZHqrRDZi3f6BzONcvlUxkqCKgwasGk5FZrnSv9TVZF4= sigs.k8s.io/controller-runtime v0.4.0 h1:wATM6/m+3w8lj8FXNaO6Fs/rq/vqoOjO1Q116Z9NPsg= sigs.k8s.io/controller-runtime v0.4.0/go.mod h1:ApC79lpY3PHW9xj/w9pj+lYkLgwAAUZwfXkME1Lajns= +sigs.k8s.io/controller-runtime v0.6.3 h1:SBbr+inLPEKhvlJtrvDcwIpm+uhDvp63Bl72xYJtoOE= +sigs.k8s.io/controller-runtime v0.6.3/go.mod h1:WlZNXcM0++oyaQt4B7C2lEE5JYRs8vJUzRP4N4JpdAY= +sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/testing_frameworks v0.1.1/go.mod h1:VVBKrHmJ6Ekkfz284YKhQePcdycOzNH9qL6ht1zEr/U= sigs.k8s.io/testing_frameworks v0.1.2 h1:vK0+tvjF0BZ/RYFeZ1E6BYBwHJJXhjuZ3TdsEKH+UQM= sigs.k8s.io/testing_frameworks v0.1.2/go.mod h1:ToQrwSC3s8Xf/lADdZp3Mktcql9CG0UAmdJG9th5i0w= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= From 56fd57e1adfa2b6344403b3c79c934ee5cc42152 Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Thu, 29 Oct 2020 09:32:37 +0900 Subject: [PATCH 05/14] Refactor pkg/controller and fix typo on CRD name --- examples/controller/README.md | 18 +- examples/controller/reconcilation.yaml | 2 +- examples/controller/variant.crds.yaml | 8 +- go.mod | 1 + pkg/controller/api.go | 27 +++ pkg/controller/controller.go | 313 +++++++------------------ pkg/controller/handler.go | 20 ++ pkg/controller/run.go | 150 ++++++++++++ 8 files changed, 297 insertions(+), 242 deletions(-) create mode 100644 pkg/controller/api.go create mode 100644 pkg/controller/handler.go create mode 100644 pkg/controller/run.go diff --git a/examples/controller/README.md b/examples/controller/README.md index 85d4747..6bd40d4 100644 --- a/examples/controller/README.md +++ b/examples/controller/README.md @@ -67,18 +67,18 @@ EOS Within a few seconds, the controller will reconcile your `Resource` by running `variant run apply --env preview --ref abc1234`. You can verify that by tailing controller logs by `kubectl logs`, or browsing the `Reconcilation` object that is created by -the controller to record the reconcilation details: +the controller to record the reconciliation details: ```console -$ kubectl get reconcilation +$ kubectl get reconciliation NAME AGE myresource-2 12m ``` ```console -$ kubectl get -o yaml reconcilation myresource-2 +$ kubectl get -o yaml reconciliation myresource-2 apiVersion: core.variant.run/v1beta1 -kind: Reconcilation +kind: Reconciliation metadata: creationTimestamp: "2020-10-28T12:05:55Z" generation: 1 @@ -114,7 +114,7 @@ EOS ``` ```console -$ kubectl get reconcilation +$ kubectl get reconciliation NAME AGE myresource-2 12m myresource-3 12m @@ -122,7 +122,7 @@ myresource-3 12m ```cnosole apiVersion: core.variant.run/v1beta1urce-3 -kind: Reconcilation +kind: Reconciliation metadata: creationTimestamp: "2020-10-28T12:06:10Z" generation: 1 @@ -146,7 +146,7 @@ Finally, deleting the `Resource` will let `variant` destroy the underlying resou as you've configured: ```console -$ kubectl get reconcilation +$ kubectl get reconciliation NAME AGE myresource-2 19m myresource-3 19m @@ -154,9 +154,9 @@ myresource-4 9s ``` ```console -$ kubectl get reconcilation -o yaml myresource-4 +$ kubectl get reconciliation -o yaml myresource-4 apiVersion: core.variant.run/v1beta1 -kind: Reconcilation +kind: Reconciliation metadata: creationTimestamp: "2020-10-28T12:25:32Z" generation: 1 diff --git a/examples/controller/reconcilation.yaml b/examples/controller/reconcilation.yaml index 20d0c9c..1294f84 100644 --- a/examples/controller/reconcilation.yaml +++ b/examples/controller/reconcilation.yaml @@ -1,5 +1,5 @@ apiVersion: core.variant.run/v1beta1 -kind: Reconcilation +kind: Reconciliation metadata: name: myresource-abc spec: diff --git a/examples/controller/variant.crds.yaml b/examples/controller/variant.crds.yaml index a4c5ec9..967fd24 100644 --- a/examples/controller/variant.crds.yaml +++ b/examples/controller/variant.crds.yaml @@ -17,7 +17,7 @@ spec: apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: - name: reconcilations.core.variant.run + name: reconciliations.core.variant.run spec: group: core.variant.run versions: @@ -25,7 +25,7 @@ spec: served: true storage: true names: - kind: Reconcilation - plural: reconcilations - singular: reconcilation + kind: Reconciliation + plural: reconciliations + singular: reconciliation scope: Namespaced diff --git a/go.mod b/go.mod index b8239f7..38ffbb4 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/AlecAivazis/survey/v2 v2.0.5 github.com/PaesslerAG/jsonpath v0.1.1 // indirect github.com/docker/distribution v2.7.1+incompatible // indirect + github.com/go-logr/logr v0.1.0 github.com/go-playground/universal-translator v0.17.0 // indirect github.com/google/go-cmp v0.4.0 github.com/google/go-github/v27 v27.0.6 // indirect diff --git a/pkg/controller/api.go b/pkg/controller/api.go new file mode 100644 index 0000000..fe73c0b --- /dev/null +++ b/pkg/controller/api.go @@ -0,0 +1,27 @@ +package controller + +import ( + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +const ( + coreGroup = "core.variant.run" + coreVersion = "v1beta1" +) + +var ( + reconciliationGroupVersionKind = schema.GroupVersionKind{ + Group: coreGroup, + Version: coreVersion, + Kind: "Reconciliation", + } +) + +func newReconciliation() *unstructured.Unstructured { + obj := &unstructured.Unstructured{} + + obj.SetGroupVersionKind(reconciliationGroupVersionKind) + + return obj +} diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index 4e46620..708d33e 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -3,282 +3,139 @@ package controller import ( "context" "fmt" - "os" - "strings" - - "github.com/summerwind/whitebox-controller/handler" - "github.com/summerwind/whitebox-controller/reconciler/state" + "github.com/go-logr/logr" "golang.org/x/xerrors" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime/schema" "sigs.k8s.io/controller-runtime/pkg/client" - kconfig "sigs.k8s.io/controller-runtime/pkg/client/config" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - "sigs.k8s.io/controller-runtime/pkg/runtime/signals" + "strings" +) - _ "k8s.io/client-go/plugin/pkg/client/auth/azure" - _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" - _ "k8s.io/client-go/plugin/pkg/client/auth/oidc" +type controller struct { + // controllerName is the name of this controller that is shown in the logs + controllerName string - "github.com/summerwind/whitebox-controller/config" - "github.com/summerwind/whitebox-controller/manager" -) + // podName is the hostname of where the controller is running on. + // Stored in Reconciliation objects so that the operator can track which controller in which pod has done the + // reconciliation. + podName string -const ( - EnvPrefix = "VARIANT_CONTROLLER_" -) + // Kubernetes client to be used for querying target objects and managing Reconcilation objects + runtimeClient client.Client -func RunRequested() bool { - for _, env := range os.Environ() { - if strings.HasPrefix(env, EnvPrefix) { - return true - } - } + // Runs `variant run ` and returns combined output and/or error + run func([]string) (string, error) - return false + log logr.Logger } -const ( - coreGroup = "core.variant.run" - coreVersion = "v1beta1" -) +func (c *controller) do(job string, obj *unstructured.Unstructured) error { + args := strings.Split(job, " ") -var ( - reconcilationGroupVersionKind = schema.GroupVersionKind{ - Group: coreGroup, - Version: coreVersion, - Kind: "Reconcilation", + m, found, err := unstructured.NestedMap(obj.Object, "spec") + if !found { + return fmt.Errorf(`"spec" field not found: %v`, obj.Object) } -) - -func Run(run func([]string) (string, error)) (finalErr error) { - logf.SetLogger(logf.ZapLogger(false)) - - defer func() { - if finalErr != nil { - logf.Log.Error(finalErr, "Error while running controller") - } - }() - kc, err := kconfig.GetConfig() if err != nil { - return xerrors.Errorf("getting kubernetes client config: %w", err) + return xerrors.Errorf("getting nested map from the object: %w", err) } - getEnv := func(n string) (string, string) { - name := EnvPrefix + n - value := os.Getenv(name) - - return name, value + for k, v := range m { + args = append(args, "--"+k, fmt.Sprintf("%v", v)) } - controllerNameEnv, controllerName := getEnv("NAME") - if controllerName == "" { - return fmt.Errorf("missing required environment variable: %s", controllerNameEnv) - } + c.log.Info("Running Variant", "args", strings.Join(args, " ")) - log := logf.Log.WithName(controllerName) + args = append([]string{"run"}, args...) - _, forAPIVersion := getEnv("FOR_API_VERSION") - if forAPIVersion == "" { - forAPIVersion = coreGroup + "/" + coreVersion + combinedLogs, err := c.run(args) + if err != nil { + return xerrors.Errorf("executing %v: %w", args, err) } - _, forKind := getEnv("FOR_KIND") - if forKind == "" { - forKind = "Resource" + if err := c.logReconciliation(obj, job, combinedLogs); err != nil { + return xerrors.Errorf("logging result of %q: %w", job, err) } - _, resyncPeriod := getEnv("RESYNC_PERIOD") + return nil +} - groupVersion := strings.Split(forAPIVersion, "/") - group := groupVersion[0] - version := groupVersion[1] +func (c *controller) logReconciliation(orig *unstructured.Unstructured, job, combinedLogs string) error { + name := orig.GetName() + namespace := orig.GetNamespace() - jobOnApplyEnv, jobOnApply := getEnv("JOB_ON_APPLY") - if jobOnApply == "" { - return fmt.Errorf("missing required environment variable: %s", jobOnApplyEnv) - } + st := &unstructured.Unstructured{} + st.SetGroupVersionKind(orig.GroupVersionKind()) - jobOnDestroyEnv, jobOnDestroy := getEnv("JOB_ON_DESTROY") - if jobOnDestroy == "" { - return fmt.Errorf("missing required environment variable: %s", jobOnDestroyEnv) + if err := c.runtimeClient.Get(context.TODO(), client.ObjectKey{Namespace: namespace, Name: name}, st); err != nil { + return fmt.Errorf("getting object %q: %w", name, err) } - var runtimeClient client.Client - - podName, err := os.Hostname() - if err != nil { - return xerrors.Errorf("getting pod name from hostname: %w", err) + gen, ok, err := unstructured.NestedInt64(st.Object, "metadata", "generation") + if !ok { + return fmt.Errorf("missing Resource.Generation: %w", err) } - logReconcilation := func(orig *unstructured.Unstructured, job, combinedLogs string) error { - name := orig.GetName() - namespace := orig.GetNamespace() - - st := &unstructured.Unstructured{} - st.SetGroupVersionKind(orig.GroupVersionKind()) - - if err := runtimeClient.Get(context.TODO(), client.ObjectKey{Namespace: namespace, Name: name}, st); err != nil { - return fmt.Errorf("getting object %q: %w", name, err) - } - - gen, ok, err := unstructured.NestedInt64(st.Object, "metadata", "generation") - if !ok { - return fmt.Errorf("missing Resource.Generation: %w", err) - } - - if err != nil { - return xerrors.Errorf("getting metadata.generation from %s: %w", name, err) - } - - reconName := name + "-" + fmt.Sprintf("%d", gen) - - obj := newReconcilation() - - var update bool - - getErr := runtimeClient.Get(context.TODO(), client.ObjectKey{Namespace: namespace, Name: reconName}, obj) - if getErr != nil { - if !errors.IsNotFound(getErr) { - return fmt.Errorf("getting reconcilation object: %w", err) - } - } else { - update = true - } - - // Use of GenerateName results in 404 - //obj.SetGenerateName(name + "-") - obj.SetName(reconName) - // Missing Namespace results in 404 - obj.SetNamespace(namespace) - obj.SetLabels(map[string]string{ - "core.variant.run/event": "apply", - "core.variant.run/controller": controllerName, - "core.variant.run/pod": podName, - }) - spec, ok, err := unstructured.NestedMap(st.Object, "spec") - if !ok { - return fmt.Errorf("missing Resource.Spec: %w", err) - } - - if err != nil { - return xerrors.Errorf("calling unstructured.NestedMap: %w", err) - } - - unstructured.SetNestedField(obj.Object, job, "spec", "job") - unstructured.SetNestedMap(obj.Object, spec, "spec", "resource") - unstructured.SetNestedField(obj.Object, combinedLogs, "spec", "combinedLogs", "data") - - if update { - if err := runtimeClient.Update(context.TODO(), obj); err != nil { - return fmt.Errorf("updating reconcilation object: %w", err) - } - } else { - if err := runtimeClient.Create(context.TODO(), obj); err != nil { - return fmt.Errorf("creating reconcilation object: %w", err) - } - } - - return nil + if err != nil { + return xerrors.Errorf("getting metadata.generation from %s: %w", name, err) } - handle := func(st *state.State, job string) (finalErr error) { - args := strings.Split(job, " ") - m, found, err := unstructured.NestedMap(st.Object.Object, "spec") - if !found { - return fmt.Errorf(`"spec" field not found: %v`, st.Object.Object) - } + reconName := name + "-" + fmt.Sprintf("%d", gen) - if err != nil { - return xerrors.Errorf("getting nested map from the object: %w", err) - } + obj := newReconciliation() - for k, v := range m { - args = append(args, "--"+k, fmt.Sprintf("%v", v)) - } - - log.Info("Running Variant", "args", strings.Join(args, " ")) - - args = append([]string{"run"}, args...) - - combinedLogs, err := run(args) - if err != nil { - return xerrors.Errorf("executing %v: %w", args, err) - } + var update bool - if err := logReconcilation(st.Object, job, combinedLogs); err != nil { - return xerrors.Errorf("logging result of %q: %w", job, err) + getErr := c.runtimeClient.Get(context.TODO(), client.ObjectKey{Namespace: namespace, Name: reconName}, obj) + if getErr != nil { + if !errors.IsNotFound(getErr) { + return fmt.Errorf("getting reconciliation object: %w", err) } - - return nil - } - - applyHandler := StateHandlerFunc(func(st *state.State) error { - return handle(st, jobOnApply) + } else { + update = true + } + + // Use of GenerateName results in 404 + //obj.SetGenerateName(name + "-") + obj.SetName(reconName) + // Missing Namespace results in 404 + obj.SetNamespace(namespace) + obj.SetLabels(map[string]string{ + "core.variant.run/event": "apply", + "core.variant.run/controller": c.controllerName, + "core.variant.run/pod": c.podName, }) - - destroyHandler := StateHandlerFunc(func(st *state.State) error { - return handle(st, jobOnDestroy) - }) - - c := &config.Config{ - Name: controllerName, - Resources: []*config.ResourceConfig{ - { - GroupVersionKind: schema.GroupVersionKind{ - Group: group, - Version: version, - Kind: forKind, - }, - Reconciler: &config.ReconcilerConfig{ - HandlerConfig: config.HandlerConfig{ - StateHandler: applyHandler, - }, - }, - Finalizer: &config.HandlerConfig{ - StateHandler: destroyHandler, - }, - ResyncPeriod: resyncPeriod, - }, - }, - Webhook: nil, + spec, ok, err := unstructured.NestedMap(st.Object, "spec") + if !ok { + return fmt.Errorf("missing Resource.Spec: %w", err) } - mgr, err := manager.New(c, kc) if err != nil { - return xerrors.Errorf("creating controller-manager: %w", err) + return xerrors.Errorf("calling unstructured.NestedMap: %w", err) } - runtimeClient = mgr.GetClient() - - err = mgr.Start(signals.SetupSignalHandler()) - if err != nil { - return xerrors.Errorf("starting controller-manager: %w", err) + if err := unstructured.SetNestedField(obj.Object, job, "spec", "job"); err != nil { + return xerrors.Errorf("setting nested field spec.job: %w", err) } - return err -} - -func newReconcilation() *unstructured.Unstructured { - obj := &unstructured.Unstructured{} - - obj.SetGroupVersionKind(reconcilationGroupVersionKind) - - return obj -} + if err := unstructured.SetNestedMap(obj.Object, spec, "spec", "resource"); err != nil { + return xerrors.Errorf("setting nested map spec.resource: %w", err) + } -func StateHandlerFunc(f func(*state.State) error) handler.StateHandler { - return &stateHandler{ - f: f, + if err := unstructured.SetNestedField(obj.Object, combinedLogs, "spec", "combinedLogs", "data"); err != nil { + return xerrors.Errorf("setting nested field spec.combinedLogs.data: %w", err) } -} -type stateHandler struct { - f func(*state.State) error -} + if update { + if err := c.runtimeClient.Update(context.TODO(), obj); err != nil { + return fmt.Errorf("updating reconciliation object: %w", err) + } + } else { + if err := c.runtimeClient.Create(context.TODO(), obj); err != nil { + return fmt.Errorf("creating reconciliation object: %w", err) + } + } -func (h stateHandler) HandleState(s *state.State) error { - return h.f(s) + return nil } diff --git a/pkg/controller/handler.go b/pkg/controller/handler.go new file mode 100644 index 0000000..93cea75 --- /dev/null +++ b/pkg/controller/handler.go @@ -0,0 +1,20 @@ +package controller + +import ( + "github.com/summerwind/whitebox-controller/handler" + "github.com/summerwind/whitebox-controller/reconciler/state" +) + +func StateHandlerFunc(f func(*state.State) error) handler.StateHandler { + return &stateHandler{ + f: f, + } +} + +type stateHandler struct { + f func(*state.State) error +} + +func (h stateHandler) HandleState(s *state.State) error { + return h.f(s) +} diff --git a/pkg/controller/run.go b/pkg/controller/run.go new file mode 100644 index 0000000..58a1e33 --- /dev/null +++ b/pkg/controller/run.go @@ -0,0 +1,150 @@ +package controller + +import ( + "fmt" + "os" + "strings" + + "github.com/summerwind/whitebox-controller/reconciler/state" + "golang.org/x/xerrors" + "k8s.io/apimachinery/pkg/runtime/schema" + kconfig "sigs.k8s.io/controller-runtime/pkg/client/config" + logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + "sigs.k8s.io/controller-runtime/pkg/runtime/signals" + + _ "k8s.io/client-go/plugin/pkg/client/auth/azure" + _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" + _ "k8s.io/client-go/plugin/pkg/client/auth/oidc" + + "github.com/summerwind/whitebox-controller/config" + "github.com/summerwind/whitebox-controller/manager" +) + +const ( + EnvPrefix = "VARIANT_CONTROLLER_" +) + +func RunRequested() bool { + for _, env := range os.Environ() { + if strings.HasPrefix(env, EnvPrefix) { + return true + } + } + + return false +} + +func Run(run func([]string) (string, error)) (finalErr error) { + logf.SetLogger(logf.ZapLogger(false)) + + defer func() { + if finalErr != nil { + logf.Log.Error(finalErr, "Error while running controller") + } + }() + + kc, err := kconfig.GetConfig() + if err != nil { + return xerrors.Errorf("getting kubernetes client config: %w", err) + } + + getEnv := func(n string) (string, string) { + name := EnvPrefix + n + value := os.Getenv(name) + + return name, value + } + + controllerNameEnv, controllerName := getEnv("NAME") + if controllerName == "" { + return fmt.Errorf("missing required environment variable: %s", controllerNameEnv) + } + + _, forAPIVersion := getEnv("FOR_API_VERSION") + if forAPIVersion == "" { + forAPIVersion = coreGroup + "/" + coreVersion + } + + _, forKind := getEnv("FOR_KIND") + if forKind == "" { + forKind = "Resource" + } + + _, resyncPeriod := getEnv("RESYNC_PERIOD") + + groupVersion := strings.Split(forAPIVersion, "/") + group := groupVersion[0] + version := groupVersion[1] + + jobOnApplyEnv, jobOnApply := getEnv("JOB_ON_APPLY") + if jobOnApply == "" { + return fmt.Errorf("missing required environment variable: %s", jobOnApplyEnv) + } + + jobOnDestroyEnv, jobOnDestroy := getEnv("JOB_ON_DESTROY") + if jobOnDestroy == "" { + return fmt.Errorf("missing required environment variable: %s", jobOnDestroyEnv) + } + + podName, err := os.Hostname() + if err != nil { + return xerrors.Errorf("getting pod name from hostname: %w", err) + } + + ctl := &controller{ + log: logf.Log.WithName(controllerName), + runtimeClient: nil, + run: run, + podName: podName, + controllerName: controllerName, + } + + handle := func(st *state.State, job string) (finalErr error) { + return ctl.do(job, st.Object) + } + + applyHandler := StateHandlerFunc(func(st *state.State) error { + return handle(st, jobOnApply) + }) + + destroyHandler := StateHandlerFunc(func(st *state.State) error { + return handle(st, jobOnDestroy) + }) + + c := &config.Config{ + Name: controllerName, + Resources: []*config.ResourceConfig{ + { + GroupVersionKind: schema.GroupVersionKind{ + Group: group, + Version: version, + Kind: forKind, + }, + Reconciler: &config.ReconcilerConfig{ + HandlerConfig: config.HandlerConfig{ + StateHandler: applyHandler, + }, + }, + Finalizer: &config.HandlerConfig{ + StateHandler: destroyHandler, + }, + ResyncPeriod: resyncPeriod, + }, + }, + Webhook: nil, + } + + mgr, err := manager.New(c, kc) + if err != nil { + return xerrors.Errorf("creating controller-manager: %w", err) + } + + ctl.runtimeClient = mgr.GetClient() + + err = mgr.Start(signals.SetupSignalHandler()) + if err != nil { + return xerrors.Errorf("starting controller-manager: %w", err) + } + + return err +} From 34f17a70ccb80e0092756d3c5872a1e59ee8c51d Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Thu, 29 Oct 2020 09:49:10 +0900 Subject: [PATCH 06/14] More refactoring --- main.go | 56 +++++--------------------------- pkg/controller/capture.go | 52 ++++++++++++++++++++++++++++++ pkg/controller/config.go | 67 +++++++++++++++++++++++++++++++++++++++ pkg/controller/run.go | 62 ++++++++---------------------------- 4 files changed, 141 insertions(+), 96 deletions(-) create mode 100644 pkg/controller/capture.go create mode 100644 pkg/controller/config.go diff --git a/main.go b/main.go index 8283f85..631c99e 100644 --- a/main.go +++ b/main.go @@ -1,14 +1,9 @@ package variant import ( - "bytes" "fmt" - "io" - "os" - "github.com/mumoshu/variant2/pkg/controller" - "golang.org/x/sync/errgroup" - "golang.org/x/xerrors" + "io" ) func RunMain(env Env, opts ...Option) error { @@ -27,50 +22,15 @@ func RunMain(env Env, opts ...Option) error { if controller.RunRequested() { return controller.Run(func(args []string) (string, error) { - buf := &bytes.Buffer{} - - outRead, outWrite := io.Pipe() - outBuf := io.TeeReader(outRead, buf) - - errRead, errWrite := io.Pipe() - errBuf := io.TeeReader(errRead, buf) - - eg := &errgroup.Group{} - - eg.Go(func() error { - if _, err := io.Copy(os.Stdout, outBuf); err != nil { - return xerrors.Errorf("copying to stdout: %w", err) - } - - return nil + out, err := controller.CaptureOutput(func(stdout, stderr io.Writer) error { + return m.Run(args, RunOptions{ + Stdout: stdout, + Stderr: stdout, + DisableLocking: false, + }) }) - eg.Go(func() error { - if _, err := io.Copy(os.Stderr, errBuf); err != nil { - return xerrors.Errorf("copying to stderr: %w", err) - } - - return nil - }) - - err := m.Run(args, RunOptions{ - Stdout: outWrite, - Stderr: errWrite, - DisableLocking: false, - }) - - outWrite.Close() - errWrite.Close() - - if egErr := eg.Wait(); egErr != nil { - panic(egErr) - } - - if err != nil { - return "", xerrors.Errorf("running command: %w", err) - } - - return buf.String(), err + return out, err }) } diff --git a/pkg/controller/capture.go b/pkg/controller/capture.go new file mode 100644 index 0000000..d57a041 --- /dev/null +++ b/pkg/controller/capture.go @@ -0,0 +1,52 @@ +package controller + +import ( + "bytes" + "golang.org/x/sync/errgroup" + "golang.org/x/xerrors" + "io" + "os" +) + +func CaptureOutput(f func(io.Writer, io.Writer) error) (string, error) { + buf := &bytes.Buffer{} + + outRead, outWrite := io.Pipe() + outBuf := io.TeeReader(outRead, buf) + + errRead, errWrite := io.Pipe() + errBuf := io.TeeReader(errRead, buf) + + eg := &errgroup.Group{} + + eg.Go(func() error { + if _, err := io.Copy(os.Stdout, outBuf); err != nil { + return xerrors.Errorf("copying to stdout: %w", err) + } + + return nil + }) + + eg.Go(func() error { + if _, err := io.Copy(os.Stderr, errBuf); err != nil { + return xerrors.Errorf("copying to stderr: %w", err) + } + + return nil + }) + + err := f(outWrite, errWrite) + + outWrite.Close() + errWrite.Close() + + if egErr := eg.Wait(); egErr != nil { + panic(egErr) + } + + if err != nil { + return "", xerrors.Errorf("running command: %w", err) + } + + return buf.String(), nil +} diff --git a/pkg/controller/config.go b/pkg/controller/config.go new file mode 100644 index 0000000..e692fe9 --- /dev/null +++ b/pkg/controller/config.go @@ -0,0 +1,67 @@ +package controller + +import ( + "fmt" + "os" + "strings" +) + +type Config struct { + controllerName string + resyncPeriod string + forKind string + group string + version string + jobOnApply string + jobOnDestroy string +} + +func getConfigFromEnv() (*Config, error) { + getEnv := func(n string) (string, string) { + name := EnvPrefix + n + value := os.Getenv(name) + + return name, value + } + + controllerNameEnv, controllerName := getEnv("NAME") + if controllerName == "" { + return nil, fmt.Errorf("missing required environment variable: %s", controllerNameEnv) + } + + _, forAPIVersion := getEnv("FOR_API_VERSION") + if forAPIVersion == "" { + forAPIVersion = coreGroup + "/" + coreVersion + } + + _, forKind := getEnv("FOR_KIND") + if forKind == "" { + forKind = "Resource" + } + + _, resyncPeriod := getEnv("RESYNC_PERIOD") + + groupVersion := strings.Split(forAPIVersion, "/") + group := groupVersion[0] + version := groupVersion[1] + + jobOnApplyEnv, jobOnApply := getEnv("JOB_ON_APPLY") + if jobOnApply == "" { + return nil, fmt.Errorf("missing required environment variable: %s", jobOnApplyEnv) + } + + jobOnDestroyEnv, jobOnDestroy := getEnv("JOB_ON_DESTROY") + if jobOnDestroy == "" { + return nil, fmt.Errorf("missing required environment variable: %s", jobOnDestroyEnv) + } + + return &Config{ + controllerName: controllerName, + resyncPeriod: resyncPeriod, + forKind: forKind, + group: group, + version: version, + jobOnApply: jobOnApply, + jobOnDestroy: jobOnDestroy, + }, nil +} diff --git a/pkg/controller/run.go b/pkg/controller/run.go index 58a1e33..e1e8cf4 100644 --- a/pkg/controller/run.go +++ b/pkg/controller/run.go @@ -1,7 +1,6 @@ package controller import ( - "fmt" "os" "strings" @@ -48,42 +47,9 @@ func Run(run func([]string) (string, error)) (finalErr error) { return xerrors.Errorf("getting kubernetes client config: %w", err) } - getEnv := func(n string) (string, string) { - name := EnvPrefix + n - value := os.Getenv(name) - - return name, value - } - - controllerNameEnv, controllerName := getEnv("NAME") - if controllerName == "" { - return fmt.Errorf("missing required environment variable: %s", controllerNameEnv) - } - - _, forAPIVersion := getEnv("FOR_API_VERSION") - if forAPIVersion == "" { - forAPIVersion = coreGroup + "/" + coreVersion - } - - _, forKind := getEnv("FOR_KIND") - if forKind == "" { - forKind = "Resource" - } - - _, resyncPeriod := getEnv("RESYNC_PERIOD") - - groupVersion := strings.Split(forAPIVersion, "/") - group := groupVersion[0] - version := groupVersion[1] - - jobOnApplyEnv, jobOnApply := getEnv("JOB_ON_APPLY") - if jobOnApply == "" { - return fmt.Errorf("missing required environment variable: %s", jobOnApplyEnv) - } - - jobOnDestroyEnv, jobOnDestroy := getEnv("JOB_ON_DESTROY") - if jobOnDestroy == "" { - return fmt.Errorf("missing required environment variable: %s", jobOnDestroyEnv) + conf, err := getConfigFromEnv() + if err != nil { + return xerrors.Errorf("getting config from envvars: %w", err) } podName, err := os.Hostname() @@ -92,11 +58,11 @@ func Run(run func([]string) (string, error)) (finalErr error) { } ctl := &controller{ - log: logf.Log.WithName(controllerName), + log: logf.Log.WithName(conf.controllerName), runtimeClient: nil, run: run, podName: podName, - controllerName: controllerName, + controllerName: conf.controllerName, } handle := func(st *state.State, job string) (finalErr error) { @@ -104,21 +70,21 @@ func Run(run func([]string) (string, error)) (finalErr error) { } applyHandler := StateHandlerFunc(func(st *state.State) error { - return handle(st, jobOnApply) + return handle(st, conf.jobOnApply) }) destroyHandler := StateHandlerFunc(func(st *state.State) error { - return handle(st, jobOnDestroy) + return handle(st, conf.jobOnDestroy) }) - c := &config.Config{ - Name: controllerName, + whiteboxConfig := &config.Config{ + Name: conf.controllerName, Resources: []*config.ResourceConfig{ { GroupVersionKind: schema.GroupVersionKind{ - Group: group, - Version: version, - Kind: forKind, + Group: conf.group, + Version: conf.version, + Kind: conf.forKind, }, Reconciler: &config.ReconcilerConfig{ HandlerConfig: config.HandlerConfig{ @@ -128,13 +94,13 @@ func Run(run func([]string) (string, error)) (finalErr error) { Finalizer: &config.HandlerConfig{ StateHandler: destroyHandler, }, - ResyncPeriod: resyncPeriod, + ResyncPeriod: conf.resyncPeriod, }, }, Webhook: nil, } - mgr, err := manager.New(c, kc) + mgr, err := manager.New(whiteboxConfig, kc) if err != nil { return xerrors.Errorf("creating controller-manager: %w", err) } From 46755a2a20efbf202387c2fa43f6f549a676e01e Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Thu, 29 Oct 2020 10:00:54 +0900 Subject: [PATCH 07/14] go-mod-replace whitebox-controller dependencies To fix builds on Actions --- Makefile | 6 +++++- examples/advanced/import-multi/export.sh | 3 ++- pkg/app/app_shim.go | 17 ++++++++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index ac03707..1c4d741 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,11 @@ smoke: build grep "Namespace to interact with" smoke2.log rm -rf build/import-multi - VARIANT_BUILD_VER=v0.0.0 VARIANT_BUILD_REPLACE=$(shell pwd) PATH=${PATH}:$(GOBIN) ./variant export binary examples/advanced/import-multi build/import-multi + VARIANT_BUILD_VER=v0.0.0 \ + VARIANT_BUILD_VARIANT_REPLACE=$(shell pwd) \ + VARIANT_BUILD_MOD_REPLACE="github.com/summerwind/whitebox-controller@v0.7.1=github.com/mumoshu/whitebox-controller@v0.5.1-0.20201028130131-ac7a0743254b" \ + PATH=${PATH}:$(GOBIN) \ + ./variant export binary examples/advanced/import-multi build/import-multi build/import-multi foo baz HELLO > build/import-multi.log bash -c 'diff <(echo HELLO) <(cat build/import-multi.log)' diff --git a/examples/advanced/import-multi/export.sh b/examples/advanced/import-multi/export.sh index d4ee0f4..80361c5 100755 --- a/examples/advanced/import-multi/export.sh +++ b/examples/advanced/import-multi/export.sh @@ -4,7 +4,8 @@ PROJECT_ROOT=../../.. VARIANT=${PROJECT_ROOT}/variant export VARIANT_BUILD_VER=v0.33.3 -export VARIANT_BUILD_REPLACE=$(pwd)/${PROJECT_ROOT} +export VARIANT_BUILD_VARIANT_REPLACE=$(pwd)/${PROJECT_ROOT} +export VARIANT_BUILD_MOD_REPLACE="github.com/summerwind/whitebox-controller@v0.7.1=github.com/mumoshu/whitebox-controller@v0.5.1-0.20201028130131-ac7a0743254b" rm -rf ../exported rm -rf ../compiled diff --git a/pkg/app/app_shim.go b/pkg/app/app_shim.go index ea719c5..6e876e1 100644 --- a/pkg/app/app_shim.go +++ b/pkg/app/app_shim.go @@ -160,7 +160,7 @@ func main() { } } - variantReplace := os.Getenv("VARIANT_BUILD_REPLACE") + variantReplace := os.Getenv("VARIANT_BUILD_VARIANT_REPLACE") if variantReplace != "" { _, err = app.execCmd( Command{ @@ -175,6 +175,21 @@ func main() { } } + modReplace := os.Getenv("VARIANT_BUILD_MOD_REPLACE") + if modReplace != "" { + _, err = app.execCmd( + Command{ + Name: "sh", + Args: []string{"-c", fmt.Sprintf("cd %s; go mod edit -replace %s", dstDir, modReplace)}, + Env: map[string]string{}, + }, + true, + ) + if err != nil { + return err + } + } + return nil } From 60ef6e259f1c14aaea42c2fb882ed981929ad1c8 Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Thu, 29 Oct 2020 10:06:27 +0900 Subject: [PATCH 08/14] Deal with the setup-go warning "Warning: Input version has been deprecated with message: The version property will not be supported after October 1, 2019. Use go-version instead" indicates that we should use go-version instead of version. --- .github/workflows/ci.yml | 8 ++++---- .github/workflows/release.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b27c59e..e8b8714 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,14 +6,14 @@ jobs: strategy: matrix: go: - - 1.15 + - 1.15.x name: Go ${{ matrix.go }} build steps: - uses: actions/checkout@master - name: Setup Go uses: actions/setup-go@v1 with: - version: ${{ matrix.go }} + go-version: ${{ matrix.go }} - name: Run go mod download run: go mod download - name: Install SSH key @@ -32,14 +32,14 @@ jobs: strategy: matrix: go: - - 1.15 + - 1.15.x name: Go ${{ matrix.go }} build steps: - uses: actions/checkout@master - name: Setup Go uses: actions/setup-go@v1 with: - version: ${{ matrix.go }} + go-version: ${{ matrix.go }} - name: Run go mod download run: go mod download - name: Run golangci-lint diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a087130..bc518a5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: name: Set up Go uses: actions/setup-go@v1 with: - go-version: 1.13.x + go-version: 1.15.x - name: Run GoReleaser uses: goreleaser/goreleaser-action@v1 From 79b1610afa6d897613b93d33f02f0324ca9a617a Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Thu, 29 Oct 2020 10:10:11 +0900 Subject: [PATCH 09/14] Add golangci-lint target files in `make lint` --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 1c4d741..f8e8852 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ bin/golangci-lint: .PHONY: lint lint: bin/golangci-lint - bin/golangci-lint run --tests \ + bin/golangci-lint run --tests ./... \ --enable-all \ --disable gochecknoglobals \ --disable gochecknoinits \ From 7c5e752a655df886a5d7e33871f71e93321e3876 Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Thu, 29 Oct 2020 10:17:18 +0900 Subject: [PATCH 10/14] Bump golangci-lint to v1.32.0 To fix `Running error: context loading failed: no go files to analyze` errors --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f8e8852..2aa199a 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ test: build PATH=$(PWD):$(PATH) go test -race -v ./... bin/golangci-lint: - curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s v1.23.1 + curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s v1.32.0 .PHONY: lint lint: bin/golangci-lint From 8b764319df9657f9ccc208279360c970bcd5293e Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Thu, 29 Oct 2020 10:57:28 +0900 Subject: [PATCH 11/14] Fix lint errors --- Makefile | 3 +- export_binary.go | 2 + export_go.go | 2 + main.go | 4 +- main_test.go | 5 ++- pipe.go | 3 +- pkg/app/app.go | 74 ++++++++++++++++++++---------------- pkg/app/app_log.go | 1 + pkg/app/app_shim.go | 25 ++++++------ pkg/app/cty2go.go | 3 +- pkg/app/load.go | 12 +++--- pkg/app/log.go | 8 ++-- pkg/app/run.go | 2 +- pkg/app/run_args.go | 1 - pkg/app/survey.go | 9 +++-- pkg/app/testdeps_deps.go | 6 ++- pkg/app/types.go | 4 +- pkg/conf/funcs.go | 7 ++-- pkg/conf/jsonpath.go | 7 +++- pkg/conf/load.go | 16 ++++---- pkg/controller/api.go | 12 +++--- pkg/controller/capture.go | 5 ++- pkg/controller/controller.go | 8 ++-- pkg/controller/run.go | 21 ++++++---- pkg/fs/fs.go | 8 ++-- pkg/slack/slack.go | 16 ++++---- pkg/slack/slashcommand.go | 1 - slack.go | 12 ++++-- test/variant_test.go | 8 ++-- variant.go | 34 ++++++++++------- 30 files changed, 183 insertions(+), 136 deletions(-) diff --git a/Makefile b/Makefile index 2aa199a..dddbbd7 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,8 @@ lint: bin/golangci-lint --enable-all \ --disable gochecknoglobals \ --disable gochecknoinits \ - --disable gomnd,funlen,prealloc,gocritic,lll,gocognit + --disable gomnd,funlen,prealloc,gocritic,lll,gocognit \ + --disable testpackage,goerr113,exhaustivestruct,wrapcheck .PHONY: smoke smoke: export GOBIN=$(shell pwd)/tools diff --git a/export_binary.go b/export_binary.go index c6703e1..d60889e 100644 --- a/export_binary.go +++ b/export_binary.go @@ -20,6 +20,8 @@ $ build/simple app deploy -n default if err != nil { c.SilenceUsage = true } + + //nolint:wrapcheck return err }, } diff --git a/export_go.go b/export_go.go index 61649fb..bb5d8d8 100644 --- a/export_go.go +++ b/export_go.go @@ -22,6 +22,8 @@ $ build/simple app deploy -n default if err != nil { c.SilenceUsage = true } + + //nolint:wrapcheck return err }, } diff --git a/main.go b/main.go index 631c99e..4111b2f 100644 --- a/main.go +++ b/main.go @@ -2,8 +2,9 @@ package variant import ( "fmt" - "github.com/mumoshu/variant2/pkg/controller" "io" + + "github.com/mumoshu/variant2/pkg/controller" ) func RunMain(env Env, opts ...Option) error { @@ -30,6 +31,7 @@ func RunMain(env Env, opts ...Option) error { }) }) + //nolint:wrapcheck return out, err }) } diff --git a/main_test.go b/main_test.go index 7fdc60f..3b0cbac 100644 --- a/main_test.go +++ b/main_test.go @@ -10,9 +10,8 @@ import ( "strings" "testing" - "golang.org/x/sync/errgroup" - "github.com/google/go-cmp/cmp" + "golang.org/x/sync/errgroup" ) func TestExamples(t *testing.T) { @@ -264,6 +263,7 @@ func TestExamples(t *testing.T) { if tc.wd != "" { return tc.wd, nil } + return "", fmt.Errorf("Unexpected call to getw") }, } @@ -368,6 +368,7 @@ func TestExport(t *testing.T) { if tc.srcDir != "" { return tc.srcDir, nil } + return "", fmt.Errorf("Unexpected call to getw") }, } diff --git a/pipe.go b/pipe.go index 501c80f..7ebfd91 100644 --- a/pipe.go +++ b/pipe.go @@ -16,14 +16,15 @@ func Pipe() (func() (*bytes.Buffer, error), io.WriteCloser) { go func() { bs, err := ioutil.ReadAll(r) - if err != nil { outDone <- err + return } if _, err := out.Write(bs); err != nil { outDone <- err + return } diff --git a/pkg/app/app.go b/pkg/app/app.go index 54951c3..e36db25 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -15,27 +15,24 @@ import ( "time" "github.com/google/go-cmp/cmp" - "github.com/variantdev/vals" - - "github.com/kr/text" - - "github.com/zclconf/go-cty/cty/function" - - "github.com/imdario/mergo" - "github.com/variantdev/mod/pkg/variantmod" - ctyyaml "github.com/zclconf/go-cty-yaml" - "gopkg.in/yaml.v3" - multierror "github.com/hashicorp/go-multierror" hcl2 "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/ext/typeexpr" gohcl2 "github.com/hashicorp/hcl/v2/gohcl" + "github.com/imdario/mergo" + "github.com/kr/text" "github.com/mumoshu/variant2/pkg/conf" "github.com/pkg/errors" "github.com/variantdev/dag/pkg/dag" "github.com/variantdev/mod/pkg/shell" + "github.com/variantdev/mod/pkg/variantmod" + "github.com/variantdev/vals" + ctyyaml "github.com/zclconf/go-cty-yaml" "github.com/zclconf/go-cty/cty" + "github.com/zclconf/go-cty/cty/function" "github.com/zclconf/go-cty/cty/gocty" + "golang.org/x/xerrors" + "gopkg.in/yaml.v3" ) const ( @@ -90,9 +87,9 @@ func (app *App) Job(l *EventLogger, cmd string, args map[string]interface{}, opt cc := app.Config jobCtx, err := app.createJobContext(cc, j, args, opts, f) - if err != nil { app.PrintError(err) + return nil, err } @@ -107,6 +104,7 @@ func (app *App) Job(l *EventLogger, cmd string, args map[string]interface{}, opt } } + //nolint:nestif if j.Log != nil { if len(j.Log.Collects) == 0 { return nil, fmt.Errorf("log config for job %q is invalid: at least one collect block is required", j.Name) @@ -117,6 +115,7 @@ func (app *App) Job(l *EventLogger, cmd string, args map[string]interface{}, opt if nonEmptyExpression(j.Log.File) { if diags := gohcl2.DecodeExpression(j.Log.File, jobEvalCtx, &file); diags.HasErrors() { app.PrintDiags(diags) + return nil, diags } } @@ -136,6 +135,7 @@ func (app *App) Job(l *EventLogger, cmd string, args map[string]interface{}, opt if nonEmptyExpression(j.Log.Stream) { if diags := gohcl2.DecodeExpression(j.Log.Stream, jobEvalCtx, &stream); diags.HasErrors() { app.PrintDiags(diags) + return nil, diags } } @@ -153,6 +153,7 @@ func (app *App) Job(l *EventLogger, cmd string, args map[string]interface{}, opt if !IsExpressionEmpty(j.Concurrency) { if err := gohcl2.DecodeExpression(j.Concurrency, jobEvalCtx, &concurrency); err != nil { app.PrintDiags(err) + return nil, err } @@ -187,6 +188,7 @@ func (app *App) Job(l *EventLogger, cmd string, args map[string]interface{}, opt r, err := app.execJobSteps(l, jobCtx, needs, j.Steps, concurrency, streamOutput) if err != nil { app.PrintDiags(err) + return r, err } @@ -194,6 +196,7 @@ func (app *App) Job(l *EventLogger, cmd string, args map[string]interface{}, opt jobRes, err := app.execJob(l, j, jobCtx, streamOutput) if err != nil { app.PrintDiags(err) + return jobRes, err } @@ -242,17 +245,17 @@ func (app *App) ExitWithError(err error) { } func (app *App) PrintError(err error) { - switch diags := err.(type) { - case hcl2.Diagnostics: + diags := hcl2.Diagnostics{} + if errors.As(err, &diags) { app.WriteDiags(diags) - default: + } else { fmt.Fprintf(os.Stderr, "%v", err) } } func (app *App) PrintDiags(err error) { - switch diags := err.(type) { - case hcl2.Diagnostics: + diags := hcl2.Diagnostics{} + if errors.As(err, &diags) { app.WriteDiags(diags) } } @@ -404,6 +407,7 @@ func (app *App) execJob(l *EventLogger, j JobSpec, jobCtx *JobContext, streamOut evalCtx := jobCtx.evalContext + //nolint:nestif if j.Exec != nil { if diags := gohcl2.DecodeExpression(j.Exec.Command, evalCtx, &cmd); diags.HasErrors() { return nil, diags @@ -453,6 +457,7 @@ func (app *App) execJob(l *EventLogger, j JobSpec, jobCtx *JobContext, streamOut return nil, err2 } } + return &Result{}, nil } } @@ -478,6 +483,7 @@ func (app *App) execAssert(ctx *hcl2.EvalContext, a Assert) error { return diags } + //nolint:nestif if !assert { fp, err := os.Open(cond.Range().Filename) if err != nil { @@ -486,8 +492,8 @@ func (app *App) execAssert(ctx *hcl2.EvalContext, a Assert) error { defer fp.Close() start := cond.Range().Start.Byte - b, err := ioutil.ReadAll(fp) + b, err := ioutil.ReadAll(fp) if err != nil { panic(err) } @@ -538,6 +544,7 @@ func failOnPanic(t *testing.T) { t.FailNow() } } + func (app *App) RunTests(pat string) (*Result, error) { var res *Result @@ -654,7 +661,7 @@ func (app *App) execTestCase(t Test, c Case) (*Result, error) { caseFieldsTopology, err := caseFieldsDAG.Sort() if err != nil { - return nil, err + return nil, xerrors.Errorf("sorting DAG of dependencies: %w", err) } var sortedCaseFieldNames []string @@ -730,7 +737,7 @@ func (app *App) execTestCase(t Test, c Case) (*Result, error) { for _, a := range t.Assert { if err := app.execAssert(jobCtx.evalContext, a); err != nil { if strings.HasPrefix(err.Error(), "assertion \"") { - return nil, fmt.Errorf("case %q: %v", c.Name, err) + return nil, fmt.Errorf("case %q: %w", c.Name, err) } return nil, err @@ -785,6 +792,7 @@ func (app *App) dispatchRunJob(l *EventLogger, jobCtx *JobContext, run eitherJob var err error + //nolint:nestif if run.static != nil { jobRun, err = staticRunToJob(jobCtx, run.static) @@ -849,7 +857,6 @@ func (app *App) execMultiRun(l *EventLogger, jobCtx *JobContext, r *DependsOn, s for _, item := range ctyItems { v, err := ctyToGo(item) - if err != nil { return nil, err } @@ -873,7 +880,6 @@ func (app *App) execMultiRun(l *EventLogger, jobCtx *JobContext, r *DependsOn, s } res, err := app.run(l, r.Name, args, streamOutput) - if err != nil { return res, err } @@ -996,7 +1002,7 @@ func (app *App) execJobSteps(l *EventLogger, jobCtx *JobContext, results map[str plan, err := g.Plan() if err != nil { - return nil, err + return nil, xerrors.Errorf("calculating DAG of dependencies: %w", err) } type result struct { @@ -1049,6 +1055,7 @@ func (app *App) execJobSteps(l *EventLogger, jobCtx *JobContext, results map[str if cancelled { rs[ii] = result{r: &Result{Cancelled: true}} rsm.Unlock() + return } rsm.Unlock() @@ -1117,6 +1124,7 @@ func getContext(sourceLocator hcl2.Expression) cty.Value { func getDefault(ctx cty.Value, def hcl2.Expression, tpe cty.Type) (*cty.Value, error) { r := def.Range() + //nolint:nestif if r.Start != r.End { var vv cty.Value @@ -1203,6 +1211,7 @@ func getValueFor(ctx cty.Value, name string, typeExpr hcl2.Expression, defaultEx val, err := gocty.ToCtyValue(v, tpe) if err != nil { + //nolint:wrapcheck return nil, nil, err } @@ -1347,13 +1356,12 @@ func (app *App) createJobContext(cc *HCL2Config, j JobSpec, givenParams map[stri secretRefsEvaluator, err := vals.New(vals.Options{CacheSize: 100}) if err != nil { - return nil, fmt.Errorf("failed to initialize vals: %v", err) + return nil, fmt.Errorf("failed to initialize vals: %w", err) } sec, err := app.getConfigs(secJobCtx, cc, j, "secret", func(j JobSpec) []Config { return j.Secrets }, func(m map[string]interface{}) (map[string]interface{}, error) { return secretRefsEvaluator.Eval(m) }) - if err != nil { return nil, err } @@ -1402,7 +1410,7 @@ func (app *App) getConfigs(jobCtx *JobContext, cc *HCL2Config, j JobSpec, confTy yamlData, err = ioutil.ReadFile(source.Path) if err != nil { if source.Default == nil { - return cty.NilVal, fmt.Errorf("job %q: %s %q: source %d: %v", j.Name, confType, confSpec.Name, sourceIdx, err) + return cty.NilVal, fmt.Errorf("job %q: %s %q: source %d: %w", j.Name, confType, confSpec.Name, sourceIdx, err) } yamlData = []byte(*source.Default) @@ -1420,7 +1428,6 @@ func (app *App) getConfigs(jobCtx *JobContext, cc *HCL2Config, j JobSpec, confTy } args, err := buildArgsFromExpr(jobCtx.WithEvalContext(confCtx).Ptr(), source.Args) - if err != nil { return cty.NilVal, err } @@ -1450,7 +1457,7 @@ func (app *App) getConfigs(jobCtx *JobContext, cc *HCL2Config, j JobSpec, confTy switch format { case FormatYAML: if err := yaml.Unmarshal(yamlData, &m); err != nil { - return cty.NilVal, err + return cty.NilVal, xerrors.Errorf("unmarshalling yaml: %w", err) } case FormatText: if key == "" { @@ -1476,7 +1483,7 @@ func (app *App) getConfigs(jobCtx *JobContext, cc *HCL2Config, j JobSpec, confTy } if err := mergo.Merge(&merged, m, mergo.WithOverride, mergo.WithOverwriteWithEmptyValue); err != nil { - return cty.NilVal, err + return cty.NilVal, xerrors.Errorf("merging maps: %w", err) } } @@ -1491,17 +1498,17 @@ func (app *App) getConfigs(jobCtx *JobContext, cc *HCL2Config, j JobSpec, confTy yamlData, err := yaml.Marshal(merged) if err != nil { - return cty.NilVal, err + return cty.NilVal, xerrors.Errorf("generating yaml: %w", err) } ty, err := ctyyaml.ImpliedType(yamlData) if err != nil { - return cty.DynamicVal, err + return cty.DynamicVal, xerrors.Errorf("determining type of %s: %w", string(yamlData), err) } v, err := ctyyaml.Unmarshal(yamlData, ty) if err != nil { - return cty.DynamicVal, err + return cty.DynamicVal, xerrors.Errorf("unmarshalling %s: %w", string(yamlData), err) } confFields[confSpec.Name] = v @@ -1527,6 +1534,7 @@ func addVariables(varCtx *hcl2.EvalContext, varSpecs []Variable) (*hcl2.EvalCont } } + //nolint:nestif if tpe.IsListType() && tpe.ListElementType().Equals(cty.String) { var v []string if err := gohcl2.DecodeExpression(varSpec.Value, varCtx, &v); err != nil { @@ -1597,12 +1605,12 @@ func getModule(ctx *hcl2.EvalContext, m1, m2 hcl2.Expression) (cty.Value, error) } fname := m.Range().Filename + mod, err := variantmod.New( variantmod.ModuleFile(fmt.Sprintf("%s.variantmod", moduleName)), variantmod.LockFile(fmt.Sprintf("%s.variantmod.lock", moduleName)), variantmod.WD(filepath.Dir(fname)), ) - if err != nil { return cty.NilVal, err } diff --git a/pkg/app/app_log.go b/pkg/app/app_log.go index 8fbd4cc..2aaf6f2 100644 --- a/pkg/app/app_log.go +++ b/pkg/app/app_log.go @@ -80,6 +80,7 @@ func (app *App) newLogCollector(file string, j JobSpec, jobCtx *JobContext) LogC return err } } + return nil }, } diff --git a/pkg/app/app_shim.go b/pkg/app/app_shim.go index 6e876e1..6a6e25f 100644 --- a/pkg/app/app_shim.go +++ b/pkg/app/app_shim.go @@ -9,11 +9,9 @@ import ( "path/filepath" "strings" - "github.com/mumoshu/variant2/pkg/fs" - "github.com/hashicorp/hcl/v2" - "github.com/mumoshu/variant2/pkg/conf" + "github.com/mumoshu/variant2/pkg/fs" ) func (app *App) ExportBinary(srcDir, dstFile string) error { @@ -28,12 +26,11 @@ func (app *App) ExportBinary(srcDir, dstFile string) error { return err } - if err := os.MkdirAll(filepath.Dir(dstFile), 0755); err != nil { + if err := os.MkdirAll(filepath.Dir(dstFile), 0o755); err != nil { return err } absDstFile, err := filepath.Abs(dstFile) - if err != nil { return err } @@ -51,7 +48,7 @@ func (app *App) ExportBinary(srcDir, dstFile string) error { } func (app *App) ExportGo(srcDir, dstDir string) error { - if err := os.MkdirAll(dstDir, 0755); err != nil { + if err := os.MkdirAll(dstDir, 0o755); err != nil { return err } @@ -119,13 +116,14 @@ func main() { replaced := strings.ReplaceAll(string(code), "${MODULE_NAME}", moduleName) code = []byte(replaced) - if err := os.MkdirAll(dstDir, 0755); err != nil { + if err := os.MkdirAll(dstDir, 0o755); err != nil { return err } exportDir := filepath.Join(dstDir, "main.go") - if err := ioutil.WriteFile(exportDir, code, 0644); err != nil { + //nolint:gosec + if err := ioutil.WriteFile(exportDir, code, 0o644); err != nil { return err } @@ -208,11 +206,12 @@ func copyFiles(srcDir string, dstDir string) error { if strings.Contains(rel, DefaultCacheDir) { fmt.Fprintf(os.Stderr, "Skipping %s\n", rel) + return nil } if info.IsDir() { - return os.MkdirAll(abs, 0755) + return os.MkdirAll(abs, 0o755) } return copyFile(path, abs) @@ -254,7 +253,7 @@ func copyFile(src, dst string) (err error) { } func (app *App) ExportShim(srcDir, dstDir string) error { - if err := os.MkdirAll(dstDir, 0755); err != nil { + if err := os.MkdirAll(dstDir, 0o755); err != nil { return err } @@ -300,7 +299,8 @@ func exportWithShim(variantBin string, files map[string]*hcl.File, dstDir string return err } - if err := ioutil.WriteFile(cfgPath, bs, 0644); err != nil { + //nolint:gosec + if err := ioutil.WriteFile(cfgPath, bs, 0o644); err != nil { return err } @@ -328,5 +328,6 @@ func generateShim(variantBin string, path string) error { import = "." `, variantBin)) - return ioutil.WriteFile(path, shimData, 0755) + //nolint:gosec + return ioutil.WriteFile(path, shimData, 0o755) } diff --git a/pkg/app/cty2go.go b/pkg/app/cty2go.go index ccff64e..5be04b7 100644 --- a/pkg/app/cty2go.go +++ b/pkg/app/cty2go.go @@ -172,8 +172,9 @@ func ctyTupleToGo(tuple cty.Value) (interface{}, error) { if lastElemType == nil { lastElemType = t } else if !lastElemType.Equals(*t) { - //return nil, fmt.Errorf("handler for tuple with varying element types is not implemented yet: %v", v) + // return nil, fmt.Errorf("handler for tuple with varying element types is not implemented yet: %v", v) typeVaries = true + break } } diff --git a/pkg/app/load.go b/pkg/app/load.go index ec76a3f..a6271bc 100644 --- a/pkg/app/load.go +++ b/pkg/app/load.go @@ -7,14 +7,12 @@ import ( "path/filepath" "strings" - fs2 "github.com/mumoshu/variant2/pkg/fs" - - "github.com/hashicorp/hcl/v2/ext/typeexpr" - "github.com/hashicorp/hcl/v2" + "github.com/hashicorp/hcl/v2/ext/typeexpr" "github.com/hashicorp/hcl/v2/gohcl" "github.com/hashicorp/hcl/v2/hclparse" "github.com/mumoshu/variant2/pkg/conf" + fs2 "github.com/mumoshu/variant2/pkg/fs" "github.com/variantdev/mod/pkg/depresolver" "github.com/zclconf/go-cty/cty" ) @@ -220,6 +218,7 @@ func findVariantFiles(fs *fs2.FileSystem, cacheDir string, dirPathOrURL string) s := strings.Split(dirPathOrURL, "::") + //nolint:nestif if len(s) > 1 { forcePrefix := s[0] @@ -272,7 +271,7 @@ func findVariantFiles(fs *fs2.FileSystem, cacheDir string, dirPathOrURL string) files, err := conf.FindVariantFiles(fs, dir) if err != nil { - return nil, fmt.Errorf("failed to get %s files: %v", conf.VariantFileExt, err) + return nil, fmt.Errorf("failed to get %s files: %w", conf.VariantFileExt, err) } return files, nil @@ -284,7 +283,6 @@ func newConfigFromSources(srcs map[string][]byte) (map[string]*hcl.File, *HCL2Co } c, nameToFiles, err := l.loadSources(srcs) - if err != nil { return nameToFiles, nil, err } @@ -315,10 +313,10 @@ func newApp(app *App, cc *HCL2Config, importDir func(string) (*App, error)) (*Ap importSources = append(importSources, *j.Import) } + //nolint:nestif if len(importSources) > 0 { for _, src := range importSources { a, err := importDir(src) - if err != nil { return nil, err } diff --git a/pkg/app/log.go b/pkg/app/log.go index dcc85bf..bf6d098 100644 --- a/pkg/app/log.go +++ b/pkg/app/log.go @@ -8,6 +8,7 @@ import ( "time" "github.com/zclconf/go-cty/cty" + "golang.org/x/xerrors" ) type Event struct { @@ -136,7 +137,7 @@ func (l *EventLogger) append(evt Event) error { // Non-nil line means that any collect block's condition matched the logged event if line != nil && l.Stream == "stderr" { if _, err := l.Stderr.Write([]byte(*line + "\n")); err != nil { - return err + return xerrors.Errorf("wrirting stderr: %w", err) } } } @@ -168,8 +169,9 @@ func (l *EventLogger) Register(logCollector LogCollector) func() error { file = logCollector.FilePath } - if err := ioutil.WriteFile(file, []byte(strings.Join(logCollector.lines, "\n")), 0644); err != nil { - return err + //nolint:gosec + if err := ioutil.WriteFile(file, []byte(strings.Join(logCollector.lines, "\n")), 0o644); err != nil { + return xerrors.Errorf("writing %s: %w", file, err) } log := Log{ diff --git a/pkg/app/run.go b/pkg/app/run.go index 90cc12b..c5f4229 100644 --- a/pkg/app/run.go +++ b/pkg/app/run.go @@ -15,6 +15,7 @@ func (app *App) runJobInBody(l *EventLogger, jobCtx *JobContext, body hcl.Body, sErr := gohcl.DecodeBody(body, jobCtx.evalContext, &lazyStaticRun) + //nolint:nestif if sErr.HasErrors() { var lazyDynamicRun LazyDynamicRun @@ -61,7 +62,6 @@ func (app *App) runJobInBody(l *EventLogger, jobCtx *JobContext, body hcl.Body, for _, r := range runs { res, err := app.runJobAndUpdateContext(l, jobCtx, r, new(sync.Mutex), streamOutput) - if err != nil { return res, true, err } diff --git a/pkg/app/run_args.go b/pkg/app/run_args.go index 6a34a30..d540a8e 100644 --- a/pkg/app/run_args.go +++ b/pkg/app/run_args.go @@ -4,7 +4,6 @@ import "github.com/hashicorp/hcl/v2" func buildArgsFromExpr(jobCtx *JobContext, expr hcl.Expression) (map[string]interface{}, error) { localArgs, err := exprToGoMap(jobCtx.evalContext, expr) - if err != nil { return nil, err } diff --git a/pkg/app/survey.go b/pkg/app/survey.go index 585a151..bd89de0 100644 --- a/pkg/app/survey.go +++ b/pkg/app/survey.go @@ -2,12 +2,11 @@ package app import ( "fmt" + "strconv" + "strings" "github.com/AlecAivazis/survey/v2" "github.com/zclconf/go-cty/cty" - - "strconv" - "strings" ) type PendingInput struct { @@ -54,6 +53,7 @@ func MakeQuestions(pendingOptions []PendingInput) ([]*survey.Question, map[strin transform = func(ans interface{}) (newAns interface{}) { i, _ := strconv.Atoi(ans.(string)) + return i } @@ -61,7 +61,7 @@ func MakeQuestions(pendingOptions []PendingInput) ([]*survey.Question, map[strin switch v := ans.(type) { case string: if _, err := strconv.Atoi(v); err != nil { - return fmt.Errorf("option %q: %v", name, err) + return fmt.Errorf("option %q: %w", name, err) } default: return fmt.Errorf("option %q: number: unexpected type of input %T", name, v) @@ -83,6 +83,7 @@ func MakeQuestions(pendingOptions []PendingInput) ([]*survey.Question, map[strin transform = func(ans interface{}) (newAns interface{}) { lines := strings.Split(ans.(string), "\n") + return lines } diff --git a/pkg/app/testdeps_deps.go b/pkg/app/testdeps_deps.go index 1b92b21..5db5af5 100644 --- a/pkg/app/testdeps_deps.go +++ b/pkg/app/testdeps_deps.go @@ -27,8 +27,10 @@ import ( // suitable for passing to testing.MainStart. type TestDeps struct{} -var matchPat string -var matchRe *regexp.Regexp +var ( + matchPat string + matchRe *regexp.Regexp +) func (TestDeps) MatchString(pat, str string) (result bool, err error) { if matchRe == nil || matchPat != pat { diff --git a/pkg/app/types.go b/pkg/app/types.go index ce82597..9d68196 100644 --- a/pkg/app/types.go +++ b/pkg/app/types.go @@ -86,7 +86,7 @@ type EnvSource struct { type SourceJob struct { Name string `hcl:"name,attr"` // This results in "no cty.Type for hcl.Expression" error - //Arguments map[string]hcl2.Expression `hcl:"args,attr"` + // Arguments map[string]hcl2.Expression `hcl:"args,attr"` Args hcl.Expression `hcl:"args,attr"` Format *string `hcl:"format,attr"` Key *string `hcl:"key,attr"` @@ -109,7 +109,7 @@ type Variable struct { } type JobSpec struct { - //Type string `hcl:"type,label"` + // Type string `hcl:"type,label"` Name string `hcl:"name,label"` Version *string `hcl:"version,attr"` diff --git a/pkg/conf/funcs.go b/pkg/conf/funcs.go index 5739031..7f99567 100644 --- a/pkg/conf/funcs.go +++ b/pkg/conf/funcs.go @@ -1,17 +1,18 @@ package conf import ( + "github.com/hashicorp/hcl/v2/ext/tryfunc" "github.com/hashicorp/hcl/v2/ext/typeexpr" "github.com/hashicorp/terraform/lang/funcs" ctyyaml "github.com/zclconf/go-cty-yaml" "github.com/zclconf/go-cty/cty" "github.com/zclconf/go-cty/cty/function" "github.com/zclconf/go-cty/cty/function/stdlib" - - "github.com/hashicorp/hcl/v2/ext/tryfunc" ) -// Functions is +// Functions is a set of functions that are available in .variant files. +// This set should cover all the functions available in moderately up-to-date version of Terraform, +// so that the experience of using functions should be easier for users who are used with Terraform. func Functions(baseDir string) map[string]function.Function { return map[string]function.Function{ "abs": stdlib.AbsoluteFunc, diff --git a/pkg/conf/jsonpath.go b/pkg/conf/jsonpath.go index 5ed4351..0c62024 100644 --- a/pkg/conf/jsonpath.go +++ b/pkg/conf/jsonpath.go @@ -7,6 +7,7 @@ import ( "github.com/zclconf/go-cty/cty" "github.com/zclconf/go-cty/cty/function" ctyjson "github.com/zclconf/go-cty/cty/json" + "golang.org/x/xerrors" ) func getValueAtJSONPath(data, path string) (cty.Value, error) { @@ -19,13 +20,13 @@ func getValueAtJSONPath(data, path string) (cty.Value, error) { ty, err := ctyjson.ImpliedType(raw) if err != nil { - return cty.DynamicVal, err + return cty.DynamicVal, xerrors.Errorf("determining implied type of %s: %w", string(raw), err) } return ctyjson.Unmarshal(raw, ty) } -// JSONPathFunc takes JSON and a query to fetch the value for the query +// JSONPathFunc takes JSON and a query to fetch the value for the query. var JSONPathFunc = function.New(&function.Spec{ Params: []function.Parameter{ { @@ -46,6 +47,7 @@ var JSONPathFunc = function.New(&function.Spec{ query := args[1].AsString() v, err := getValueAtJSONPath(data, query) + return v.Type(), err }, Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { @@ -53,6 +55,7 @@ var JSONPathFunc = function.New(&function.Spec{ query := args[1].AsString() v, err := getValueAtJSONPath(data, query) + return v, err }, }) diff --git a/pkg/conf/load.go b/pkg/conf/load.go index 2813ac5..18c94f5 100644 --- a/pkg/conf/load.go +++ b/pkg/conf/load.go @@ -4,6 +4,7 @@ import ( "path/filepath" "github.com/mumoshu/variant2/pkg/fs" + "golang.org/x/xerrors" ) const ( @@ -11,7 +12,7 @@ const ( ) // FindVariantFiles walks the given path and returns the files ending whose ext is .variant -// Also, it returns the path if the path is just a file and a HCL file +// Also, it returns the path if the path is just a file and a HCL file. func FindVariantFiles(fs *fs.FileSystem, path string) ([]string, error) { var ( files []string @@ -20,13 +21,15 @@ func FindVariantFiles(fs *fs.FileSystem, path string) ([]string, error) { fi, err := fs.Stat(path) if err != nil { - return files, err + return files, xerrors.Errorf("stat: %w", err) } if fi.IsDir() { - found, err := fs.Glob(filepath.Join(path, "*"+VariantFileExt+"*")) + variantFilesPattern := filepath.Join(path, "*"+VariantFileExt+"*") + + found, err := fs.Glob(variantFilesPattern) if err != nil { - return nil, err + return nil, xerrors.Errorf("glob %q: %w", variantFilesPattern, err) } for _, f := range found { @@ -37,9 +40,8 @@ func FindVariantFiles(fs *fs.FileSystem, path string) ([]string, error) { } info, err := fs.Stat(f) - if err != nil { - return nil, err + return nil, xerrors.Errorf("stat %s: %w", f, err) } if info.IsDir() { @@ -57,5 +59,5 @@ func FindVariantFiles(fs *fs.FileSystem, path string) ([]string, error) { files = append(files, path) } - return files, err + return files, xerrors.Errorf("stat %s: %w", path, err) } diff --git a/pkg/controller/api.go b/pkg/controller/api.go index fe73c0b..51b715b 100644 --- a/pkg/controller/api.go +++ b/pkg/controller/api.go @@ -10,13 +10,11 @@ const ( coreVersion = "v1beta1" ) -var ( - reconciliationGroupVersionKind = schema.GroupVersionKind{ - Group: coreGroup, - Version: coreVersion, - Kind: "Reconciliation", - } -) +var reconciliationGroupVersionKind = schema.GroupVersionKind{ + Group: coreGroup, + Version: coreVersion, + Kind: "Reconciliation", +} func newReconciliation() *unstructured.Unstructured { obj := &unstructured.Unstructured{} diff --git a/pkg/controller/capture.go b/pkg/controller/capture.go index d57a041..a505ea8 100644 --- a/pkg/controller/capture.go +++ b/pkg/controller/capture.go @@ -2,10 +2,11 @@ package controller import ( "bytes" - "golang.org/x/sync/errgroup" - "golang.org/x/xerrors" "io" "os" + + "golang.org/x/sync/errgroup" + "golang.org/x/xerrors" ) func CaptureOutput(f func(io.Writer, io.Writer) error) (string, error) { diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index 708d33e..cc45257 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -3,12 +3,13 @@ package controller import ( "context" "fmt" + "strings" + "github.com/go-logr/logr" "golang.org/x/xerrors" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "sigs.k8s.io/controller-runtime/pkg/client" - "strings" ) type controller struct { @@ -20,7 +21,7 @@ type controller struct { // reconciliation. podName string - // Kubernetes client to be used for querying target objects and managing Reconcilation objects + // Kubernetes client to be used for querying target objects and managing Reconciliation objects runtimeClient client.Client // Runs `variant run ` and returns combined output and/or error @@ -97,7 +98,7 @@ func (c *controller) logReconciliation(orig *unstructured.Unstructured, job, com } // Use of GenerateName results in 404 - //obj.SetGenerateName(name + "-") + // obj.SetGenerateName(name + "-") obj.SetName(reconName) // Missing Namespace results in 404 obj.SetNamespace(namespace) @@ -106,6 +107,7 @@ func (c *controller) logReconciliation(orig *unstructured.Unstructured, job, com "core.variant.run/controller": c.controllerName, "core.variant.run/pod": c.podName, }) + spec, ok, err := unstructured.NestedMap(st.Object, "spec") if !ok { return fmt.Errorf("missing Resource.Spec: %w", err) diff --git a/pkg/controller/run.go b/pkg/controller/run.go index e1e8cf4..3758d6c 100644 --- a/pkg/controller/run.go +++ b/pkg/controller/run.go @@ -4,19 +4,24 @@ import ( "os" "strings" + "github.com/summerwind/whitebox-controller/config" + "github.com/summerwind/whitebox-controller/manager" "github.com/summerwind/whitebox-controller/reconciler/state" "golang.org/x/xerrors" "k8s.io/apimachinery/pkg/runtime/schema" - kconfig "sigs.k8s.io/controller-runtime/pkg/client/config" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" - "sigs.k8s.io/controller-runtime/pkg/runtime/signals" + // We import these here rather than in main to automate setting up cloud-provider-specific authentication strategies. _ "k8s.io/client-go/plugin/pkg/client/auth/azure" + + // We import these here rather than in main to automate setting up cloud-provider-specific authentication strategies. _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" - _ "k8s.io/client-go/plugin/pkg/client/auth/oidc" - "github.com/summerwind/whitebox-controller/config" - "github.com/summerwind/whitebox-controller/manager" + // We import these here rather than in main to automate setting up cloud-provider-specific authentication strategies. + _ "k8s.io/client-go/plugin/pkg/client/auth/oidc" + kconfig "sigs.k8s.io/controller-runtime/pkg/client/config" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" + "sigs.k8s.io/controller-runtime/pkg/manager/signals" ) const ( @@ -34,7 +39,7 @@ func RunRequested() bool { } func Run(run func([]string) (string, error)) (finalErr error) { - logf.SetLogger(logf.ZapLogger(false)) + logf.SetLogger(zap.New()) defer func() { if finalErr != nil { @@ -112,5 +117,5 @@ func Run(run func([]string) (string, error)) (finalErr error) { return xerrors.Errorf("starting controller-manager: %w", err) } - return err + return nil } diff --git a/pkg/fs/fs.go b/pkg/fs/fs.go index f3d95ae..dcbed1a 100644 --- a/pkg/fs/fs.go +++ b/pkg/fs/fs.go @@ -1,6 +1,7 @@ package fs import ( + "errors" "fmt" "io/ioutil" "net/http" @@ -10,6 +11,7 @@ import ( "sync" "github.com/rakyll/statik/fs" + "golang.org/x/xerrors" ) const ( @@ -35,7 +37,7 @@ func (s *FileSystem) ReadFile(path string) ([]byte, error) { } f, err := fs.Open(s.vendored(path)) - if err == os.ErrNotExist { + if errors.Is(err, os.ErrNotExist) { return ioutil.ReadFile(path) } defer f.Close() @@ -55,7 +57,7 @@ func (s *FileSystem) Stat(path string) (os.FileInfo, error) { } f, err := fs.Open(s.vendored(path)) - if err == os.ErrNotExist { + if errors.Is(err, os.ErrNotExist) { return os.Stat(path) } defer f.Close() @@ -153,7 +155,7 @@ func glob(fs http.FileSystem, dir, pattern string) ([]string, error) { for _, n := range names { matched, err := filepath.Match(pattern, n) if err != nil { - return m, err + return m, xerrors.Errorf("matching pattern %s against %s: %w", pattern, n, err) } if matched { diff --git a/pkg/slack/slack.go b/pkg/slack/slack.go index 365d47d..85dce81 100644 --- a/pkg/slack/slack.go +++ b/pkg/slack/slack.go @@ -9,6 +9,7 @@ import ( "github.com/nlopes/slack" "github.com/rs/xid" + "golang.org/x/xerrors" ) const ( @@ -90,12 +91,12 @@ func (conn *Connection) Notify(n Notification) error { Markdown: true, } - respChannel, respTs, err := conn.Client.PostMessage(conn.Channel, slack.MsgOptionPostMessageParameters(params), slack.MsgOptionAttachments(attachment)) + respChannel, respTS, err := conn.Client.PostMessage(conn.Channel, slack.MsgOptionPostMessageParameters(params), slack.MsgOptionAttachments(attachment)) if err != nil { - return err + return xerrors.Errorf("posting message: %w", err) } - fmt.Printf("respCHannel=%s, respTs=%s", respChannel, respTs) + fmt.Printf("respCHannel=%s, respTS=%s", respChannel, respTS) return nil } @@ -142,12 +143,12 @@ func (conn *Connection) Select(sel Selection) (*string, error) { Markdown: true, } - respChannel, respTs, err := conn.Client.PostMessage(conn.Channel, slack.MsgOptionPostMessageParameters(params), slack.MsgOptionAttachments(attachment)) + respChannel, respTS, err := conn.Client.PostMessage(conn.Channel, slack.MsgOptionPostMessageParameters(params), slack.MsgOptionAttachments(attachment)) if err != nil { - return nil, err + return nil, xerrors.Errorf("posting message: %w", err) } - fmt.Printf("respCHannel=%s, respTs=%s", respChannel, respTs) + fmt.Printf("respCHannel=%s, respTS=%s", respChannel, respTS) // Wait for selection @@ -293,7 +294,7 @@ func (conn *Connection) Run() error { cmd.ChannelID, // Commented-out as this resulted in mesage_not_found error in the later phase, which seemed to indicate that // we cant update the non-ephemeral response after it's posted. - //slack.MsgOptionResponseURL(cmd.ResponseURL, slack.ResponseTypeInChannel), + // slack.MsgOptionResponseURL(cmd.ResponseURL, slack.ResponseTypeInChannel), slack.MsgOptionText(fmt.Sprintf("@%s triggered `%s`", cmd.UserName, userInput), false), ) if err != nil { @@ -318,6 +319,7 @@ func (conn *Connection) Run() error { ) if err != nil { fmt.Printf("async response 3 error: %v", err) + return } }() diff --git a/pkg/slack/slashcommand.go b/pkg/slack/slashcommand.go index 89f8d8a..c7e56d0 100644 --- a/pkg/slack/slashcommand.go +++ b/pkg/slack/slashcommand.go @@ -24,7 +24,6 @@ func (h slashCommandsHTTPHandler) ServeHTTP(w http.ResponseWriter, r *http.Reque } cmd, err := slack.SlashCommandParse(r) - if err != nil { log.Printf("[ERROR] failed to parse slash command: %v", err) w.WriteHeader(http.StatusBadRequest) diff --git a/slack.go b/slack.go index 3769f04..ed38638 100644 --- a/slack.go +++ b/slack.go @@ -13,6 +13,7 @@ import ( variantslack "github.com/mumoshu/variant2/pkg/slack" "github.com/nlopes/slack" "github.com/zclconf/go-cty/cty" + "golang.org/x/xerrors" ) func (r *Runner) StartSlackbot(name string) error { @@ -46,7 +47,7 @@ func (r *Runner) StartSlackbot(name string) error { Placeholder: desc, Type: slack.InputTypeText, Name: k, - //Optional: true, + // Optional: true, } default: elem = slack.DialogInput{ @@ -54,7 +55,7 @@ func (r *Runner) StartSlackbot(name string) error { Placeholder: desc, Type: slack.InputTypeTextArea, Name: k, - //Optional: true, + // Optional: true, } } @@ -85,7 +86,7 @@ func (r *Runner) StartSlackbot(name string) error { _, transformers, err := app.MakeQuestions(pendingOptions) if err != nil { - return nil, err + return nil, xerrors.Errorf("making questions: %w", err) } vals := make(map[string]interface{}) @@ -98,6 +99,7 @@ func (r *Runner) StartSlackbot(name string) error { if v == "" { errs[k] = fmt.Errorf("%s is required", k) + continue } @@ -105,6 +107,7 @@ func (r *Runner) StartSlackbot(name string) error { b, err := strconv.ParseBool(v) if err != nil { errs[k] = err + continue } @@ -138,7 +141,7 @@ func (r *Runner) StartSlackbot(name string) error { } if err := app.SetOptsFromMap(transformers, opts, vals); err != nil { - return nil, err + return nil, xerrors.Errorf("setting options: %w", err) } done <- nil @@ -148,6 +151,7 @@ func (r *Runner) StartSlackbot(name string) error { if err := bot.Client.OpenDialogContext(context.TODO(), message.TriggerID, dialog); err != nil { log.Print("open dialog failed: ", err) + return nil } diff --git a/test/variant_test.go b/test/variant_test.go index 9bc77c0..f126c10 100644 --- a/test/variant_test.go +++ b/test/variant_test.go @@ -8,6 +8,7 @@ import ( "testing" variant "github.com/mumoshu/variant2" + "golang.org/x/xerrors" ) // Building the binary with `go build -o myapp main.go` @@ -25,8 +26,8 @@ job "test" { } } ` - err := variant.MustLoad(variant.FromSource("myapp", source)).Run([]string{"test"}) + err := variant.MustLoad(variant.FromSource("myapp", source)).Run([]string{"test"}) if err != nil { panic(err) } @@ -131,7 +132,6 @@ func TestExtensionWithGo(t *testing.T) { Stderr: stderrW, } j, err := myapp.Job("app deploy", subst) - if err != nil { return err } @@ -146,7 +146,7 @@ func TestExtensionWithGo(t *testing.T) { } if _, err := s.Stdout.Write([]byte("OUTPUT: " + o.String())); err != nil { - return err + return xerrors.Errorf("writing stdout: %w", err) } e, err := errs() @@ -155,7 +155,7 @@ func TestExtensionWithGo(t *testing.T) { } if _, err := s.Stderr.Write([]byte("ERROR: " + e.String())); err != nil { - return err + return xerrors.Errorf("writing stderr: %w", err) } return nil diff --git a/variant.go b/variant.go index 5ea1889..f984774 100644 --- a/variant.go +++ b/variant.go @@ -12,12 +12,12 @@ import ( "strings" "sync" - "github.com/mattn/go-isatty" - "github.com/hashicorp/hcl/v2/ext/typeexpr" + "github.com/mattn/go-isatty" "github.com/mumoshu/variant2/pkg/app" "github.com/spf13/cobra" "github.com/zclconf/go-cty/cty" + "golang.org/x/xerrors" ) var Version string @@ -52,13 +52,13 @@ func FromPath(path string, opts ...Option) Setup { path, err = os.Getwd() if err != nil { - return nil, err + return nil, xerrors.Errorf("getwd: %w", err) } } info, err := os.Stat(path) if err != nil { - return nil, err + return nil, xerrors.Errorf("stat %s: %w", path, err) } var setup app.Setup @@ -283,7 +283,6 @@ func createCobraFlagsFromVariantOptions(cli *cobra.Command, opts []app.OptionSpe } if !app.IsExpressionEmpty(o.Default) || interactive { - } else if err := cli.MarkPersistentFlagRequired(o.Name); err != nil { panic(err) } @@ -328,7 +327,6 @@ func configureCommand(cli *cobra.Command, root app.JobSpec, interactive bool) (* ii := i ty, err := typeexpr.TypeConstraint(p.Type) - if err != nil { return nil, err } @@ -411,8 +409,8 @@ func getMergedParamsAndOpts( } cfg := cfgs[cmdName] - params, err := cfg.Parameters(args) + params, err := cfg.Parameters(args) if err != nil { return nil, nil, err } @@ -430,6 +428,8 @@ func (m *Main) initApp(setup app.Setup) (*app.App, error) { ap, err := app.New(setup) if err != nil { ap.PrintError(err) + + //nolint:wrapcheck return nil, err } @@ -496,20 +496,19 @@ func (m Main) initRunner(r *Runner) { } r, err := r.ap.Run(n, st.Parameters, st.Options) - if err != nil { - return err + return xerrors.Errorf("running job %q: %w", n, err) } if st.Stdout != nil { if _, err := st.Stdout.Write([]byte(r.Stdout)); err != nil { - return err + return xerrors.Errorf("writing stdout of job %q: %w", n, err) } } if st.Stderr != nil { if _, err := st.Stderr.Write([]byte(r.Stderr)); err != nil { - return err + return xerrors.Errorf("writing stderr of job %q: %w", n, err) } } @@ -620,7 +619,6 @@ func (r *Runner) Cobra() (*cobra.Command, error) { } cfg, err := configureCommand(cli, job, r.Interactive) - if err != nil { return nil, err } @@ -637,6 +635,7 @@ func (r *Runner) Cobra() (*cobra.Command, error) { cmd.SilenceUsage = true } + //nolint:wrapcheck return err } commands[name] = cli @@ -660,7 +659,7 @@ type RunOptions struct { DisableLocking bool } -// Add adds a job to this runner so that it can later by calling `Job` +// Add adds a job to this runner so that it can later by calling `Job`. func (r Runner) Add(job Job) { r.goJobs[job.Name] = job @@ -675,7 +674,7 @@ func (r Runner) Add(job Job) { } } -// Job prepares a job to be run +// Job prepares a job to be run. func (r Runner) Job(job string, opts State) (JobRun, error) { f, ok := r.jobRunProviders[job] if !ok { @@ -771,6 +770,7 @@ func (r *Runner) Run(arguments []string, opt ...RunOptions) error { r.ap.Stderr = appStderr } + //nolint:wrapcheck return err } @@ -803,6 +803,8 @@ func (r *Runner) createVariantRootCommand() *cobra.Command { if err != nil { c.SilenceUsage = true } + + //nolint:wrapcheck return err }, } @@ -820,6 +822,8 @@ func (r *Runner) createVariantRootCommand() *cobra.Command { if err != nil { c.SilenceUsage = true } + + //nolint:wrapcheck return err }, } @@ -843,6 +847,7 @@ func (r *Runner) createVariantRootCommand() *cobra.Command { if err != nil { c.SilenceUsage = true } + return err }, } @@ -865,6 +870,7 @@ func (r *Runner) createVariantRootCommand() *cobra.Command { if err != nil { c.SilenceUsage = true } + return err }, } From e130c455c3bbb7416b7a0d57e04ab6757ef55a11 Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Thu, 29 Oct 2020 17:51:07 +0900 Subject: [PATCH 12/14] Longer timeout for golangci-lint --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index dddbbd7..7c65dd9 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,7 @@ bin/golangci-lint: .PHONY: lint lint: bin/golangci-lint bin/golangci-lint run --tests ./... \ + --timeout 2m \ --enable-all \ --disable gochecknoglobals \ --disable gochecknoinits \ From 5f725bf464b706fa687b7702c9b668e90f463c78 Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Thu, 29 Oct 2020 17:51:36 +0900 Subject: [PATCH 13/14] Add default VARIANT_BUILD_MOD_REPLACE to make `variant export go/binary` successful --- pkg/app/app_shim.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg/app/app_shim.go b/pkg/app/app_shim.go index 6a6e25f..a37ad87 100644 --- a/pkg/app/app_shim.go +++ b/pkg/app/app_shim.go @@ -174,6 +174,12 @@ func main() { } modReplace := os.Getenv("VARIANT_BUILD_MOD_REPLACE") + + if modReplace == "" { + // Required until https://github.com/summerwind/whitebox-controller/pull/8 is merged + modReplace = "github.com/summerwind/whitebox-controller@v0.7.1=github.com/mumoshu/whitebox-controller@v0.5.1-0.20201028130131-ac7a0743254b" + } + if modReplace != "" { _, err = app.execCmd( Command{ From 378df01ffb983575b0a9bb4f08c602d13845adca Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Thu, 29 Oct 2020 17:59:17 +0900 Subject: [PATCH 14/14] Even longer timeout for golangci-lint --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 7c65dd9..060b1a9 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,7 @@ bin/golangci-lint: .PHONY: lint lint: bin/golangci-lint bin/golangci-lint run --tests ./... \ - --timeout 2m \ + --timeout 5m \ --enable-all \ --disable gochecknoglobals \ --disable gochecknoinits \