├── .gitignore ├── fzfutil ├── fzf_test.go └── fzf.go ├── Dockerfile ├── go.mod ├── docker-compose.yml ├── .goreleaser.yml ├── benchmark.sh ├── README.md ├── config └── config.go ├── cmd ├── kubectx │ └── main.go └── kubens │ └── main.go └── go.sum /.gitignore: -------------------------------------------------------------------------------- 1 | output/* -------------------------------------------------------------------------------- /fzfutil/fzf_test.go: -------------------------------------------------------------------------------- 1 | package fzfutil 2 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.13 2 | 3 | ENV GOOS=linux 4 | ENV GOARCH=amd64 5 | 6 | EXPOSE 8080 7 | 8 | WORKDIR /go-kubectx 9 | 10 | COPY go.mod go.sum /go-kubectx/ 11 | RUN go mod download 12 | 13 | COPY . . -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/aca/go-kubectx 2 | 3 | go 1.13 4 | 5 | require ( 6 | github.com/spf13/pflag v1.0.5 7 | k8s.io/apimachinery v0.0.0-20200124032037-954b62493c18 8 | k8s.io/client-go v0.0.0-20200124032437-bccad466ab89 9 | ) 10 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | services: 3 | builder: 4 | build: . 5 | image: go-kubectx-builder 6 | entrypoint: /usr/local/go/bin/go 7 | command: build -v 8 | volumes: 9 | - ./output:/go-kubectx/output 10 | environment: 11 | GOOS: 12 | GOARCH: -------------------------------------------------------------------------------- /.goreleaser.yml: -------------------------------------------------------------------------------- 1 | before: 2 | hooks: 3 | - go mod tidy 4 | builds: 5 | - id: "kubens" 6 | binary: kubens 7 | main: ./cmd/kubens 8 | - id: "kubectx" 9 | binary: kubectx 10 | main: ./cmd/kubectx 11 | archives: 12 | - replacements: 13 | darwin: Darwin 14 | linux: Linux 15 | 386: i386 16 | amd64: x86_64 17 | checksum: 18 | name_template: 'checksums.txt' 19 | changelog: 20 | sort: asc 21 | -------------------------------------------------------------------------------- /benchmark.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | kubectx=/usr/bin/kubectx 4 | go_kubectx="$GOPATH/bin/kubectx" 5 | 6 | kubens=/usr/bin/kubens 7 | go_kubens="$GOPATH/bin/kubens" 8 | 9 | bench_kubectx() { 10 | echo "COMMAND: kubectx $@" 11 | hyperfine "$kubectx $@" "$go_kubectx $@" --export-markdown bench_kubectx.md 2>/dev/null 12 | printf "\n\n" 13 | } 14 | 15 | bench_kubens() { 16 | echo "COMMAND: kubens $@" 17 | hyperfine "$kubens $@" "$go_kubens $@" --export-markdown bench_kubens.md 2>/dev/null 18 | printf "\n\n" 19 | } 20 | 21 | bench_kubectx minikube 22 | bench_kubens kube-system 23 | 24 | -------------------------------------------------------------------------------- /fzfutil/fzf.go: -------------------------------------------------------------------------------- 1 | // fzfutil is to use fzf as library 2 | package fzfutil 3 | 4 | import ( 5 | "io" 6 | "os" 7 | "os/exec" 8 | "strings" 9 | ) 10 | 11 | // Based on, https://junegunn.kr/2016/02/using-fzf-in-your-program 12 | func FZF(input func(in io.WriteCloser), opts ...string) ([]string, error) { 13 | fzf, err := exec.LookPath("fzf") 14 | if err != nil { 15 | return nil, err 16 | } 17 | 18 | cmd := exec.Command(fzf, opts...) 19 | 20 | cmd.Stderr = os.Stderr 21 | 22 | in, _ := cmd.StdinPipe() 23 | go func() { 24 | input(in) 25 | in.Close() 26 | }() 27 | 28 | stdout, err := cmd.Output() 29 | if err != nil { 30 | exitError, ok := err.(*exec.ExitError) 31 | if !ok { 32 | return nil, err 33 | } else { 34 | code := exitError.ExitCode() 35 | // EXIT STATUS 36 | // 0 Normal exit 37 | // 1 No match 38 | // 2 Error 39 | // 130 Interrupted with CTRL-C or ESC 40 | if code == 1 || code == 130 { 41 | return nil, nil 42 | } 43 | } 44 | } 45 | 46 | return strings.Split(string(stdout), "\n"), nil 47 | } 48 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | **Archived** 2 | 3 | [kubectx](https://github.com/ahmetb/kubectx) is now written in go. Check [#12](https://github.com/aca/go-kubectx/issues/12). This project is not maintained anymore. 4 | 5 | --- 6 | 7 | # go-kubectx 8 | Simply 5x-10x faster alternative to famous [kubectx](https://github.com/ahmetb/kubectx). Uses client-go. 9 | 10 | ### Dependencies 11 | Requires [fzf](https://github.com/junegunn/fzf) same as original kubectx. 12 | 13 | ### Install 14 | Using go mod, requires go>=1.13 15 | ``` 16 | git clone git@github.com:aca/go-kubectx.git && cd go-kubectx 17 | go install ./cmd/kubens 18 | go install ./cmd/kubectx 19 | 20 | # Using Docker - also cross-compiles for other OS's 21 | # Binaries will be built into the output directory after build. 22 | cd go-kubectx && ./build.sh 23 | ``` 24 | 25 | or download pre-built binaries from [Releases](https://github.com/aca/go-kubectx/releases). 26 | 27 | 28 | ### Benchmarks 29 | 30 | | Command | Mean [ms] | Min [ms] | Max [ms] | Relative | 31 | |:---|---:|---:|---:|---:| 32 | | `/usr/bin/kubectx minikube` | 98.9 ± 12.1 | 84.8 | 138.6 | 5.35 ± 0.89 | 33 | | `/home/rok/bin/kubectx minikube` | 18.5 ± 2.1 | 15.6 | 27.1 | 1.00 | 34 | 35 | 36 | | Command | Mean [ms] | Min [ms] | Max [ms] | Relative | 37 | |:---|---:|---:|---:|---:| 38 | | `/usr/bin/kubens kube-system` | 258.6 ± 20.7 | 237.9 | 300.9 | 5.73 ± 1.78 | 39 | | `/home/rok/bin/kubens kube-system` | 45.1 ± 13.6 | 32.3 | 120.0 | 1.00 | 40 | -------------------------------------------------------------------------------- /config/config.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | import ( 4 | "bytes" 5 | "encoding/json" 6 | "io/ioutil" 7 | "os" 8 | "path/filepath" 9 | ) 10 | 11 | type Config struct { 12 | LastNamespace string `json:"last_namespace"` 13 | LastContext string `json:"last_context"` 14 | } 15 | 16 | func getCfgPath() (string, error) { 17 | cfgPath, err := os.UserConfigDir() 18 | if err != nil { 19 | return "", err 20 | } 21 | 22 | cfgPath = filepath.Join(cfgPath, "kubectx") 23 | err = os.MkdirAll(cfgPath, 0777) 24 | if err != nil { 25 | return "", err 26 | } 27 | 28 | cfgPath = filepath.Join(cfgPath, "config.json") 29 | 30 | _, err = os.Lstat(cfgPath) 31 | if os.IsNotExist(err) { 32 | var err error 33 | buf := &bytes.Buffer{} 34 | defaultCfg := Config{ 35 | LastNamespace: "default", 36 | LastContext: "", 37 | } 38 | err = json.NewEncoder(buf).Encode(&defaultCfg) 39 | if err != nil { 40 | return "", err 41 | } 42 | err = ioutil.WriteFile(cfgPath, buf.Bytes(), 0666) 43 | if err != nil { 44 | return "", err 45 | } 46 | } 47 | return cfgPath, nil 48 | } 49 | 50 | func WriteCfg(cfg *Config) error { 51 | cfgPath, err := getCfgPath() 52 | if err != nil { 53 | return err 54 | } 55 | 56 | b, err := json.Marshal(cfg) 57 | if err != nil { 58 | return err 59 | } 60 | 61 | err = ioutil.WriteFile(cfgPath, b, 0600) 62 | if err != nil { 63 | return err 64 | } 65 | 66 | return nil 67 | } 68 | 69 | func ReadCfg() (*Config, error) { 70 | cfg := &Config{} 71 | 72 | cfgPath, err := getCfgPath() 73 | if err != nil { 74 | return nil, err 75 | } 76 | 77 | b, err := ioutil.ReadFile(cfgPath) 78 | if err != nil { 79 | return nil, err 80 | } 81 | 82 | // ignore 83 | _ = json.Unmarshal(b, cfg) 84 | if err != nil { 85 | return nil, err 86 | } 87 | 88 | // if cfg.CurrentContext != "" { 89 | // cfg.CurNS = "default" 90 | // } 91 | 92 | return cfg, nil 93 | } 94 | -------------------------------------------------------------------------------- /cmd/kubectx/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "errors" 5 | "fmt" 6 | "io" 7 | "io/ioutil" 8 | "log" 9 | "os" 10 | 11 | "github.com/aca/go-kubectx/config" 12 | "github.com/aca/go-kubectx/fzfutil" 13 | "github.com/spf13/pflag" 14 | 15 | clientcmdapi "k8s.io/client-go/tools/clientcmd/api" 16 | 17 | "k8s.io/client-go/tools/clientcmd" 18 | ) 19 | 20 | var cfg *config.Config 21 | var rules *clientcmd.ClientConfigLoadingRules 22 | var clientcmdCfg *clientcmdapi.Config 23 | 24 | func main() { 25 | var err error 26 | log.SetFlags(log.LstdFlags | log.Lshortfile) 27 | cfg, err = config.ReadCfg() 28 | if err != nil { 29 | log.Fatal(err) 30 | } 31 | 32 | fs := pflag.NewFlagSet("kubectx", pflag.ContinueOnError) 33 | current := fs.BoolP("current", "c", false, "show the current context") 34 | help := fs.BoolP("help", "h", false, "help") 35 | fs.Parse(os.Args[1:]) 36 | 37 | if *help { 38 | fmt.Printf(`USAGE: 39 | kubectx : switch context(interactive) 40 | kubectx : switch context which closest match with QUERY(if failed to match, interactive mode) 41 | kubectx - : switch to previous context (~/.config/kubectx/config.json) 42 | kubectx -c, --current : show current context name 43 | kubectx -h,--help : help 44 | `) 45 | return 46 | } 47 | 48 | rules = clientcmd.NewDefaultClientConfigLoadingRules() 49 | b, err := ioutil.ReadFile(rules.GetDefaultFilename()) 50 | if err != nil { 51 | log.Fatal(err) 52 | } 53 | 54 | clientcmdCfg, err = clientcmd.Load(b) 55 | if err != nil { 56 | log.Fatal(err) 57 | } 58 | 59 | var query string 60 | 61 | if *current { 62 | fmt.Println(clientcmdCfg.CurrentContext) 63 | return 64 | } 65 | 66 | if len(os.Args) > 1 && os.Args[1] == "-" { 67 | query = cfg.LastContext 68 | } else if len(os.Args) > 1 { 69 | query = os.Args[1] 70 | } 71 | 72 | err = kubectx(query) 73 | if err != nil { 74 | fmt.Printf("Err: %s", err) 75 | os.Exit(1) 76 | } 77 | } 78 | 79 | func kubectx(query string) error { 80 | var err error 81 | 82 | _, ok := clientcmdCfg.Contexts[query] 83 | if ok { 84 | return modifyConfig(query) 85 | } 86 | 87 | listNS := func(in io.WriteCloser) { 88 | for key, _ := range clientcmdCfg.Contexts { 89 | fmt.Fprintln(in, key) 90 | } 91 | } 92 | 93 | fzfopt := []string{"--select-1", "--query", query} 94 | 95 | result, err := fzfutil.FZF(listNS, fzfopt...) 96 | if err != nil { 97 | return err 98 | } 99 | 100 | if len(result) == 0 { 101 | return errors.New("no context selected") 102 | } 103 | 104 | return modifyConfig(result[0]) 105 | } 106 | 107 | func modifyConfig(to string) (err error) { 108 | curCtx := clientcmdCfg.CurrentContext 109 | defer func() { 110 | if err == nil { 111 | if curCtx != to { 112 | cfg.LastContext = curCtx 113 | config.WriteCfg(cfg) 114 | } 115 | fmt.Printf("Switched to context \"%s\"\n", to) 116 | } 117 | }() 118 | clientcmdCfg.CurrentContext = to 119 | return clientcmd.ModifyConfig(rules, *clientcmdCfg, false) 120 | } 121 | -------------------------------------------------------------------------------- /cmd/kubens/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "errors" 5 | "fmt" 6 | "io" 7 | "io/ioutil" 8 | "log" 9 | "os" 10 | "time" 11 | 12 | "github.com/aca/go-kubectx/config" 13 | "github.com/aca/go-kubectx/fzfutil" 14 | "github.com/spf13/pflag" 15 | 16 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 17 | clientcmdapi "k8s.io/client-go/tools/clientcmd/api" 18 | 19 | "k8s.io/client-go/kubernetes" 20 | _ "k8s.io/client-go/plugin/pkg/client/auth" 21 | "k8s.io/client-go/tools/clientcmd" 22 | ) 23 | 24 | var cfg *config.Config 25 | var rules *clientcmd.ClientConfigLoadingRules 26 | var clientcmdCfg *clientcmdapi.Config 27 | var kubeCfgBytes []byte 28 | 29 | func main() { 30 | var err error 31 | log.SetFlags(log.LstdFlags | log.Lshortfile) 32 | cfg, err = config.ReadCfg() 33 | if err != nil { 34 | log.Fatal(err) 35 | } 36 | 37 | fs := pflag.NewFlagSet("kubens", pflag.ContinueOnError) 38 | current := fs.BoolP("current", "c", false, "show the current context") 39 | help := fs.BoolP("help", "h", false, "help") 40 | fs.Parse(os.Args[1:]) 41 | 42 | if *help { 43 | fmt.Printf(`USAGE: 44 | kubens : switch namespace(interactive) 45 | kubens : switch namespace which closest match with QUERY(if failed to match, interactive mode) 46 | kubens - : switch to previous namespace (~/.config/kubectx/config.json) 47 | kubens -c, --current : show current namespace name 48 | kubens -h,--help : help 49 | `) 50 | return 51 | } 52 | 53 | rules = clientcmd.NewDefaultClientConfigLoadingRules() 54 | kubeCfgBytes, err = ioutil.ReadFile(rules.GetDefaultFilename()) 55 | if err != nil { 56 | log.Fatal(err) 57 | } 58 | 59 | clientcmdCfg, err = clientcmd.Load(kubeCfgBytes) 60 | if err != nil { 61 | log.Fatal(err) 62 | } 63 | 64 | var query string 65 | 66 | if *current { 67 | fmt.Println(clientcmdCfg.Contexts[clientcmdCfg.CurrentContext].Namespace) 68 | return 69 | } 70 | 71 | if len(os.Args) > 1 && os.Args[1] == "-" { 72 | query = cfg.LastNamespace 73 | } else if len(os.Args) > 1 { 74 | query = os.Args[1] 75 | } 76 | 77 | err = kubens(query) 78 | if err != nil { 79 | fmt.Printf("Err: %s", err) 80 | os.Exit(1) 81 | } 82 | } 83 | 84 | func kubens(query string) (err error) { 85 | restConfig, err := clientcmd.RESTConfigFromKubeConfig(kubeCfgBytes) 86 | if err != nil { 87 | return err 88 | } 89 | restConfig.Timeout = time.Second * 5 90 | 91 | clientset, err := kubernetes.NewForConfig(restConfig) 92 | if err != nil { 93 | return err 94 | } 95 | 96 | namespaces, err := clientset.CoreV1().Namespaces().List(metav1.ListOptions{}) 97 | if err != nil { 98 | return err 99 | } 100 | 101 | for _, item := range namespaces.Items{ 102 | if item.ObjectMeta.Name == query { 103 | return modifyConfig(query) 104 | } 105 | } 106 | 107 | fzfopt := []string{"--select-1", "--query", query} 108 | 109 | result, err := fzfutil.FZF(func(in io.WriteCloser) { 110 | for _, item := range namespaces.Items { 111 | fmt.Fprintln(in, item.ObjectMeta.Name) 112 | } 113 | }, fzfopt...) 114 | 115 | if err != nil { 116 | return err 117 | } 118 | 119 | if len(result) == 0 { 120 | return errors.New("no namespace selected") 121 | } 122 | 123 | return modifyConfig(result[0]) 124 | } 125 | 126 | func modifyConfig(to string) (err error) { 127 | curNS := clientcmdCfg.Contexts[clientcmdCfg.CurrentContext].Namespace 128 | defer func() { 129 | if err == nil { 130 | if curNS != to { 131 | cfg.LastNamespace = curNS 132 | config.WriteCfg(cfg) 133 | } 134 | fmt.Printf("Switched to namespace \"%s\"\n", to) 135 | } 136 | }() 137 | clientcmdCfg.Contexts[clientcmdCfg.CurrentContext].Namespace = to 138 | return clientcmd.ModifyConfig(rules, *clientcmdCfg, false) 139 | } 140 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 3 | cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo= 4 | cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 5 | github.com/Azure/go-autorest/autorest v0.9.0 h1:MRvx8gncNaXJqOoLmhNjUAKh33JJF8LyxPhomEtOsjs= 6 | github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= 7 | github.com/Azure/go-autorest/autorest/adal v0.5.0 h1:q2gDruN08/guU9vAjuPWff0+QIrpH6ediguzdAzXAUU= 8 | github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= 9 | github.com/Azure/go-autorest/autorest/date v0.1.0 h1:YGrhWfrgtFs84+h0o46rJrlmsZtyZRg470CqAXTZaGM= 10 | github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= 11 | github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= 12 | github.com/Azure/go-autorest/autorest/mocks v0.2.0 h1:Ww5g4zThfD/6cLb4z6xxgeyDa7QDkizMkJKe0ysZXp0= 13 | github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= 14 | github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= 15 | github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= 16 | github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= 17 | github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= 18 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 19 | github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= 20 | github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= 21 | github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= 22 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 23 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 24 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 25 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 26 | github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= 27 | github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= 28 | github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= 29 | github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= 30 | github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= 31 | github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= 32 | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 33 | github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 34 | github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= 35 | github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= 36 | github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= 37 | github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= 38 | github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= 39 | github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= 40 | github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= 41 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 42 | github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 43 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 44 | github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 45 | github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 46 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 47 | github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= 48 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 49 | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 50 | github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 51 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 52 | github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= 53 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 54 | github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= 55 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 56 | github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= 57 | github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 58 | github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 59 | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= 60 | github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= 61 | github.com/googleapis/gnostic v0.1.0 h1:rVsPeBmXbYv4If/cumu1AzZPwV58q433hvONV1UEZoI= 62 | github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= 63 | github.com/gophercloud/gophercloud v0.1.0 h1:P/nh25+rzXouhytV2pUHBb65fnds26Ghl8/391+sT5o= 64 | github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= 65 | github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= 66 | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 67 | github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 68 | github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= 69 | github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= 70 | github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= 71 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= 72 | github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= 73 | github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 74 | github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= 75 | github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= 76 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 77 | github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= 78 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 79 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 80 | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= 81 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 82 | github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 83 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 84 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= 85 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 86 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 87 | github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= 88 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 89 | github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= 90 | github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= 91 | github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 92 | github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 93 | github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 94 | github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= 95 | github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= 96 | github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= 97 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 98 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 99 | github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= 100 | github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 101 | github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= 102 | github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 103 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 104 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 105 | github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= 106 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 107 | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= 108 | golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 109 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 110 | golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 h1:7KByu05hhLed2MO29w7p1XfZvZ13m8mub3shuVftRs0= 111 | golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 112 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 113 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 114 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 115 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 116 | golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 117 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 118 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 119 | golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 120 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 121 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 122 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 123 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 124 | golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI= 125 | golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 126 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 127 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 128 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= 129 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 130 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 131 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 132 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 133 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 134 | golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 135 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 136 | golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 137 | golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 138 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 139 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 140 | golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456 h1:ng0gs1AKnRRuEMZoTLLlbOd+C17zUDepwGQBb/n+JVg= 141 | golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 142 | golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 143 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 144 | golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 145 | golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= 146 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 147 | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 148 | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= 149 | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 150 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 151 | golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 152 | golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 153 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 154 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 155 | golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 156 | google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= 157 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 158 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 159 | google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c= 160 | google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 161 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 162 | google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 163 | google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 164 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 165 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 166 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= 167 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 168 | gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= 169 | gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= 170 | gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= 171 | gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= 172 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 173 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 174 | gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= 175 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 176 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 177 | honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 178 | k8s.io/api v0.0.0-20200124032216-924612ff3bca h1:44eybKN1psru+ndO300QCFDErIEZ5foLCbkUf3Y/rCU= 179 | k8s.io/api v0.0.0-20200124032216-924612ff3bca/go.mod h1:WYGNSV/2aSDAMvHS6cmemi/htNIV58hkcMDRVUi/6tw= 180 | k8s.io/apimachinery v0.0.0-20200124032037-954b62493c18 h1:DR+OqyPAa+L9ZeRFmHD9jwyGrkrSmR3ERPA0wISOnEo= 181 | k8s.io/apimachinery v0.0.0-20200124032037-954b62493c18/go.mod h1:OAtNFcsmF2+2JlejTQ9O5Qu7PHEA9GlSn28VjH8ssNs= 182 | k8s.io/client-go v0.0.0-20200124032437-bccad466ab89 h1:eSec9M8Jo9V0jwm1WW24BMjQ/YHjgZhY+Ck39OjklsQ= 183 | k8s.io/client-go v0.0.0-20200124032437-bccad466ab89/go.mod h1:v3RpIuHO09Zbhw5BmRcqE/Het8nGgvMkJ7QPFq5WDCo= 184 | k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= 185 | k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= 186 | k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= 187 | k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= 188 | k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= 189 | k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= 190 | k8s.io/utils v0.0.0-20191217005138-9e5e9d854fcc h1:MUttqhwRgupMiA5ps5F3d2/NLkU8EZSECTGxrQxqM54= 191 | k8s.io/utils v0.0.0-20191217005138-9e5e9d854fcc/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= 192 | sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= 193 | sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= 194 | sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= 195 | --------------------------------------------------------------------------------