From 78fcac266bfb215c35a21d696f9e147e6c563d09 Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Fri, 18 Oct 2019 00:18:54 -0400 Subject: [PATCH 01/12] Upgrade helm-operator to Helm v3 --- cmd/operator-sdk/new/cmd.go | 12 +- go.mod | 15 +- go.sum | 227 +++++++++++----- internal/olm/client/client.go | 2 +- internal/scaffold/ansible/go_mod.go | 2 + internal/scaffold/go_mod.go | 2 + internal/scaffold/helm/chart.go | 74 ++---- internal/scaffold/helm/chart_test.go | 242 ++++-------------- internal/scaffold/helm/go_mod.go | 2 + internal/scaffold/helm/role.go | 46 ++-- internal/scaffold/helm/role_test.go | 33 ++- .../testdata/testcharts/test-chart-1.2.0.tgz | Bin 0 -> 2732 bytes .../testdata/testcharts/test-chart-1.2.3.tgz | Bin 0 -> 2731 bytes .../testcharts/test-chart/.helmignore | 22 ++ .../testdata/testcharts/test-chart/Chart.yaml | 21 ++ .../testcharts/test-chart/templates/NOTES.txt | 21 ++ .../test-chart/templates/_helpers.tpl | 63 +++++ .../test-chart/templates/deployment.yaml | 55 ++++ .../test-chart/templates/ingress.yaml | 37 +++ .../test-chart/templates/service.yaml | 15 ++ .../test-chart/templates/serviceaccount.yaml | 8 + .../templates/tests/test-connection.yaml | 15 ++ .../testcharts/test-chart/values.yaml | 66 +++++ pkg/helm/client/client.go | 21 +- pkg/helm/controller/controller.go | 4 +- pkg/helm/controller/reconcile.go | 27 +- pkg/helm/engine/ownerref.go | 10 +- pkg/helm/engine/ownerref_test.go | 6 +- pkg/helm/release/manager.go | 168 ++++-------- pkg/helm/release/manager_factory.go | 188 ++++++++++---- pkg/helm/watches/watches.go | 2 +- test/test-framework/go.mod | 2 + test/test-framework/go.sum | 110 +++++++- 33 files changed, 956 insertions(+), 562 deletions(-) create mode 100644 internal/scaffold/helm/testdata/testcharts/test-chart-1.2.0.tgz create mode 100644 internal/scaffold/helm/testdata/testcharts/test-chart-1.2.3.tgz create mode 100644 internal/scaffold/helm/testdata/testcharts/test-chart/.helmignore create mode 100644 internal/scaffold/helm/testdata/testcharts/test-chart/Chart.yaml create mode 100644 internal/scaffold/helm/testdata/testcharts/test-chart/templates/NOTES.txt create mode 100644 internal/scaffold/helm/testdata/testcharts/test-chart/templates/_helpers.tpl create mode 100644 internal/scaffold/helm/testdata/testcharts/test-chart/templates/deployment.yaml create mode 100644 internal/scaffold/helm/testdata/testcharts/test-chart/templates/ingress.yaml create mode 100644 internal/scaffold/helm/testdata/testcharts/test-chart/templates/service.yaml create mode 100644 internal/scaffold/helm/testdata/testcharts/test-chart/templates/serviceaccount.yaml create mode 100644 internal/scaffold/helm/testdata/testcharts/test-chart/templates/tests/test-connection.yaml create mode 100644 internal/scaffold/helm/testdata/testcharts/test-chart/values.yaml diff --git a/cmd/operator-sdk/new/cmd.go b/cmd/operator-sdk/new/cmd.go index 49e0209417..e540afade8 100644 --- a/cmd/operator-sdk/new/cmd.go +++ b/cmd/operator-sdk/new/cmd.go @@ -28,6 +28,7 @@ import ( "github.com/operator-framework/operator-sdk/internal/scaffold/input" "github.com/operator-framework/operator-sdk/internal/util/projutil" + "github.com/ghodss/yaml" "github.com/pkg/errors" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" @@ -314,8 +315,13 @@ func doHelmScaffold() error { return fmt.Errorf("failed to create helm chart: %s", err) } - valuesPath := filepath.Join("", helm.HelmChartsDir, chart.GetMetadata().GetName(), "values.yaml") - crSpec := fmt.Sprintf("# Default values copied from %s\n\n%s", valuesPath, chart.GetValues().GetRaw()) + valuesPath := filepath.Join("", helm.HelmChartsDir, chart.Name(), "values.yaml") + + rawValues, err := yaml.Marshal(chart.Values) + if err != nil { + return fmt.Errorf("failed to get raw chart values: %s", err) + } + crSpec := fmt.Sprintf("# Default values copied from %s\n\n%s", valuesPath, rawValues) roleScaffold := helm.DefaultRoleScaffold if k8sCfg, err := config.GetConfig(); err != nil { @@ -331,7 +337,7 @@ func doHelmScaffold() error { &helm.Dockerfile{}, &helm.WatchesYAML{ Resource: resource, - ChartName: chart.GetMetadata().GetName(), + ChartName: chart.Name(), }, &scaffold.ServiceAccount{}, &roleScaffold, diff --git a/go.mod b/go.mod index 74bdc0eb46..76bd0741bb 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,6 @@ go 1.13 require ( github.com/DATA-DOG/go-sqlmock v1.3.3 // indirect - github.com/Masterminds/goutils v1.1.0 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/sprig v2.22.0+incompatible // indirect github.com/blang/semver v3.5.1+incompatible github.com/coreos/go-semver v0.3.0 github.com/coreos/prometheus-operator v0.34.0 @@ -15,10 +12,9 @@ require ( github.com/go-logr/logr v0.1.0 github.com/go-logr/zapr v0.1.1 github.com/gobuffalo/packr v1.30.1 // indirect - github.com/gobwas/glob v0.2.3 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 github.com/gregjones/httpcache v0.0.0-20190203031600-7a902570cb17 // indirect - github.com/huandu/xstrings v1.2.0 // indirect + github.com/helm/helm-2to3 v0.2.0 github.com/iancoleman/strcase v0.0.0-20190422225806-e506e3ef7365 github.com/jmoiron/sqlx v1.2.0 // indirect github.com/lib/pq v1.2.0 // indirect @@ -26,14 +22,13 @@ require ( github.com/martinlindhe/base36 v1.0.0 github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a github.com/mattn/go-isatty v0.0.8 - github.com/mitchellh/copystructure v1.0.0 // indirect github.com/mitchellh/go-homedir v1.1.0 github.com/mitchellh/mapstructure v1.1.2 github.com/operator-framework/operator-lifecycle-manager v0.0.0-20191115003340-16619cd27fa5 github.com/operator-framework/operator-registry v1.5.1 github.com/pborman/uuid v1.2.0 github.com/pkg/errors v0.8.1 - github.com/prometheus/client_golang v1.1.0 + github.com/prometheus/client_golang v1.2.1 github.com/rogpeppe/go-internal v1.5.0 github.com/rubenv/sql-migrate v0.0.0-20191025130928-9355dd04f4b3 // indirect github.com/sergi/go-diff v1.0.0 @@ -43,12 +38,12 @@ require ( github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.4.0 github.com/stretchr/testify v1.4.0 - github.com/technosophos/moniker v0.0.0-20180509230615-a5dbd03a2245 // indirect github.com/ziutek/mymysql v1.5.4 // indirect go.uber.org/zap v1.10.0 golang.org/x/tools v0.0.0-20191018212557-ed542cd5b28a gopkg.in/gorp.v1 v1.7.2 // indirect gopkg.in/yaml.v2 v2.2.4 + helm.sh/helm/v3 v3.0.0 k8s.io/api v0.0.0 k8s.io/apiextensions-apiserver v0.0.0 k8s.io/apimachinery v0.0.0 @@ -61,7 +56,7 @@ require ( k8s.io/kube-openapi v0.0.0-20190918143330-0270cf2f1c1d k8s.io/kube-state-metrics v1.7.2 k8s.io/kubectl v0.0.0 - k8s.io/kubernetes v1.16.2 + k8s.io/kubernetes v1.16.2 // indirect sigs.k8s.io/controller-runtime v0.4.0 sigs.k8s.io/controller-tools v0.2.2 ) @@ -90,3 +85,5 @@ replace ( k8s.io/metrics => k8s.io/metrics v0.0.0-20191016113814-3b1a734dba6e k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.0.0-20191016112829-06bb3c9d77c9 ) + +replace github.com/docker/docker => github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309 // Required by Helm diff --git a/go.sum b/go.sum index 630bc522b2..758604b6ee 100644 --- a/go.sum +++ b/go.sum @@ -31,16 +31,23 @@ github.com/DATA-DOG/go-sqlmock v1.3.3 h1:CWUqKXe0s8A2z6qCgkP4Kru7wC11YoAnoupUKFD github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= +github.com/MakeNowJust/heredoc v0.0.0-20171113091838-e9091a26100e h1:eb0Pzkt15Bm7f2FFYv7sjY7NPFi3cPkS3tv1CcrFBWA= +github.com/MakeNowJust/heredoc v0.0.0-20171113091838-e9091a26100e/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= github.com/Masterminds/goutils v1.1.0 h1:zukEsf/1JZwCMgHiK3GZftabmxiCw4apj3a28RPBiVg= github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/semver/v3 v3.0.1 h1:2kKm5lb7dKVrt5TYUiAavE6oFc1cFT0057UVGT+JqLk= +github.com/Masterminds/semver/v3 v3.0.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig/v3 v3.0.0 h1:KSQz7Nb08/3VU9E4ns29dDxcczhOD1q7O1UfM4G3t3g= +github.com/Masterminds/sprig/v3 v3.0.0/go.mod h1:NEUY/Qq8Gdm2xgYA+NwJM6wmfdRV9xkh8h/Rld20R0U= +github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.12 h1:xAfWHN1IrQ0NJ9TBC0KBZoqLjzDTr1ML+4MywiUOryc= +github.com/Microsoft/go-winio v0.4.12/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/hcsshim v0.0.0-20190417211021-672e52e9209d/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.6 h1:ZfF0+zZeYdzMIVMZHKtDKJvLHj76XCuVae/jNkjj0IA= github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.0.1/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= @@ -54,16 +61,21 @@ github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdko github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Rican7/retry v0.1.0/go.mod h1:FgOROf8P5bebcC1DS0PdOQiqGUridaZvikzUmkFW6gg= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/ant31/crd-validation v0.0.0-20180702145049-30f8a35d0ac2/go.mod h1:X0noFIik9YqfhGYBLEHg8LJKEwy7QIitLQuFMpKLcPk= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/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/auth0/go-jwt-middleware v0.0.0-20170425171159-5493cabe49f7/go.mod h1:LWMyo4iOLWXHGdBki7NIht1kHru/0wM179h+d3g8ATM= github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -71,25 +83,34 @@ github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN github.com/bazelbuild/bazel-gazelle v0.0.0-20181012220611-c728ce9f663e/go.mod h1:uHBSeeATKpVazAACZBDPL/Nk/UhQDDsJWDlqYJo8/Us= github.com/bazelbuild/buildtools v0.0.0-20180226164855-80c7f0d45d7e/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bifurcation/mint v0.0.0-20180715133206-93c51c6ce115/go.mod h1:zVt7zX3K/aDCk9Tj+VM7YymsX66ERvzCJzw8rFCX2JU= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= +github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/brancz/gojsontoyaml v0.0.0-20190425155809-e8bd32d46b3d/go.mod h1:IyUJYN1gvWjtLF5ZuygmxbnsAyP3aJS6cHzIuZY50B0= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1 h1:pgAtgj+A31JBVtEHu2uHuEx0n+2ukqUJnS2vVe5pQNA= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/bugsnag/bugsnag-go v1.5.0 h1:tP8hiPv1pGGW3LA6LKy5lW6WG+y9J2xWUdPd3WC452k= +github.com/bugsnag/bugsnag-go v1.5.0/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/panicwrap v1.2.0 h1:OzrKrRvXis8qEvOkfcxNcYbOd2O7xXS2nnKMEMABFQA= +github.com/bugsnag/panicwrap v1.2.0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/caddyserver/caddy v1.0.3/go.mod h1:G+ouvOY32gENkJC+jhgl62TyhvqEsFaDiZ4uw0RzP1E= github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c/go.mod h1:Xe6ZsFhtM8HrDku0pxJ3/Lr51rwykrzgFwpmTzleatY= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 h1:7aWHqerlJ41y6FOsEUvknqgXnGmJyJSbjhAWq5pO4F8= +github.com/cespare/xxhash/v2 v2.1.0 h1:yTUvW7Vhb89inJ+8irsUqiWjh8iT6sQPZiQzI6ReGkA= +github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= github.com/checkpoint-restore/go-criu v0.0.0-20190109184317-bdb7599cd87b/go.mod h1:TrMrLQfeENAPYPRsJuq3jsqdlRh3lvi6trTZJG8+tho= github.com/cheekybits/genny v0.0.0-20170328200008-9127e812e1e9/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= @@ -103,14 +124,17 @@ github.com/container-storage-interface/spec v1.1.0/go.mod h1:6URME8mwIBbpVyZV93C github.com/containerd/console v0.0.0-20170925154832-84eeaae905fa/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/containerd v1.0.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.2.7/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190823190603-4a2f61c4f2b4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0 h1:xjvXQWABwS2uiv3TWgQt5Uth60Gu86LTGZXMJkjc7rY= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/continuity v0.0.0-20181203112020-004b46473808 h1:4BX8f882bXEDKfWIf0wa8HRvpnBoPszJJXL+TVbBw4M= +github.com/containerd/continuity v0.0.0-20181203112020-004b46473808/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/typeurl v0.0.0-20190228175220-2a93cfde8c20/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/coredns/corefile-migration v1.0.2/go.mod h1:OFwBp/Wc9dJt5cAZzHWMNhK1r5L0p0jDwIBc6j8NC8E= github.com/coreos/bbolt v1.3.1-coreos.6/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.15+incompatible h1:+9RjdC18gMxNQVvSiXvObLu29mOFmkgdsB4cRTlV+EE= 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.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= @@ -119,10 +143,8 @@ github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmf github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a h1:W8b4lQ4tFF21aspRGoBuCNV6V2fFJBF+pm1J6OY8Lys= github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/prometheus-operator v0.34.0 h1:TF9qaydNeUamLKs0hniaapa4FBz8U8TIlRRtJX987A4= github.com/coreos/prometheus-operator v0.34.0/go.mod h1:Li6rMllG/hYIyXfMuvUwhyC+hqwJVHdsDdP21hypT1M= @@ -146,25 +168,36 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= +github.com/deislabs/oras v0.7.0 h1:RnDoFd3tQYODMiUqxgQ8JxlrlWL0/VMKIKRD01MmNYk= +github.com/deislabs/oras v0.7.0/go.mod h1:sqMKPG3tMyIX9xwXUBRLhZ24o+uT4y6jgBD2RzUTKDM= github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dhui/dktest v0.3.0/go.mod h1:cyzIUfGsBEbZ6BT7tnXqAShHSXCZhSNmFl70sZ7c1yc= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v0.0.0-20190506213505-d88565df0c2d h1:qdD+BtyCE1XXpDyhvn0yZVcZOLILdj9Cw4pKu0kQbPQ= +github.com/docker/cli v0.0.0-20190506213505-d88565df0c2d/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.7.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/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.20190103212154-2b7e084dc98b/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v0.7.3-0.20190817195342-4760db040282 h1:mzrx39dGtGq0VEnTHjnakmczd4uFbhx2cZU3BJDsLdc= -github.com/docker/docker v0.7.3-0.20190817195342-4760db040282/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.1 h1:Dq4iIfcM7cNtddhLVWe9h4QDjsi4OER3Z8voPu/I52g= +github.com/docker/docker-credential-helpers v0.6.1/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-metrics v0.0.0-20181218153428-b84716841b82 h1:X0fj836zx99zFu83v/M79DuBn84IL/Syx1SY6Y5ZEMA= +github.com/docker/go-metrics v0.0.0-20181218153428-b84716841b82/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/libnetwork v0.0.0-20180830151422-a9cd636e3789/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg= +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/docker/spdystream v0.0.0-20181023171402-6480d4af844c h1:ZfSZ3P3BedhKGUhzj7BQlPSU4OvT6tfOKe3DVHzOA7s= +github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= @@ -175,8 +208,9 @@ github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e h1:p1yVGRW3nmb85p1 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/emicklei/go-restful v2.9.6+incompatible h1:tfrHha8zJ01ywiOEC1miGY8st1/igzWB8OmvPgoYX7w= github.com/emicklei/go-restful v2.9.6+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.11.1+incompatible h1:CjKsv3uWcCMvySPQYKxO8XX3f9zD4FeZRsW4G0B4ffE= +github.com/emicklei/go-restful v2.11.1+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= github.com/evanphx/json-patch v4.1.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -194,6 +228,8 @@ github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHqu 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/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk= +github.com/garyburd/redigo v1.6.0 h1:0VruCpn7yAIIu7pWVClQC8wxCJEcG3nyzpMSHKi1PQc= +github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -222,13 +258,15 @@ github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA 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 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= @@ -238,22 +276,22 @@ github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt 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 h1:SStNd1jRcYtfKCN7R0laGNs80WYYvn5CbBjM2sOmCrE= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= +github.com/go-openapi/spec v0.19.4 h1:ixzUSnHTd6hCemgtAJgluaTSGYpLNpJY4mA2DIkdOAo= +github.com/go-openapi/spec v0.19.4/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/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 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.4 h1:i/65mCM9s1h8eCkT07F5Z/C1e/f8VTgEwer+00yevpA= github.com/go-openapi/swag v0.19.4/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= -github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -273,21 +311,26 @@ github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0= github.com/godbus/dbus v4.1.0+incompatible/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/gofrs/flock v0.7.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE= +github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48 h1:X+zN6RZXsvnrSJaAIQhZezPfAfvsqihKKR8oiLHid34= github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang-migrate/migrate/v4 v4.6.2/go.mod h1:JYi6reN3+Z734VZ0akNuyOJNcrg45ZL7LDBMW3WGJL0= 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-20181024230925-c65c006176ff/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9 h1:uHTyIjqVhYRhLbJ8nIiOJHkEZZ+5YoOsAbD3sk82NiE= +github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= @@ -310,8 +353,9 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ github.com/google/cadvisor v0.34.0/go.mod h1:1nql6U13uTHaLYB8rLS5x9IJc2qT6Xd/Tr1sTX6NE48= github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= 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= @@ -331,30 +375,30 @@ github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTV github.com/googleapis/gnostic v0.3.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.1.0 h1:P/nh25+rzXouhytV2pUHBb65fnds26Ghl8/391+sT5o= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gophercloud/gophercloud v0.2.0 h1:lD2Bce2xBAMNNcFZ0dObTpXkGLlVIb33RPVUNVpw6ic= github.com/gophercloud/gophercloud v0.2.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.4.0 h1:XulKRWSQK5uChr4pEgSE4Tc/OcmnU9GJuSwdog/tZsA= +github.com/gorilla/handlers v1.4.0/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.1 h1:Dw4jY2nghMMRsh1ol8dv1axHkDwMQK2DHerMNJsIpJU= github.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gosuri/uitable v0.0.1 h1:M9sMNgSZPyAu1FJZJLpJ16ofL8q5ko2EDUkICsynvlY= +github.com/gosuri/uitable v0.0.1/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190203031600-7a902570cb17 h1:prg2TTpTOcJF1jRWL2zSU1FQNgB0STAFNux8GK82y8k= github.com/gregjones/httpcache v0.0.0-20190203031600-7a902570cb17/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 h1:Iju5GlWwrvL6UBg4zJJt3btmonfrMlCDdsejg4CZE7c= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 h1:THDBEeQ9xZ8JEaCLyLQqXMMdRqNr0QAUJTIkQAUtFjg= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= 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.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.4 h1:5xLhQjsk4zqPf9EHCrja2qFZMx+yBqkO3XgJ14bNnU0= github.com/grpc-ecosystem/grpc-gateway v1.9.4/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-health-probe v0.2.1-0.20181220223928-2bf0a5b182db/go.mod h1:uBKkC2RbarFsvS5jMJHpVhTLvGlGQj9JJwkaePE3FWI= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= @@ -364,14 +408,17 @@ github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdv github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 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 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= 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= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/heketi/heketi v9.0.0+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= github.com/heketi/rest v0.0.0-20180404230133-aa6a65207413/go.mod h1:BeS3M108VzVlmAue3lv2WcGuPAX94/KN63MUURzbYSI= github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7UkZt1i4FQeQy0R2T8GLUwQhOP5M1gBhy4= github.com/heketi/utils v0.0.0-20170317161834-435bc5bdfa64/go.mod h1:RYlF4ghFZPPmk2TC5REt5OFwvfb6lzxFWrTWB+qs28s= +github.com/helm/helm-2to3 v0.2.0 h1:1wgpvw93CHlO+mC6AMrfc5xboYyk1MkoI3ku7eI5uvE= +github.com/helm/helm-2to3 v0.2.0/go.mod h1:jQUVAWB0bM7zNIqKPIfHFzuFSK0kHYovJrjO+hqcvRk= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.2.0 h1:yPeWdRnmynF7p+lLYz0H2tthW9lqhMJrQV/U7yy4wX0= @@ -380,8 +427,9 @@ github.com/iancoleman/strcase v0.0.0-20190422225806-e506e3ef7365 h1:ECW73yc9MY79 github.com/iancoleman/strcase v0.0.0-20190422225806-e506e3ef7365/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= 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 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/improbable-eng/thanos v0.3.2/go.mod h1:GZewVGILKuJVPNRn7L4Zw+7X96qzFOwj63b22xYGXBE= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -394,7 +442,6 @@ github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhB github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -404,6 +451,8 @@ github.com/jsonnet-bundler/jsonnet-bundler v0.1.0/go.mod h1:YKsSFc9VFhhLITkJS3X2 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/karrick/godirwalk v1.7.5/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= @@ -427,7 +476,6 @@ 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/libopenstorage/openstorage v1.0.0/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= -github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/lpabon/godbc v0.1.1/go.mod h1:Jo9QV0cf3U6jZABgiJ2skINAXb9j8m51r07g4KI92ZA= @@ -441,8 +489,11 @@ github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP 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 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/maorfr/helm-plugin-utils v0.0.0-20181205064038-588190cb5e3b/go.mod h1:p3gwmRSFqbWw6plBpR0sKl3n3vpu8kX70gvCJKMvvCA= github.com/markbates/inflect v1.0.4 h1:5fh1gzTFhfae06u3hzHYO9xe3l3v3nW5Pwt3naLTP5g= github.com/markbates/inflect v1.0.4/go.mod h1:1fR9+pO2KHEO9ZRtto13gDwwZaAKstQzferVeWqbgNs= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= @@ -456,6 +507,8 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.6/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-shellwords v1.0.5/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o= @@ -465,7 +518,9 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5 github.com/maxbrunsfeld/counterfeiter/v6 v6.2.1/go.mod h1:F9YacGpnZbLQMzuPI0rR6op21YvNu/RjL705LJJpM3k= github.com/mesos/mesos-go v0.0.9/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= github.com/mholt/certmagic v0.6.2-0.20190624175158-6a42ef9fe8c2/go.mod h1:g4cOPxcjV0oFq3qwpjSA30LReKD8AoIfwAY9VvG35NY= +github.com/miekg/dns v0.0.0-20181005163659-0d29b283ac0f/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.3/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.4 h1:rCMZsU2ScVSYcAsOXgmC6+AKOK+6pmQTOcw03nfwYV0= github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mindprince/gonvml v0.0.0-20171110221305-fee913ce8fb2/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY= github.com/mistifyio/go-zfs v2.1.1+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= @@ -481,6 +536,8 @@ github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQz github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309 h1:cvy4lBOYN3gKfKj8Lzz5Q9TfviP+L7koMHY7SvkyTKs= +github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= 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= @@ -489,6 +546,7 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c h1:nXxl5PrvVm2L/wCy8dQu6DMTwH4oIuGN8GJDAlqDdVE= github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mrunalp/fileutils v0.0.0-20160930181131-4ee1cc9a8058/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= @@ -506,16 +564,21 @@ github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB 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/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.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.3.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/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= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc2.0.20190611121236-6cc515888830 h1:yvQ/2Pupw60ON8TYEIGGTAI77yZsWYkiOeHFZWkwlCk= github.com/opencontainers/runc v1.0.0-rc2.0.20190611121236-6cc515888830/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runtime-spec v1.0.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.2.2/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs= @@ -541,6 +604,8 @@ github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/phayes/freeport v0.0.0-20171002181615-b8543db493a5 h1:rZQtoozkfsiNs36c7Tdv/gyGNzD1X1XWKO8rptVNZuM= +github.com/phayes/freeport v0.0.0-20171002181615-b8543db493a5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= @@ -553,34 +618,33 @@ github.com/pquerna/ffjson v0.0.0-20180717144149-af8b230fcd20/go.mod h1:YARuvh7BU 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/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0 h1:BQ53HtBmfOitExawJ6LokA4x8ov/z0SYYb0+HxJfRI8= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.2.1 h1:JnMpQc6ppsNgw9QPAGF6Dod479itz7lvlsMzzNayLOI= +github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= 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-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzrgykg80hfFph1mryUeLRsUfoocVVmRY= +github.com/prometheus/procfs v0.0.0-20190129233650-316cf8ccfec5/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/prometheus v2.3.2+incompatible/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.8.0/go.mod h1:fSI0j+IUQrDd7+ZtR9WKIGtoYAYAJUKcKhYLG25tN4g= @@ -614,7 +678,6 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -622,6 +685,7 @@ github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= 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 v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= @@ -645,12 +709,9 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/syndtr/gocapability v0.0.0-20160928074757-e7cb7fa329f4/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/technosophos/moniker v0.0.0-20180509230615-a5dbd03a2245 h1:DNVk+NIkGS0RbLkjQOLCJb/759yfCysThkMbl7EXxyY= -github.com/technosophos/moniker v0.0.0-20180509230615-a5dbd03a2245/go.mod h1:O1c8HleITsZqzNZDjSNzirUGsMT0oGu9LhHKoJrqO+A= github.com/thecodeteam/goscaleio v0.1.0/go.mod h1:68sdkZAsK8bvEwBlbQnlLS+xU+hvLYM/iQ8KXej1AwM= github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -661,16 +722,28 @@ github.com/vmware/govmomi v0.20.1/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59b github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.1.0 h1:ngVtJC9TY/lg0AA/1k48FYhBrhRoFlEmWzsehpNAaZg= +github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xenolf/lego v0.0.0-20160613233155-a9d8cec0e656/go.mod h1:fwiGnfsIjG7OHPfOvgK7Y/Qo6+2Ox0iozjNTkZICKbY= +github.com/xenolf/lego v0.3.2-0.20160613233155-a9d8cec0e656 h1:BTvU+npm3/yjuBd53EvgiFLl5+YLikf2WvHsjRQ4KrY= +github.com/xenolf/lego v0.3.2-0.20160613233155-a9d8cec0e656/go.mod h1:fwiGnfsIjG7OHPfOvgK7Y/Qo6+2Ox0iozjNTkZICKbY= github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1 h1:j2hhcujLRHAg872RWAV5yaUrEjHEObwDv3aImCaNLek= github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940 h1:p7OofyZ509h8DmPLh8Hn+EIIZm/xYhdZHJ9GnXHdr6U= +github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.6 h1:qMJQYPNdtJ7UNYHjX38KXZtltKTqimMuoQjNnSVIuJg= +github.com/yvasiyarov/gorelic v0.0.6/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE= -go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -698,12 +771,15 @@ golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4 h1:ydJNl0ENAG67pFbB+9tfhiL2pYqLhfoaZFw/cjLhY4A= golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191028145041-f83a4685e152 h1:ZC1Xn5A1nlpSmQCIva4bZ3ob3lmhYIefc+GU+DLg1Ow= +golang.org/x/crypto v0.0.0-20191028145041-f83a4685e152/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-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -718,6 +794,7 @@ golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -732,11 +809,14 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc h1:gkKoSkUmnU6bpS/VhkuO27bzQeSA51uaEfbOW5dNb68= golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271 h1:N66aaryRB3Ax92gH0v3hp1QYZ3zWWCCUR/j8Ifh45Ss= +golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -747,7 +827,6 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -776,10 +855,11 @@ golang.org/x/sys v0.0.0-20190426135247-a129542de9ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3 h1:4y9KwBHBgBNwDbtu44R5o1fdOCQUEXhbk/P4A9WmJq0= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191028164358-195ce5e7f934 h1:u/E0NqCIWRDAo9WCFo6Ko49njPFDLSd3z+X1HgWDMpE= +golang.org/x/sys v0.0.0-20191028164358-195ce5e7f934/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/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= @@ -787,8 +867,9 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 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/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20170824195420-5d2fd3ccab98/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 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= @@ -827,27 +908,30 @@ google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNV google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190128161407-8ac453e89fca/go.mod h1:L3J43x8/uS+qIUoksaLKe6OS3nUKxOKuIFz1sl2/jx4= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 h1:nfPFGzJkUDX6uBmpN/pSw7MbOAWegH5QDQuoXFHedLg= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20191028173616-919d9bdd9fe6 h1:UXl+Zk3jqqcbEVV7ace5lrt4YdA4tXiz3f/KbmD29Vo= +google.golang.org/genproto v0.0.0-20191028173616-919d9bdd9fe6/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-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= @@ -864,7 +948,8 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/mcuadros/go-syslog.v2 v2.2.1/go.mod h1:l5LPIyOOyIdQquNg+oU6Z3524YwrcqEm0aKH+5zpt2U= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2 h1:orlkJ3myw8CN1nVQHBFfloD+L3egixIa4FvUP6RosSA= +gopkg.in/square/go-jose.v1 v1.1.2 h1:/5jmADZB+RiKtZGr4HxsEFOEfbfsjTKsVnqpThUpE30= +gopkg.in/square/go-jose.v1 v1.1.2/go.mod h1:QpYS+a4WhS+DTlyQIi6Ka7MS3SuR9a055rgXNEe6EiA= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= @@ -881,6 +966,8 @@ gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81 gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/gotestsum v0.3.5/go.mod h1:Mnf3e5FUzXbkCfynWBGOwLssY7gTQgCHObK9tMpAriY= +helm.sh/helm/v3 v3.0.0 h1:or/9cs1GgfcTQeEnR2CVJNw893/rmqIG1KsNHmUiSFw= +helm.sh/helm/v3 v3.0.0/go.mod h1:sI7B9yfvMgxtTPMWdk1jSKJ2aa59UyP9qhPydqW6mgo= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -943,13 +1030,16 @@ k8s.io/metrics v0.0.0-20191016113814-3b1a734dba6e/go.mod h1:ve7/vMWeY5lEBkZf6Bt5 k8s.io/repo-infra v0.0.0-20181204233714-00fe14e3d1a3/go.mod h1:+G1xBfZDfVFsm1Tj/HNCvg4QqWx8rJ2Fxpqr1rqp/gQ= k8s.io/sample-apiserver v0.0.0-20191016112829-06bb3c9d77c9/go.mod h1:sXltHZrQa4jdKL14nOFRRUhhzpmbnRF0qGuAhRQbaxc= k8s.io/utils v0.0.0-20190308190857-21c4ce38f2a7/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= -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-20191010214722-8d271d903fe4 h1:Gi+/O1saihwDqnlmC8Vhv1M5Sp4+rbOmK9TbsLn8ZEA= +k8s.io/utils v0.0.0-20191010214722-8d271d903fe4/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +rsc.io/letsencrypt v0.0.1 h1:DV0d09Ne9E7UUa9ZqWktZ9L2VmybgTgfq7xlfFR/bbU= +rsc.io/letsencrypt v0.0.1/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= 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-tools v0.2.2 h1:tOXKme2gR7KoM6+7Y+nzjwjbXDgqLfTuX5r7+4dvlig= @@ -962,5 +1052,4 @@ sigs.k8s.io/testing_frameworks v0.1.2 h1:vK0+tvjF0BZ/RYFeZ1E6BYBwHJJXhjuZ3TdsEKH 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= -vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc h1:MksmcCZQWAQJCTA5T0jgI/0sJ51AVm4Z41MrmfczEoc= vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI= diff --git a/internal/olm/client/client.go b/internal/olm/client/client.go index cd06aa90d5..750345a824 100644 --- a/internal/olm/client/client.go +++ b/internal/olm/client/client.go @@ -37,7 +37,7 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" - deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" + deploymentutil "k8s.io/kubectl/pkg/util/deployment" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/apiutil" ) diff --git a/internal/scaffold/ansible/go_mod.go b/internal/scaffold/ansible/go_mod.go index bee34fd941..75020daccf 100644 --- a/internal/scaffold/ansible/go_mod.go +++ b/internal/scaffold/ansible/go_mod.go @@ -69,6 +69,8 @@ replace ( k8s.io/metrics => k8s.io/metrics v0.0.0-20191016113814-3b1a734dba6e k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.0.0-20191016112829-06bb3c9d77c9 ) + +replace github.com/docker/docker => github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309 // Required by Helm ` func PrintGoMod() error { diff --git a/internal/scaffold/go_mod.go b/internal/scaffold/go_mod.go index 4df956a707..a6aeed5f0d 100644 --- a/internal/scaffold/go_mod.go +++ b/internal/scaffold/go_mod.go @@ -68,6 +68,8 @@ replace ( k8s.io/metrics => k8s.io/metrics v0.0.0-20191016113814-3b1a734dba6e k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.0.0-20191016112829-06bb3c9d77c9 ) + +replace github.com/docker/docker => github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309 // Required by Helm ` func PrintGoMod() error { diff --git a/internal/scaffold/helm/chart.go b/internal/scaffold/helm/chart.go index 81f580a1c0..d0ae85690a 100644 --- a/internal/scaffold/helm/chart.go +++ b/internal/scaffold/helm/chart.go @@ -20,19 +20,18 @@ import ( "io/ioutil" "os" "path/filepath" - "strings" "github.com/operator-framework/operator-sdk/internal/scaffold" "github.com/iancoleman/strcase" log "github.com/sirupsen/logrus" - "k8s.io/helm/pkg/chartutil" - "k8s.io/helm/pkg/downloader" - "k8s.io/helm/pkg/getter" - "k8s.io/helm/pkg/helm/environment" - "k8s.io/helm/pkg/helm/helmpath" - "k8s.io/helm/pkg/proto/hapi/chart" - "k8s.io/helm/pkg/repo" + "helm.sh/helm/v3/pkg/chart" + "helm.sh/helm/v3/pkg/chart/loader" + "helm.sh/helm/v3/pkg/chartutil" + "helm.sh/helm/v3/pkg/cli" + "helm.sh/helm/v3/pkg/downloader" + "helm.sh/helm/v3/pkg/getter" + "helm.sh/helm/v3/pkg/repo" ) const ( @@ -139,14 +138,14 @@ func CreateChart(projectDir string, opts CreateChartOptions) (*scaffold.Resource } } - relChartPath := filepath.Join(HelmChartsDir, c.GetMetadata().GetName()) + relChartPath := filepath.Join(HelmChartsDir, c.Name()) absChartPath := filepath.Join(projectDir, relChartPath) if err := fetchChartDependencies(absChartPath); err != nil { return nil, nil, fmt.Errorf("failed to fetch chart dependencies: %s", err) } // Reload chart in case dependencies changed - c, err = chartutil.Load(absChartPath) + c, err = loader.Load(absChartPath) if err != nil { return nil, nil, fmt.Errorf("failed to load chart: %s", err) } @@ -161,22 +160,12 @@ func scaffoldChart(destDir, apiVersion, kind string) (*scaffold.Resource, *chart return nil, nil, err } - chartfile := &chart.Metadata{ - // Many helm charts use hyphenated names, but we chose not to because - // of the issues related to how hyphens are interpreted in templates. - // See https://github.com/helm/helm/issues/2192 - Name: r.LowerKind, - Description: "A Helm chart for Kubernetes", - Version: "0.1.0", - AppVersion: "1.0", - ApiVersion: chartutil.ApiVersionV1, - } - chartPath, err := chartutil.Create(chartfile, destDir) + chartPath, err := chartutil.Create(r.LowerKind, destDir) if err != nil { return nil, nil, err } - chart, err := chartutil.Load(chartPath) + chart, err := loader.Load(chartPath) if err != nil { return nil, nil, err } @@ -198,7 +187,7 @@ func fetchChart(destDir string, opts CreateChartOptions) (*scaffold.Resource, *c return nil, nil, err } - chartName := chart.GetMetadata().GetName() + chartName := chart.Name() if len(opts.ResourceAPIVersion) == 0 { opts.ResourceAPIVersion = DefaultAPIVersion } @@ -214,7 +203,7 @@ func fetchChart(destDir string, opts CreateChartOptions) (*scaffold.Resource, *c } func createChartFromDisk(destDir, source string) (*chart.Chart, error) { - chart, err := chartutil.Load(source) + chart, err := loader.Load(source) if err != nil { return nil, err } @@ -227,15 +216,13 @@ func createChartFromDisk(destDir, source string) (*chart.Chart, error) { } func createChartFromRemote(destDir string, opts CreateChartOptions) (*chart.Chart, error) { - helmHome, ok := os.LookupEnv(environment.HomeEnvVar) - if !ok { - helmHome = environment.DefaultHelmHome - } - getters := getter.All(environment.EnvSettings{}) + settings := cli.New() + getters := getter.All(settings) c := downloader.ChartDownloader{ - HelmHome: helmpath.Home(helmHome), - Out: os.Stderr, - Getters: getters, + Out: os.Stderr, + Getters: getters, + RepositoryConfig: settings.RepositoryConfig, + RepositoryCache: settings.RepositoryCache, } if opts.Repo != "" { @@ -261,11 +248,8 @@ func createChartFromRemote(destDir string, opts CreateChartOptions) (*chart.Char // One of Helm's error messages directs users to run `helm init`, which // installs tiller in a remote cluster. Since that's unnecessary and // unhelpful, modify the error message to be relevant for operator-sdk. - if strings.Contains(err.Error(), "Couldn't load repositories file") { - return nil, fmt.Errorf("failed to load repositories file %s "+ - "(you might need to run `helm init --client-only` "+ - "to create and initialize it)", c.HelmHome.RepositoryFile()) - } + + // TODO(joelanford): Is there anything to initialize in helm v3 return nil, err } @@ -273,18 +257,16 @@ func createChartFromRemote(destDir string, opts CreateChartOptions) (*chart.Char } func fetchChartDependencies(chartPath string) error { - helmHome, ok := os.LookupEnv(environment.HomeEnvVar) - if !ok { - helmHome = environment.DefaultHelmHome - } - getters := getter.All(environment.EnvSettings{}) + settings := cli.New() + getters := getter.All(settings) out := &bytes.Buffer{} man := &downloader.Manager{ - Out: out, - ChartPath: chartPath, - HelmHome: helmpath.Home(helmHome), - Getters: getters, + Out: out, + ChartPath: chartPath, + Getters: getters, + RepositoryConfig: settings.RepositoryConfig, + RepositoryCache: settings.RepositoryCache, } if err := man.Build(); err != nil { fmt.Println(out.String()) diff --git a/internal/scaffold/helm/chart_test.go b/internal/scaffold/helm/chart_test.go index 87a9eaca4a..acf9378b31 100644 --- a/internal/scaffold/helm/chart_test.go +++ b/internal/scaffold/helm/chart_test.go @@ -16,27 +16,29 @@ package helm_test import ( "fmt" - "io/ioutil" - "net/http" "os" "path/filepath" "testing" - "time" "github.com/operator-framework/operator-sdk/internal/scaffold" "github.com/operator-framework/operator-sdk/internal/scaffold/helm" "github.com/stretchr/testify/assert" - "k8s.io/helm/pkg/chartutil" - "k8s.io/helm/pkg/proto/hapi/chart" - "k8s.io/helm/pkg/repo" -) - -const ( - repoServerAddr = "127.0.0.1:8879" + "helm.sh/helm/v3/pkg/chart/loader" + "helm.sh/helm/v3/pkg/repo/repotest" ) func TestCreateChart(t *testing.T) { + srv, err := repotest.NewTempServer("testdata/testcharts/*.tgz") + if err != nil { + t.Fatalf("Failed to create new temp server: %s", err) + } + defer srv.Stop() + + if err := srv.LinkIndices(); err != nil { + t.Fatalf("Failed to link server indices: %s", err) + } + const ( chartName = "test-chart" latestVersion = "1.2.3" @@ -48,42 +50,6 @@ func TestCreateChart(t *testing.T) { expectDerivedKind = "TestChart" ) - testDir, err := ioutil.TempDir("", "osdk-test") - if err != nil { - t.Fatalf("Failed to create temp test directory: %s", err) - } - defer os.RemoveAll(testDir) - - helmHomeDir := filepath.Join(testDir, "helmhome") - if err := os.Mkdir(helmHomeDir, 0755); err != nil { - t.Fatalf("Failed to create temp helm home directory: %s", err) - } - - latest, previous, localDir, err := createLocalChartRepo(helmHomeDir, chartName, latestVersion, previousVersion) - if err != nil { - t.Fatalf("Failed to create local chart repo: %s", err) - } - - if err := chartutil.SaveDir(latest.chart, localDir); err != nil { - t.Fatalf("Failed to save latest chart as directory: %s", err) - } - latestDirectory := filepath.Join(localDir, latest.chart.GetMetadata().GetName()) - - testRepo := http.Server{ - Addr: repoServerAddr, - Handler: &repo.RepositoryServer{RepoPath: localDir}, - } - - var ( - repoURL = fmt.Sprintf("http://%s/", testRepo.Addr) - repoURLCharts = fmt.Sprintf("http://%s/charts/", testRepo.Addr) - ) - - testRepoServerErrChan := make(chan error) - go func() { - testRepoServerErrChan <- testRepo.ListenAndServe() - }() - testCases := []createChartTestCase{ { name: "from scaffold no apiVersion", @@ -100,12 +66,12 @@ func TestCreateChart(t *testing.T) { }, { name: "repo without helm chart", - helmChartRepo: repoURL, + helmChartRepo: srv.URL(), expectErr: true, }, { name: "non-existent version", - helmChart: latest.repoAndName, + helmChart: "test/" + chartName, helmChartVersion: nonExistentVersion, expectErr: true, }, @@ -119,43 +85,43 @@ func TestCreateChart(t *testing.T) { }, { name: "from directory", - helmChart: latestDirectory, + helmChart: "./testdata/testcharts/" + chartName, expectResource: mustNewResource(t, helm.DefaultAPIVersion, expectDerivedKind), expectChartName: chartName, expectChartVersion: latestVersion, }, { name: "from archive", - helmChart: latest.archive, + helmChart: fmt.Sprintf("./testdata/testcharts/%s-%s.tgz", chartName, latestVersion), expectResource: mustNewResource(t, helm.DefaultAPIVersion, expectDerivedKind), expectChartName: chartName, expectChartVersion: latestVersion, }, { name: "from url", - helmChart: latest.url, + helmChart: fmt.Sprintf("%s/%s-%s.tgz", srv.URL(), chartName, latestVersion), expectResource: mustNewResource(t, helm.DefaultAPIVersion, expectDerivedKind), expectChartName: chartName, expectChartVersion: latestVersion, }, { name: "from repo and name implicit latest", - helmChart: latest.repoAndName, + helmChart: "test/" + chartName, expectResource: mustNewResource(t, helm.DefaultAPIVersion, expectDerivedKind), expectChartName: chartName, expectChartVersion: latestVersion, }, { name: "from repo and name implicit latest with apiVersion", - helmChart: latest.repoAndName, + helmChart: "test/" + chartName, apiVersion: customAPIVersion, - expectResource: mustNewResource(t, customAPIVersion, expectDerivedKind), + expectResource: mustNewResource(t, customApiVersion, expectDerivedKind), expectChartName: chartName, expectChartVersion: latestVersion, }, { name: "from repo and name implicit latest with kind", - helmChart: latest.repoAndName, + helmChart: "test/" + chartName, kind: customKind, expectResource: mustNewResource(t, helm.DefaultAPIVersion, customKind), expectChartName: chartName, @@ -163,7 +129,7 @@ func TestCreateChart(t *testing.T) { }, { name: "from repo and name implicit latest with apiVersion and kind", - helmChart: latest.repoAndName, + helmChart: "test/" + chartName, apiVersion: customAPIVersion, kind: customKind, expectResource: mustNewResource(t, customAPIVersion, customKind), @@ -172,7 +138,7 @@ func TestCreateChart(t *testing.T) { }, { name: "from repo and name explicit latest", - helmChart: latest.repoAndName, + helmChart: "test/" + chartName, helmChartVersion: latestVersion, expectResource: mustNewResource(t, helm.DefaultAPIVersion, expectDerivedKind), expectChartName: chartName, @@ -180,7 +146,7 @@ func TestCreateChart(t *testing.T) { }, { name: "from repo and name explicit previous", - helmChart: previous.repoAndName, + helmChart: "test/" + chartName, helmChartVersion: previousVersion, expectResource: mustNewResource(t, helm.DefaultAPIVersion, expectDerivedKind), expectChartName: chartName, @@ -189,7 +155,7 @@ func TestCreateChart(t *testing.T) { { name: "from name and repo url implicit latest", helmChart: chartName, - helmChartRepo: repoURL, + helmChartRepo: srv.URL(), expectResource: mustNewResource(t, helm.DefaultAPIVersion, expectDerivedKind), expectChartName: chartName, expectChartVersion: latestVersion, @@ -197,7 +163,7 @@ func TestCreateChart(t *testing.T) { { name: "from name and repo url explicit latest", helmChart: chartName, - helmChartRepo: repoURL, + helmChartRepo: srv.URL(), helmChartVersion: latestVersion, expectResource: mustNewResource(t, helm.DefaultAPIVersion, expectDerivedKind), expectChartName: chartName, @@ -206,33 +172,7 @@ func TestCreateChart(t *testing.T) { { name: "from name and repo url explicit previous", helmChart: chartName, - helmChartRepo: repoURL, - helmChartVersion: previousVersion, - expectResource: mustNewResource(t, helm.DefaultAPIVersion, expectDerivedKind), - expectChartName: chartName, - expectChartVersion: previousVersion, - }, - { - name: "from name and charts repo url implicit latest", - helmChart: chartName, - helmChartRepo: repoURLCharts, - expectResource: mustNewResource(t, helm.DefaultAPIVersion, expectDerivedKind), - expectChartName: chartName, - expectChartVersion: latestVersion, - }, - { - name: "from name and charts repo url explicit latest", - helmChart: chartName, - helmChartRepo: repoURLCharts, - helmChartVersion: latestVersion, - expectResource: mustNewResource(t, helm.DefaultAPIVersion, expectDerivedKind), - expectChartName: chartName, - expectChartVersion: latestVersion, - }, - { - name: "from name and charts repo url explicit previous", - helmChart: chartName, - helmChartRepo: repoURLCharts, + helmChartRepo: srv.URL(), helmChartVersion: previousVersion, expectResource: mustNewResource(t, helm.DefaultAPIVersion, expectDerivedKind), expectChartName: chartName, @@ -242,24 +182,9 @@ func TestCreateChart(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - runTestCase(t, testDir, tc) + runTestCase(t, srv.Root(), tc) }) } - - if err := testRepo.Close(); err != nil { - t.Fatalf("Failed to close test repo server: %s", err) - } - - if err := <-testRepoServerErrChan; err != nil && err != http.ErrServerClosed { - t.Fatalf("Failed to run test repo server: %s", err) - } -} - -type testChart struct { - chart *chart.Chart - archive string - repoAndName string - url string } type createChartTestCase struct { @@ -290,6 +215,15 @@ func runTestCase(t *testing.T, testDir string, tc createChartTestCase) { assert.NoError(t, os.Mkdir(outputDir, 0755)) defer os.RemoveAll(outputDir) + os.Setenv("XDG_CONFIG_HOME", filepath.Join(testDir, ".config")) + os.Setenv("XDG_CACHE_HOME", filepath.Join(testDir, ".cache")) + os.Setenv("HELM_REPOSITORY_CONFIG", filepath.Join(testDir, "repositories.yaml")) + os.Setenv("HELM_REPOSITORY_CACHE", filepath.Join(testDir)) + defer os.Unsetenv("XDG_CONFIG_HOME") + defer os.Unsetenv("XDG_CACHE_HOME") + defer os.Unsetenv("HELM_REPOSITORY_CONFIG") + defer os.Unsetenv("HELM_REPOSITORY_CACHE") + opts := helm.CreateChartOptions{ ResourceAPIVersion: tc.apiVersion, ResourceKind: tc.kind, @@ -303,107 +237,17 @@ func runTestCase(t *testing.T, testDir string, tc createChartTestCase) { return } - assert.NoError(t, err) + if !assert.NoError(t, err) { + return + } assert.Equal(t, tc.expectResource, resource) - assert.Equal(t, tc.expectChartName, chart.GetMetadata().GetName()) - assert.Equal(t, tc.expectChartVersion, chart.GetMetadata().GetVersion()) + assert.Equal(t, tc.expectChartName, chart.Name()) + assert.Equal(t, tc.expectChartVersion, chart.Metadata.Version) - loadedChart, err := chartutil.Load(filepath.Join(outputDir, helm.HelmChartsDir, chart.GetMetadata().GetName())) + loadedChart, err := loader.Load(filepath.Join(outputDir, helm.HelmChartsDir, chart.Name())) if err != nil { t.Fatalf("Could not load chart from expected location: %s", err) } assert.Equal(t, loadedChart, chart) } - -func createLocalChartRepo(helmHomeDir, chartName, latestVersion, previousVersion string) (*testChart, *testChart, string, error) { - if err := os.Setenv("HELM_HOME", helmHomeDir); err != nil { - return nil, nil, "", err - } - - var ( - localURL = fmt.Sprintf("http://%s", repoServerAddr) - - repoDir = filepath.Join(helmHomeDir, "repository") - cacheDir = filepath.Join(helmHomeDir, "repository", "cache") - localDir = filepath.Join(helmHomeDir, "repository", "local") - - cacheFilePath = filepath.Join(helmHomeDir, "repository", "cache", "local-index.yaml") - localIndexPath = filepath.Join(helmHomeDir, "repository", "local", "index.yaml") - repoFilePath = filepath.Join(helmHomeDir, "repository", "repositories.yaml") - ) - - if err := os.MkdirAll(repoDir, 0755); err != nil { - return nil, nil, "", err - } - if err := os.MkdirAll(cacheDir, 0755); err != nil { - return nil, nil, "", err - } - if err := os.MkdirAll(localDir, 0755); err != nil { - return nil, nil, "", err - } - repoFile := repo.RepoFile{ - APIVersion: "v1", - Generated: time.Now(), - Repositories: []*repo.Entry{ - { - Name: "local", - Cache: cacheFilePath, - URL: localURL, - }, - }, - } - if err := repoFile.WriteFile(repoFilePath, 0644); err != nil { - return nil, nil, "", err - } - - latest, err := createTestChart(localDir, chartName, latestVersion) - if err != nil { - return nil, nil, "", err - } - - previous, err := createTestChart(localDir, chartName, previousVersion) - if err != nil { - return nil, nil, "", err - } - - localIndex, err := repo.IndexDirectory(localDir, localURL+"/charts") - if err != nil { - return nil, nil, "", err - } - if err := localIndex.WriteFile(cacheFilePath, 0644); err != nil { - return nil, nil, "", err - } - if err := localIndex.WriteFile(localIndexPath, 0644); err != nil { - return nil, nil, "", err - } - return latest, previous, localDir, nil -} - -func createTestChart(chartsDir, name, version string) (*testChart, error) { - dir, err := chartutil.Create(&chart.Metadata{ - Name: name, - Version: version, - }, chartsDir) - if err != nil { - return nil, fmt.Errorf("could not create test chart directory: %s", err) - } - defer os.RemoveAll(dir) - - chart, err := chartutil.LoadDir(dir) - if err != nil { - return nil, fmt.Errorf("could not load chart from directory: %s", err) - } - - archive, err := chartutil.Save(chart, chartsDir) - if err != nil { - return nil, fmt.Errorf("could not save chart archive: %s", err) - } - - return &testChart{ - chart: chart, - archive: archive, - repoAndName: "local/" + chart.GetMetadata().GetName(), - url: fmt.Sprintf("http://%s/charts/%s", repoServerAddr, filepath.Base(archive)), - }, nil -} diff --git a/internal/scaffold/helm/go_mod.go b/internal/scaffold/helm/go_mod.go index 137f4f3887..d7b1b2cd9d 100644 --- a/internal/scaffold/helm/go_mod.go +++ b/internal/scaffold/helm/go_mod.go @@ -69,6 +69,8 @@ replace ( k8s.io/metrics => k8s.io/metrics v0.0.0-20191016113814-3b1a734dba6e k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.0.0-20191016112829-06bb3c9d77c9 ) + +replace github.com/docker/docker => github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309 // Required by Helm ` func PrintGoMod() error { diff --git a/internal/scaffold/helm/role.go b/internal/scaffold/helm/role.go index e0c3a967ea..21b835bc4d 100644 --- a/internal/scaffold/helm/role.go +++ b/internal/scaffold/helm/role.go @@ -24,16 +24,15 @@ import ( "github.com/ghodss/yaml" log "github.com/sirupsen/logrus" + "helm.sh/helm/v3/pkg/action" + "helm.sh/helm/v3/pkg/chart" + "helm.sh/helm/v3/pkg/chartutil" + "helm.sh/helm/v3/pkg/releaseutil" rbacv1 "k8s.io/api/rbac/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/discovery" - "k8s.io/helm/pkg/chartutil" - "k8s.io/helm/pkg/manifest" - "k8s.io/helm/pkg/proto/hapi/chart" - "k8s.io/helm/pkg/renderutil" - "k8s.io/helm/pkg/tiller" ) // roleDiscoveryInterface is an interface that contains just the discovery @@ -186,21 +185,34 @@ func getServerVersionAndResources(dc roleDiscoveryInterface) (*version.Info, []* return kubeVersion, serverResources, nil } -func getDefaultManifests(c *chart.Chart, kubeVersion *version.Info) ([]tiller.Manifest, error) { - v := strings.TrimSuffix(fmt.Sprintf("%s.%s", kubeVersion.Major, kubeVersion.Minor), "+") - renderOpts := renderutil.Options{ - ReleaseOptions: chartutil.ReleaseOptions{ - IsInstall: true, - IsUpgrade: false, - }, - KubeVersion: v, - } - - renderedTemplates, err := renderutil.Render(c, &chart.Config{}, renderOpts) +func getDefaultManifests(c *chart.Chart, kubeVersion *version.Info) ([]releaseutil.Manifest, error) { + install := action.NewInstall(&action.Configuration{}) + install.DryRun = true + install.ReleaseName = "RELEASE-NAME" + install.Replace = true + install.ClientOnly = true + rel, err := install.Run(c, nil) if err != nil { return nil, fmt.Errorf("failed to render chart templates: %s", err) } - return tiller.SortByKind(manifest.SplitManifests(renderedTemplates)), nil + _, manifests, err := releaseutil.SortManifests(releaseutil.SplitManifests(rel.Manifest), chartutil.DefaultVersionSet, releaseutil.InstallOrder) + return manifests, err + /* + v := strings.TrimSuffix(fmt.Sprintf("%s.%s", kubeVersion.Major, kubeVersion.Minor), "+") + renderOpts := renderutil.Options{ + ReleaseOptions: chartutil.ReleaseOptions{ + IsInstall: true, + IsUpgrade: false, + }, + KubeVersion: v, + } + + renderedTemplates, err := renderutil.Render(c, &chart.Config{}, renderOpts) + if err != nil { + return nil, fmt.Errorf("failed to render chart templates: %s", err) + } + return tiller.SortByKind(releaseutil.SplitManifests(renderedTemplates)), nil + */ } func getResource(namespacedResourceList []*metav1.APIResourceList, groupVersion, kind string) (string, bool, bool) { diff --git a/internal/scaffold/helm/role_test.go b/internal/scaffold/helm/role_test.go index 3ad28134ce..fc0f84b56e 100644 --- a/internal/scaffold/helm/role_test.go +++ b/internal/scaffold/helm/role_test.go @@ -21,9 +21,9 @@ import ( "github.com/operator-framework/operator-sdk/internal/scaffold/helm" "github.com/stretchr/testify/assert" + "helm.sh/helm/v3/pkg/chart" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/version" - "k8s.io/helm/pkg/proto/hapi/chart" ) func TestGenerateRoleScaffold(t *testing.T) { @@ -40,12 +40,19 @@ func TestGenerateRoleScaffold(t *testing.T) { testCases := []roleScaffoldTestCase{ { - name: "fallback to default", + name: "fallback to default with unparsable template", chart: failChart(), expectSkipDefaultRules: false, expectIsClusterScoped: false, expectLenCustomRules: 2, }, + { + name: "skip rule for unknown API", + chart: unknownAPIChart(), + expectSkipDefaultRules: true, + expectIsClusterScoped: false, + expectLenCustomRules: 3, + }, { name: "namespaced manifest", chart: namespacedChart(), @@ -119,21 +126,32 @@ type roleScaffoldTestCase struct { func failChart() *chart.Chart { return &chart.Chart{ Metadata: &chart.Metadata{ - Name: "unknown", + Name: "broken", }, - Templates: []*chart.Template{ + Templates: []*chart.File{ {Name: "broken1.yaml", Data: []byte(`invalid {{ template`)}, }, } } +func unknownAPIChart() *chart.Chart { + return &chart.Chart{ + Metadata: &chart.Metadata{ + Name: "unknown", + }, + Templates: []*chart.File{ + {Name: "unknown1.yaml", Data: testUnknownData("unknown1")}, + {Name: "pod1.yaml", Data: testPodData("pod1")}, + }, + } +} + func namespacedChart() *chart.Chart { return &chart.Chart{ Metadata: &chart.Metadata{ Name: "namespaced", }, - Templates: []*chart.Template{ - {Name: "unknown1.yaml", Data: testUnknownData("unknown1")}, + Templates: []*chart.File{ {Name: "pod1.yaml", Data: testPodData("pod1")}, {Name: "pod2.yaml", Data: testPodData("pod2")}, }, @@ -145,8 +163,7 @@ func clusterScopedChart() *chart.Chart { Metadata: &chart.Metadata{ Name: "clusterscoped", }, - Templates: []*chart.Template{ - {Name: "unknown1.yaml", Data: testUnknownData("unknown1")}, + Templates: []*chart.File{ {Name: "pod1.yaml", Data: testPodData("pod1")}, {Name: "pod2.yaml", Data: testPodData("pod2")}, {Name: "ns1.yaml", Data: testNamespaceData("ns1")}, diff --git a/internal/scaffold/helm/testdata/testcharts/test-chart-1.2.0.tgz b/internal/scaffold/helm/testdata/testcharts/test-chart-1.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..c32376b22ec31842868de5593a4e8a5b0dee0f6c GIT binary patch literal 2732 zcmV;d3RCqTiwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PI^|Z`(K$@3TI|oZ3a(+?xK=BrOEwp_dkW!Szz3>GiNEih`EL zHa9e>B`GI9*Z0{EBqd9h<=9QL$t_?$II=vP84fwaA7>bY+O*;^Ri=GvKgoob~>H<-%j`C(el~7@4o1DUp#`&9qZB9GHs}O)cIjq^}+o~8co?JRGLW< z!L%39G+ln}lI}6-1PSU`vDCPCui@{=C*T$g45fm9WCK(J4eCJ92}V#ZsKCrpjDV&o zXEC+?gK5dTM>@en4}RYsRs4TSd4~EA2msss|M+mt{|}G${(mox4u?!IGmBup2!%#sFX}wQ;m9_Za!8)52>yNjVZO zW6A>nfRviC7XVlak7<~Aw03p z3(?6MwexRF3s6!M=gj`?*qC%aw}PJ3`xiRG$4cfJsjE3pV6m#!@*CSsl? z2w~~8qzKue8|?F%c4z&XZkDsYm4?jV#3`o@HJK(fN$gCZdzXJ%gie8YEZy8i?e>#g zjp)hJS{n@iPSWIWlv5F-y26pYoHuUWVNkL ztsCw}e_U>$J2+(j{hP1numAbBX0cQzyDoVSAx%?qxjfVmCfl~-$p&kdmi&3WBNN(K zi=EU3T0?F0uL&BOP(vN>iZ#PeOfyp$wcC41I;2Co(W}m@j$PWBMwrP=RpWRV02HRM zCTb0(x}qw9CxxxRc8^|ls*&-b_oRKhzt)KVzK)Tns5CL@T^t3s;lHC^{rq=y-0ke~ z-+i?CynO&uHi*=MifsXI~u zUCOY#-3)%uC}%^4iH(g;c@q2^J$FZMtPHEGh5^RZhEgpjSjlerArBeyL<3a_oK2X) z#715-W*VLiX3iXM&Mz#j1q&9`Jtx805R?!8p2>1^^I0_ajv2UOoLhX7X{)EUm?q;q z*Y+msmOFZ3lnOMjAL*Ag8wqx@y4|OXFHhVEqLbYxwxZ|K7@o`OHo4Swn9!7xOutXv(z>{uPnjJ+*+r}6Q6co-TdZ@#Zz%QKz{QayU%drh^hwn&v_OX zzJbD&TYMA#HH7eMcpI;hlZg~wO?{)9p2YJRBcBjGZo6NiO>i_H81V?OkwoWNn|C>L z0+nU%NBer2wzj{mBe7-P*&?yEF5lqyOd71657)U&sGuWET7y}%f*~(FAcaQb6*;F} z%vT?2t5FS~DB2208+sOiG+Kke&AR7nxgPOz01njWvU2dbWn|Ut*ZHPswMs^OhRhM# zGunK<3^C8P9BrO&VkxSFErLXid6++}9XT4AG(>`j-qgRNHR8VnQ!Zx{6n9e&+=lTc7sbMk_g@`7eP=QNuy<&dZ*+<0C~`hat~`YcH+yp z{tW~Z2?_&;w!6hok*_Y;1FiO9D|g9ip5DtUqNkTOp(Y-`tBBvM!1@MLDst?37rv46 zuGqsiz9Qy!f?gHrtzy)k%@s4_GILrhsw^{NuvTta(Z$GL>4Z0ntL%8b!+NORINeQA zom4rk7E2m+%7?aIjcHOA3cQG_GQ?K7D62?l+2=-GHt3@_D%0()a`yEx2rFyTy&`2% z3>J&15qT^YVVzUIQe|6XS(e~db#R&E)iD)D85@(X{7|uBzbsc(TdJgyvE&haJndJ0 z<7|ooweBl9z*T8h$}dTOmGOO z_1~l8-oE~OFKtUDcbVg{$nHGP^K3(Y%T9V4+byPA{9UQ~`15TEKn0pBsVy8^V&7z(Ne`9N1jdCE4NJL;)Vc@c+j6 zUpVRg#Q)CGac^J$d7!p(|F?*yA&-1%K90s=e|BJQy@5}CSZ}0#2(RNP2-xMfv^4;Ub z4T+;7a%||iF=+fr^Y0Jc8vWnC^q;L*3W2djx3>=i+x*{d_ACD1>m2s>`~SVPMz`+E zq`{ZNoi_hgZP|oB;L{CcK)*#s7&lEgK1` z@NQ*n#s9tIwg3Ow`~Us4$Iz$7pb{F41V8(5HAVr0jPZnt5u`M}q$AWMcnlxMOoPr+ zhr2B+CPqJlLQV~vqC0U{-cykTk3rzb|A)b|RN;_aW8%{+e|b*ez2GyD z!u7N&L5d1E6G#H`=HlyxkqU#ykY7jnbb0{^Q#v3cX4>x4s~?cTe^lFj7B9x5w*4r+ z>Zxd#jO_V8OWoZ!9UKsSl?Df7Kre#>VkT*D@ZaDue4>iUOvBlmw>luHlD}bW0>Toc mZBM7Dc zVQyr3R8em|NM&qo0PI`qZ`(K$?`QoLb7~fCb8GpLM+*V@&`XQG;CiXi^m-*aeB=xc^KbmHfTfqF_$ntPzIOGg}oMAL7-HOIU>h`($3}$4)p4@Ni zbUK~W<74}`)9KXzcDgT5if8-2d(`V5J%P?W>(SU!rHOpf`C(c0!Tm`ZN$4k(iV7aW zwC9l|DZX}t?rG5RVpNf&iMH=v!{3ojz%CdV3JL#62PipeR30Z2453_5o}MKb0!b1^ zBVzh{(~@^DIPxBQ@cZ_p;{Q{^QdECH0NCdLr^hS)e|)m{{|9MgIHa8FSqSrmH%u8b zUi^NFQqmYh@O_U?$OuCZAW0eP3r3?^2p7Xkq5BdQa_s>~OoXCZ$XN({MER}j)lV6_ z!bqZ4A$|Ah-x7xmzXv5XHNVyK7>q%51 zl@U5MRYMPja!Mm-A|Z7MuR2B%8~n~$sx-=reopl|iY#XjAd*P5iI_4q!*$`4r;K@8 zFqFA*K7aWm<7CDEHBJ&nG^+OH`;Tw00)4CRN5&TaKkD?3YyN-yvfJJJ|3kEH0KcFH zJ;v%r4gdP^4hA!jDd&`r%+CrT5|atxu?oHUyajX!!6&z6WPTlFE)0u>rI3V=5Dtv< zLU^`9ZT;KO0+iH&b!PW=taUP<8$k#4zM2^tHJ<}=BQI>X=W{2@@`c4>K8K*>?#R6Q zBU5PjM}liYxdQ)E#Ml>7`-Qrh;|9i|9Y4G^eh!!K-@N_WfB)g**}?Pcbbyg&FhUKj zmT_g3kO;vj@c|hUg~4Uf~6)8l7!wu2V*!Fhg1Tm~S!n5z5Xf=(Xb+g;_Ju9d0>g|V57v~K# zX!-3TcqfU_YUN=c{Q2CU&oe)KPI-*Ckk2-&m@;=l=)ACQ7Fb_%Uga+u)<8Ly&}dtm zT07je{#b0FJ2+(j{hP0sumAbBX0b%XyDoVKK1q_`x;WGXRJ2XUvo+Q%E&20mN6M8p z7CWm8G=^I1UlY_MCYo5@6>IvRsG>SIYPa_?=medh8@}qi>X@aSDukIxWi^ib9zbpi zW1`kj$QvSKILK`UrhE9RQ;m#|y(jJ4!?i~I_jQacL8$_r+{aOH8~!`#)z5z?r`^sT z|2;&T&)bJErIQd8Y8X<6Caj)Kj9H>FhH%)nvAKQdy}eBckL})QLX+7U&9e)HUPjk~ z7>ATMMafo4KvJe5a0y2n5cAkxJ+{F&b2Q=+oF3UnI=M=RLwXB-t7K+EmU(t6p4%f8 zkV1yp?PljV>SmwLzZ}>RglD@?Y(>w)7>>*GHd*Mp^!B?IOeE!c z2>ws1^^@{z+??F+S!(N^mzH25&bC$)0 zZy+&Y2H*I9^}+w@-^HuMWFojzQ*Bh!kvKkMWRpOR+xC}m9URRD7B~dhNTRZ=&AW_w z0F`C#M*F%*Tbtijkyw#;Hb`ux%QyHv6&h>j!&NR5!pR8Z)?gMcVaO{7NTJbqdCqAU z^VLV%YE;7|inapMhMqYf4Obv=v+mhiu1EX~fCF*4tPFf^8Cf;^b-6BDEt3TneVI;Vc6%C^F?EWs`7U^Be?U3G@8E_Tu>_*FSiF_Sp zep6-%@Me7~#dgh53LidL@>l%sWEp}Z7OwgHK*k;ip(k*(CrHS4Q^)WIo3nlJnc<&tfhZT1-c-x&XM zCw-Xs-#Iz$?dv~})Ryl5=5aPlXg>D2-(8_=xH3>y{woKcR)+jHTrtRyERiGB{rWMX z>D04ygj&uo+~tga{Qn1pH~D{--~Hh*u+9IER_ebmyQjUq|35_AIRU>ZP-Nu0$BPY# zqdan~>A5y&{7LigkKG#m-@J66tw?Z=kwLe24+Go$-)#0v{@?2y_xAh$gS1As?u)p= zm;IeK|5k0;_&?y&4Tmc~FDs9Qxc0MuH&SU7nR8(d9O_BpJQsR1LS0RmhcHOhY#?rn zkhV@5x{%SW+1rj zX;gv)B{0e{@Pap2U$3-~=skt(I?AW>D~PF7UNEA%Z9kp*UNHENY}?QL#dy> 0, nil +} + +func releaseHistoryV3(storageBackend *v3storage.Storage, releaseName string) ([]*helmreleasev3.Release, bool, error) { releaseHistory, err := storageBackend.History(releaseName) if err != nil { if notFoundErr(err) { diff --git a/pkg/helm/watches/watches.go b/pkg/helm/watches/watches.go index ecfd8c5d5d..6a1730dfda 100644 --- a/pkg/helm/watches/watches.go +++ b/pkg/helm/watches/watches.go @@ -20,8 +20,8 @@ import ( "io/ioutil" yaml "gopkg.in/yaml.v2" + "helm.sh/helm/v3/pkg/chartutil" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/helm/pkg/chartutil" ) // Watch defines options for configuring a watch for a Helm-based diff --git a/test/test-framework/go.mod b/test/test-framework/go.mod index edc04bf677..177f40a876 100644 --- a/test/test-framework/go.mod +++ b/test/test-framework/go.mod @@ -36,4 +36,6 @@ replace ( k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.0.0-20191016112829-06bb3c9d77c9 ) +replace github.com/docker/docker => github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309 // Required by Helm + replace github.com/operator-framework/operator-sdk => ../../ diff --git a/test/test-framework/go.sum b/test/test-framework/go.sum index 1245af5f9c..7b329917e4 100644 --- a/test/test-framework/go.sum +++ b/test/test-framework/go.sum @@ -30,10 +30,14 @@ github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= +github.com/MakeNowJust/heredoc v0.0.0-20171113091838-e9091a26100e/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/semver/v3 v3.0.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig/v3 v3.0.0/go.mod h1:NEUY/Qq8Gdm2xgYA+NwJM6wmfdRV9xkh8h/Rld20R0U= +github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.12/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/hcsshim v0.0.0-20190417211021-672e52e9209d/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= @@ -46,10 +50,13 @@ github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt 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/Rican7/retry v0.1.0/go.mod h1:FgOROf8P5bebcC1DS0PdOQiqGUridaZvikzUmkFW6gg= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/ant31/crd-validation v0.0.0-20180702145049-30f8a35d0ac2/go.mod h1:X0noFIik9YqfhGYBLEHg8LJKEwy7QIitLQuFMpKLcPk= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -69,16 +76,23 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bifurcation/mint v0.0.0-20180715133206-93c51c6ce115/go.mod h1:zVt7zX3K/aDCk9Tj+VM7YymsX66ERvzCJzw8rFCX2JU= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/brancz/gojsontoyaml v0.0.0-20190425155809-e8bd32d46b3d/go.mod h1:IyUJYN1gvWjtLF5ZuygmxbnsAyP3aJS6cHzIuZY50B0= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/bugsnag/bugsnag-go v1.5.0/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/panicwrap v1.2.0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/caddyserver/caddy v1.0.3/go.mod h1:G+ouvOY32gENkJC+jhgl62TyhvqEsFaDiZ4uw0RzP1E= github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c/go.mod h1:Xe6ZsFhtM8HrDku0pxJ3/Lr51rwykrzgFwpmTzleatY= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.0 h1:yTUvW7Vhb89inJ+8irsUqiWjh8iT6sQPZiQzI6ReGkA= +github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= github.com/checkpoint-restore/go-criu v0.0.0-20190109184317-bdb7599cd87b/go.mod h1:TrMrLQfeENAPYPRsJuq3jsqdlRh3lvi6trTZJG8+tho= github.com/cheekybits/genny v0.0.0-20170328200008-9127e812e1e9/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= @@ -92,6 +106,9 @@ github.com/container-storage-interface/spec v1.1.0/go.mod h1:6URME8mwIBbpVyZV93C github.com/containerd/console v0.0.0-20170925154832-84eeaae905fa/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/containerd v1.0.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.2.7/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190823190603-4a2f61c4f2b4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/continuity v0.0.0-20181203112020-004b46473808/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/typeurl v0.0.0-20190228175220-2a93cfde8c20/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/coredns/corefile-migration v1.0.2/go.mod h1:OFwBp/Wc9dJt5cAZzHWMNhK1r5L0p0jDwIBc6j8NC8E= @@ -127,22 +144,27 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= +github.com/deislabs/oras v0.7.0/go.mod h1:sqMKPG3tMyIX9xwXUBRLhZ24o+uT4y6jgBD2RzUTKDM= github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dhui/dktest v0.3.0/go.mod h1:cyzIUfGsBEbZ6BT7tnXqAShHSXCZhSNmFl70sZ7c1yc= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v0.0.0-20190506213505-d88565df0c2d/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.7.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190103212154-2b7e084dc98b/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v0.7.3-0.20190817195342-4760db040282/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.1/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-metrics v0.0.0-20181218153428-b84716841b82/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/libnetwork v0.0.0-20180830151422-a9cd636e3789/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8= +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/docker/spdystream v0.0.0-20181023171402-6480d4af844c/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= @@ -153,6 +175,7 @@ github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkg 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/emicklei/go-restful v2.9.6+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.11.1+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= github.com/evanphx/json-patch v4.1.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -168,6 +191,7 @@ github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHqu 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/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk= +github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -197,10 +221,12 @@ 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= @@ -211,6 +237,7 @@ github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nA 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.4/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= @@ -219,6 +246,7 @@ github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/ 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.4/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-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= @@ -237,6 +265,8 @@ github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWS github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0= github.com/godbus/dbus v4.1.0+incompatible/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/gofrs/flock v0.7.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= @@ -244,6 +274,8 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48 h1:X+zN6RZXsvnrSJaAIQhZezPfAfvsqihKKR8oiLHid34= github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang-migrate/migrate/v4 v4.6.2/go.mod h1:JYi6reN3+Z734VZ0akNuyOJNcrg45ZL7LDBMW3WGJL0= 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= @@ -251,6 +283,9 @@ github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9 h1:uHTyIjqVhYRhLbJ8nIiOJHkEZZ+5YoOsAbD3sk82NiE= +github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -273,6 +308,8 @@ github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= 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= @@ -297,11 +334,14 @@ github.com/gophercloud/gophercloud v0.2.0 h1:lD2Bce2xBAMNNcFZ0dObTpXkGLlVIb33RPV github.com/gophercloud/gophercloud v0.2.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.4.0/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gosuri/uitable v0.0.1/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190203031600-7a902570cb17/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= @@ -321,11 +361,14 @@ github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCO github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/heketi/heketi v9.0.0+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= github.com/heketi/rest v0.0.0-20180404230133-aa6a65207413/go.mod h1:BeS3M108VzVlmAue3lv2WcGuPAX94/KN63MUURzbYSI= github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7UkZt1i4FQeQy0R2T8GLUwQhOP5M1gBhy4= github.com/heketi/utils v0.0.0-20170317161834-435bc5bdfa64/go.mod h1:RYlF4ghFZPPmk2TC5REt5OFwvfb6lzxFWrTWB+qs28s= +github.com/helm/helm-2to3 v0.2.0/go.mod h1:jQUVAWB0bM7zNIqKPIfHFzuFSK0kHYovJrjO+hqcvRk= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= @@ -334,6 +377,8 @@ github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/improbable-eng/thanos v0.3.2/go.mod h1:GZewVGILKuJVPNRn7L4Zw+7X96qzFOwj63b22xYGXBE= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -355,6 +400,7 @@ github.com/jsonnet-bundler/jsonnet-bundler v0.1.0/go.mod h1:YKsSFc9VFhhLITkJS3X2 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/karrick/godirwalk v1.7.5/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= @@ -390,6 +436,9 @@ 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/maorfr/helm-plugin-utils v0.0.0-20181205064038-588190cb5e3b/go.mod h1:p3gwmRSFqbWw6plBpR0sKl3n3vpu8kX70gvCJKMvvCA= github.com/markbates/inflect v1.0.4 h1:5fh1gzTFhfae06u3hzHYO9xe3l3v3nW5Pwt3naLTP5g= github.com/markbates/inflect v1.0.4/go.mod h1:1fR9+pO2KHEO9ZRtto13gDwwZaAKstQzferVeWqbgNs= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= @@ -400,6 +449,7 @@ github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.6/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-shellwords v1.0.5/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= @@ -408,6 +458,7 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5 github.com/maxbrunsfeld/counterfeiter/v6 v6.2.1/go.mod h1:F9YacGpnZbLQMzuPI0rR6op21YvNu/RjL705LJJpM3k= github.com/mesos/mesos-go v0.0.9/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= github.com/mholt/certmagic v0.6.2-0.20190624175158-6a42ef9fe8c2/go.mod h1:g4cOPxcjV0oFq3qwpjSA30LReKD8AoIfwAY9VvG35NY= +github.com/miekg/dns v0.0.0-20181005163659-0d29b283ac0f/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.3/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mindprince/gonvml v0.0.0-20171110221305-fee913ce8fb2/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY= @@ -420,6 +471,7 @@ github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1: github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= 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= @@ -446,13 +498,18 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W 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.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.3.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc2.0.20190611121236-6cc515888830/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runtime-spec v1.0.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.2.2/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs= @@ -473,6 +530,7 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-toml v1.0.1/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/phayes/freeport v0.0.0-20171002181615-b8543db493a5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= @@ -490,10 +548,14 @@ github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0 h1:BQ53HtBmfOitExawJ6LokA4x8ov/z0SYYb0+HxJfRI8= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.2.1 h1:JnMpQc6ppsNgw9QPAGF6Dod479itz7lvlsMzzNayLOI= +github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= 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-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -502,14 +564,19 @@ github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190129233650-316cf8ccfec5/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/prometheus v2.3.2+incompatible/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.8.0/go.mod h1:fSI0j+IUQrDd7+ZtR9WKIGtoYAYAJUKcKhYLG25tN4g= @@ -547,6 +614,7 @@ github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= 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 v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= @@ -570,7 +638,6 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/syndtr/gocapability v0.0.0-20160928074757-e7cb7fa329f4/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/technosophos/moniker v0.0.0-20180509230615-a5dbd03a2245/go.mod h1:O1c8HleITsZqzNZDjSNzirUGsMT0oGu9LhHKoJrqO+A= github.com/thecodeteam/goscaleio v0.1.0/go.mod h1:68sdkZAsK8bvEwBlbQnlLS+xU+hvLYM/iQ8KXej1AwM= github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -584,10 +651,18 @@ github.com/vmware/govmomi v0.20.1/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59b github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xenolf/lego v0.0.0-20160613233155-a9d8cec0e656/go.mod h1:fwiGnfsIjG7OHPfOvgK7Y/Qo6+2Ox0iozjNTkZICKbY= +github.com/xenolf/lego v0.3.2-0.20160613233155-a9d8cec0e656/go.mod h1:fwiGnfsIjG7OHPfOvgK7Y/Qo6+2Ox0iozjNTkZICKbY= github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.6/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -619,10 +694,14 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4 h1:ydJNl0ENAG67pFbB+9tfhiL2pYqLhfoaZFw/cjLhY4A= golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191028145041-f83a4685e152 h1:ZC1Xn5A1nlpSmQCIva4bZ3ob3lmhYIefc+GU+DLg1Ow= +golang.org/x/crypto v0.0.0-20191028145041-f83a4685e152/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-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -637,6 +716,7 @@ golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -651,11 +731,15 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc h1:gkKoSkUmnU6bpS/VhkuO27bzQeSA51uaEfbOW5dNb68= golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271 h1:N66aaryRB3Ax92gH0v3hp1QYZ3zWWCCUR/j8Ifh45Ss= +golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -697,6 +781,9 @@ golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3 h1:4y9KwBHBgBNwDbtu44R5o1fdOCQUEXhbk/P4A9WmJq0= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191028164358-195ce5e7f934 h1:u/E0NqCIWRDAo9WCFo6Ko49njPFDLSd3z+X1HgWDMpE= +golang.org/x/sys v0.0.0-20191028164358-195ce5e7f934/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/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= @@ -706,6 +793,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20170824195420-5d2fd3ccab98/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 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= @@ -746,18 +835,24 @@ google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190128161407-8ac453e89fca/go.mod h1:L3J43x8/uS+qIUoksaLKe6OS3nUKxOKuIFz1sl2/jx4= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20191028173616-919d9bdd9fe6/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -777,6 +872,7 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/mcuadros/go-syslog.v2 v2.2.1/go.mod h1:l5LPIyOOyIdQquNg+oU6Z3524YwrcqEm0aKH+5zpt2U= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v1 v1.1.2/go.mod h1:QpYS+a4WhS+DTlyQIi6Ka7MS3SuR9a055rgXNEe6EiA= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= @@ -793,6 +889,7 @@ gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/gotestsum v0.3.5/go.mod h1:Mnf3e5FUzXbkCfynWBGOwLssY7gTQgCHObK9tMpAriY= +helm.sh/helm/v3 v3.0.0/go.mod h1:sI7B9yfvMgxtTPMWdk1jSKJ2aa59UyP9qhPydqW6mgo= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -848,11 +945,14 @@ k8s.io/sample-apiserver v0.0.0-20191016112829-06bb3c9d77c9/go.mod h1:sXltHZrQa4j k8s.io/utils v0.0.0-20190308190857-21c4ce38f2a7/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= 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-20191010214722-8d271d903fe4 h1:Gi+/O1saihwDqnlmC8Vhv1M5Sp4+rbOmK9TbsLn8ZEA= +k8s.io/utils v0.0.0-20191010214722-8d271d903fe4/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +rsc.io/letsencrypt v0.0.1/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= 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-tools v0.2.2 h1:tOXKme2gR7KoM6+7Y+nzjwjbXDgqLfTuX5r7+4dvlig= From b3647b4774b204ab1fcb35332883e95e6a7367b1 Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Wed, 27 Nov 2019 16:22:56 -0500 Subject: [PATCH 02/12] doc/helm: initial helm docs updates --- doc/helm/dev/developer_guide.md | 302 +++++++++++++++++++++----------- doc/helm/project_layout.md | 2 +- doc/helm/user-guide.md | 4 +- 3 files changed, 205 insertions(+), 103 deletions(-) diff --git a/doc/helm/dev/developer_guide.md b/doc/helm/dev/developer_guide.md index ef3d2d3b2f..555ebfdb3f 100644 --- a/doc/helm/dev/developer_guide.md +++ b/doc/helm/dev/developer_guide.md @@ -19,9 +19,6 @@ If you are unfamiliar with Helm, the easiest way to get started is to [install Helm][helm_install] and test your charts using the `helm` command line tool. -**NOTE:** Installing Helm's Tiller component in your cluster is not required, -because the Helm operator runs a Tiller component internally. - ### Testing a Helm chart locally Sometimes it is beneficial for a developer to run the Helm chart installation @@ -30,19 +27,18 @@ time. To do this, initialize a new project: ```sh $ operator-sdk new --type helm --kind Foo --api-version foo.example.com/v1alpha1 foo-operator -INFO[0000] Creating new Helm operator 'foo-operator'. -INFO[0000] Created build/Dockerfile -INFO[0000] Created watches.yaml -INFO[0000] Created deploy/service_account.yaml -INFO[0000] Created deploy/role.yaml -INFO[0000] Created deploy/role_binding.yaml -INFO[0000] Created deploy/operator.yaml -INFO[0000] Created deploy/crds/foo.example.com_foos_crd.yaml -INFO[0000] Created deploy/crds/foo.example.com_v1alpha1_foo_cr.yaml -INFO[0000] Created helm-charts/foo/ -INFO[0000] Run git init ... -Initialized empty Git repository in /home/user/go/src/github.com/operator-framework/foo-operator/.git/ -INFO[0000] Run git init done +INFO[0000] Creating new Helm operator 'foo-operator'. +INFO[0000] Created helm-charts/foo +INFO[0000] Generating RBAC rules +WARN[0000] The RBAC rules generated in deploy/role.yaml are based on the chart's default manifest. Some rules may be missing for resources that are only enabled with custom values, and some existing rules may be overly broad. Double check the rules generated in deploy/role.yaml to ensure they meet the operator's permission requirements. +INFO[0000] Created build/Dockerfile +INFO[0000] Created watches.yaml +INFO[0000] Created deploy/service_account.yaml +INFO[0000] Created deploy/role.yaml +INFO[0000] Created deploy/role_binding.yaml +INFO[0000] Created deploy/operator.yaml +INFO[0000] Created deploy/crds/foo.example.com_foos_crd.yaml +INFO[0000] Created deploy/crds/foo.example.com_v1alpha1_foo_cr.yaml INFO[0000] Project creation complete. $ cd foo-operator @@ -53,7 +49,49 @@ For this example we will use the default Nginx helm chart scaffolded by release manifests are: ```sh -$ helm template --name test-release helm-charts/foo +$ helm install --dry-run test-release helm-charts/foo +NAME: test-release +LAST DEPLOYED: Wed Nov 27 15:41:10 2019 +NAMESPACE: default +STATUS: pending-install +REVISION: 1 +HOOKS: +--- +# Source: foo/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "test-release-foo-test-connection" + labels: + + helm.sh/chart: foo-0.1.0 + app.kubernetes.io/name: foo + app.kubernetes.io/instance: test-release + app.kubernetes.io/version: "1.16.0" + app.kubernetes.io/managed-by: Helm + annotations: + "helm.sh/hook": test-success +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['test-release-foo:80'] + restartPolicy: Never +MANIFEST: +--- +# Source: foo/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: test-release-foo + labels: + + helm.sh/chart: foo-0.1.0 + app.kubernetes.io/name: foo + app.kubernetes.io/instance: test-release + app.kubernetes.io/version: "1.16.0" + app.kubernetes.io/managed-by: Helm --- # Source: foo/templates/service.yaml apiVersion: v1 @@ -61,10 +99,11 @@ kind: Service metadata: name: test-release-foo labels: - app.kubernetes.io/name: foo helm.sh/chart: foo-0.1.0 + app.kubernetes.io/name: foo app.kubernetes.io/instance: test-release - app.kubernetes.io/managed-by: Tiller + app.kubernetes.io/version: "1.16.0" + app.kubernetes.io/managed-by: Helm spec: type: ClusterIP ports: @@ -75,18 +114,18 @@ spec: selector: app.kubernetes.io/name: foo app.kubernetes.io/instance: test-release - --- # Source: foo/templates/deployment.yaml -apiVersion: apps/v1beta2 +apiVersion: apps/v1 kind: Deployment metadata: name: test-release-foo labels: - app.kubernetes.io/name: foo helm.sh/chart: foo-0.1.0 + app.kubernetes.io/name: foo app.kubernetes.io/instance: test-release - app.kubernetes.io/managed-by: Tiller + app.kubernetes.io/version: "1.16.0" + app.kubernetes.io/managed-by: Helm spec: replicas: 1 selector: @@ -99,9 +138,14 @@ spec: app.kubernetes.io/name: foo app.kubernetes.io/instance: test-release spec: + serviceAccountName: test-release-foo + securityContext: + {} containers: - name: foo - image: "nginx:stable" + securityContext: + {} + image: "nginx:1.16.0" imagePullPolicy: IfNotPresent ports: - name: http @@ -118,19 +162,27 @@ spec: resources: {} - ---- -# Source: foo/templates/ingress.yaml - +NOTES: +1. Get the application URL by running these commands: + export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=foo,app.kubernetes.io/instance=test-release" -o jsonpath="{.items[0].metadata.name}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace default port-forward $POD_NAME 8080:80 ``` -Next, deploy these resource manifests to your cluster without using -Tiller: +Next, let's go ahead and install the release: ```sh -$ helm template --name test-release helm-charts/foo | kubectl apply -f - -service/test-release-foo created -deployment.apps/test-release-foo created +$ helm install test-release helm-charts/foo +NAME: test-release +LAST DEPLOYED: Wed Nov 27 15:43:04 2019 +NAMESPACE: default +STATUS: deployed +REVISION: 1 +NOTES: +1. Get the application URL by running these commands: + export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=foo,app.kubernetes.io/instance=test-release" -o jsonpath="{.items[0].metadata.name}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace default port-forward $POD_NAME 8080:80 ``` Check that the release resources were created: @@ -138,16 +190,16 @@ Check that the release resources were created: ```sh $ kubectl get all -l app.kubernetes.io/instance=test-release NAME READY STATUS RESTARTS AGE -pod/test-release-foo-5554d49986-47676 1/1 Running 0 2m +pod/test-release-foo-76bd6c5f58-vqj7m 1/1 Running 0 36s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -service/test-release-foo ClusterIP 10.100.136.126 80/TCP 2m +service/test-release-foo ClusterIP 10.106.222.153 80/TCP 36s -NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE -deployment.apps/test-release-foo 1 1 1 1 2m +NAME READY UP-TO-DATE AVAILABLE AGE +deployment.apps/test-release-foo 1/1 1 1 36s NAME DESIRED CURRENT READY AGE -replicaset.apps/test-release-foo-5554d49986 1 1 1 2m +replicaset.apps/test-release-foo-76bd6c5f58 1 1 1 36s ``` Next, let's create a simple values file that we can use to override the Helm @@ -161,13 +213,21 @@ service: EOF ``` -Re-run the templates and re-apply them to the cluster, this time using the -`overrides.yaml` file we just created: +Now let's upgrade the release to use these new values from `overrides.yaml`: ```sh -$ helm template -f overrides.yaml --name test-release helm-charts/foo | kubectl apply -f - -service/test-release-foo configured -deployment.apps/test-release-foo configured +$ helm upgrade -f overrides.yaml test-release helm-charts/foo +Release "test-release" has been upgraded. Happy Helming! +NAME: test-release +LAST DEPLOYED: Wed Nov 27 15:45:15 2019 +NAMESPACE: default +STATUS: deployed +REVISION: 2 +NOTES: +1. Get the application URL by running these commands: + export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=foo,app.kubernetes.io/instance=test-release" -o jsonpath="{.items[0].metadata.name}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace default port-forward $POD_NAME 8080:80 ``` Now you'll see that there are 2 deployment replicas and the service port @@ -175,27 +235,26 @@ has been updated to `8080`. ```sh $ kubectl get deployment -l app.kubernetes.io/instance=test-release -NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE -test-release-foo 2 2 2 2 3m +NAME READY UP-TO-DATE AVAILABLE AGE +test-release-foo 2/2 2 2 2m58s $ kubectl get service -l app.kubernetes.io/instance=test-release -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -test-release-foo ClusterIP 10.100.136.126 8080/TCP 3m +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +test-release-foo ClusterIP 10.106.222.153 8080/TCP 2m59s ``` -Lastly, delete the release: +Lastly, uninstall the release: ```sh -$ helm template -f overrides.yaml --name test-release helm-charts/foo | kubectl delete -f - -service "test-release-foo" deleted -deployment.apps "test-release-foo" deleted +$ helm uninstall test-release +release "test-release" uninstalled ``` Check that the resources were deleted: ```sh $ kubectl get all -l app.kubernetes.io/instance=test-release -No resources found. +No resources found in default namespace. ``` ## Using Helm inside of an Operator @@ -263,7 +322,7 @@ Once a developer is comfortable working with the above workflow, it will be beneficial to test the logic inside of an operator. To accomplish this, we can use `operator-sdk up local` from the top-level directory of our project. The `up local` command reads from `./watches.yaml` and uses `~/.kube/config` to -communicate with a Kubernetes cluster just as the `kubectl apply` commands did +communicate with a Kubernetes cluster just as the `helm` CLI commands did when we were testing our Helm chart locally. This section assumes the developer has read the [Helm Operator user guide][helm_operator_user_guide] and has the proper dependencies installed. @@ -291,24 +350,49 @@ INFO[0000] operator-sdk Version: v0.2.0+git Now that the operator is watching resource `Foo` for events, the creation of a Custom Resource will trigger our Helm chart to be executed. Take a look at -`deploy/crds/foo.example.com_v1alpha1_foo_cr.yaml`. Our chart does not have a `size` value, -so let's remove it. Your CR file should look like the following: +`deploy/crds/foo.example.com_v1alpha1_foo_cr.yaml`. The `spec` was generated +from the chart's default `values.yaml` file, so creating this CR will result +in the chart's default manifest being installed. ```yaml -apiVersion: "foo.example.com/v1alpha1" -kind: "Foo" +apiVersion: foo.example.com/v1alpha1 +kind: Foo metadata: - name: "example-foo" + name: example-foo spec: - # Add fields here + # Default values copied from /helm-charts/foo/values.yaml + + affinity: {} + fullnameOverride: "" + image: + pullPolicy: IfNotPresent + repository: nginx + imagePullSecrets: [] + ingress: + annotations: {} + enabled: false + hosts: + - host: chart-example.local + paths: [] + tls: [] + nameOverride: "" + nodeSelector: {} + podSecurityContext: {} + replicaCount: 1 + resources: {} + securityContext: {} + service: + port: 80 + type: ClusterIP + serviceAccount: + create: true + name: null + tolerations: [] + ``` -Since `spec` is not set, Helm is invoked with no extra variables. The next -section covers how extra variables are passed from a Custom Resource to -Helm. This is why it is important to set sane defaults for the operator. -Create a Custom Resource instance of Foo with default var `state` set to -`present`: +Create a Custom Resource instance of Foo using these default values: ```sh $ kubectl apply -f deploy/crds/foo.example.com_v1alpha1_foo_cr.yaml @@ -319,27 +403,26 @@ The custom resource status will be updated with the release information if the installation succeeds. Let's get the release name: ```sh -$ export RELEASE_NAME=$(kubectl get foos example-foo -o jsonpath={..status.release.name}) +$ export RELEASE_NAME=$(kubectl get foos example-foo -o jsonpath={..status.deployedRelease.name}) $ echo $RELEASE_NAME -example-foo-4f8ay4vfr99ulx905hax3j6x1 +example-foo ``` -Check that the release resources were created: +Note that the release name matches the name of the CR. Next, check that the release resources were created: ```sh $ kubectl get all -l app.kubernetes.io/instance=${RELEASE_NAME} -NAME READY STATUS RESTARTS AGE -pod/example-foo-4f8ay4vfr99ulx905hax3j6x1-9dfd67fc6-s6krb 1/1 Running 0 4m +NAME READY STATUS RESTARTS AGE +pod/example-foo-69594454bc-mvz2l 1/1 Running 0 2m39s -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -service/example-foo-4f8ay4vfr99ulx905hax3j6x1 ClusterIP 10.102.91.83 80/TCP 4m +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +service/example-foo ClusterIP 10.96.236.249 80/TCP 2m39s -NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE -deployment.apps/example-foo-4f8ay4vfr99ulx905hax3j6x1 1 1 1 1 4m - -NAME DESIRED CURRENT READY AGE -replicaset.apps/example-foo-4f8ay4vfr99ulx905hax3j6x1-9dfd67fc6 1 1 1 4m +NAME READY UP-TO-DATE AVAILABLE AGE +deployment.apps/example-foo 1/1 1 1 2m39s +NAME DESIRED CURRENT READY AGE +replicaset.apps/example-foo-69594454bc 1 1 1 2m39s ``` Modify `deploy/crds/foo.example.com_v1alpha1_foo_cr.yaml` to set `replicaCount` to `2`: @@ -350,8 +433,9 @@ kind: "Foo" metadata: name: "example-foo" spec: - # Add fields here + # ... replicaCount: 2 + # ... ``` Apply the changes to Kubernetes and confirm that the deployment has 2 replicas: @@ -361,8 +445,19 @@ $ kubectl apply -f deploy/crds/foo.example.com_v1alpha1_foo_cr.yaml foo.foo.example.com/example-foo configured $ kubectl get deployment -l app.kubernetes.io/instance=${RELEASE_NAME} -NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE -example-foo-4f8ay4vfr99ulx905hax3j6x1 2 2 2 2 6m +NAME READY UP-TO-DATE AVAILABLE AGE +example-foo 2/2 2 2 3m35s +``` + +Lastly, to uninstall the release, simply delete the CR and verify that the +release resources have been deleted: + +```sh +$ kubectl delete -f deploy/crds/foo.example.com_v1alpha1_foo_cr.yaml +foo.foo.example.com "example-foo" deleted + +$ kubectl get all -l app.kubernetes.io/instance=${RELEASE_NAME} +No resources found in default namespace. ``` ### Testing a Helm operator on a cluster @@ -411,33 +506,40 @@ NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE foo-operator 1 1 1 1 1m ``` -## Override values sent to Helm +Apply the CR to Kubernetes and confirm that the release resources have been +created: -The override values that are sent to Helm are managed by the operator. The -contents of the `spec` section are passed along verbatim to Helm and treated -like a value file would be if the Helm CLI were used (e.g. -`helm install -f overrides.yaml ./my-chart`) +```sh +$ kubectl apply -f deploy/crds/foo.example.com_v1alpha1_foo_cr.yaml +foo.foo.example.com/example-foo configured -For the CR example: +$ kubectl get all -l app.kubernetes.io/instance=${RELEASE_NAME} +NAME READY STATUS RESTARTS AGE +pod/example-foo-69594454bc-4z92w 1/1 Running 0 10s +pod/example-foo-69594454bc-wp4sl 1/1 Running 0 10s -```yaml -apiVersion: "app.example.com/v1alpha1" -kind: "Database" -metadata: - name: "example" -spec: - message: "Hello world 2" - newParameter: "newParam" +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +service/example-foo ClusterIP 10.107.177.143 80/TCP 10s + +NAME READY UP-TO-DATE AVAILABLE AGE +deployment.apps/example-foo 2/2 2 2 10s + +NAME DESIRED CURRENT READY AGE +replicaset.apps/example-foo-69594454bc 2 2 2 10s ``` -The structure passed to Helm as values is: +Lastly, to uninstall the release, simply delete the CR and verify that the +release resources have been deleted: -```yaml -message: "Hello world 2" -newParameter: "newParam" +```sh +$ kubectl delete -f deploy/crds/foo.example.com_v1alpha1_foo_cr.yaml +foo.foo.example.com "example-foo" deleted + +$ kubectl get all -l app.kubernetes.io/instance=${RELEASE_NAME} +No resources found in default namespace. ``` -[helm_charts]:https://v2.helm.sh/docs/developing_charts/ -[helm_values]:https://v2.helm.sh/docs/using_helm/#customizing-the-chart-before-installing -[helm_install]:https://helm.sh/docs/using_helm/ +[helm_charts]:https://helm.sh/docs/topics/charts/ +[helm_values]:https://helm.sh/docs/intro/using_helm/#customizing-the-chart-before-installing +[helm_install]:https://helm.sh/docs/intro/install/ [helm_operator_user_guide]:../user-guide.md diff --git a/doc/helm/project_layout.md b/doc/helm/project_layout.md index 333025050c..8b4444c49c 100644 --- a/doc/helm/project_layout.md +++ b/doc/helm/project_layout.md @@ -11,4 +11,4 @@ table describes a basic rundown of each generated file/directory. | build | Contains scripts that the operator-sdk uses for build and initialization. | | watches.yaml | Contains Group, Version, Kind, and Helm chart location. | -[docs_helm_create]:https://v2.helm.sh/docs/helm/#helm-create +[docs_helm_create]:https://helm.sh/docs/intro/using_helm/#creating-your-own-charts diff --git a/doc/helm/user-guide.md b/doc/helm/user-guide.md index d6d38d928e..48a098cf12 100644 --- a/doc/helm/user-guide.md +++ b/doc/helm/user-guide.md @@ -317,6 +317,6 @@ kubectl delete -f deploy/crds/example.com_nginxes_crd.yaml [docker-tool]:https://docs.docker.com/install/ [kubectl-tool]:https://kubernetes.io/docs/tasks/tools/install-kubectl/ [minikube-tool]:https://github.com/kubernetes/minikube#installation -[helm-charts]:https://v2.helm.sh/docs/developing_charts/ -[helm-values]:https://helm.sh/docs/using_helm/#customizing-the-chart-before-installing +[helm-charts]:https://helm.sh/docs/topics/charts/ +[helm-values]:https://helm.sh/docs/intro/using_helm/#customizing-the-chart-before-installing [quay-link]:https://quay.io From c26966ae77625473add5c99058641fb623561eb4 Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Mon, 2 Dec 2019 08:51:48 -0500 Subject: [PATCH 03/12] internal/scaffold/helm/role.go: remove commented code --- internal/scaffold/helm/role.go | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/internal/scaffold/helm/role.go b/internal/scaffold/helm/role.go index 21b835bc4d..564da36704 100644 --- a/internal/scaffold/helm/role.go +++ b/internal/scaffold/helm/role.go @@ -197,22 +197,6 @@ func getDefaultManifests(c *chart.Chart, kubeVersion *version.Info) ([]releaseut } _, manifests, err := releaseutil.SortManifests(releaseutil.SplitManifests(rel.Manifest), chartutil.DefaultVersionSet, releaseutil.InstallOrder) return manifests, err - /* - v := strings.TrimSuffix(fmt.Sprintf("%s.%s", kubeVersion.Major, kubeVersion.Minor), "+") - renderOpts := renderutil.Options{ - ReleaseOptions: chartutil.ReleaseOptions{ - IsInstall: true, - IsUpgrade: false, - }, - KubeVersion: v, - } - - renderedTemplates, err := renderutil.Render(c, &chart.Config{}, renderOpts) - if err != nil { - return nil, fmt.Errorf("failed to render chart templates: %s", err) - } - return tiller.SortByKind(releaseutil.SplitManifests(renderedTemplates)), nil - */ } func getResource(namespacedResourceList []*metav1.APIResourceList, groupVersion, kind string) (string, bool, bool) { From 2440e229bccd982d9afdf8471f45bae947d81a7d Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Wed, 4 Dec 2019 10:36:18 -0500 Subject: [PATCH 04/12] internal/scaffold/helm: improve test coverage --- internal/scaffold/helm/role_test.go | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/internal/scaffold/helm/role_test.go b/internal/scaffold/helm/role_test.go index fc0f84b56e..832a859ad0 100644 --- a/internal/scaffold/helm/role_test.go +++ b/internal/scaffold/helm/role_test.go @@ -15,6 +15,7 @@ package helm_test import ( + "errors" "fmt" "testing" @@ -27,7 +28,7 @@ import ( ) func TestGenerateRoleScaffold(t *testing.T) { - dcs := map[string]*mockRoleDiscoveryClient{ + workingDcs := map[string]*mockRoleDiscoveryClient{ "upstream": &mockRoleDiscoveryClient{ serverVersion: func() (*version.Info, error) { return &version.Info{Major: "1", Minor: "11"}, nil }, serverResources: func() ([]*metav1.APIResourceList, error) { return simpleResourcesList(), nil }, @@ -37,6 +38,16 @@ func TestGenerateRoleScaffold(t *testing.T) { serverResources: func() ([]*metav1.APIResourceList, error) { return simpleResourcesList(), nil }, }, } + brokenDcs := map[string]*mockRoleDiscoveryClient{ + "no server version": &mockRoleDiscoveryClient{ + serverVersion: func() (*version.Info, error) { return nil, errors.New("no server version") }, + serverResources: func() ([]*metav1.APIResourceList, error) { return simpleResourcesList(), nil }, + }, + "no server resources": &mockRoleDiscoveryClient{ + serverVersion: func() (*version.Info, error) { return &version.Info{Major: "1", Minor: "11"}, nil }, + serverResources: func() ([]*metav1.APIResourceList, error) { return nil, errors.New("no server resources") }, + }, + } testCases := []roleScaffoldTestCase{ { @@ -70,7 +81,7 @@ func TestGenerateRoleScaffold(t *testing.T) { } for _, tc := range testCases { - for dcName, dc := range dcs { + for dcName, dc := range workingDcs { testName := fmt.Sprintf("%s %s", dcName, tc.name) t.Run(testName, func(t *testing.T) { roleScaffold := helm.GenerateRoleScaffold(dc, tc.chart) @@ -79,6 +90,15 @@ func TestGenerateRoleScaffold(t *testing.T) { assert.Equal(t, tc.expectIsClusterScoped, roleScaffold.IsClusterScoped) }) } + for dcName, dc := range brokenDcs { + testName := fmt.Sprintf("%s %s", dcName, tc.name) + t.Run(testName, func(t *testing.T) { + roleScaffold := helm.GenerateRoleScaffold(dc, tc.chart) + assert.Equal(t, false, roleScaffold.SkipDefaultRules) + assert.Equal(t, 2, len(roleScaffold.CustomRules)) + assert.Equal(t, false, roleScaffold.IsClusterScoped) + }) + } } } From b57590f8a9e72b096dd11f713ef29fcd850a7101 Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Thu, 5 Dec 2019 16:33:29 -0500 Subject: [PATCH 05/12] go.mod: bump helm-v3 to v3.0.1 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 76bd0741bb..b92886007b 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( golang.org/x/tools v0.0.0-20191018212557-ed542cd5b28a gopkg.in/gorp.v1 v1.7.2 // indirect gopkg.in/yaml.v2 v2.2.4 - helm.sh/helm/v3 v3.0.0 + helm.sh/helm/v3 v3.0.1 k8s.io/api v0.0.0 k8s.io/apiextensions-apiserver v0.0.0 k8s.io/apimachinery v0.0.0 diff --git a/go.sum b/go.sum index 758604b6ee..5447fec2b8 100644 --- a/go.sum +++ b/go.sum @@ -968,6 +968,8 @@ gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81 gotest.tools/gotestsum v0.3.5/go.mod h1:Mnf3e5FUzXbkCfynWBGOwLssY7gTQgCHObK9tMpAriY= helm.sh/helm/v3 v3.0.0 h1:or/9cs1GgfcTQeEnR2CVJNw893/rmqIG1KsNHmUiSFw= helm.sh/helm/v3 v3.0.0/go.mod h1:sI7B9yfvMgxtTPMWdk1jSKJ2aa59UyP9qhPydqW6mgo= +helm.sh/helm/v3 v3.0.1 h1:gEs30kweCOnLFK9Diq2S8b+VHmWQ2oi465GhqTc3ZxI= +helm.sh/helm/v3 v3.0.1/go.mod h1:sI7B9yfvMgxtTPMWdk1jSKJ2aa59UyP9qhPydqW6mgo= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From d030c3ea72296fe4b4afd0b4b90d7717b1031ad7 Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Tue, 10 Dec 2019 00:41:11 -0500 Subject: [PATCH 06/12] cmd,internal,pkg,test: PR fixes --- cmd/operator-sdk/new/cmd.go | 8 ++-- internal/scaffold/helm/chart.go | 5 -- internal/scaffold/helm/chart_test.go | 6 +-- pkg/helm/release/manager_factory.go | 70 +++++++++++++--------------- test/test-framework/go.sum | 1 + 5 files changed, 40 insertions(+), 50 deletions(-) diff --git a/cmd/operator-sdk/new/cmd.go b/cmd/operator-sdk/new/cmd.go index e540afade8..22c1832d71 100644 --- a/cmd/operator-sdk/new/cmd.go +++ b/cmd/operator-sdk/new/cmd.go @@ -312,14 +312,14 @@ func doHelmScaffold() error { resource, chart, err := helm.CreateChart(cfg.AbsProjectPath, createOpts) if err != nil { - return fmt.Errorf("failed to create helm chart: %s", err) + return fmt.Errorf("failed to create helm chart: %w", err) } valuesPath := filepath.Join("", helm.HelmChartsDir, chart.Name(), "values.yaml") rawValues, err := yaml.Marshal(chart.Values) if err != nil { - return fmt.Errorf("failed to get raw chart values: %s", err) + return fmt.Errorf("failed to get raw chart values: %w", err) } crSpec := fmt.Sprintf("# Default values copied from %s\n\n%s", valuesPath, rawValues) @@ -350,11 +350,11 @@ func doHelmScaffold() error { }, ) if err != nil { - return fmt.Errorf("new helm scaffold failed: (%v)", err) + return fmt.Errorf("new helm scaffold failed: %w", err) } if err := scaffold.UpdateRoleForResource(resource, cfg.AbsProjectPath); err != nil { - return fmt.Errorf("failed to update the RBAC manifest for resource (%v, %v): (%v)", resource.APIVersion, resource.Kind, err) + return fmt.Errorf("failed to update the RBAC manifest for resource (%v, %v): %w", resource.APIVersion, resource.Kind, err) } return nil } diff --git a/internal/scaffold/helm/chart.go b/internal/scaffold/helm/chart.go index d0ae85690a..3b197d79ba 100644 --- a/internal/scaffold/helm/chart.go +++ b/internal/scaffold/helm/chart.go @@ -245,11 +245,6 @@ func createChartFromRemote(destDir string, opts CreateChartOptions) (*chart.Char chartArchive, _, err := c.DownloadTo(opts.Chart, opts.Version, tmpDir) if err != nil { - // One of Helm's error messages directs users to run `helm init`, which - // installs tiller in a remote cluster. Since that's unnecessary and - // unhelpful, modify the error message to be relevant for operator-sdk. - - // TODO(joelanford): Is there anything to initialize in helm v3 return nil, err } diff --git a/internal/scaffold/helm/chart_test.go b/internal/scaffold/helm/chart_test.go index acf9378b31..5c00b4db4b 100644 --- a/internal/scaffold/helm/chart_test.go +++ b/internal/scaffold/helm/chart_test.go @@ -85,14 +85,14 @@ func TestCreateChart(t *testing.T) { }, { name: "from directory", - helmChart: "./testdata/testcharts/" + chartName, + helmChart: filepath.Join(".", "testdata", "testcharts", chartName), expectResource: mustNewResource(t, helm.DefaultAPIVersion, expectDerivedKind), expectChartName: chartName, expectChartVersion: latestVersion, }, { name: "from archive", - helmChart: fmt.Sprintf("./testdata/testcharts/%s-%s.tgz", chartName, latestVersion), + helmChart: filepath.Join(".", "testdata", "testcharts", fmt.Sprintf("%s-%s.tgz", chartName, latestVersion)), expectResource: mustNewResource(t, helm.DefaultAPIVersion, expectDerivedKind), expectChartName: chartName, expectChartVersion: latestVersion, @@ -115,7 +115,7 @@ func TestCreateChart(t *testing.T) { name: "from repo and name implicit latest with apiVersion", helmChart: "test/" + chartName, apiVersion: customAPIVersion, - expectResource: mustNewResource(t, customApiVersion, expectDerivedKind), + expectResource: mustNewResource(t, customAPIVersion, expectDerivedKind), expectChartName: chartName, expectChartVersion: latestVersion, }, diff --git a/pkg/helm/release/manager_factory.go b/pkg/helm/release/manager_factory.go index 08dc0c1c65..3758666ae2 100644 --- a/pkg/helm/release/manager_factory.go +++ b/pkg/helm/release/manager_factory.go @@ -26,8 +26,8 @@ import ( "helm.sh/helm/v3/pkg/chart/loader" "helm.sh/helm/v3/pkg/kube" helmreleasev3 "helm.sh/helm/v3/pkg/release" - v3storage "helm.sh/helm/v3/pkg/storage" - v3driver "helm.sh/helm/v3/pkg/storage/driver" + storagev3 "helm.sh/helm/v3/pkg/storage" + driverv3 "helm.sh/helm/v3/pkg/storage/driver" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -36,8 +36,8 @@ import ( "k8s.io/cli-runtime/pkg/resource" v1 "k8s.io/client-go/kubernetes/typed/core/v1" helmreleasev2 "k8s.io/helm/pkg/proto/hapi/release" - v2storage "k8s.io/helm/pkg/storage" - v2driver "k8s.io/helm/pkg/storage/driver" + storagev2 "k8s.io/helm/pkg/storage" + driverv2 "k8s.io/helm/pkg/storage/driver" crmanager "sigs.k8s.io/controller-runtime/pkg/manager" "github.com/operator-framework/operator-sdk/pkg/helm/client" @@ -65,28 +65,28 @@ func NewManagerFactory(mgr crmanager.Manager, chartDir string) ManagerFactory { func (f managerFactory) NewManager(cr *unstructured.Unstructured) (Manager, error) { clientv1, err := v1.NewForConfig(f.mgr.GetConfig()) if err != nil { - return nil, fmt.Errorf("failed to get core/v1 client: %s", err) + return nil, fmt.Errorf("failed to get core/v1 client: %w", err) } - v2StorageBackend := v2storage.Init(v2driver.NewSecrets(clientv1.Secrets(cr.GetNamespace()))) - v3StorageBackend := v3storage.Init(v3driver.NewSecrets(clientv1.Secrets(cr.GetNamespace()))) + storageBackendV2 := storagev2.Init(driverv2.NewSecrets(clientv1.Secrets(cr.GetNamespace()))) + storageBackendV3 := storagev3.Init(driverv3.NewSecrets(clientv1.Secrets(cr.GetNamespace()))) - if err := convertV2ToV3(v2StorageBackend, v3StorageBackend, cr); err != nil { - return nil, fmt.Errorf("failed to convert releases from v2 to v3: %s", err) + if err := convertV2ToV3(storageBackendV2, storageBackendV3, cr); err != nil { + return nil, fmt.Errorf("failed to convert releases from v2 to v3: %w", err) } rcg, err := client.NewRESTClientGetter(f.mgr) if err != nil { - return nil, fmt.Errorf("failed to get REST client getter from manager: %s", err) + return nil, fmt.Errorf("failed to get REST client getter from manager: %w", err) } kubeClient := kube.New(nil) crChart, err := loader.LoadDir(f.chartDir) if err != nil { - return nil, fmt.Errorf("failed to load chart dir: %s", err) + return nil, fmt.Errorf("failed to load chart dir: %w", err) } - releaseName, err := getReleaseName(v3StorageBackend, crChart.Name(), cr) + releaseName, err := getReleaseName(storageBackendV3, crChart.Name(), cr) if err != nil { - return nil, fmt.Errorf("failed to get helm release name: %s", err) + return nil, fmt.Errorf("failed to get helm release name: %w", err) } values, ok := cr.Object["spec"].(map[string]interface{}) if !ok { @@ -99,13 +99,13 @@ func (f managerFactory) NewManager(cr *unstructured.Unstructured) (Manager, erro } actionConfig := &action.Configuration{ RESTClientGetter: rcg, - Releases: v3StorageBackend, + Releases: storageBackendV3, KubeClient: ownerRefClient, Log: func(_ string, _ ...interface{}) {}, } return &manager{ actionConfig: actionConfig, - storageBackend: v3StorageBackend, + storageBackend: storageBackendV3, kubeClient: ownerRefClient, releaseName: releaseName, @@ -147,46 +147,40 @@ func (c *ownerRefInjectingClient) Build(reader io.Reader, validate bool) (kube.R return resourceList, nil } -func convertV2ToV3(v2StorageBackend *v2storage.Storage, v3StorageBackend *v3storage.Storage, cr *unstructured.Unstructured) error { +func convertV2ToV3(storageBackendV2 *storagev2.Storage, storageBackendV3 *storagev3.Storage, cr *unstructured.Unstructured) error { // If a v2 release with the legacy name exists, convert it to v3. legacyName := getLegacyName(cr) - legacyHistoryV2, legacyV2Exists, err := releaseHistoryV2(v2StorageBackend, legacyName) + legacyHistoryV2, legacyExistsV2, err := releaseHistoryV2(storageBackendV2, legacyName) if err != nil { return err } - if legacyV2Exists { - if err := convertHistoryToV3(legacyHistoryV2, v2StorageBackend, v3StorageBackend); err != nil { - return err - } - return nil + if legacyExistsV2 { + return convertHistoryToV3(legacyHistoryV2, storageBackendV2, storageBackendV3) } // If a v2 release with the CR name exists, convert it to v3. releaseName := cr.GetName() - historyV2, existsV2, err := releaseHistoryV2(v2StorageBackend, releaseName) + historyV2, existsV2, err := releaseHistoryV2(storageBackendV2, releaseName) if err != nil { return err } if existsV2 { - if err := convertHistoryToV3(historyV2, v2StorageBackend, v3StorageBackend); err != nil { - return err - } - return nil + return convertHistoryToV3(historyV2, storageBackendV2, storageBackendV3) } return nil } -func convertHistoryToV3(history []*helmreleasev2.Release, v2StorageBackend *v2storage.Storage, v3StorageBackend *v3storage.Storage) error { - for _, v2Rel := range history { - v3Rel, err := helm2to3.CreateRelease(v2Rel) +func convertHistoryToV3(history []*helmreleasev2.Release, storageBackendV2 *storagev2.Storage, storageBackendV3 *storagev3.Storage) error { + for _, relV2 := range history { + relV3, err := helm2to3.CreateRelease(relV2) if err != nil { - return fmt.Errorf("generate v3 release: %s", err) + return fmt.Errorf("generate v3 release: %w", err) } - if err := v3StorageBackend.Create(v3Rel); err != nil { - return fmt.Errorf("create v3 release: %s", err) + if err := storageBackendV3.Create(relV3); err != nil { + return fmt.Errorf("create v3 release: %w", err) } - if _, err := v2StorageBackend.Delete(v2Rel.GetName(), v2Rel.GetVersion()); err != nil { - return fmt.Errorf("delete v2 release: %s", err) + if _, err := storageBackendV2.Delete(relV2.GetName(), relV2.GetVersion()); err != nil { + return fmt.Errorf("delete v2 release: %w", err) } } return nil @@ -227,7 +221,7 @@ func getLegacyName(cr *unstructured.Unstructured) string { // admission webhook so that the CR owner receives immediate feedback of the // collision. As is, the only indication of collision will be in the CR status // and operator logs. -func getReleaseName(storageBackend *v3storage.Storage, crChartName string, cr *unstructured.Unstructured) (string, error) { +func getReleaseName(storageBackend *storagev3.Storage, crChartName string, cr *unstructured.Unstructured) (string, error) { // If a release with the legacy name exists as a v3 release, // return the legacy name. legacyName := getLegacyName(cr) @@ -263,7 +257,7 @@ func getReleaseName(storageBackend *v3storage.Storage, crChartName string, cr *u return releaseName, nil } -func releaseHistoryV2(storageBackend *v2storage.Storage, releaseName string) ([]*helmreleasev2.Release, bool, error) { +func releaseHistoryV2(storageBackend *storagev2.Storage, releaseName string) ([]*helmreleasev2.Release, bool, error) { releaseHistory, err := storageBackend.History(releaseName) if err != nil { if notFoundErr(err) { @@ -274,7 +268,7 @@ func releaseHistoryV2(storageBackend *v2storage.Storage, releaseName string) ([] return releaseHistory, len(releaseHistory) > 0, nil } -func releaseHistoryV3(storageBackend *v3storage.Storage, releaseName string) ([]*helmreleasev3.Release, bool, error) { +func releaseHistoryV3(storageBackend *storagev3.Storage, releaseName string) ([]*helmreleasev3.Release, bool, error) { releaseHistory, err := storageBackend.History(releaseName) if err != nil { if notFoundErr(err) { diff --git a/test/test-framework/go.sum b/test/test-framework/go.sum index 7b329917e4..754447dd38 100644 --- a/test/test-framework/go.sum +++ b/test/test-framework/go.sum @@ -890,6 +890,7 @@ gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81 gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/gotestsum v0.3.5/go.mod h1:Mnf3e5FUzXbkCfynWBGOwLssY7gTQgCHObK9tMpAriY= helm.sh/helm/v3 v3.0.0/go.mod h1:sI7B9yfvMgxtTPMWdk1jSKJ2aa59UyP9qhPydqW6mgo= +helm.sh/helm/v3 v3.0.1/go.mod h1:sI7B9yfvMgxtTPMWdk1jSKJ2aa59UyP9qhPydqW6mgo= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From c45d24a49094e589d733583b38a70e50a2c52e41 Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Tue, 10 Dec 2019 12:07:14 -0500 Subject: [PATCH 07/12] helm: fix golangci-lint errors --- internal/scaffold/helm/role.go | 23 ++--------- internal/scaffold/helm/role_test.go | 60 +++++++++-------------------- pkg/helm/client/client.go | 2 +- pkg/helm/release/manager.go | 8 ++-- 4 files changed, 27 insertions(+), 66 deletions(-) diff --git a/internal/scaffold/helm/role.go b/internal/scaffold/helm/role.go index 564da36704..198dd59325 100644 --- a/internal/scaffold/helm/role.go +++ b/internal/scaffold/helm/role.go @@ -31,15 +31,12 @@ import ( rbacv1 "k8s.io/api/rbac/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/version" - "k8s.io/client-go/discovery" ) // roleDiscoveryInterface is an interface that contains just the discovery // methods needed by the Helm role scaffold generator. Requiring just this // interface simplifies testing. type roleDiscoveryInterface interface { - discovery.ServerVersionInterface ServerResources() ([]*metav1.APIResourceList, error) } @@ -95,12 +92,12 @@ func GenerateRoleScaffold(dc roleDiscoveryInterface, chart *chart.Chart) scaffol } func generateRoleRules(dc roleDiscoveryInterface, chart *chart.Chart) ([]rbacv1.PolicyRule, []rbacv1.PolicyRule, error) { - kubeVersion, serverResources, err := getServerVersionAndResources(dc) + serverResources, err := dc.ServerResources() if err != nil { - return nil, nil, fmt.Errorf("failed to get server info: %s", err) + return nil, nil, fmt.Errorf("failed to get server resources: %s", err) } - manifests, err := getDefaultManifests(chart, kubeVersion) + manifests, err := getDefaultManifests(chart) if err != nil { return nil, nil, fmt.Errorf("failed to get default manifest: %s", err) } @@ -173,19 +170,7 @@ func generateRoleRules(dc roleDiscoveryInterface, chart *chart.Chart) ([]rbacv1. return clusterRules, namespacedRules, nil } -func getServerVersionAndResources(dc roleDiscoveryInterface) (*version.Info, []*metav1.APIResourceList, error) { - kubeVersion, err := dc.ServerVersion() - if err != nil { - return nil, nil, fmt.Errorf("failed to get kubernetes server version: %s", err) - } - serverResources, err := dc.ServerResources() - if err != nil { - return nil, nil, fmt.Errorf("failed to get kubernetes server resources: %s", err) - } - return kubeVersion, serverResources, nil -} - -func getDefaultManifests(c *chart.Chart, kubeVersion *version.Info) ([]releaseutil.Manifest, error) { +func getDefaultManifests(c *chart.Chart) ([]releaseutil.Manifest, error) { install := action.NewInstall(&action.Configuration{}) install.DryRun = true install.ReleaseName = "RELEASE-NAME" diff --git a/internal/scaffold/helm/role_test.go b/internal/scaffold/helm/role_test.go index 832a859ad0..b9b4c9c02e 100644 --- a/internal/scaffold/helm/role_test.go +++ b/internal/scaffold/helm/role_test.go @@ -24,29 +24,15 @@ import ( "github.com/stretchr/testify/assert" "helm.sh/helm/v3/pkg/chart" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/version" ) func TestGenerateRoleScaffold(t *testing.T) { - workingDcs := map[string]*mockRoleDiscoveryClient{ - "upstream": &mockRoleDiscoveryClient{ - serverVersion: func() (*version.Info, error) { return &version.Info{Major: "1", Minor: "11"}, nil }, - serverResources: func() ([]*metav1.APIResourceList, error) { return simpleResourcesList(), nil }, - }, - "openshift": &mockRoleDiscoveryClient{ - serverVersion: func() (*version.Info, error) { return &version.Info{Major: "1", Minor: "11+"}, nil }, - serverResources: func() ([]*metav1.APIResourceList, error) { return simpleResourcesList(), nil }, - }, + validDiscoveryClient := &mockRoleDiscoveryClient{ + serverResources: func() ([]*metav1.APIResourceList, error) { return simpleResourcesList(), nil }, } - brokenDcs := map[string]*mockRoleDiscoveryClient{ - "no server version": &mockRoleDiscoveryClient{ - serverVersion: func() (*version.Info, error) { return nil, errors.New("no server version") }, - serverResources: func() ([]*metav1.APIResourceList, error) { return simpleResourcesList(), nil }, - }, - "no server resources": &mockRoleDiscoveryClient{ - serverVersion: func() (*version.Info, error) { return &version.Info{Major: "1", Minor: "11"}, nil }, - serverResources: func() ([]*metav1.APIResourceList, error) { return nil, errors.New("no server resources") }, - }, + + brokenDiscoveryClient := &mockRoleDiscoveryClient{ + serverResources: func() ([]*metav1.APIResourceList, error) { return nil, errors.New("no server resources") }, } testCases := []roleScaffoldTestCase{ @@ -81,36 +67,26 @@ func TestGenerateRoleScaffold(t *testing.T) { } for _, tc := range testCases { - for dcName, dc := range workingDcs { - testName := fmt.Sprintf("%s %s", dcName, tc.name) - t.Run(testName, func(t *testing.T) { - roleScaffold := helm.GenerateRoleScaffold(dc, tc.chart) - assert.Equal(t, tc.expectSkipDefaultRules, roleScaffold.SkipDefaultRules) - assert.Equal(t, tc.expectLenCustomRules, len(roleScaffold.CustomRules)) - assert.Equal(t, tc.expectIsClusterScoped, roleScaffold.IsClusterScoped) - }) - } - for dcName, dc := range brokenDcs { - testName := fmt.Sprintf("%s %s", dcName, tc.name) - t.Run(testName, func(t *testing.T) { - roleScaffold := helm.GenerateRoleScaffold(dc, tc.chart) - assert.Equal(t, false, roleScaffold.SkipDefaultRules) - assert.Equal(t, 2, len(roleScaffold.CustomRules)) - assert.Equal(t, false, roleScaffold.IsClusterScoped) - }) - } + t.Run(fmt.Sprintf("%s with valid discovery client", tc.name), func(t *testing.T) { + roleScaffold := helm.GenerateRoleScaffold(validDiscoveryClient, tc.chart) + assert.Equal(t, tc.expectSkipDefaultRules, roleScaffold.SkipDefaultRules) + assert.Equal(t, tc.expectLenCustomRules, len(roleScaffold.CustomRules)) + assert.Equal(t, tc.expectIsClusterScoped, roleScaffold.IsClusterScoped) + }) + + t.Run(fmt.Sprintf("%s with broken discovery client", tc.name), func(t *testing.T) { + roleScaffold := helm.GenerateRoleScaffold(brokenDiscoveryClient, tc.chart) + assert.Equal(t, false, roleScaffold.SkipDefaultRules) + assert.Equal(t, 2, len(roleScaffold.CustomRules)) + assert.Equal(t, false, roleScaffold.IsClusterScoped) + }) } } type mockRoleDiscoveryClient struct { - serverVersion func() (*version.Info, error) serverResources func() ([]*metav1.APIResourceList, error) } -func (dc *mockRoleDiscoveryClient) ServerVersion() (*version.Info, error) { - return dc.serverVersion() -} - func (dc *mockRoleDiscoveryClient) ServerResources() ([]*metav1.APIResourceList, error) { return dc.serverResources() } diff --git a/pkg/helm/client/client.go b/pkg/helm/client/client.go index 3e74e256ee..ecbfea93bf 100644 --- a/pkg/helm/client/client.go +++ b/pkg/helm/client/client.go @@ -59,7 +59,7 @@ func (c *restClientGetter) ToRawKubeConfigLoader() clientcmd.ClientConfig { return nil } -func NewRESTClientGetter(mgr manager.Manager) (*restClientGetter, error) { +func NewRESTClientGetter(mgr manager.Manager) (genericclioptions.RESTClientGetter, error) { cfg := mgr.GetConfig() dc, err := discovery.NewDiscoveryClientForConfig(cfg) if err != nil { diff --git a/pkg/helm/release/manager.go b/pkg/helm/release/manager.go index 34746fb965..0ef0c169f9 100644 --- a/pkg/helm/release/manager.go +++ b/pkg/helm/release/manager.go @@ -119,7 +119,7 @@ func (m *manager) Sync(ctx context.Context) error { m.isInstalled = true // Get the next candidate release to determine if an update is necessary. - candidateRelease, err := m.getCandidateRelease(ctx, m.namespace, m.releaseName, m.chart, m.values) + candidateRelease, err := m.getCandidateRelease(m.namespace, m.releaseName, m.chart, m.values) if err != nil { return fmt.Errorf("failed to get candidate release: %s", err) } @@ -145,7 +145,7 @@ func (m manager) getDeployedRelease() (*rpb.Release, error) { return deployedRelease, nil } -func (m manager) getCandidateRelease(ctx context.Context, namespace, name string, chart *cpb.Chart, values map[string]interface{}) (*rpb.Release, error) { +func (m manager) getCandidateRelease(namespace, name string, chart *cpb.Chart, values map[string]interface{}) (*rpb.Release, error) { upgrade := action.NewUpgrade(m.actionConfig) upgrade.Namespace = namespace upgrade.DryRun = true @@ -212,11 +212,11 @@ func (m manager) UpdateRelease(ctx context.Context) (*rpb.Release, *rpb.Release, // ReconcileRelease creates or patches resources as necessary to match the // deployed release's manifest. func (m manager) ReconcileRelease(ctx context.Context) (*rpb.Release, error) { - err := reconcileRelease(ctx, m.kubeClient, m.namespace, m.deployedRelease.Manifest) + err := reconcileRelease(ctx, m.kubeClient, m.deployedRelease.Manifest) return m.deployedRelease, err } -func reconcileRelease(ctx context.Context, kubeClient kube.Interface, namespace string, expectedManifest string) error { +func reconcileRelease(ctx context.Context, kubeClient kube.Interface, expectedManifest string) error { expectedInfos, err := kubeClient.Build(bytes.NewBufferString(expectedManifest), false) if err != nil { return err From 72123f8506a74f5894c104322f326f3f041e0dec Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Wed, 11 Dec 2019 10:17:53 -0500 Subject: [PATCH 08/12] pkg/helm: remove unused engine package --- pkg/helm/engine/doc.go | 17 ---- pkg/helm/engine/ownerref.go | 151 ------------------------------- pkg/helm/engine/ownerref_test.go | 144 ----------------------------- 3 files changed, 312 deletions(-) delete mode 100644 pkg/helm/engine/doc.go delete mode 100644 pkg/helm/engine/ownerref.go delete mode 100644 pkg/helm/engine/ownerref_test.go diff --git a/pkg/helm/engine/doc.go b/pkg/helm/engine/doc.go deleted file mode 100644 index 895b595666..0000000000 --- a/pkg/helm/engine/doc.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2018 The Operator-SDK Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package engine provides an implementation of Helm's templating engine -// required for a Helm operator. -package engine diff --git a/pkg/helm/engine/ownerref.go b/pkg/helm/engine/ownerref.go deleted file mode 100644 index 812e92109b..0000000000 --- a/pkg/helm/engine/ownerref.go +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2018 The Operator-SDK Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package engine - -/* -import ( - "bytes" - "fmt" - "sort" - "strings" - - "helm.sh/helm/v3/pkg/chart" - "helm.sh/helm/v3/pkg/chartutil" - "helm.sh/helm/v3/pkg/releaseutil" - "helm.sh/helm/v3/pkg/tiller/environment" - "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" -) - -// OwnerRefEngine wraps a tiller Render engine, adding ownerrefs to rendered assets -type OwnerRefEngine struct { - environment.Engine - - restMapper meta.RESTMapper - refs []metav1.OwnerReference -} - -// assert interface -var _ environment.Engine = &OwnerRefEngine{} - -// Render proxies to the wrapped Render engine and then adds ownerRefs to each rendered file -func (o *OwnerRefEngine) Render(chart *chart.Chart, values chartutil.Values) (map[string]string, error) { - rendered, err := o.Engine.Render(chart, values) - if err != nil { - return nil, err - } - - ownedRenderedFiles := map[string]string{} - for fileName, renderedFile := range rendered { - if !strings.HasSuffix(fileName, ".yaml") { - // Pass non-YAML files through untouched. - // This is required for NOTES.txt - ownedRenderedFiles[fileName] = renderedFile - continue - } - withOwner, err := o.addOwnerRefs(renderedFile) - if err != nil { - return nil, err - } - if withOwner == "" { - continue - } - ownedRenderedFiles[fileName] = withOwner - } - return ownedRenderedFiles, nil -} - -// addOwnerRefs adds the configured ownerRefs to a single rendered file -// Adds the ownerrefs to all the documents in a YAML file -func (o *OwnerRefEngine) addOwnerRefs(fileContents string) (string, error) { - const documentSeparator = "---\n" - var outBuf bytes.Buffer - - manifests := releaseutil.SplitManifests(fileContents) - for _, manifest := range sortManifests(manifests) { - manifestMap := chartutil.FromYaml(manifest) - if errors, ok := manifestMap["Error"]; ok { - return "", fmt.Errorf("error parsing rendered template to add ownerrefs: %v", errors) - } - - // Check if the document is empty - if len(manifestMap) == 0 { - continue - } - - unst, err := runtime.DefaultUnstructuredConverter.ToUnstructured(&manifestMap) - if err != nil { - return "", err - } - - unstructured := &unstructured.Unstructured{Object: unst} - - // Get the REST mapping for the GVK to determine its scope. - gvk := unstructured.GroupVersionKind() - mapping, err := o.restMapper.RESTMapping(gvk.GroupKind(), gvk.Version) - if err != nil { - return "", err - } - - // If the GVK is namespace-scoped, add owner references to this - // resource. We don't do this for cluster-scoped manifest resources - // since a namespace-scoped resource (the CR) cannot own a - // cluster-scoped resource. - // - // NOTE: the helm-operator that uses this engine ALSO uses a finalizer - // that ensures that the release is uninstalled via the built-in - // tiller, so manual cleanup of cluster-scoped dependent resources - // should not be necessary. - if mapping.Scope == meta.RESTScopeNamespace { - unstructured.SetOwnerReferences(o.refs) - } - - // Write the document with to the buffer - // Also add document start marker - _, err = outBuf.WriteString(documentSeparator + chartutil.ToYaml(unstructured.Object)) - if err != nil { - return "", fmt.Errorf("error writing the document to buffer: %v", err) - } - } - - return outBuf.String(), nil -} - -// NewOwnerRefEngine creates a new OwnerRef engine with a set of metav1.OwnerReferences to be added to assets -func NewOwnerRefEngine(baseEngine environment.Engine, restMapper meta.RESTMapper, refs []metav1.OwnerReference) environment.Engine { - return &OwnerRefEngine{ - Engine: baseEngine, - - restMapper: restMapper, - refs: refs, - } -} - -func sortManifests(in map[string]string) []string { - var keys []string - for k := range in { - keys = append(keys, k) - } - sort.Strings(keys) - - var manifests []string - for _, k := range keys { - manifests = append(manifests, in[k]) - } - return manifests -} -*/ diff --git a/pkg/helm/engine/ownerref_test.go b/pkg/helm/engine/ownerref_test.go deleted file mode 100644 index 0500944ebf..0000000000 --- a/pkg/helm/engine/ownerref_test.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2018 The Operator-SDK Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package engine - -/* -import ( - "fmt" - "strings" - "testing" - - "github.com/stretchr/testify/require" - "helm.sh/helm/v3/pkg/chart" - "helm.sh/helm/v3/pkg/chartutil" - "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -type mockEngine struct { - out map[string]string -} - -func (e *mockEngine) Render(chrt *chart.Chart, v chartutil.Values) (map[string]string, error) { - return e.out, nil -} - -type testCase struct { - input map[string]string - expected map[string]string -} - -type restMapping struct { - gvk schema.GroupVersionKind - scope meta.RESTScope -} - -func genTemplate(resourceCount int, withLeadingSep bool, gvk schema.GroupVersionKind, ownerRefs []metav1.OwnerReference) string { - sb := &strings.Builder{} - - for i := 0; i < resourceCount; i++ { - if withLeadingSep || i > 0 { - sb.WriteString("---\n") - } - sb.WriteString(fmt.Sprintf("apiVersion: %s/%s\nkind: %s\nmetadata:\n name: example-%s-%d\n", gvk.Group, gvk.Version, gvk.Kind, strings.ToLower(gvk.Kind), i)) - if len(ownerRefs) > 0 { - sb.WriteString(" ownerReferences:\n") - } - for _, or := range ownerRefs { - sb.WriteString(fmt.Sprintf(" - apiVersion: %s\n kind: %s\n name: %s\n uid: %q\n", or.APIVersion, or.Kind, or.Name, or.UID)) - } - sb.WriteString(fmt.Sprintf("spec:\n value: value-%d\n", i)) - } - return sb.String() -} - -func TestOwnerRefEngine(t *testing.T) { - ownerRefs := []metav1.OwnerReference{ - { - APIVersion: "v1", - Kind: "Test", - Name: "test", - UID: "123", - }, - } - - ns := restMapping{ - gvk: schema.GroupVersionKind{ - Group: "app.example.com", - Version: "v1", - Kind: "App", - }, - scope: meta.RESTScopeNamespace, - } - cs := restMapping{ - gvk: schema.GroupVersionKind{ - Group: "app.example.com", - Version: "v1", - Kind: "ClusterApp", - }, - scope: meta.RESTScopeRoot, - } - restMapper := meta.NewDefaultRESTMapper(nil) - restMapper.Add(ns.gvk, ns.scope) - restMapper.Add(cs.gvk, cs.scope) - - testCases := []testCase{ - { - input: map[string]string{ - "template1.yaml": genTemplate(1, false, ns.gvk, nil), - "template2.yaml": genTemplate(1, false, cs.gvk, nil), - "template3.yaml": genTemplate(2, true, ns.gvk, nil), - "template4.yaml": genTemplate(2, true, cs.gvk, nil), - "template5.yaml": fmt.Sprintf("%s%s", - genTemplate(1, true, ns.gvk, nil), - genTemplate(1, true, cs.gvk, nil), - ), - "template6.yaml": fmt.Sprintf("%s%s", - genTemplate(1, true, cs.gvk, nil), - genTemplate(1, true, ns.gvk, nil), - ), - "empty.yaml": "", - "comment.yaml": "# This is empty", - }, - expected: map[string]string{ - "template1.yaml": genTemplate(1, true, ns.gvk, ownerRefs), - "template2.yaml": genTemplate(1, true, cs.gvk, nil), - "template3.yaml": genTemplate(2, true, ns.gvk, ownerRefs), - "template4.yaml": genTemplate(2, true, cs.gvk, nil), - "template5.yaml": fmt.Sprintf("%s%s", - genTemplate(1, true, ns.gvk, ownerRefs), - genTemplate(1, true, cs.gvk, nil), - ), - "template6.yaml": fmt.Sprintf("%s%s", - genTemplate(1, true, cs.gvk, nil), - genTemplate(1, true, ns.gvk, ownerRefs), - ), - }, - }, - } - - for _, tc := range testCases { - engine := NewOwnerRefEngine(&mockEngine{out: tc.input}, restMapper, ownerRefs) - out, err := engine.Render(&chart.Chart{}, map[string]interface{}{}) - require.NoError(t, err) - for expectedKey, expectedValue := range tc.expected { - actualValue, actualKeyExists := out[expectedKey] - require.True(t, actualKeyExists, "Did not find expected template %q in output", expectedKey) - require.EqualValues(t, expectedValue, actualValue) - } - } -} -*/ From e920b945c972dd67740e7c6e628ababe934c840e Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Wed, 11 Dec 2019 10:18:09 -0500 Subject: [PATCH 09/12] pkg/helm/watches: improve test coverage --- pkg/helm/watches/watches_test.go | 114 +++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 pkg/helm/watches/watches_test.go diff --git a/pkg/helm/watches/watches_test.go b/pkg/helm/watches/watches_test.go new file mode 100644 index 0000000000..b9bf067e69 --- /dev/null +++ b/pkg/helm/watches/watches_test.go @@ -0,0 +1,114 @@ +// Copyright 2019 The Operator-SDK Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package watches + +import ( + "io/ioutil" + "os" + "testing" +) + +type testCase struct { + name string + data string + expectErr bool +} + +func TestLoadWatches(t *testing.T) { + testCases := []testCase{ + { + name: "valid", + data: `--- +- group: mygroup + version: v1alpha1 + kind: MyKind + chart: ../../../internal/scaffold/helm/testdata/testcharts/test-chart +`, + expectErr: false, + }, + { + name: "duplicate gvk", + data: `--- +- group: mygroup + version: v1alpha1 + kind: MyKind + chart: ../../../internal/scaffold/helm/testdata/testcharts/test-chart +- group: mygroup + version: v1alpha1 + kind: MyKind + chart: ../../../internal/scaffold/helm/testdata/testcharts/test-chart +`, + expectErr: true, + }, + { + name: "no version", + data: `--- +- group: mygroup + kind: MyKind + chart: ../../../internal/scaffold/helm/testdata/testcharts/test-chart +`, + expectErr: true, + }, + { + name: "no kind", + data: `--- +- group: mygroup + version: v1alpha1 + chart: ../../../internal/scaffold/helm/testdata/testcharts/test-chart +`, + expectErr: true, + }, + { + name: "bad chart path", + data: `--- +- group: mygroup + version: v1alpha1 + kind: MyKind + chart: nonexistent/path/to/chart +`, + expectErr: true, + }, + { + name: "invalid yaml", + data: `--- +foo: bar +`, + expectErr: true, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + tmp, err := ioutil.TempFile("", "watches.yaml") + if err != nil { + t.Fatalf("Failed to create temporary watches.yaml file: %w", err) + } + defer func() { _ = os.Remove(tmp.Name()) }() + if _, err := tmp.WriteString(tc.data); err != nil { + t.Fatalf("Failed to write data to temporary watches.yaml file: %w", err) + } + if err := tmp.Close(); err != nil { + t.Fatalf("Failed to close temporary watches.yaml file: %w", err) + } + + _, err = Load(tmp.Name()) + if !tc.expectErr && err != nil { + t.Fatalf("Expected no error; got error: %w", err) + } else if tc.expectErr && err == nil { + t.Fatalf("Expected error; got no error") + } + }) + } +} From a75826a0f2b0ed76be8a96740e300d3a83e299b0 Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Wed, 11 Dec 2019 10:18:36 -0500 Subject: [PATCH 10/12] pkg/helm: move ownerref-injecting client to client package --- pkg/helm/client/client.go | 45 +++++++++++++++++++++ pkg/helm/release/manager_factory.go | 61 ++++++++--------------------- 2 files changed, 62 insertions(+), 44 deletions(-) diff --git a/pkg/helm/client/client.go b/pkg/helm/client/client.go index ecbfea93bf..114195a862 100644 --- a/pkg/helm/client/client.go +++ b/pkg/helm/client/client.go @@ -15,9 +15,15 @@ package client import ( + "io" + "helm.sh/helm/v3/pkg/kube" "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/cli-runtime/pkg/genericclioptions" + "k8s.io/cli-runtime/pkg/resource" "k8s.io/client-go/discovery" cached "k8s.io/client-go/discovery/cached" "k8s.io/client-go/rest" @@ -74,3 +80,42 @@ func NewRESTClientGetter(mgr manager.Manager) (genericclioptions.RESTClientGette restMapper: rm, }, nil } + +var _ kube.Interface = &ownerRefInjectingClient{} + +func NewOwnerRefInjectingClient(base kube.Client, ownerRef metav1.OwnerReference) kube.Interface { + return &ownerRefInjectingClient{ + refs: []metav1.OwnerReference{ownerRef}, + Client: base, + } +} + +type ownerRefInjectingClient struct { + refs []metav1.OwnerReference + kube.Client +} + +func (c *ownerRefInjectingClient) Build(reader io.Reader, validate bool) (kube.ResourceList, error) { + resourceList, err := c.Client.Build(reader, validate) + if err != nil { + return resourceList, err + } + err = resourceList.Visit(func(r *resource.Info, err error) error { + if err != nil { + return err + } + objMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(r.Object) + if err != nil { + return err + } + u := &unstructured.Unstructured{Object: objMap} + if r.ResourceMapping().Scope == meta.RESTScopeNamespace { + u.SetOwnerReferences(c.refs) + } + return nil + }) + if err != nil { + return nil, err + } + return resourceList, nil +} diff --git a/pkg/helm/release/manager_factory.go b/pkg/helm/release/manager_factory.go index 3758666ae2..f96444e47d 100644 --- a/pkg/helm/release/manager_factory.go +++ b/pkg/helm/release/manager_factory.go @@ -16,7 +16,6 @@ package release import ( "fmt" - "io" "strings" helm2to3 "github.com/helm/helm-2to3/pkg/v3" @@ -28,12 +27,9 @@ import ( helmreleasev3 "helm.sh/helm/v3/pkg/release" storagev3 "helm.sh/helm/v3/pkg/storage" driverv3 "helm.sh/helm/v3/pkg/storage/driver" - "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" apitypes "k8s.io/apimachinery/pkg/types" - "k8s.io/cli-runtime/pkg/resource" v1 "k8s.io/client-go/kubernetes/typed/core/v1" helmreleasev2 "k8s.io/helm/pkg/proto/hapi/release" storagev2 "k8s.io/helm/pkg/storage" @@ -63,46 +59,53 @@ func NewManagerFactory(mgr crmanager.Manager, chartDir string) ManagerFactory { } func (f managerFactory) NewManager(cr *unstructured.Unstructured) (Manager, error) { + // Get both v2 and v3 storage backends clientv1, err := v1.NewForConfig(f.mgr.GetConfig()) if err != nil { return nil, fmt.Errorf("failed to get core/v1 client: %w", err) } - storageBackendV2 := storagev2.Init(driverv2.NewSecrets(clientv1.Secrets(cr.GetNamespace()))) storageBackendV3 := storagev3.Init(driverv3.NewSecrets(clientv1.Secrets(cr.GetNamespace()))) + // Automatically convert V2 releases to V3 releases. This is required to + // maintain backward compatibility with old releases now that the + // operator reconciliation loop expects Helm V3 releases. if err := convertV2ToV3(storageBackendV2, storageBackendV3, cr); err != nil { return nil, fmt.Errorf("failed to convert releases from v2 to v3: %w", err) } + // Get the necessary clients and client getters. Use a client that injects the CR + // as an owner reference into all resources templated by the chart. rcg, err := client.NewRESTClientGetter(f.mgr) if err != nil { return nil, fmt.Errorf("failed to get REST client getter from manager: %w", err) } kubeClient := kube.New(nil) + ownerRef := metav1.NewControllerRef(cr, cr.GroupVersionKind()) + ownerRefClient := client.NewOwnerRefInjectingClient(*kubeClient, *ownerRef) + crChart, err := loader.LoadDir(f.chartDir) if err != nil { return nil, fmt.Errorf("failed to load chart dir: %w", err) } + releaseName, err := getReleaseName(storageBackendV3, crChart.Name(), cr) if err != nil { return nil, fmt.Errorf("failed to get helm release name: %w", err) } + values, ok := cr.Object["spec"].(map[string]interface{}) if !ok { return nil, fmt.Errorf("failed to get spec: expected map[string]interface{}") } - controllerRef := metav1.NewControllerRef(cr, cr.GroupVersionKind()) - ownerRefClient := &ownerRefInjectingClient{ - refs: []metav1.OwnerReference{*controllerRef}, - Client: *kubeClient, - } + actionConfig := &action.Configuration{ RESTClientGetter: rcg, Releases: storageBackendV3, KubeClient: ownerRefClient, Log: func(_ string, _ ...interface{}) {}, } + return &manager{ actionConfig: actionConfig, storageBackend: storageBackendV3, @@ -117,36 +120,6 @@ func (f managerFactory) NewManager(cr *unstructured.Unstructured) (Manager, erro }, nil } -type ownerRefInjectingClient struct { - refs []metav1.OwnerReference - kube.Client -} - -func (c *ownerRefInjectingClient) Build(reader io.Reader, validate bool) (kube.ResourceList, error) { - resourceList, err := c.Client.Build(reader, validate) - if err != nil { - return resourceList, err - } - err = resourceList.Visit(func(r *resource.Info, err error) error { - if err != nil { - return err - } - objMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(r.Object) - if err != nil { - return err - } - u := &unstructured.Unstructured{Object: objMap} - if r.ResourceMapping().Scope == meta.RESTScopeNamespace { - u.SetOwnerReferences(c.refs) - } - return nil - }) - if err != nil { - return nil, err - } - return resourceList, nil -} - func convertV2ToV3(storageBackendV2 *storagev2.Storage, storageBackendV3 *storagev3.Storage, cr *unstructured.Unstructured) error { // If a v2 release with the legacy name exists, convert it to v3. legacyName := getLegacyName(cr) @@ -217,10 +190,10 @@ func getLegacyName(cr *unstructured.Unstructured) string { // identifying names or characters added by templates. // // TODO(jlanford): As noted above, using the CR name as the release name raises -// the possibility of collision. We should move this logic to a validating -// admission webhook so that the CR owner receives immediate feedback of the -// collision. As is, the only indication of collision will be in the CR status -// and operator logs. +// the possibility of collision. We should move this logic to a validating +// admission webhook so that the CR owner receives immediate feedback of the +// collision. As is, the only indication of collision will be in the CR status +// and operator logs. func getReleaseName(storageBackend *storagev3.Storage, crChartName string, cr *unstructured.Unstructured) (string, error) { // If a release with the legacy name exists as a v3 release, // return the legacy name. From f502b71c40ebf1435f4a61d6038b1d07e4a44e9d Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Wed, 11 Dec 2019 12:08:20 -0500 Subject: [PATCH 11/12] CHANGELOG.md: add line for Helm v3 upgrade (#2080) --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad909834b5..661eafef16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ ### Changed - Replace usage of `github.com/operator-framework/operator-sdk/pkg/restmapper.DynamicRESTMapper` with `sigs.k8s.io/controller-runtime/pkg/client/apiutil.DynamicRESTMapper`. ([#2309](https://github.com/operator-framework/operator-sdk/pull/2309)) +- Upgraded Helm operator packages and base image from Helm v2 to Helm v3. Cluster state for pre-existing CRs using Helm v2-based operators will be automatically migrated to Helm v3's new release storage format, and existing releases may be upgraded due to changes in Helm v3's label injection. ([#2080](https://github.com/operator-framework/operator-sdk/pull/2080)) ### Deprecated From 18fc222c89fbd11220b294176cef390759f4510a Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Wed, 11 Dec 2019 23:52:53 -0500 Subject: [PATCH 12/12] doc/helm/dev/developer_guide.md: whitespace fixes --- doc/helm/dev/developer_guide.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/doc/helm/dev/developer_guide.md b/doc/helm/dev/developer_guide.md index 555ebfdb3f..301c5fd47c 100644 --- a/doc/helm/dev/developer_guide.md +++ b/doc/helm/dev/developer_guide.md @@ -27,18 +27,18 @@ time. To do this, initialize a new project: ```sh $ operator-sdk new --type helm --kind Foo --api-version foo.example.com/v1alpha1 foo-operator -INFO[0000] Creating new Helm operator 'foo-operator'. -INFO[0000] Created helm-charts/foo -INFO[0000] Generating RBAC rules -WARN[0000] The RBAC rules generated in deploy/role.yaml are based on the chart's default manifest. Some rules may be missing for resources that are only enabled with custom values, and some existing rules may be overly broad. Double check the rules generated in deploy/role.yaml to ensure they meet the operator's permission requirements. -INFO[0000] Created build/Dockerfile -INFO[0000] Created watches.yaml -INFO[0000] Created deploy/service_account.yaml -INFO[0000] Created deploy/role.yaml -INFO[0000] Created deploy/role_binding.yaml -INFO[0000] Created deploy/operator.yaml -INFO[0000] Created deploy/crds/foo.example.com_foos_crd.yaml -INFO[0000] Created deploy/crds/foo.example.com_v1alpha1_foo_cr.yaml +INFO[0000] Creating new Helm operator 'foo-operator'. +INFO[0000] Created helm-charts/foo +INFO[0000] Generating RBAC rules +WARN[0000] The RBAC rules generated in deploy/role.yaml are based on the chart's default manifest. Some rules may be missing for resources that are only enabled with custom values, and some existing rules may be overly broad. Double check the rules generated in deploy/role.yaml to ensure they meet the operator's permission requirements. +INFO[0000] Created build/Dockerfile +INFO[0000] Created watches.yaml +INFO[0000] Created deploy/service_account.yaml +INFO[0000] Created deploy/role.yaml +INFO[0000] Created deploy/role_binding.yaml +INFO[0000] Created deploy/operator.yaml +INFO[0000] Created deploy/crds/foo.example.com_foos_crd.yaml +INFO[0000] Created deploy/crds/foo.example.com_v1alpha1_foo_cr.yaml INFO[0000] Project creation complete. $ cd foo-operator @@ -49,7 +49,7 @@ For this example we will use the default Nginx helm chart scaffolded by release manifests are: ```sh -$ helm install --dry-run test-release helm-charts/foo +$ helm install --dry-run test-release helm-charts/foo NAME: test-release LAST DEPLOYED: Wed Nov 27 15:41:10 2019 NAMESPACE: default @@ -361,7 +361,7 @@ metadata: name: example-foo spec: # Default values copied from /helm-charts/foo/values.yaml - + affinity: {} fullnameOverride: "" image: @@ -506,7 +506,7 @@ NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE foo-operator 1 1 1 1 1m ``` -Apply the CR to Kubernetes and confirm that the release resources have been +Apply the CR to Kubernetes and confirm that the release resources have been created: ```sh