diff --git a/cmd/preflight/cli/receive.go b/cmd/preflight/cli/receive.go index dcc511006..80222bb5a 100644 --- a/cmd/preflight/cli/receive.go +++ b/cmd/preflight/cli/receive.go @@ -13,7 +13,7 @@ import ( func receivePreflightResults(preflightJobNamespace string, preflightJobName string) error { // poll until there are no more "running" collectors - troubleshootClient, err := createTroubleshootK8sClient() + troubleshootClient, err := createTroubleshootK8sClient(KubernetesConfigFlags) if err != nil { return err } diff --git a/cmd/preflight/cli/root.go b/cmd/preflight/cli/root.go index b5fbcc458..caf1a5e27 100644 --- a/cmd/preflight/cli/root.go +++ b/cmd/preflight/cli/root.go @@ -3,12 +3,16 @@ package cli import ( "fmt" "os" - "path/filepath" "strings" troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1" "github.com/spf13/cobra" "github.com/spf13/viper" + "k8s.io/cli-runtime/pkg/genericclioptions" +) + +var ( + KubernetesConfigFlags *genericclioptions.ConfigFlags ) func RootCmd() *cobra.Command { @@ -35,12 +39,7 @@ that a cluster meets the requirements to run an application.`, cmd.Flags().Bool("interactive", true, "interactive preflights") cmd.Flags().String("format", "human", "output format, one of human, json, yaml. only used when interactive is set to false") - cmd.Flags().String("preflight", "", "name of the preflight to use") - cmd.Flags().String("namespace", "default", "namespace the preflight can be found in") - - cmd.Flags().String("kubecontext", filepath.Join(homeDir(), ".kube", "config"), "the kubecontext to use when connecting") - cmd.Flags().String("image", "", "the full name of the preflight image to use") cmd.Flags().String("pullpolicy", "", "the pull policy of the preflight image") cmd.Flags().String("collector-image", "", "the full name of the collector image to use") @@ -49,6 +48,10 @@ that a cluster meets the requirements to run an application.`, cmd.Flags().String("serviceaccount", "", "name of the service account to use. if not provided, one will be created") viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_")) + + KubernetesConfigFlags = genericclioptions.NewConfigFlags(false) + KubernetesConfigFlags.AddFlags(cmd.Flags()) + return cmd } diff --git a/cmd/preflight/cli/run_crd.go b/cmd/preflight/cli/run_crd.go index 002e99327..bbf3a7f46 100644 --- a/cmd/preflight/cli/run_crd.go +++ b/cmd/preflight/cli/run_crd.go @@ -1,10 +1,10 @@ package cli import ( - "errors" "fmt" "time" + "github.com/pkg/errors" troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1" "github.com/replicatedhq/troubleshoot/pkg/k8sutil" "github.com/spf13/viper" @@ -13,7 +13,7 @@ import ( ) func runPreflightsCRD(v *viper.Viper) error { - troubleshootClient, err := createTroubleshootK8sClient() + troubleshootClient, err := createTroubleshootK8sClient(KubernetesConfigFlags) if err != nil { return err } @@ -86,8 +86,12 @@ func runPreflightsCRD(v *viper.Viper) error { time.Sleep(time.Millisecond * 200) } - // Connect to the callback - stopChan, err := k8sutil.PortForward(v.GetString("kubecontext"), 8000, 8000, found.Status.ServerPodNamespace, found.Status.ServerPodName) + config, err := KubernetesConfigFlags.ToRESTConfig() + if err != nil { + return errors.Wrap(err, "failed to convert kube flags to rest config") + } + + stopChan, err := k8sutil.PortForward(config, 8000, 8000, found.Status.ServerPodNamespace, found.Status.ServerPodName) if err != nil { return err } diff --git a/cmd/preflight/cli/run_nocrd.go b/cmd/preflight/cli/run_nocrd.go index cd2dbbbe0..8f5d78c93 100644 --- a/cmd/preflight/cli/run_nocrd.go +++ b/cmd/preflight/cli/run_nocrd.go @@ -138,11 +138,17 @@ func runCollectors(v *viper.Viper, preflight troubleshootv1beta1.Preflight) (map allCollectedData := make(map[string][]byte) + config, err := KubernetesConfigFlags.ToRESTConfig() + if err != nil { + return nil, errors.Wrap(err, "failed to convert kube flags to rest config") + } + // Run preflights collectors synchronously for _, desiredCollector := range desiredCollectors { collector := collect.Collector{ - Redact: true, - Collect: desiredCollector, + Redact: true, + Collect: desiredCollector, + ClientConfig: config, } result, err := collector.RunCollectorSync() diff --git a/cmd/preflight/cli/util.go b/cmd/preflight/cli/util.go index b9a7b3b4f..8c90938ea 100644 --- a/cmd/preflight/cli/util.go +++ b/cmd/preflight/cli/util.go @@ -4,9 +4,9 @@ import ( "net/url" "os" + "github.com/pkg/errors" troubleshootclientv1beta1 "github.com/replicatedhq/troubleshoot/pkg/client/troubleshootclientset/typed/troubleshoot/v1beta1" - "github.com/spf13/viper" - "k8s.io/client-go/tools/clientcmd" + "k8s.io/cli-runtime/pkg/genericclioptions" ) func homeDir() string { @@ -25,16 +25,15 @@ func isURL(str string) bool { return true } -func createTroubleshootK8sClient() (*troubleshootclientv1beta1.TroubleshootV1beta1Client, error) { - v := viper.GetViper() - - config, err := clientcmd.BuildConfigFromFlags("", v.GetString("kubecontext")) +func createTroubleshootK8sClient(configFlags *genericclioptions.ConfigFlags) (*troubleshootclientv1beta1.TroubleshootV1beta1Client, error) { + config, err := configFlags.ToRESTConfig() if err != nil { - return nil, err + return nil, errors.Wrap(err, "failed to convert kube flags to rest config") } + troubleshootClient, err := troubleshootclientv1beta1.NewForConfig(config) if err != nil { - return nil, err + return nil, errors.Wrap(err, "failed to create troubleshoot client") } return troubleshootClient, nil diff --git a/cmd/troubleshoot/cli/receive.go b/cmd/troubleshoot/cli/receive.go index 79aae9a79..a93535bea 100644 --- a/cmd/troubleshoot/cli/receive.go +++ b/cmd/troubleshoot/cli/receive.go @@ -18,7 +18,7 @@ import ( func receiveSupportBundle(collectorJobNamespace string, collectorJobName string) error { // poll until there are no more "running" collectors - troubleshootClient, err := createTroubleshootK8sClient() + troubleshootClient, err := createTroubleshootK8sClient(KubernetesConfigFlags) if err != nil { return err } diff --git a/cmd/troubleshoot/cli/retrieve.go b/cmd/troubleshoot/cli/retrieve.go index c00a3f60a..b6ffd8b61 100644 --- a/cmd/troubleshoot/cli/retrieve.go +++ b/cmd/troubleshoot/cli/retrieve.go @@ -1,9 +1,7 @@ package cli import ( - "errors" - "path/filepath" - + "github.com/pkg/errors" troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1" "github.com/replicatedhq/troubleshoot/pkg/k8sutil" "github.com/replicatedhq/troubleshoot/pkg/logger" @@ -19,13 +17,11 @@ func Retrieve() *cobra.Command { Long: `...`, PreRun: func(cmd *cobra.Command, args []string) { viper.BindPFlag("collectors", cmd.Flags().Lookup("collectors")) - viper.BindPFlag("namespace", cmd.Flags().Lookup("namespace")) - viper.BindPFlag("kubecontext", cmd.Flags().Lookup("kubecontext")) }, RunE: func(cmd *cobra.Command, args []string) error { v := viper.GetViper() - troubleshootClient, err := createTroubleshootK8sClient() + troubleshootClient, err := createTroubleshootK8sClient(KubernetesConfigFlags) if err != nil { return err } @@ -53,7 +49,12 @@ func Retrieve() *cobra.Command { logger.Printf("connecting to collector job %s\n", collectorJob.Name) - stopChan, err := k8sutil.PortForward(v.GetString("kubecontext"), 8000, 8000, collectorJob.Status.ServerPodNamespace, collectorJob.Status.ServerPodName) + config, err := KubernetesConfigFlags.ToRESTConfig() + if err != nil { + return errors.Wrap(err, "failed to convert kube flags to rest config") + } + + stopChan, err := k8sutil.PortForward(config, 8000, 8000, collectorJob.Status.ServerPodNamespace, collectorJob.Status.ServerPodName) if err != nil { return err } @@ -70,9 +71,6 @@ func Retrieve() *cobra.Command { } cmd.Flags().String("collectors", "", "name of the collectors to use") - cmd.Flags().String("namespace", "", "namespace the collectors can be found in") - - cmd.Flags().String("kubecontext", filepath.Join(homeDir(), ".kube", "config"), "the kubecontext to use when connecting") viper.BindPFlags(cmd.Flags()) diff --git a/cmd/troubleshoot/cli/root.go b/cmd/troubleshoot/cli/root.go index a11309bca..fe7fae460 100644 --- a/cmd/troubleshoot/cli/root.go +++ b/cmd/troubleshoot/cli/root.go @@ -3,13 +3,17 @@ package cli import ( "fmt" "os" - "path/filepath" "strings" troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1" "github.com/replicatedhq/troubleshoot/pkg/logger" "github.com/spf13/cobra" "github.com/spf13/viper" + "k8s.io/cli-runtime/pkg/genericclioptions" +) + +var ( + KubernetesConfigFlags *genericclioptions.ConfigFlags ) func RootCmd() *cobra.Command { @@ -40,10 +44,6 @@ from a server that can be used to assist when troubleshooting a server.`, cmd.AddCommand(Analyze()) cmd.Flags().String("collectors", "", "name of the collectors to use") - cmd.Flags().String("namespace", "default", "namespace the collectors can be found in") - - cmd.Flags().String("kubecontext", filepath.Join(homeDir(), ".kube", "config"), "the kubecontext to use when connecting") - cmd.Flags().String("image", "", "the full name of the collector image to use") cmd.Flags().String("pullpolicy", "", "the pull policy of the collector image") cmd.Flags().Bool("redact", true, "enable/disable default redactions") @@ -52,6 +52,10 @@ from a server that can be used to assist when troubleshooting a server.`, viper.BindPFlags(cmd.Flags()) viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_")) + + KubernetesConfigFlags = genericclioptions.NewConfigFlags(false) + KubernetesConfigFlags.AddFlags(cmd.Flags()) + return cmd } diff --git a/cmd/troubleshoot/cli/run_crd.go b/cmd/troubleshoot/cli/run_crd.go index b3de258ad..d628137e5 100644 --- a/cmd/troubleshoot/cli/run_crd.go +++ b/cmd/troubleshoot/cli/run_crd.go @@ -1,10 +1,10 @@ package cli import ( - "errors" "fmt" "time" + "github.com/pkg/errors" troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1" "github.com/replicatedhq/troubleshoot/pkg/k8sutil" "github.com/spf13/viper" @@ -13,7 +13,7 @@ import ( ) func runTroubleshootCRD(v *viper.Viper) error { - troubleshootClient, err := createTroubleshootK8sClient() + troubleshootClient, err := createTroubleshootK8sClient(KubernetesConfigFlags) if err != nil { return err } @@ -85,8 +85,12 @@ func runTroubleshootCRD(v *viper.Viper) error { time.Sleep(time.Millisecond * 200) } - // Connect to the callback - stopChan, err := k8sutil.PortForward(v.GetString("kubecontext"), 8000, 8000, found.Status.ServerPodNamespace, found.Status.ServerPodName) + config, err := KubernetesConfigFlags.ToRESTConfig() + if err != nil { + return errors.Wrap(err, "failed to convert kube flags to rest config") + } + + stopChan, err := k8sutil.PortForward(config, 8000, 8000, found.Status.ServerPodNamespace, found.Status.ServerPodName) if err != nil { return err } diff --git a/cmd/troubleshoot/cli/run_nocrd.go b/cmd/troubleshoot/cli/run_nocrd.go index db26f52a5..de7089968 100644 --- a/cmd/troubleshoot/cli/run_nocrd.go +++ b/cmd/troubleshoot/cli/run_nocrd.go @@ -152,11 +152,17 @@ func runCollectors(v *viper.Viper, collector troubleshootv1beta1.Collector, prog collectorDirs := []string{} + config, err := KubernetesConfigFlags.ToRESTConfig() + if err != nil { + return "", errors.Wrap(err, "failed to convert kube flags to rest config") + } + // Run preflights collectors synchronously for _, desiredCollector := range desiredCollectors { collector := collect.Collector{ - Redact: true, - Collect: desiredCollector, + Redact: true, + Collect: desiredCollector, + ClientConfig: config, } result, err := collector.RunCollectorSync() diff --git a/cmd/troubleshoot/cli/util.go b/cmd/troubleshoot/cli/util.go index 9f9519c0a..d8f4cd1fa 100644 --- a/cmd/troubleshoot/cli/util.go +++ b/cmd/troubleshoot/cli/util.go @@ -7,8 +7,7 @@ import ( "github.com/pkg/errors" troubleshootclientv1beta1 "github.com/replicatedhq/troubleshoot/pkg/client/troubleshootclientset/typed/troubleshoot/v1beta1" - "github.com/spf13/viper" - "k8s.io/client-go/tools/clientcmd" + "k8s.io/cli-runtime/pkg/genericclioptions" ) func homeDir() string { @@ -27,16 +26,15 @@ func isURL(str string) bool { return true } -func createTroubleshootK8sClient() (*troubleshootclientv1beta1.TroubleshootV1beta1Client, error) { - v := viper.GetViper() - - config, err := clientcmd.BuildConfigFromFlags("", v.GetString("kubecontext")) +func createTroubleshootK8sClient(configFlags *genericclioptions.ConfigFlags) (*troubleshootclientv1beta1.TroubleshootV1beta1Client, error) { + config, err := configFlags.ToRESTConfig() if err != nil { - return nil, err + return nil, errors.Wrap(err, "failed to convert kube flags to rest config") } + troubleshootClient, err := troubleshootclientv1beta1.NewForConfig(config) if err != nil { - return nil, err + return nil, errors.Wrap(err, "failed to create troubleshoot client") } return troubleshootClient, nil diff --git a/go.mod b/go.mod index 4191cfdc9..7b859db5f 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,6 @@ require ( github.com/gin-gonic/gin v1.4.0 github.com/gizak/termui/v3 v3.1.0 github.com/golang/snappy v0.0.1 // indirect - github.com/google/uuid v1.1.1 // indirect github.com/hashicorp/go-getter v1.3.0 github.com/hashicorp/go-multierror v1.0.0 github.com/huandu/xstrings v1.2.0 // indirect @@ -28,20 +27,26 @@ require ( github.com/nwaples/rardecode v1.0.0 // indirect github.com/onsi/gomega v1.5.0 github.com/opencontainers/go-digest v1.0.0-rc1 // indirect + github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pierrec/lz4 v2.0.5+incompatible // indirect github.com/pkg/errors v0.8.1 - github.com/spf13/cobra v0.0.3 + github.com/spf13/cobra v0.0.4 github.com/spf13/viper v1.4.0 github.com/stretchr/testify v1.3.0 github.com/tj/go-spin v1.1.0 github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect github.com/xo/dburl v0.0.0-20190203050942-98997a05b24f // indirect - golang.org/x/net v0.0.0-20190522155817-f3200d17e092 + golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc gopkg.in/yaml.v2 v2.2.2 k8s.io/api v0.0.0-20190409021203-6e4e0e4f393b k8s.io/apiextensions-apiserver v0.0.0-20190409022649-727a075fdec8 k8s.io/apimachinery v0.0.0-20190404173353-6a84e37a896d + k8s.io/cli-runtime v0.0.0-20190314001948-2899ed30580f k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible + k8s.io/klog v0.4.0 // indirect + k8s.io/kube-openapi v0.0.0-20190815110238-8ff09bc626d6 // indirect + k8s.io/utils v0.0.0-20190809000727-6c36bc71fc4a // indirect sigs.k8s.io/controller-runtime v0.2.0-beta.2 sigs.k8s.io/controller-tools v0.2.0-beta.2 // indirect + sigs.k8s.io/kustomize v2.0.3+incompatible // indirect ) diff --git a/go.sum b/go.sum index 833c7d4c1..6bec53cc8 100644 --- a/go.sum +++ b/go.sum @@ -13,6 +13,13 @@ dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBr dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Masterminds/goutils v1.1.0 h1:zukEsf/1JZwCMgHiK3GZftabmxiCw4apj3a28RPBiVg= @@ -23,8 +30,14 @@ github.com/Masterminds/sprig v2.20.0+incompatible h1:dJTKKuUkYW3RMFdQFXPU/s6hg10 github.com/Masterminds/sprig v2.20.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.0.0 h1:0GoNN3taZV6QI81IXgCbxMyEaJDXMSIjArYBCYzVVvs= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2 h1:JCHLVE3B+kJde7bIEo5N4J+ZbLhp0J1Fs+ulyRws4gE= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/ahmetalpbalkan/go-cursor v0.0.0-20131010032410-8136607ea412 h1:vOVO0ypMfTt6tZacyI0kp+iCZb1XSNiYDqnzBWYgfe4= github.com/ahmetalpbalkan/go-cursor v0.0.0-20131010032410-8136607ea412/go.mod h1:AI9hp1tkp10pAlK5TCwL+7yWbRgtDm9jhToq6qij2xs= github.com/alecthomas/gometalinter v2.0.11+incompatible/go.mod h1:qfIpQGGz3d+NmgyPBqv+LSh50emm1pt72EtcX2vKYQk= @@ -84,7 +97,10 @@ github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5Jflh github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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 h1:H2pdYOb3KQ1/YsqVWoWNLQO+fusocsw354rqGTZtAgw= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.6+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/evanphx/json-patch v4.0.0+incompatible h1:xregGRMLBeuRcwiOTHRCsPPuzCQlqhxUPbqdw+zNkLc= github.com/evanphx/json-patch v4.0.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -100,6 +116,7 @@ github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml 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 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 h1:t8FVkw33L+wilf2QiWkw0UV77qRpcH/JHPKGpKa2E8g= @@ -120,10 +137,22 @@ github.com/go-logr/zapr v0.1.0 h1:h+WVe9j6HAA01niTJPA/kKH0i7e0rLZBCwauQFcRE54= github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-logr/zapr v0.1.1 h1:qXBXPDdNncunGs7XeEpsJt8wCjYBygluzfdLO0G5baE= github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1 h1:wSt/4CYxs70xbATrGXhokKF1i0tZjENLOo1ioIO13zk= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +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/jsonreference v0.0.0-20160704190145-13c6e3589ad9 h1:tF+augKRWlWx0J0B7ZyyKSiTyV6E1zZe+7b3qQlcEf8= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +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/spec v0.0.0-20160808142527-6aced65f8501 h1:C1JKChikHGpXwT5UQDFaryIpDtyyGL/CR6C2kB7F1oc= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +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/swag v0.0.0-20160704191624-1d0bd113de87 h1:zP3nY8Tk2E6RTkqGYrarZXuzh+ffyLDljLxCy1iJw80= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +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-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobuffalo/envy v1.6.5/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ= github.com/gobuffalo/envy v1.6.15 h1:OsV5vOpHYUpP7ZLS6sem1y40/lNX1BZj+ynMiRi21lQ= @@ -135,6 +164,8 @@ github.com/gogo/protobuf v1.1.1 h1:72R+M5VuhED/KujmZVcIquuo8mBgX4oVda//DQb3PXo= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903 h1:LbsanbbD6LieFkXbj9YNNBupiGHJgFeLpO0j0Fza1h8= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -155,6 +186,7 @@ github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20160524151835-7d79101e329e/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -163,6 +195,7 @@ 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-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 h1:ScAXWS+TR6MZKex+7Z8rneuSJH+FSDqd6ocQyl+ZHo4= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf h1:+RRA9JqSOZFfKrOeqr2z77+8R2RKyh8PG66dcu1V0ck= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= @@ -189,10 +222,13 @@ github.com/googleapis/gnostic v0.2.0 h1:l6N3VoaVzTncYYW+9yOz2LJJammFZGBO13sqgEhp github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.0 h1:CcQijm0XKekKjP/YCz28LXVSpgguuB+nCxaSjCe09y0= github.com/googleapis/gnostic v0.3.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gordonklaus/ineffassign v0.0.0-20180909121442-1003c8bd00dc/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= 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/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= @@ -224,6 +260,7 @@ github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.2.0 h1:yPeWdRnmynF7p+lLYz0H2tthW9lqhMJrQV/U7yy4wX0= github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= @@ -240,11 +277,14 @@ github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBv github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a h1:FaWFmfWdAUKbSCtOU2QjDaorUexogfaMgbipgYATUMU= github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= @@ -254,13 +294,17 @@ github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a h1:weJVJJRzAJBFRlAiJQROKQs8oC9vOxvm4rZmBBk0ONw= github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a h1:TpvdAwDAt1K4ANVOfcihouRdvP+MgAfDWwBuct4l6ZY= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/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/manifoldco/promptui v0.3.2 h1:rir7oByTERac6jhpHUPErHuopoRDvO3jxS+FdadEns8= github.com/manifoldco/promptui v0.3.2/go.mod h1:8JU+igZ+eeiiRku4T5BjtKh2ms8sziGpSYl1gN8Bazw= github.com/markbates/inflect v1.0.4 h1:5fh1gzTFhfae06u3hzHYO9xe3l3v3nW5Pwt3naLTP5g= @@ -281,6 +325,7 @@ github.com/mholt/archiver v3.1.1+incompatible/go.mod h1:Dh2dOXnSdiLxRiPoVfIr/fI1 github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/mitchellh/go-homedir v1.0.0 h1:vKb8ShqSby24Yrqr/yDYkuFz8d0WUjys40rvnGC8aR0= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= @@ -288,6 +333,7 @@ github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzC github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -406,6 +452,8 @@ 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 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.4 h1:S0tLZ3VOKl2Te0hpq8+ke0eSJPfCnNTPiDlsfwi1/NE= +github.com/spf13/cobra v0.0.4/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= @@ -418,6 +466,7 @@ github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= @@ -457,9 +506,12 @@ golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -496,12 +548,16 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL 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 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU= 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/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890 h1:uESlIz09WIHT2I+pasSXcpLYqYK8wHcdCetU3VuMBJE= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a h1:tImsplftrFpALCYumobsd0K86vlAs/eXGFms2txfJfA= +golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= @@ -520,6 +576,7 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181213200352-4d1cda033e06/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -538,9 +595,11 @@ golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 h1:z99zHgr7hKfrUcX/KsoJk5FJfjTceCKIp96+biqP4To= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20161028155119-f51c12702a4d/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= @@ -550,6 +609,7 @@ golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181122213734-04b5d21e00f1/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -581,6 +641,7 @@ google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.3.0 h1:FBSsiFRMz3LBeXIomRnVzrQwSDj4ibvcRexLG0LZGQk= 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.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -631,23 +692,29 @@ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= k8s.io/api v0.0.0-20190222213804-5cb15d344471 h1:MzQGt8qWQCR+39kbYRd0uQqsvSidpYqJLFeWiJ9l4OE= k8s.io/api v0.0.0-20190222213804-5cb15d344471/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= +k8s.io/api v0.0.0-20190313235455-40a48860b5ab/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= k8s.io/api v0.0.0-20190409021203-6e4e0e4f393b h1:aBGgKJUM9Hk/3AE8WaZIApnTxG35kbuQba2w+SXqezo= k8s.io/api v0.0.0-20190409021203-6e4e0e4f393b/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= k8s.io/api v0.0.0-20190703205437-39734b2a72fe h1:MFaHtAyhZcfBZocN91muHSqnwiF5yfXx7yGoehneNYg= k8s.io/api v0.0.0-20190703205437-39734b2a72fe/go.mod h1:J5EZ0KSEjvyKOBy5BDHSF3zn82madLLWg7nUKaOHZKU= k8s.io/api v0.0.0-20190717022910-653c86b0609b h1:WiE134uexhvhHw4DjJuYsghv792UCe2xN5SHQOayf28= +k8s.io/api v0.0.0-20190820101039-d651a1528133 h1:6XLrpVprGENt40uO1F50pRfgP+lOyyz05NfwsbmWXMM= +k8s.io/api v0.0.0-20190820101039-d651a1528133/go.mod h1:AlhL1I0Xqh5Tyz0HsxjEhy+iKci9l1Qy3UMDFW7iG3A= k8s.io/apiextensions-apiserver v0.0.0-20190228180357-d002e88f6236 h1:JfFtjaElBIgYKCWEtYQkcNrTpW+lMO4GJy8NP6SVQmM= k8s.io/apiextensions-apiserver v0.0.0-20190228180357-d002e88f6236/go.mod h1:IxkesAMoaCRoLrPJdZNZUQp9NfZnzqaVzLhb2VEQzXE= k8s.io/apiextensions-apiserver v0.0.0-20190409022649-727a075fdec8 h1:q1Qvjzs/iEdXF6A1a8H3AKVFDzJNcJn3nXMs6R6qFtA= k8s.io/apiextensions-apiserver v0.0.0-20190409022649-727a075fdec8/go.mod h1:IxkesAMoaCRoLrPJdZNZUQp9NfZnzqaVzLhb2VEQzXE= -k8s.io/apimachinery v0.0.0-20190221213512-86fb29eff628 h1:UYfHH+KEF88OTg+GojQUwFTNxbxwmoktLwutUzR0GPg= -k8s.io/apimachinery v0.0.0-20190221213512-86fb29eff628/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/apimachinery v0.0.0-20190313205120-d7deff9243b1 h1:IS7K02iBkQXpCeieSiyJjGoLSdVOv2DbPaWHJ+ZtgKg= +k8s.io/apimachinery v0.0.0-20190313205120-d7deff9243b1/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= k8s.io/apimachinery v0.0.0-20190404173353-6a84e37a896d h1:Jmdtdt1ZnoGfWWIIik61Z7nKYgO3J+swQJtPYsP9wHA= k8s.io/apimachinery v0.0.0-20190404173353-6a84e37a896d/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= -k8s.io/apimachinery v0.0.0-20190703205208-4cfb76a8bf76 h1:vxMYBaJgczGAIpJAOBco2eHuFYIyDdNIebt60jxLauA= -k8s.io/apimachinery v0.0.0-20190703205208-4cfb76a8bf76/go.mod h1:M2fZgZL9DbLfeJaPBCDqSqNsdsmLN+V29knYJnIXlMA= +k8s.io/cli-runtime v0.0.0-20190314001948-2899ed30580f h1:gRAqn9Z3rp62UwLU3PdC7Lhmsvd3e9PXLsq7EG+bq1s= +k8s.io/cli-runtime v0.0.0-20190314001948-2899ed30580f/go.mod h1:qWnH3/b8sp/l7EvlDh7ulDU3UWA4P4N1NFbEEP791tM= +k8s.io/cli-runtime v0.0.0-20190820104540-373e70fb3de3 h1:UFn3hzZ4oEmZbyRoieBItTLgoQPQ5ePPIQOyZ4ucmJ0= +k8s.io/cli-runtime v0.0.0-20190820104540-373e70fb3de3/go.mod h1:XEkgzavn9/snF1lj3xu74swnPb0aqjtTuOVpPjNLQzs= k8s.io/client-go v0.0.0-20190228174230-b40b2a5939e4 h1:aE8wOCKuoRs2aU0OP/Rz8SXiAB0FTTku3VtGhhrkSmc= k8s.io/client-go v0.0.0-20190228174230-b40b2a5939e4/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= +k8s.io/client-go v0.0.0-20190820101407-c8dc69f8a8bf/go.mod h1:/Fq6Zm28c3mTL4uNB5Blb9K7ufxovl3zPT6sCLZLrkE= k8s.io/client-go v11.0.0+incompatible h1:LBbX2+lOwY9flffWlJM7f1Ct8V2SRNiMRDFeiwnJo9o= k8s.io/client-go v11.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible h1:U5Bt+dab9K8qaUmXINrkXO135kA11/i5Kg1RUydgaMQ= @@ -667,16 +734,26 @@ k8s.io/klog v0.3.1 h1:RVgyDHY/kFKtLqh67NvEWIgkMneNoIrdkN0CxDSQc68= k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.3 h1:niceAagH1tzskmaie/icWd7ci1wbG7Bf2c6YGcQv+3c= k8s.io/klog v0.3.3/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.4.0 h1:lCJCxf/LIowc2IGS9TPjWDyXY4nOmdGdfcwwDQCOURQ= +k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c h1:3KSCztE7gPitlZmWbNwue/2U0YruD65DqX3INopDAQM= k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30 h1:TRb4wNWoBVrH9plmkp2q86FIDppkbrEXdXlxU3a3BMI= k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20190603182131-db7b694dc208 h1:5sW+fEHvlJI3Ngolx30CmubFulwH28DhKjGf70Xmtco= k8s.io/kube-openapi v0.0.0-20190603182131-db7b694dc208/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058 h1:di3XCwddOR9cWBNpfgXaskhh6cgJuwcK54rvtwUaC10= +k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190815110238-8ff09bc626d6 h1:3zEq2jkpzwO71j00zmrJAokMnI6KQRS3dzRl2ATTkUY= +k8s.io/kube-openapi v0.0.0-20190815110238-8ff09bc626d6/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190506122338-8fab8cb257d5 h1:VBM/0P5TWxwk+Nw6Z+lAw3DKgO76g90ETOiA6rfLV1Y= k8s.io/utils v0.0.0-20190506122338-8fab8cb257d5/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20190607212802-c55fbcfc754a h1:2jUDc9gJja832Ftp+QbDV0tVhQHMISFn01els+2ZAcw= k8s.io/utils v0.0.0-20190607212802-c55fbcfc754a/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= +k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20190809000727-6c36bc71fc4a h1:uy5HAgt4Ha5rEMbhZA+aM1j2cq5LmR6LQ71EYC2sVH4= +k8s.io/utils v0.0.0-20190809000727-6c36bc71fc4a/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= @@ -690,6 +767,8 @@ sigs.k8s.io/controller-runtime v0.2.0-beta.2/go.mod h1:TSH2R0nSz4WAlUUlNnOFcOR/V sigs.k8s.io/controller-tools v0.1.11/go.mod h1:6g08p9m9G/So3sBc1AOQifHfhxH/mb6Sc4z0LMI8XMw= sigs.k8s.io/controller-tools v0.2.0-beta.2 h1:ucniFzEuW7PFfFDuUxacdY4Fy4q065wPguVl+BE2/t0= sigs.k8s.io/controller-tools v0.2.0-beta.2/go.mod h1:gC5UAnK1jbxWnDaqTi0yxKIsRsRwshzeRtTUGbM9vos= +sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0= +sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/testing_frameworks v0.1.1 h1:cP2l8fkA3O9vekpy5Ks8mmA0NW/F7yBdXf8brkWhVrs= sigs.k8s.io/testing_frameworks v0.1.1/go.mod h1:VVBKrHmJ6Ekkfz284YKhQePcdycOzNH9qL6ht1zEr/U= diff --git a/pkg/collect/cluster_info.go b/pkg/collect/cluster_info.go index 37d56c764..706c4fb45 100644 --- a/pkg/collect/cluster_info.go +++ b/pkg/collect/cluster_info.go @@ -6,7 +6,6 @@ import ( "github.com/pkg/errors" "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/kubernetes" - "sigs.k8s.io/controller-runtime/pkg/client/config" ) type ClusterVersion struct { @@ -19,13 +18,8 @@ type ClusterInfoOutput struct { Errors []byte `json:"cluster-info/errors.json,omitempty"` } -func ClusterInfo() ([]byte, error) { - cfg, err := config.GetConfig() - if err != nil { - return nil, errors.Wrap(err, "failed to get kubernetes config") - } - - client, err := kubernetes.NewForConfig(cfg) +func ClusterInfo(ctx *Context) ([]byte, error) { + client, err := kubernetes.NewForConfig(ctx.ClientConfig) if err != nil { return nil, errors.Wrap(err, "Failed to create kubernetes clientset") } diff --git a/pkg/collect/cluster_resources.go b/pkg/collect/cluster_resources.go index 00afeb4da..3d830a3f7 100644 --- a/pkg/collect/cluster_resources.go +++ b/pkg/collect/cluster_resources.go @@ -11,7 +11,6 @@ import ( apiextensionsv1beta1clientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" - "sigs.k8s.io/controller-runtime/pkg/client/config" ) type ClusterResourcesOutput struct { @@ -33,13 +32,8 @@ type ClusterResourcesOutput struct { ImagePullSecretsErrors []byte `json:"cluster-resources/image-pull-secrets-errors.json,omitempty"` } -func ClusterResources(redact bool) ([]byte, error) { - cfg, err := config.GetConfig() - if err != nil { - return nil, err - } - - client, err := kubernetes.NewForConfig(cfg) +func ClusterResources(ctx *Context) ([]byte, error) { + client, err := kubernetes.NewForConfig(ctx.ClientConfig) if err != nil { return nil, err } @@ -99,7 +93,7 @@ func ClusterResources(redact bool) ([]byte, error) { } // crds - crdClient, err := apiextensionsv1beta1clientset.NewForConfig(cfg) + crdClient, err := apiextensionsv1beta1clientset.NewForConfig(ctx.ClientConfig) if err != nil { return nil, err } @@ -118,7 +112,7 @@ func ClusterResources(redact bool) ([]byte, error) { return nil, err } - if redact { + if ctx.Redact { clusterResourcesOutput, err = clusterResourcesOutput.Redact() if err != nil { return nil, err diff --git a/pkg/collect/collector.go b/pkg/collect/collector.go index 1c4ac0a68..f997c8bc3 100644 --- a/pkg/collect/collector.go +++ b/pkg/collect/collector.go @@ -7,37 +7,44 @@ import ( troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1" "gopkg.in/yaml.v2" + "k8s.io/client-go/rest" ) type Collector struct { - Collect *troubleshootv1beta1.Collect - Redact bool + Collect *troubleshootv1beta1.Collect + Redact bool + ClientConfig *rest.Config +} + +type Context struct { + Redact bool + ClientConfig *rest.Config } func (c *Collector) RunCollectorSync() ([]byte, error) { if c.Collect.ClusterInfo != nil { - return ClusterInfo() + return ClusterInfo(c.GetContext()) } if c.Collect.ClusterResources != nil { - return ClusterResources(c.Redact) + return ClusterResources(c.GetContext()) } if c.Collect.Secret != nil { - return Secret(c.Collect.Secret, c.Redact) + return Secret(c.GetContext(), c.Collect.Secret) } if c.Collect.Logs != nil { - return Logs(c.Collect.Logs, c.Redact) + return Logs(c.GetContext(), c.Collect.Logs) } if c.Collect.Run != nil { - return Run(c.Collect.Run, c.Redact) + return Run(c.GetContext(), c.Collect.Run) } if c.Collect.Exec != nil { - return Exec(c.Collect.Exec, c.Redact) + return Exec(c.GetContext(), c.Collect.Exec) } if c.Collect.Copy != nil { - return Copy(c.Collect.Copy, c.Redact) + return Copy(c.GetContext(), c.Collect.Copy) } if c.Collect.HTTP != nil { - return HTTP(c.Collect.HTTP, c.Redact) + return HTTP(c.GetContext(), c.Collect.HTTP) } return nil, errors.New("no spec found to run") @@ -91,6 +98,13 @@ func (c *Collector) GetDisplayName() string { return collector } +func (c *Collector) GetContext() *Context { + return &Context{ + Redact: c.Redact, + ClientConfig: c.ClientConfig, + } +} + func ParseSpec(specContents string) (*troubleshootv1beta1.Collect, error) { collect := troubleshootv1beta1.Collect{} diff --git a/pkg/collect/copy.go b/pkg/collect/copy.go index fb8d03097..0f893c94b 100644 --- a/pkg/collect/copy.go +++ b/pkg/collect/copy.go @@ -10,7 +10,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/remotecommand" - "sigs.k8s.io/controller-runtime/pkg/client/config" ) type CopyOutput struct { @@ -18,13 +17,8 @@ type CopyOutput struct { Errors map[string][]byte `json:"copy-errors/,omitempty"` } -func Copy(copyCollector *troubleshootv1beta1.Copy, redact bool) ([]byte, error) { - cfg, err := config.GetConfig() - if err != nil { - return nil, err - } - - client, err := kubernetes.NewForConfig(cfg) +func Copy(ctx *Context, copyCollector *troubleshootv1beta1.Copy) ([]byte, error) { + client, err := kubernetes.NewForConfig(ctx.ClientConfig) if err != nil { return nil, err } @@ -45,7 +39,7 @@ func Copy(copyCollector *troubleshootv1beta1.Copy, redact bool) ([]byte, error) if len(pods) > 0 { for _, pod := range pods { - files, copyErrors := copyFiles(client, pod, copyCollector) + files, copyErrors := copyFiles(ctx, client, pod, copyCollector) if len(copyErrors) > 0 { key := fmt.Sprintf("%s/%s/%s-errors.json", pod.Namespace, pod.Name, copyCollector.ContainerPath) copyOutput.Errors[key], err = marshalNonNil(copyErrors) @@ -60,7 +54,7 @@ func Copy(copyCollector *troubleshootv1beta1.Copy, redact bool) ([]byte, error) } } - if redact { + if ctx.Redact { // TODO } } @@ -73,12 +67,7 @@ func Copy(copyCollector *troubleshootv1beta1.Copy, redact bool) ([]byte, error) return b, nil } -func copyFiles(client *kubernetes.Clientset, pod corev1.Pod, copyCollector *troubleshootv1beta1.Copy) (map[string][]byte, map[string]string) { - cfg, err := config.GetConfig() - if err != nil { - return nil, map[string]string{"error": err.Error()} - } - +func copyFiles(ctx *Context, client *kubernetes.Clientset, pod corev1.Pod, copyCollector *troubleshootv1beta1.Copy) (map[string][]byte, map[string]string) { container := pod.Spec.Containers[0].Name if copyCollector.ContainerName != "" { container = copyCollector.ContainerName @@ -102,7 +91,7 @@ func copyFiles(client *kubernetes.Clientset, pod corev1.Pod, copyCollector *trou TTY: false, }, parameterCodec) - exec, err := remotecommand.NewSPDYExecutor(cfg, "POST", req.URL()) + exec, err := remotecommand.NewSPDYExecutor(ctx.ClientConfig, "POST", req.URL()) if err != nil { return nil, map[string]string{"error": err.Error()} } diff --git a/pkg/collect/exec.go b/pkg/collect/exec.go index 22b472726..35babab6b 100644 --- a/pkg/collect/exec.go +++ b/pkg/collect/exec.go @@ -12,7 +12,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/remotecommand" - "sigs.k8s.io/controller-runtime/pkg/client/config" ) type ExecOutput struct { @@ -20,9 +19,9 @@ type ExecOutput struct { Errors map[string][]byte `json:"exec-errors/,omitempty"` } -func Exec(execCollector *troubleshootv1beta1.Exec, redact bool) ([]byte, error) { +func Exec(ctx *Context, execCollector *troubleshootv1beta1.Exec) ([]byte, error) { if execCollector.Timeout == "" { - return execWithoutTimeout(execCollector, redact) + return execWithoutTimeout(ctx, execCollector) } timeout, err := time.ParseDuration(execCollector.Timeout) @@ -34,7 +33,7 @@ func Exec(execCollector *troubleshootv1beta1.Exec, redact bool) ([]byte, error) resultCh := make(chan []byte, 1) go func() { - b, err := execWithoutTimeout(execCollector, redact) + b, err := execWithoutTimeout(ctx, execCollector) if err != nil { errCh <- err } else { @@ -52,13 +51,8 @@ func Exec(execCollector *troubleshootv1beta1.Exec, redact bool) ([]byte, error) } } -func execWithoutTimeout(execCollector *troubleshootv1beta1.Exec, redact bool) ([]byte, error) { - cfg, err := config.GetConfig() - if err != nil { - return nil, err - } - - client, err := kubernetes.NewForConfig(cfg) +func execWithoutTimeout(ctx *Context, execCollector *troubleshootv1beta1.Exec) ([]byte, error) { + client, err := kubernetes.NewForConfig(ctx.ClientConfig) if err != nil { return nil, err } @@ -79,7 +73,7 @@ func execWithoutTimeout(execCollector *troubleshootv1beta1.Exec, redact bool) ([ if len(pods) > 0 { for _, pod := range pods { - stdout, stderr, execErrors := getExecOutputs(client, pod, execCollector, redact) + stdout, stderr, execErrors := getExecOutputs(ctx, client, pod, execCollector) execOutput.Results[fmt.Sprintf("%s/%s/%s-stdout.txt", pod.Namespace, pod.Name, execCollector.CollectorName)] = stdout execOutput.Results[fmt.Sprintf("%s/%s/%s-stderr.txt", pod.Namespace, pod.Name, execCollector.CollectorName)] = stderr if len(execErrors) > 0 { @@ -92,7 +86,7 @@ func execWithoutTimeout(execCollector *troubleshootv1beta1.Exec, redact bool) ([ } } - if redact { + if ctx.Redact { execOutput, err = execOutput.Redact() if err != nil { return nil, err @@ -108,12 +102,7 @@ func execWithoutTimeout(execCollector *troubleshootv1beta1.Exec, redact bool) ([ return b, nil } -func getExecOutputs(client *kubernetes.Clientset, pod corev1.Pod, execCollector *troubleshootv1beta1.Exec, doRedact bool) ([]byte, []byte, []string) { - cfg, err := config.GetConfig() - if err != nil { - return nil, nil, []string{err.Error()} - } - +func getExecOutputs(ctx *Context, client *kubernetes.Clientset, pod corev1.Pod, execCollector *troubleshootv1beta1.Exec) ([]byte, []byte, []string) { container := pod.Spec.Containers[0].Name if execCollector.ContainerName != "" { container = execCollector.ContainerName @@ -135,7 +124,7 @@ func getExecOutputs(client *kubernetes.Clientset, pod corev1.Pod, execCollector TTY: false, }, parameterCodec) - exec, err := remotecommand.NewSPDYExecutor(cfg, "POST", req.URL()) + exec, err := remotecommand.NewSPDYExecutor(ctx.ClientConfig, "POST", req.URL()) if err != nil { return nil, nil, []string{err.Error()} } diff --git a/pkg/collect/http.go b/pkg/collect/http.go index af1446398..83038529a 100644 --- a/pkg/collect/http.go +++ b/pkg/collect/http.go @@ -26,7 +26,7 @@ type httpError struct { Message string `json:"message"` } -func HTTP(httpCollector *troubleshootv1beta1.HTTP, redact bool) ([]byte, error) { +func HTTP(ctx *Context, httpCollector *troubleshootv1beta1.HTTP) ([]byte, error) { var response *http.Response var err error @@ -40,7 +40,7 @@ func HTTP(httpCollector *troubleshootv1beta1.HTTP, redact bool) ([]byte, error) return nil, errors.New("no supported http request type") } - output, err := responseToOutput(response, err, redact) + output, err := responseToOutput(response, err, ctx.Redact) if err != nil { return nil, err } diff --git a/pkg/collect/logs.go b/pkg/collect/logs.go index f46521e8c..3a66b8ff0 100644 --- a/pkg/collect/logs.go +++ b/pkg/collect/logs.go @@ -13,7 +13,6 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" - "sigs.k8s.io/controller-runtime/pkg/client/config" ) type LogsOutput struct { @@ -21,13 +20,8 @@ type LogsOutput struct { Errors map[string][]byte `json:"logs-errors/,omitempty"` } -func Logs(logsCollector *troubleshootv1beta1.Logs, redact bool) ([]byte, error) { - cfg, err := config.GetConfig() - if err != nil { - return nil, err - } - - client, err := kubernetes.NewForConfig(cfg) +func Logs(ctx *Context, logsCollector *troubleshootv1beta1.Logs) ([]byte, error) { + client, err := kubernetes.NewForConfig(ctx.ClientConfig) if err != nil { return nil, err } @@ -63,7 +57,7 @@ func Logs(logsCollector *troubleshootv1beta1.Logs, redact bool) ([]byte, error) } } - if redact { + if ctx.Redact { logsOutput, err = logsOutput.Redact() if err != nil { return nil, err diff --git a/pkg/collect/run.go b/pkg/collect/run.go index 2aa5a26ff..b4c1feaf0 100644 --- a/pkg/collect/run.go +++ b/pkg/collect/run.go @@ -10,20 +10,14 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" - "sigs.k8s.io/controller-runtime/pkg/client/config" ) type RunOutput struct { PodLogs map[string][]byte `json:"run/,omitempty"` } -func Run(runCollector *troubleshootv1beta1.Run, redact bool) ([]byte, error) { - cfg, err := config.GetConfig() - if err != nil { - return nil, err - } - - client, err := kubernetes.NewForConfig(cfg) +func Run(ctx *Context, runCollector *troubleshootv1beta1.Run) ([]byte, error) { + client, err := kubernetes.NewForConfig(ctx.ClientConfig) if err != nil { return nil, err } @@ -40,7 +34,7 @@ func Run(runCollector *troubleshootv1beta1.Run, redact bool) ([]byte, error) { }() if runCollector.Timeout == "" { - return runWithoutTimeout(pod, runCollector, redact) + return runWithoutTimeout(ctx, pod, runCollector) } timeout, err := time.ParseDuration(runCollector.Timeout) @@ -51,7 +45,7 @@ func Run(runCollector *troubleshootv1beta1.Run, redact bool) ([]byte, error) { errCh := make(chan error, 1) resultCh := make(chan []byte, 1) go func() { - b, err := runWithoutTimeout(pod, runCollector, redact) + b, err := runWithoutTimeout(ctx, pod, runCollector) if err != nil { errCh <- err } else { @@ -69,13 +63,8 @@ func Run(runCollector *troubleshootv1beta1.Run, redact bool) ([]byte, error) { } } -func runWithoutTimeout(pod *corev1.Pod, runCollector *troubleshootv1beta1.Run, redact bool) ([]byte, error) { - cfg, err := config.GetConfig() - if err != nil { - return nil, err - } - - client, err := kubernetes.NewForConfig(cfg) +func runWithoutTimeout(ctx *Context, pod *corev1.Pod, runCollector *troubleshootv1beta1.Run) ([]byte, error) { + client, err := kubernetes.NewForConfig(ctx.ClientConfig) if err != nil { return nil, err } @@ -104,7 +93,7 @@ func runWithoutTimeout(pod *corev1.Pod, runCollector *troubleshootv1beta1.Run, r runOutput.PodLogs[k] = v } - if redact { + if ctx.Redact { runOutput, err = runOutput.Redact() if err != nil { return nil, err diff --git a/pkg/collect/secret.go b/pkg/collect/secret.go index ab45074dc..20fd42946 100644 --- a/pkg/collect/secret.go +++ b/pkg/collect/secret.go @@ -7,7 +7,6 @@ import ( troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" - "sigs.k8s.io/controller-runtime/pkg/client/config" ) type FoundSecret struct { @@ -23,13 +22,8 @@ type SecretOutput struct { Errors map[string][]byte `json:"secrets-errors/,omitempty"` } -func Secret(secretCollector *troubleshootv1beta1.Secret, redact bool) ([]byte, error) { - cfg, err := config.GetConfig() - if err != nil { - return nil, err - } - - client, err := kubernetes.NewForConfig(cfg) +func Secret(ctx *Context, secretCollector *troubleshootv1beta1.Secret) ([]byte, error) { + client, err := kubernetes.NewForConfig(ctx.ClientConfig) if err != nil { return nil, err } @@ -49,7 +43,7 @@ func Secret(secretCollector *troubleshootv1beta1.Secret, redact bool) ([]byte, e } if encoded != nil { secretOutput.FoundSecret[fmt.Sprintf("%s/%s.json", secret.Namespace, secret.Name)] = encoded - if redact { + if ctx.Redact { secretOutput, err = secretOutput.Redact() if err != nil { return nil, err diff --git a/pkg/controller/collectorjob/collectorjob_controller.go b/pkg/controller/collectorjob/collectorjob_controller.go index 242f062ac..75b4874c9 100644 --- a/pkg/controller/collectorjob/collectorjob_controller.go +++ b/pkg/controller/collectorjob/collectorjob_controller.go @@ -25,7 +25,6 @@ import ( "math/rand" "net/http" "os" - "path/filepath" "time" troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1" @@ -40,8 +39,8 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/config" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/handler" @@ -61,7 +60,11 @@ func Add(mgr manager.Manager) error { // newReconciler returns a new reconcile.Reconciler func newReconciler(mgr manager.Manager) reconcile.Reconciler { - return &ReconcileCollectorJob{Client: mgr.GetClient(), scheme: mgr.GetScheme()} + return &ReconcileCollectorJob{ + Client: mgr.GetClient(), + config: mgr.GetConfig(), + scheme: mgr.GetScheme(), + } } // add adds a new Controller to mgr with r as the reconcile.Reconciler @@ -94,6 +97,7 @@ var _ reconcile.Reconciler = &ReconcileCollectorJob{} // ReconcileCollectorJob reconciles a CollectorJob object type ReconcileCollectorJob struct { client.Client + config *rest.Config scheme *runtime.Scheme } @@ -147,12 +151,7 @@ func (r *ReconcileCollectorJob) Reconcile(request reconcile.Request) (reconcile. } func (r *ReconcileCollectorJob) getCollectorSpec(namespace string, name string) (*troubleshootv1beta1.Collector, error) { - cfg, err := config.GetConfig() - if err != nil { - return nil, err - } - - troubleshootClient, err := troubleshootclientv1beta1.NewForConfig(cfg) + troubleshootClient, err := troubleshootclientv1beta1.NewForConfig(r.config) if err != nil { return nil, err } @@ -190,12 +189,7 @@ func (r *ReconcileCollectorJob) reconileOneCollectorJob(instance *troubleshootv1 // Get the logs podLogOpts := corev1.PodLogOptions{} - cfg, err := config.GetConfig() - if err != nil { - return err - } - - k8sClient, err := kubernetes.NewForConfig(cfg) + k8sClient, err := kubernetes.NewForConfig(r.config) if err != nil { return err } @@ -223,15 +217,9 @@ func (r *ReconcileCollectorJob) reconileOneCollectorJob(instance *troubleshootv1 logger.Printf("setting up port forwarding because the manager is not running in the cluster\n") // this isn't likely to be very solid - r := rand.New(rand.NewSource(time.Now().UnixNano())) - localPort := 3000 + r.Intn(999) + localPort := 3000 + rand.New(rand.NewSource(time.Now().UnixNano())).Intn(999) - homeDir := os.Getenv("HOME") - if homeDir == "" { - homeDir = os.Getenv("USERPROFILE") - } - kubeContext := filepath.Join(homeDir, ".kube", "config") - ch, err := k8sutil.PortForward(kubeContext, localPort, 8000, instance.Namespace, instance.Name+"-collector") + ch, err := k8sutil.PortForward(r.config, localPort, 8000, instance.Namespace, instance.Name+"-collector") if err != nil { return err } diff --git a/pkg/controller/preflightjob/preflightjob_controller.go b/pkg/controller/preflightjob/preflightjob_controller.go index 8bdee773b..f07ea2baf 100644 --- a/pkg/controller/preflightjob/preflightjob_controller.go +++ b/pkg/controller/preflightjob/preflightjob_controller.go @@ -25,8 +25,8 @@ import ( kuberneteserrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/config" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/manager" @@ -45,7 +45,11 @@ func Add(mgr manager.Manager) error { // newReconciler returns a new reconcile.Reconciler func newReconciler(mgr manager.Manager) reconcile.Reconciler { - return &ReconcilePreflightJob{Client: mgr.GetClient(), scheme: mgr.GetScheme()} + return &ReconcilePreflightJob{ + Client: mgr.GetClient(), + config: mgr.GetConfig(), + scheme: mgr.GetScheme(), + } } // add adds a new Controller to mgr with r as the reconcile.Reconciler @@ -70,6 +74,7 @@ var _ reconcile.Reconciler = &ReconcilePreflightJob{} // ReconcilePreflightJob reconciles a PreflightJob object type ReconcilePreflightJob struct { client.Client + config *rest.Config scheme *runtime.Scheme } @@ -155,12 +160,7 @@ func (r *ReconcilePreflightJob) Reconcile(request reconcile.Request) (reconcile. } func (r *ReconcilePreflightJob) getPreflightSpec(namespace string, name string) (*troubleshootv1beta1.Preflight, error) { - cfg, err := config.GetConfig() - if err != nil { - return nil, err - } - - troubleshootClient, err := troubleshootclientv1beta1.NewForConfig(cfg) + troubleshootClient, err := troubleshootclientv1beta1.NewForConfig(r.config) if err != nil { return nil, err } diff --git a/pkg/k8sutil/portforward.go b/pkg/k8sutil/portforward.go index f6be044fe..f7ad71481 100644 --- a/pkg/k8sutil/portforward.go +++ b/pkg/k8sutil/portforward.go @@ -8,21 +8,17 @@ import ( "strings" "time" - "k8s.io/client-go/tools/clientcmd" + restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/portforward" "k8s.io/client-go/transport/spdy" ) -func PortForward(kubeContext string, localPort int, remotePort int, namespace string, podName string) (chan struct{}, error) { - // port forward - config, err := clientcmd.BuildConfigFromFlags("", kubeContext) - if err != nil { - return nil, err - } +func PortForward(config *restclient.Config, localPort int, remotePort int, namespace string, podName string) (chan struct{}, error) { roundTripper, upgrader, err := spdy.RoundTripperFor(config) if err != nil { return nil, err } + path := fmt.Sprintf("/api/v1/namespaces/%s/pods/%s/portforward", namespace, podName) hostIP := strings.TrimLeft(config.Host, "htps:/") serverURL := url.URL{Scheme: "http", Path: path, Host: hostIP}