From bc9751275fe7575802a7dc80d061398c0c5d2034 Mon Sep 17 00:00:00 2001 From: Arunvel Sriram Date: Fri, 23 Nov 2018 23:29:35 +0530 Subject: [PATCH 01/48] Create github release uisng travis, goreleaser --- .gitignore | 1 + .goreleaser.yml | 21 +++++++++++++++++++++ .travis.yml | 10 +++++++++- 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 .goreleaser.yml diff --git a/.gitignore b/.gitignore index 5ef8ec7..3da371d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ #Output out/ +dist/ # user configs config.yaml diff --git a/.goreleaser.yml b/.goreleaser.yml new file mode 100644 index 0000000..388f39a --- /dev/null +++ b/.goreleaser.yml @@ -0,0 +1,21 @@ +builds: + - goos: + - darwin + - linux + - windows + goarch: + - amd64 +archive: + replacements: + darwin: Darwin + linux: Linux + windows: Windows + amd64: x86_64 +checksum: + name_template: "checksums.txt" +snapshot: + name_template: "{{ .Tag }}-next" +changelog: + sort: asc +release: + draft: true diff --git a/.travis.yml b/.travis.yml index 0b8f4b3..ecee061 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: go go: - - "1.11.x" + - "1.11.x" - master env: @@ -9,3 +9,11 @@ env: install: make setup modules script: make tests tests-cover-html build + +deploy: + - provider: script + skip_cleanup: true + script: curl -sL https://git.io/goreleaser | bash + on: + tags: true + condition: $TRAVIS_OS_NAME = linux From 49713583c1bcbb08bde8c45848ba7ed9f10ff7b9 Mon Sep 17 00:00:00 2001 From: Arunvel Sriram Date: Fri, 23 Nov 2018 23:36:11 +0530 Subject: [PATCH 02/48] Remove golang master version --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ecee061..94dd20e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: go go: - "1.11.x" - - master env: - GO111MODULE=on From c0a3620c5b5d2824f1794d7b5c14f69a6f3914ba Mon Sep 17 00:00:00 2001 From: Arunvel Sriram Date: Fri, 23 Nov 2018 23:50:30 +0530 Subject: [PATCH 03/48] Add env var for creating release in GitHub --- .travis.yml | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 94dd20e..aa655d9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,18 +1,16 @@ language: go go: - - "1.11.x" - + - 1.11.x env: - - GO111MODULE=on - + global: + - GO111MODULE=on + - secure: azgsx/4nSKps0b1cPxNt1p5eke8m84U+gpUD0r+bjwj+7anhDkaTMzj4sBwPNf56h1+AGmKVBBflcjuJg34ONLLOZhNQ1QwM8nypuX0pn4Y42JkTnAFVSGA7Scw9F3/gdBU1aqnqj4Hb3q72RzVyY+LI6SZpXebpv5PiTdOv0uffrYmxtmZ/9HRFlBRTGEUws+oOXoNr5fK1bcvpDBHbdUAsEpj/CJocpJ5U85XU51E38InEmx1fiFxcIuddC6IkuWRL9rTLw4xMNVz8QUcEX7yLAkbMi8UMB9BYB91qh8NMcd6sKsrCy4a8ue+H3VWpVc634/fAkfp9N3YFmQBlDUQ0tt41UhXPoTqABrjv+TLt42ydUItqdokSVwvMPc5ucQ3hwpqt2JMKE5/Pj36PwFqUE4mC7woAWqO4YnEf5jC0Rek2JMxqbljVlfANH9RI3ormEWmdtO6/VKjuauCCq3BIUogygCoZ1iJQgKVzhjc8V9o1cSyW/PxfL/uBUQr32toYd4tGGHqiZeHUCwALY1khNPN+8miWlXExdjkjPjWdyoYXDiO3S4JNY0Q7cRQZs9nwI4+FCsNR9/Borq/l1/LlFbD56vyhywLBpRkODAsX/+zRPlgZOOcPtTgzMN+OGeC1WNCrr8A5YJ/w5avM91Z0M00w1a45u/KkX437fbI= install: make setup modules - script: make tests tests-cover-html build - deploy: - provider: script skip_cleanup: true script: curl -sL https://git.io/goreleaser | bash on: tags: true - condition: $TRAVIS_OS_NAME = linux + condition: "$TRAVIS_OS_NAME = linux" From ccfdde4148b9ad4e8d2e25df863c5fde4ec420fd Mon Sep 17 00:00:00 2001 From: Arunvel Sriram Date: Sat, 24 Nov 2018 00:05:26 +0530 Subject: [PATCH 04/48] Show build status in readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 19a1741..fed075a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # kube-tmuxp +[![Build Status](https://travis-ci.org/arunvelsriram/kube-tmuxp.svg?branch=master)](https://travis-ci.org/arunvelsriram/kube-tmuxp) + Easier way to work with multiple [Kubernetes](https://kubernetes.io/) clusters. ## Introduction From 6bfbe7185d7674fbc1a57f2fcec51d867194cfa0 Mon Sep 17 00:00:00 2001 From: Arunvel Sriram Date: Sat, 24 Nov 2018 00:14:14 +0530 Subject: [PATCH 05/48] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fed075a..ce0db6b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Build Status](https://travis-ci.org/arunvelsriram/kube-tmuxp.svg?branch=master)](https://travis-ci.org/arunvelsriram/kube-tmuxp) -Easier way to work with multiple [Kubernetes](https://kubernetes.io/) clusters. +Tool to generate tmuxp configs that help to switch between multiple [Kubernetes](https://kubernetes.io/) contexts safely. ## Introduction From 219c3be308eab2f7961abbd3f64d019bec266c43 Mon Sep 17 00:00:00 2001 From: Arunvel Sriram Date: Sat, 24 Nov 2018 00:36:29 +0530 Subject: [PATCH 06/48] Add brew installation steps to readme --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ce0db6b..ca6fa03 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,10 @@ The generated `tmuxp` configs can be used to start preconfigured `tmux` sessions ### Homebrew -To be updated +``` +brew tap arunvelsriram/stable +brew install kube-tmuxp +``` ### Manual From 2f31cda7b3c024dc1fc3d2af9e379826c268c912 Mon Sep 17 00:00:00 2001 From: Arunvel Sriram Date: Sat, 24 Nov 2018 00:56:37 +0530 Subject: [PATCH 07/48] Add bash functions written by @jskswamy --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index ca6fa03..b9f0141 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,10 @@ tmuxp load my-context-name Now you will be inside a `tmux` session preconfigured with Kubernetes context `my-context-name`. +## Handy bash functions + +Use the `bash` functions available [here](https://github.com/arunvelsriram/dotfiles/blob/master/bash_it_custom/plugins/kube-tmuxp.plugin.bash) to switch, kill sessions easily. Special thanks to [@jskswamy](https://github.com/jskswamy) for writing these awesome functions. + ## Limitations * Currently works for Google Kubernetes Engine (GKE) only. However, it can be extended to work with any Kubernetes clusters. Feel free to submit a PR for this. From de85afd42b6a4e3e1ff0ab973ee42c3c1a2f97dd Mon Sep 17 00:00:00 2001 From: Krishnaswamy Subramanian Date: Sat, 24 Nov 2018 21:58:25 +0530 Subject: [PATCH 08/48] Add cmd to show version --- Makefile | 5 +++-- cmd/version.go | 26 ++++++++++++++++++++++++++ main.go | 3 +++ 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 cmd/version.go diff --git a/Makefile b/Makefile index f5a8c19..398ec0e 100644 --- a/Makefile +++ b/Makefile @@ -5,6 +5,7 @@ help: ## prints help (only for tasks with comment) APP=kube-tmuxp SRC_PACKAGES=$(shell go list ./...) APP_EXECUTABLE="./out/$(APP)" +BUILD?=$(shell git describe --tags --always --dirty) RICHGO=$(shell command -v richgo 2> /dev/null) ifeq ($(RICHGO),) @@ -22,10 +23,10 @@ modules: ## add missing and remove unused modules go mod tidy compile: ensure-out-dir ## compiles kube-tmuxp for this platform - $(GOBIN) build -o $(APP_EXECUTABLE) ./main.go + $(GOBIN) build -ldflags "-X main.version=${BUILD}" -o $(APP_EXECUTABLE) ./main.go compile-linux: ensure-out-dir ## compiles kube-tmuxp for linux - GOOS=linux GOARCH=amd64 $(GOBIN) build -o $(APP_EXECUTABLE) ./main.go + GOOS=linux GOARCH=amd64 $(GOBIN) build -ldflags "-X main.version=${BUILD}" -o $(APP_EXECUTABLE) ./main.go fmt: ## format go code $(GOBIN) fmt $(SRC_PACKAGES) diff --git a/cmd/version.go b/cmd/version.go new file mode 100644 index 0000000..6933f24 --- /dev/null +++ b/cmd/version.go @@ -0,0 +1,26 @@ +package cmd + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +var buildVersion string + +// SetVersion set the major and minor version +func SetVersion(version string) { + buildVersion = version +} + +var versionCmd = &cobra.Command{ + Use: "version", + Short: "Print the current version", + Run: func(cmd *cobra.Command, args []string) { + fmt.Println(buildVersion) + }, +} + +func init() { + rootCmd.AddCommand(versionCmd) +} diff --git a/main.go b/main.go index edfb318..647f4e7 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,9 @@ package main import "github.com/arunvelsriram/kube-tmuxp/cmd" +var version string + func main() { + cmd.SetVersion(version) cmd.Execute() } From c0eb729ce0bfe415b15c679305db5780b8a21c97 Mon Sep 17 00:00:00 2001 From: Dinesh Date: Sat, 5 Jan 2019 13:20:29 +0530 Subject: [PATCH 09/48] Create ~/.tmuxp dir if not present --- pkg/filesystem/filesystem.go | 9 +++++++++ pkg/internal/mock/filesystem.go | 12 ++++++++++++ pkg/tmuxp/tmuxp.go | 4 ++++ pkg/tmuxp/tmuxp_test.go | 16 ++++++++++++++++ 4 files changed, 41 insertions(+) diff --git a/pkg/filesystem/filesystem.go b/pkg/filesystem/filesystem.go index 9361d0c..e639f43 100644 --- a/pkg/filesystem/filesystem.go +++ b/pkg/filesystem/filesystem.go @@ -13,6 +13,7 @@ type FileSystem interface { HomeDir() (string, error) Open(file string) (io.Reader, error) Create(file string) (io.Writer, error) + CreateDirIfNotExist(dir string) error } // Default represents the Operating System's filesystem @@ -55,3 +56,11 @@ func (d *Default) Create(file string) (io.Writer, error) { return writer, nil } + +// CreateDirIfNotExist creates a new directory if it already exists +func (d *Default) CreateDirIfNotExist(dir string) error { + if _, err := os.Stat(dir); os.IsNotExist(err) { + return os.Mkdir(dir, 0755) + } + return nil +} diff --git a/pkg/internal/mock/filesystem.go b/pkg/internal/mock/filesystem.go index 1f02941..7b178fc 100644 --- a/pkg/internal/mock/filesystem.go +++ b/pkg/internal/mock/filesystem.go @@ -83,3 +83,15 @@ func (m *FileSystem) Create(file string) (io.Writer, error) { func (mr *FileSystemMockRecorder) Create(file interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*FileSystem)(nil).Create), file) } + +// CreateDirIfNotExist mocks base method +func (m *FileSystem) CreateDirIfNotExist(dir string) error { + ret := m.ctrl.Call(m, "CreateDirIfNotExist", dir) + ret0, _ := ret[0].(error) + return ret0 +} + +// CreateDirIfNotExist indicates an expected call of CreateDirIfNotExist +func (mr *FileSystemMockRecorder) CreateDirIfNotExist(dir interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateDirIfNotExist", reflect.TypeOf((*FileSystem)(nil).CreateDirIfNotExist), dir) +} diff --git a/pkg/tmuxp/tmuxp.go b/pkg/tmuxp/tmuxp.go index 1058a6e..f17ffb4 100644 --- a/pkg/tmuxp/tmuxp.go +++ b/pkg/tmuxp/tmuxp.go @@ -60,6 +60,10 @@ func NewConfig(sessionName string, windows Windows, environment Environment, fs } tmuxpCfgsDir := path.Join(home, ".tmuxp") + err = fs.CreateDirIfNotExist(tmuxpCfgsDir) + if err != nil { + return nil, err + } return &Config{ SessionName: sessionName, Windows: windows, diff --git a/pkg/tmuxp/tmuxp_test.go b/pkg/tmuxp/tmuxp_test.go index f2b547a..6ea3b81 100644 --- a/pkg/tmuxp/tmuxp_test.go +++ b/pkg/tmuxp/tmuxp_test.go @@ -18,6 +18,7 @@ func TestNewConfig(t *testing.T) { mockFS := mock.NewFileSystem(ctrl) mockFS.EXPECT().HomeDir().Return("/Users/test", nil) + mockFS.EXPECT().CreateDirIfNotExist(gomock.Eq("/Users/test/.tmuxp")).Return(nil) tmuxpCfg, err := tmuxp.NewConfig("session", tmuxp.Windows{}, tmuxp.Environment{}, mockFS) assert.Nil(t, err) @@ -34,6 +35,18 @@ func TestNewConfig(t *testing.T) { assert.EqualError(t, err, "some error") }) + + t.Run("should return error in create .tmuxp dir is failed", func(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + mockFS := mock.NewFileSystem(ctrl) + mockFS.EXPECT().HomeDir().Return("/Users/test", nil) + mockFS.EXPECT().CreateDirIfNotExist(gomock.Eq("/Users/test/.tmuxp")).Return(fmt.Errorf("error creating .tmuxp dir")) + _, err := tmuxp.NewConfig("session", tmuxp.Windows{}, tmuxp.Environment{}, mockFS) + + assert.EqualError(t, err, "error creating .tmuxp dir") + }) } func TestTmuxpConfigsDir(t *testing.T) { @@ -42,6 +55,7 @@ func TestTmuxpConfigsDir(t *testing.T) { mockFS := mock.NewFileSystem(ctrl) mockFS.EXPECT().HomeDir().Return("/Users/test", nil) + mockFS.EXPECT().CreateDirIfNotExist(gomock.Eq("/Users/test/.tmuxp")).Return(nil) tmuxpCfg, _ := tmuxp.NewConfig("session", tmuxp.Windows{}, tmuxp.Environment{}, mockFS) assert.Equal(t, "/Users/test/.tmuxp", tmuxpCfg.TmuxpConfigsDir()) @@ -55,6 +69,7 @@ func TestSave(t *testing.T) { mockFS := mock.NewFileSystem(ctrl) mockFS.EXPECT().HomeDir().Return("/Users/test", nil) var writer bytes.Buffer + mockFS.EXPECT().CreateDirIfNotExist(gomock.Eq("/Users/test/.tmuxp")).Return(nil) mockFS.EXPECT().Create("tmuxp-config.yaml").Return(&writer, nil) tmuxpCfg, _ := tmuxp.NewConfig("session", tmuxp.Windows{{Name: "window"}}, tmuxp.Environment{"TEST_ENV": "value", "ANOTHER_TEST_ENV": "another-value"}, mockFS) @@ -79,6 +94,7 @@ environment: mockFS := mock.NewFileSystem(ctrl) mockFS.EXPECT().HomeDir().Return("/Users/test", nil) + mockFS.EXPECT().CreateDirIfNotExist(gomock.Eq("/Users/test/.tmuxp")).Return(nil) mockFS.EXPECT().Create("tmuxp-config.yaml").Return(nil, fmt.Errorf("some error")) tmuxpCfg, _ := tmuxp.NewConfig("session", tmuxp.Windows{{Name: "window"}}, tmuxp.Environment{"TEST_ENV": "value", "ANOTHER_TEST_ENV": "another-value"}, mockFS) From e2e918992047e5c3cc9d172b17e33a6c6bc264c8 Mon Sep 17 00:00:00 2001 From: Arunvel Sriram Date: Wed, 13 Feb 2019 23:38:38 +0530 Subject: [PATCH 10/48] Complete transfer ownership --- README.md | 2 +- cmd/generate.go | 8 ++++---- go.mod | 2 +- main.go | 2 +- pkg/commander/commander_test.go | 2 +- pkg/kubeconfig/kubeconfig.go | 4 ++-- pkg/kubeconfig/kubeconfig_test.go | 4 ++-- pkg/kubetmuxp/kubetmuxp.go | 6 +++--- pkg/kubetmuxp/kubetmuxp_test.go | 6 +++--- pkg/tmuxp/tmuxp.go | 2 +- pkg/tmuxp/tmuxp_test.go | 4 ++-- 11 files changed, 21 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index b9f0141..45b9b4c 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ brew install kube-tmuxp ### Manual ``` -git clone https://github.com/arunvelsriram/kube-tmuxp.git +git clone https://github.com/thecasualcoder/kube-tmuxp.git cd kube-tmuxp make build cp ./out/kube-tmuxp /usr/local/bin/kube-tmuxp diff --git a/cmd/generate.go b/cmd/generate.go index eaa6f2d..307aba2 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -4,11 +4,11 @@ import ( "fmt" "os" - "github.com/arunvelsriram/kube-tmuxp/pkg/commander" - "github.com/arunvelsriram/kube-tmuxp/pkg/filesystem" - "github.com/arunvelsriram/kube-tmuxp/pkg/kubeconfig" - "github.com/arunvelsriram/kube-tmuxp/pkg/kubetmuxp" "github.com/spf13/cobra" + "github.com/thecasualcoder/kube-tmuxp/pkg/commander" + "github.com/thecasualcoder/kube-tmuxp/pkg/filesystem" + "github.com/thecasualcoder/kube-tmuxp/pkg/kubeconfig" + "github.com/thecasualcoder/kube-tmuxp/pkg/kubetmuxp" ) var generateCmd = &cobra.Command{ diff --git a/go.mod b/go.mod index e380e25..5065d47 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/arunvelsriram/kube-tmuxp +module github.com/thecasualcoder/kube-tmuxp require ( github.com/BurntSushi/toml v0.3.1 // indirect diff --git a/main.go b/main.go index 647f4e7..c6c67c8 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,6 @@ package main -import "github.com/arunvelsriram/kube-tmuxp/cmd" +import "github.com/thecasualcoder/kube-tmuxp/cmd" var version string diff --git a/pkg/commander/commander_test.go b/pkg/commander/commander_test.go index 2a3a076..2445de3 100644 --- a/pkg/commander/commander_test.go +++ b/pkg/commander/commander_test.go @@ -3,8 +3,8 @@ package commander_test import ( "testing" - "github.com/arunvelsriram/kube-tmuxp/pkg/commander" "github.com/stretchr/testify/assert" + "github.com/thecasualcoder/kube-tmuxp/pkg/commander" ) func TestExecute(t *testing.T) { diff --git a/pkg/kubeconfig/kubeconfig.go b/pkg/kubeconfig/kubeconfig.go index 4530ef0..c0cb2e9 100644 --- a/pkg/kubeconfig/kubeconfig.go +++ b/pkg/kubeconfig/kubeconfig.go @@ -5,8 +5,8 @@ import ( "os" "path" - "github.com/arunvelsriram/kube-tmuxp/pkg/commander" - "github.com/arunvelsriram/kube-tmuxp/pkg/filesystem" + "github.com/thecasualcoder/kube-tmuxp/pkg/commander" + "github.com/thecasualcoder/kube-tmuxp/pkg/filesystem" ) // KubeConfig exposes methods to perform actions on kubeconfig diff --git a/pkg/kubeconfig/kubeconfig_test.go b/pkg/kubeconfig/kubeconfig_test.go index 46b1fd5..075a4b6 100644 --- a/pkg/kubeconfig/kubeconfig_test.go +++ b/pkg/kubeconfig/kubeconfig_test.go @@ -5,10 +5,10 @@ import ( "os" "testing" - "github.com/arunvelsriram/kube-tmuxp/pkg/internal/mock" - "github.com/arunvelsriram/kube-tmuxp/pkg/kubeconfig" "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" + "github.com/thecasualcoder/kube-tmuxp/pkg/internal/mock" + "github.com/thecasualcoder/kube-tmuxp/pkg/kubeconfig" ) func TestNew(t *testing.T) { diff --git a/pkg/kubetmuxp/kubetmuxp.go b/pkg/kubetmuxp/kubetmuxp.go index 51a6192..8b7619d 100644 --- a/pkg/kubetmuxp/kubetmuxp.go +++ b/pkg/kubetmuxp/kubetmuxp.go @@ -5,9 +5,9 @@ import ( "io/ioutil" "path" - "github.com/arunvelsriram/kube-tmuxp/pkg/filesystem" - "github.com/arunvelsriram/kube-tmuxp/pkg/kubeconfig" - "github.com/arunvelsriram/kube-tmuxp/pkg/tmuxp" + "github.com/thecasualcoder/kube-tmuxp/pkg/filesystem" + "github.com/thecasualcoder/kube-tmuxp/pkg/kubeconfig" + "github.com/thecasualcoder/kube-tmuxp/pkg/tmuxp" yaml "gopkg.in/yaml.v2" ) diff --git a/pkg/kubetmuxp/kubetmuxp_test.go b/pkg/kubetmuxp/kubetmuxp_test.go index b71bb09..d3ccd0d 100644 --- a/pkg/kubetmuxp/kubetmuxp_test.go +++ b/pkg/kubetmuxp/kubetmuxp_test.go @@ -5,11 +5,11 @@ import ( "strings" "testing" - "github.com/arunvelsriram/kube-tmuxp/pkg/internal/mock" - "github.com/arunvelsriram/kube-tmuxp/pkg/kubeconfig" - "github.com/arunvelsriram/kube-tmuxp/pkg/kubetmuxp" "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" + "github.com/thecasualcoder/kube-tmuxp/pkg/internal/mock" + "github.com/thecasualcoder/kube-tmuxp/pkg/kubeconfig" + "github.com/thecasualcoder/kube-tmuxp/pkg/kubetmuxp" ) func getKubeCfg(ctrl *gomock.Controller) kubeconfig.KubeConfig { diff --git a/pkg/tmuxp/tmuxp.go b/pkg/tmuxp/tmuxp.go index f17ffb4..593b384 100644 --- a/pkg/tmuxp/tmuxp.go +++ b/pkg/tmuxp/tmuxp.go @@ -3,7 +3,7 @@ package tmuxp import ( "path" - "github.com/arunvelsriram/kube-tmuxp/pkg/filesystem" + "github.com/thecasualcoder/kube-tmuxp/pkg/filesystem" yaml "gopkg.in/yaml.v2" ) diff --git a/pkg/tmuxp/tmuxp_test.go b/pkg/tmuxp/tmuxp_test.go index 6ea3b81..53bfd9d 100644 --- a/pkg/tmuxp/tmuxp_test.go +++ b/pkg/tmuxp/tmuxp_test.go @@ -5,10 +5,10 @@ import ( "fmt" "testing" - "github.com/arunvelsriram/kube-tmuxp/pkg/internal/mock" - "github.com/arunvelsriram/kube-tmuxp/pkg/tmuxp" "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" + "github.com/thecasualcoder/kube-tmuxp/pkg/internal/mock" + "github.com/thecasualcoder/kube-tmuxp/pkg/tmuxp" ) func TestNewConfig(t *testing.T) { From afb3fc8b2f33905714c03bd75764b10307a33d63 Mon Sep 17 00:00:00 2001 From: Arunvel Sriram Date: Wed, 13 Feb 2019 23:52:04 +0530 Subject: [PATCH 11/48] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 45b9b4c..13ebcb7 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ The generated `tmuxp` configs can be used to start preconfigured `tmux` sessions ### Homebrew ``` -brew tap arunvelsriram/stable +brew tap thecasualcoder/stable brew install kube-tmuxp ``` From e35dd16189a54cc2879618551efa4149b974459e Mon Sep 17 00:00:00 2001 From: Arunvel Sriram Date: Thu, 14 Feb 2019 22:16:14 +0530 Subject: [PATCH 12/48] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 13ebcb7..f29d398 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # kube-tmuxp -[![Build Status](https://travis-ci.org/arunvelsriram/kube-tmuxp.svg?branch=master)](https://travis-ci.org/arunvelsriram/kube-tmuxp) +[![Build Status](https://travis-ci.org/thecasualcoder/kube-tmuxp.svg?branch=master)](https://travis-ci.org/thecasualcoder/kube-tmuxp) Tool to generate tmuxp configs that help to switch between multiple [Kubernetes](https://kubernetes.io/) contexts safely. From 686f5fe57193812085109eed66771e37c624293b Mon Sep 17 00:00:00 2001 From: Arunvel Sriram Date: Wed, 27 Mar 2019 01:49:38 +0530 Subject: [PATCH 13/48] Handle err when importing k8s context - print command execution errors to stderr --- pkg/commander/commander.go | 1 + pkg/kubeconfig/kubeconfig.go | 2 -- pkg/kubeconfig/kubeconfig_test.go | 4 ---- pkg/kubetmuxp/kubetmuxp.go | 8 ++++++-- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/pkg/commander/commander.go b/pkg/commander/commander.go index a8bbca8..bbe46ff 100644 --- a/pkg/commander/commander.go +++ b/pkg/commander/commander.go @@ -17,6 +17,7 @@ type Default struct{} // Execute executes a command on the actual machine func (d *Default) Execute(cmdStr string, args []string, envs []string) (string, error) { cmd := exec.Command(cmdStr, args...) + cmd.Stderr = os.Stderr cmd.Env = os.Environ() cmd.Env = append(cmd.Env, envs...) out, err := cmd.Output() diff --git a/pkg/kubeconfig/kubeconfig.go b/pkg/kubeconfig/kubeconfig.go index c0cb2e9..89b00c9 100644 --- a/pkg/kubeconfig/kubeconfig.go +++ b/pkg/kubeconfig/kubeconfig.go @@ -38,8 +38,6 @@ func (k *KubeConfig) AddRegionalCluster(project string, cluster string, region s fmt.Sprintf("--project=%s", project), } envs := []string{ - "CLOUDSDK_CONTAINER_USE_V1_API_CLIENT=false", - "CLOUDSDK_CONTAINER_USE_V1_API=false", fmt.Sprintf("KUBECONFIG=%s", kubeCfgFile), } if _, err := k.commander.Execute("gcloud", args, envs); err != nil { diff --git a/pkg/kubeconfig/kubeconfig_test.go b/pkg/kubeconfig/kubeconfig_test.go index 075a4b6..9705489 100644 --- a/pkg/kubeconfig/kubeconfig_test.go +++ b/pkg/kubeconfig/kubeconfig_test.go @@ -105,8 +105,6 @@ func TestAddRegionalCluster(t *testing.T) { "--project=test-project", } envs := []string{ - "CLOUDSDK_CONTAINER_USE_V1_API_CLIENT=false", - "CLOUDSDK_CONTAINER_USE_V1_API=false", "KUBECONFIG=/Users/test/.kube/configs/test-context", } mockCmdr.EXPECT().Execute("gcloud", args, envs).Return("Context added successfully", nil) @@ -135,8 +133,6 @@ func TestAddRegionalCluster(t *testing.T) { "--project=test-project", } envs := []string{ - "CLOUDSDK_CONTAINER_USE_V1_API_CLIENT=false", - "CLOUDSDK_CONTAINER_USE_V1_API=false", "KUBECONFIG=/Users/test/.kube/configs/test-context", } mockCmdr.EXPECT().Execute("gcloud", args, envs).Return("", fmt.Errorf("some error")) diff --git a/pkg/kubetmuxp/kubetmuxp.go b/pkg/kubetmuxp/kubetmuxp.go index 8b7619d..45fba8a 100644 --- a/pkg/kubetmuxp/kubetmuxp.go +++ b/pkg/kubetmuxp/kubetmuxp.go @@ -121,9 +121,13 @@ func (c *Config) Process() error { if regional, err := cluster.IsRegional(); err != nil { return err } else if regional { - c.kubeCfg.AddRegionalCluster(project.Name, cluster.Name, cluster.Region, kubeCfgFile) + if err := c.kubeCfg.AddRegionalCluster(project.Name, cluster.Name, cluster.Region, kubeCfgFile); err != nil { + return err + } } else { - c.kubeCfg.AddZonalCluster(project.Name, cluster.Name, cluster.Zone, kubeCfgFile) + if err := c.kubeCfg.AddZonalCluster(project.Name, cluster.Name, cluster.Zone, kubeCfgFile); err != nil { + return err + } } fmt.Println("Renaming context...") From 9fea21583ac954e3ade877c64e5b86a2ca0e7826 Mon Sep 17 00:00:00 2001 From: Arunvel Sriram Date: Wed, 27 Mar 2019 02:08:01 +0530 Subject: [PATCH 14/48] Update modules --- go.mod | 14 +++++++------- go.sum | 46 +++++++++++++++++++++++++++------------------- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/go.mod b/go.mod index 5065d47..fbaf6cb 100644 --- a/go.mod +++ b/go.mod @@ -1,14 +1,14 @@ module github.com/thecasualcoder/kube-tmuxp +go 1.12 + require ( github.com/BurntSushi/toml v0.3.1 // indirect - github.com/golang/mock v1.1.1 + github.com/golang/mock v1.2.0 github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/mitchellh/go-homedir v1.0.0 - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/mitchellh/go-homedir v1.1.0 github.com/spf13/cobra v0.0.3 - github.com/spf13/viper v1.2.1 - github.com/stretchr/testify v1.2.2 - golang.org/x/net v0.0.0-20181108082009-03003ca0c849 // indirect - gopkg.in/yaml.v2 v2.2.1 + github.com/spf13/viper v1.3.2 + github.com/stretchr/testify v1.3.0 + gopkg.in/yaml.v2 v2.2.2 ) diff --git a/go.sum b/go.sum index a850dcf..1362625 100644 --- a/go.sum +++ b/go.sum @@ -1,46 +1,54 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/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/golang/mock v1.1.1 h1:G5FRp8JnTd7RQH5kemVNlMeyXQAztQ3mOWV95KxsXH8= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -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/mapstructure v1.0.0 h1:vVpGvMXJPqSDh2VYHF7gsfQj8Ncx+Xw5Y1KHeTRY+7I= -github.com/mitchellh/mapstructure v1.0.0/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +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/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.2.0 h1:HHl1DSRbEQN2i8tJmtS6ViPyHx35+p51amrdsiTCrkg= -github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= +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/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.2 h1:Fy0orTDgHdbnzHcsOgfCN4LtHf0ec3wwtiwJqwvf3Gc= -github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.2.1 h1:bIcUwXqLseLF3BDAZduuNfekWG87ibtFxi59Bq+oI9M= -github.com/spf13/viper v1.2.1/go.mod h1:P4AexN0a+C9tGAnUFNwDMYYZv3pjFuvmeiMyKRaNVlI= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -golang.org/x/net v0.0.0-20181108082009-03003ca0c849 h1:FSqE2GGG7wzsYUsWiQ8MZrvEd1EOyU3NCF0AW3Wtltg= -golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sys v0.0.0-20180906133057-8cf3aee42992 h1:BH3eQWeGbwRU2+wxxuuPOdFBmaiBH81O8BugSjHeTFg= -golang.org/x/sys v0.0.0-20180906133057-8cf3aee42992/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a h1:1n5lsVfiQW3yfsRGu98756EH1YthsFqr/5mxHduZW2A= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From e6452503a9183ba640dbd42496fc608da551f347 Mon Sep 17 00:00:00 2001 From: Arunvel Sriram Date: Wed, 27 Mar 2019 02:08:45 +0530 Subject: [PATCH 15/48] Add .talismanrc --- .talismanrc | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .talismanrc diff --git a/.talismanrc b/.talismanrc new file mode 100644 index 0000000..86f190d --- /dev/null +++ b/.talismanrc @@ -0,0 +1,4 @@ +fileignoreconfig: +- filename: go.sum + checksum: 228e96793e8630f807ad3ebd8f814802aa89d59121ce1c08907d9beff36efcad + ignore_detectors: [] From bda79da810015e98ad44031e60a093e4800a177b Mon Sep 17 00:00:00 2001 From: Arunvel Sriram Date: Wed, 27 Mar 2019 02:11:56 +0530 Subject: [PATCH 16/48] Update golang version to 1.12.x --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index aa655d9..61fc94f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: go go: - - 1.11.x + - 1.12.x env: global: - GO111MODULE=on From 25257cadabaaef919d7c263a5a9f705c4ddd7244 Mon Sep 17 00:00:00 2001 From: Arunvel Sriram Date: Fri, 5 Apr 2019 01:20:54 +0530 Subject: [PATCH 17/48] Debug travis issue --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 61fc94f..2136612 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ env: - GO111MODULE=on - secure: azgsx/4nSKps0b1cPxNt1p5eke8m84U+gpUD0r+bjwj+7anhDkaTMzj4sBwPNf56h1+AGmKVBBflcjuJg34ONLLOZhNQ1QwM8nypuX0pn4Y42JkTnAFVSGA7Scw9F3/gdBU1aqnqj4Hb3q72RzVyY+LI6SZpXebpv5PiTdOv0uffrYmxtmZ/9HRFlBRTGEUws+oOXoNr5fK1bcvpDBHbdUAsEpj/CJocpJ5U85XU51E38InEmx1fiFxcIuddC6IkuWRL9rTLw4xMNVz8QUcEX7yLAkbMi8UMB9BYB91qh8NMcd6sKsrCy4a8ue+H3VWpVc634/fAkfp9N3YFmQBlDUQ0tt41UhXPoTqABrjv+TLt42ydUItqdokSVwvMPc5ucQ3hwpqt2JMKE5/Pj36PwFqUE4mC7woAWqO4YnEf5jC0Rek2JMxqbljVlfANH9RI3ormEWmdtO6/VKjuauCCq3BIUogygCoZ1iJQgKVzhjc8V9o1cSyW/PxfL/uBUQr32toYd4tGGHqiZeHUCwALY1khNPN+8miWlXExdjkjPjWdyoYXDiO3S4JNY0Q7cRQZs9nwI4+FCsNR9/Borq/l1/LlFbD56vyhywLBpRkODAsX/+zRPlgZOOcPtTgzMN+OGeC1WNCrr8A5YJ/w5avM91Z0M00w1a45u/KkX437fbI= install: make setup modules -script: make tests tests-cover-html build +script: make tests tests-cover-html build && git diff deploy: - provider: script skip_cleanup: true From aa37ecf24e3eda74e405a1610a344bf25ce85c35 Mon Sep 17 00:00:00 2001 From: Arunvel Sriram Date: Fri, 5 Apr 2019 01:26:47 +0530 Subject: [PATCH 18/48] Fix travis issue --- go.mod | 3 +++ go.sum | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/go.mod b/go.mod index fbaf6cb..4181b43 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,12 @@ require ( github.com/BurntSushi/toml v0.3.1 // indirect github.com/golang/mock v1.2.0 github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/kr/pretty v0.1.0 // indirect github.com/mitchellh/go-homedir v1.1.0 github.com/spf13/cobra v0.0.3 github.com/spf13/viper v1.3.2 github.com/stretchr/testify v1.3.0 + golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e // indirect + gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect gopkg.in/yaml.v2 v2.2.2 ) diff --git a/go.sum b/go.sum index 1362625..d204ed4 100644 --- a/go.sum +++ b/go.sum @@ -15,6 +15,11 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +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/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -46,9 +51,13 @@ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1: golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a h1:1n5lsVfiQW3yfsRGu98756EH1YthsFqr/5mxHduZW2A= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e h1:nFYrTHrdrAOpShe27kaFHjsqYSEQ0KWqdWLu3xuZJts= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From e42f26ca481770be7886fdfcfe1b01efce56d711 Mon Sep 17 00:00:00 2001 From: Arunvel Sriram Date: Fri, 5 Apr 2019 01:28:32 +0530 Subject: [PATCH 19/48] Revert "Debug travis issue" This reverts commit 25257cadabaaef919d7c263a5a9f705c4ddd7244. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2136612..61fc94f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ env: - GO111MODULE=on - secure: azgsx/4nSKps0b1cPxNt1p5eke8m84U+gpUD0r+bjwj+7anhDkaTMzj4sBwPNf56h1+AGmKVBBflcjuJg34ONLLOZhNQ1QwM8nypuX0pn4Y42JkTnAFVSGA7Scw9F3/gdBU1aqnqj4Hb3q72RzVyY+LI6SZpXebpv5PiTdOv0uffrYmxtmZ/9HRFlBRTGEUws+oOXoNr5fK1bcvpDBHbdUAsEpj/CJocpJ5U85XU51E38InEmx1fiFxcIuddC6IkuWRL9rTLw4xMNVz8QUcEX7yLAkbMi8UMB9BYB91qh8NMcd6sKsrCy4a8ue+H3VWpVc634/fAkfp9N3YFmQBlDUQ0tt41UhXPoTqABrjv+TLt42ydUItqdokSVwvMPc5ucQ3hwpqt2JMKE5/Pj36PwFqUE4mC7woAWqO4YnEf5jC0Rek2JMxqbljVlfANH9RI3ormEWmdtO6/VKjuauCCq3BIUogygCoZ1iJQgKVzhjc8V9o1cSyW/PxfL/uBUQr32toYd4tGGHqiZeHUCwALY1khNPN+8miWlXExdjkjPjWdyoYXDiO3S4JNY0Q7cRQZs9nwI4+FCsNR9/Borq/l1/LlFbD56vyhywLBpRkODAsX/+zRPlgZOOcPtTgzMN+OGeC1WNCrr8A5YJ/w5avM91Z0M00w1a45u/KkX437fbI= install: make setup modules -script: make tests tests-cover-html build && git diff +script: make tests tests-cover-html build deploy: - provider: script skip_cleanup: true From 48a3635f28cc347eadf373f68f7c1bdc205f6452 Mon Sep 17 00:00:00 2001 From: Dinesh Date: Wed, 2 Oct 2019 19:36:16 +0530 Subject: [PATCH 20/48] Set default configuration path --- cmd/root.go | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index 87d06a2..cab70fe 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -3,8 +3,9 @@ package cmd import ( "fmt" "os" + "path" - homedir "github.com/mitchellh/go-homedir" + "github.com/mitchellh/go-homedir" "github.com/spf13/cobra" "github.com/spf13/viper" ) @@ -27,22 +28,18 @@ func Execute() { func init() { cobra.OnInitialize(initConfig) - rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.kube-tmuxp.yaml)") + home, err := homedir.Dir() + if err != nil { + fmt.Println(err) + os.Exit(1) + } + configFileName := ".kube-tmuxp.yaml" + cfgFile = path.Join(home, configFileName) + rootCmd.PersistentFlags().StringVar(&cfgFile, "config", cfgFile, "config file") } func initConfig() { - if cfgFile != "" { - viper.SetConfigFile(cfgFile) - } else { - home, err := homedir.Dir() - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - viper.AddConfigPath(home) - viper.SetConfigName(".kube-tmuxp") - } + viper.SetConfigFile(cfgFile) viper.AutomaticEnv() From 9d4239768ff205019b778abfb1b99c3d42ffe5cc Mon Sep 17 00:00:00 2001 From: Dinesh Date: Tue, 26 Nov 2019 21:00:50 +0530 Subject: [PATCH 21/48] Update golang version to 1.13 and update mod files Signed-off-by: Dinesh --- .travis.yml | 2 +- go.mod | 17 +++---- go.sum | 132 ++++++++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 119 insertions(+), 32 deletions(-) diff --git a/.travis.yml b/.travis.yml index 61fc94f..4888202 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: go go: - - 1.12.x + - 1.13.x env: global: - GO111MODULE=on diff --git a/go.mod b/go.mod index 4181b43..f001d5c 100644 --- a/go.mod +++ b/go.mod @@ -1,17 +1,12 @@ module github.com/thecasualcoder/kube-tmuxp -go 1.12 +go 1.13 require ( - github.com/BurntSushi/toml v0.3.1 // indirect - github.com/golang/mock v1.2.0 - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/kr/pretty v0.1.0 // indirect + github.com/golang/mock v1.3.1 github.com/mitchellh/go-homedir v1.1.0 - github.com/spf13/cobra v0.0.3 - github.com/spf13/viper v1.3.2 - github.com/stretchr/testify v1.3.0 - golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e // indirect - gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect - gopkg.in/yaml.v2 v2.2.2 + github.com/spf13/cobra v0.0.5 + github.com/spf13/viper v1.5.0 + github.com/stretchr/testify v1.2.2 + gopkg.in/yaml.v2 v2.2.7 ) diff --git a/go.sum b/go.sum index d204ed4..c36ecfb 100644 --- a/go.sum +++ b/go.sum @@ -1,63 +1,155 @@ -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/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/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +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/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 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/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/spf13/viper v1.5.0 h1:GpsTwfsQ27oS/Aha/6d1oD7tpKIqWnOA6tgOX9HHkt4= +github.com/spf13/viper v1.5.0/go.mod h1:AkYRkVJF8TkSG/xet6PzXX+l39KhhXa2pdqVSxnTcn4= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a h1:1n5lsVfiQW3yfsRGu98756EH1YthsFqr/5mxHduZW2A= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e h1:nFYrTHrdrAOpShe27kaFHjsqYSEQ0KWqdWLu3xuZJts= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +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/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From b288a6090b9062c86d7140d832533d696cc23e35 Mon Sep 17 00:00:00 2001 From: Dinesh Date: Mon, 9 Dec 2019 21:24:57 +0530 Subject: [PATCH 22/48] Clean the repo before during deploy in travis ci Signed-off-by: Dinesh --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4888202..d93259d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ install: make setup modules script: make tests tests-cover-html build deploy: - provider: script - skip_cleanup: true + skip_cleanup: false script: curl -sL https://git.io/goreleaser | bash on: tags: true From c41d9a7da88d11b1568d1411d0e44a32bb8090d1 Mon Sep 17 00:00:00 2001 From: Dinesh Date: Fri, 13 Dec 2019 10:23:06 +0530 Subject: [PATCH 23/48] Add idea dir to gitignore Signed-off-by: Dinesh --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 3da371d..08e1034 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ # Vim *.swp +# IntelliJ +.idea/ + #Output out/ dist/ From c9a5306f6e7b05c9b31e760672117039c6d8fa0b Mon Sep 17 00:00:00 2001 From: Dinesh Date: Fri, 13 Dec 2019 11:44:42 +0530 Subject: [PATCH 24/48] Print 'Using config file' only for generate sub-command Signed-off-by: Dinesh --- cmd/generate.go | 1 + cmd/root.go | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/generate.go b/cmd/generate.go index 307aba2..0502bfa 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -24,6 +24,7 @@ var generateCmd = &cobra.Command{ os.Exit(1) } + fmt.Println("Using config file:", cfgFile) kubetmuxpCfg, err := kubetmuxp.NewConfig(cfgFile, fs, kubeCfg) if err != nil { fmt.Println(err) diff --git a/cmd/root.go b/cmd/root.go index cab70fe..3601332 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -43,7 +43,7 @@ func initConfig() { viper.AutomaticEnv() - if err := viper.ReadInConfig(); err == nil { - fmt.Println("Using config file:", viper.ConfigFileUsed()) + if err := viper.ReadInConfig(); err != nil { + _, _ = fmt.Fprintln(os.Stderr, fmt.Sprintf("error reading config file %s: %v", viper.ConfigFileUsed(), err)) } } From 8bc343edadd4176d64fedf5a4df96937d22f73ef Mon Sep 17 00:00:00 2001 From: Dinesh Date: Tue, 21 Jan 2020 13:33:59 +0530 Subject: [PATCH 25/48] Use different import name other than predefined yaml tag-name Signed-off-by: Dinesh --- pkg/kubetmuxp/kubetmuxp.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/kubetmuxp/kubetmuxp.go b/pkg/kubetmuxp/kubetmuxp.go index 45fba8a..296f3a0 100644 --- a/pkg/kubetmuxp/kubetmuxp.go +++ b/pkg/kubetmuxp/kubetmuxp.go @@ -8,7 +8,7 @@ import ( "github.com/thecasualcoder/kube-tmuxp/pkg/filesystem" "github.com/thecasualcoder/kube-tmuxp/pkg/kubeconfig" "github.com/thecasualcoder/kube-tmuxp/pkg/tmuxp" - yaml "gopkg.in/yaml.v2" + yamlV2 "gopkg.in/yaml.v2" ) // Envs reprensents environemnt variables @@ -77,7 +77,7 @@ func (c *Config) load(cfgFile string) error { return err } - err = yaml.Unmarshal(data, c) + err = yamlV2.Unmarshal(data, c) if err != nil { return err } From 142aba8327dd2fe831ef422f0e802a7ca7630e54 Mon Sep 17 00:00:00 2001 From: Dinesh Date: Tue, 21 Jan 2020 20:32:11 +0530 Subject: [PATCH 26/48] Use gcloud to fetch all projects and clusters and generate config file Signed-off-by: Dinesh --- cmd/config-generate.go | 63 ++++++++++++++ go.mod | 6 +- go.sum | 168 +++++++++++++++++++++++++++++++++++++ pkg/gcloud/client.go | 69 +++++++++++++++ pkg/kubetmuxp/kubetmuxp.go | 6 +- 5 files changed, 308 insertions(+), 4 deletions(-) create mode 100644 cmd/config-generate.go create mode 100644 pkg/gcloud/client.go diff --git a/cmd/config-generate.go b/cmd/config-generate.go new file mode 100644 index 0000000..f57dfc6 --- /dev/null +++ b/cmd/config-generate.go @@ -0,0 +1,63 @@ +package cmd + +import ( + "fmt" + "gopkg.in/yaml.v2" + "os" + + "github.com/spf13/cobra" + "github.com/thecasualcoder/kube-tmuxp/pkg/gcloud" + "github.com/thecasualcoder/kube-tmuxp/pkg/kubetmuxp" +) + +var configGenerateCmd = &cobra.Command{ + Use: "config-generate", + Aliases: []string{"cgen"}, + Short: "Generates configs for kube-tmuxp based on gcloud account", + Run: func(cmd *cobra.Command, args []string) { + projectIds, err := gcloud.ListProjects() + if err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + projects := make(kubetmuxp.Projects, 0, len(projectIds)) + for _, projectId := range projectIds { + clusters, err := gcloud.ListClusters(projectId) + if err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + kubetmuxpClusters := make(kubetmuxp.Clusters, 0, len(clusters)) + for _, cluster := range clusters { + zone := "" + region := "" + if cluster.IsRegional { + region = cluster.Location + } else { + zone = cluster.Location + } + kubetmuxpClusters = append(kubetmuxpClusters, kubetmuxp.Cluster{ + Name: cluster.Name, + Zone: zone, + Region: region, + Context: cluster.Name, + Envs: nil, + }) + } + projects = append(projects, kubetmuxp.Project{ + Name: projectId, + Clusters: kubetmuxpClusters, + }) + } + bytes, err := yaml.Marshal(map[string]kubetmuxp.Projects{"projects": projects}) + if err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + fmt.Println(string(bytes)) + }, +} + +func init() { + rootCmd.AddCommand(configGenerateCmd) +} diff --git a/go.mod b/go.mod index f001d5c..f334ec2 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,14 @@ module github.com/thecasualcoder/kube-tmuxp go 1.13 require ( + cloud.google.com/go v0.51.0 + github.com/ghodss/yaml v1.0.0 github.com/golang/mock v1.3.1 github.com/mitchellh/go-homedir v1.1.0 github.com/spf13/cobra v0.0.5 github.com/spf13/viper v1.5.0 - github.com/stretchr/testify v1.2.2 + github.com/stretchr/testify v1.4.0 + google.golang.org/api v0.15.0 + google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb gopkg.in/yaml.v2 v2.2.7 ) diff --git a/go.sum b/go.sum index c36ecfb..8030045 100644 --- a/go.sum +++ b/go.sum @@ -1,12 +1,35 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.51.0 h1:PvKAVQWCtlGUSlZkGW3QLelKaWq7KYv/MW1EboG8bfM= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= +cloud.google.com/go/bigquery v1.0.1 h1:hL+ycaJpVE9M7nLoiXb/Pn10ENE2u+oddxbD8uu0ZVU= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0 h1:Kt+gOPPp2LEPWp8CSfxhsM8ik9CcyE/gYu+0r+RnZvM= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/pubsub v1.0.1 h1:W9tAK3E57P75u0XLLR82LZyw8VpAnhmyTOxW9qzmyj8= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0 h1:VV2nUM3wwLLGh9lSABFgZMjInyUbJeaRSE64WuAIQ+4= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -15,43 +38,77 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= 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/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= @@ -72,12 +129,14 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -95,9 +154,12 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.5.0 h1:GpsTwfsQ27oS/Aha/6d1oD7tpKIqWnOA6tgOX9HHkt4= github.com/spf13/viper v1.5.0/go.mod h1:AkYRkVJF8TkSG/xet6PzXX+l39KhhXa2pdqVSxnTcn4= +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/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -106,24 +168,67 @@ github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljT github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299 h1:zQpM52jfKHG6II1ISZY1ZcpygvuSFZpLwfluuF89XOg= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -131,20 +236,77 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8 h1:JA8d3MPx/IToSyXZG/RhwYEtfrKO1Fxrqe8KrkiLXKM= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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/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-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4 h1:Toz2IK7k8rbltAXwNAxKcn9OzqyNfMUhUNjz3sL0NMk= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.15.0 h1:yzlyyDW/J0w8yNFJIhiAJy4kq74S+1DOLdawELNxFMA= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb h1:ADPHZzpzM4tk4V4S5cnCrr5SwzvlrPRmqqCuJDB8UTs= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -153,3 +315,9 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/pkg/gcloud/client.go b/pkg/gcloud/client.go new file mode 100644 index 0000000..6b38e40 --- /dev/null +++ b/pkg/gcloud/client.go @@ -0,0 +1,69 @@ +package gcloud + +import ( + "cloud.google.com/go/container/apiv1" + "context" + "fmt" + "google.golang.org/api/cloudresourcemanager/v1" + container2 "google.golang.org/genproto/googleapis/container/v1" +) + +// ListProjects lists the projects for logged-in user +func ListProjects() ([]string, error) { + newService, err := cloudresourcemanager.NewService(context.TODO()) + if err != nil { + return nil, err + } + projectsService := cloudresourcemanager.NewProjectsService(newService) + + response, err := projectsService.List().Do() + if err != nil { + return nil, err + } + + projectIds := make([]string, 0, len(response.Projects)) + for _, project := range response.Projects { + projectIds = append(projectIds, project.ProjectId) + } + + return projectIds, nil +} + +// Cluster represent the GKE Cluster +type Cluster struct { + Name string + Location string + IsRegional bool +} + +// Clusters represents the list of Cluster +type Clusters []Cluster + +// ListClusters for the given projectId +func ListClusters(projectId string) (Clusters, error) { + clusterManagerClient, err := container.NewClusterManagerClient(context.TODO()) + if err != nil { + return nil, err + } + + listClustersRequest := container2.ListClustersRequest{Parent: fmt.Sprintf("projects/%s/locations/%s", projectId, "-")} + response, err := clusterManagerClient.ListClusters(context.TODO(), &listClustersRequest) + if err != nil { + return nil, err + } + clusters := make(Clusters, 0, len(response.Clusters)) + for _, cluster := range response.Clusters { + clusters = append(clusters, Cluster{Name: cluster.Name, Location: cluster.Location, IsRegional: !Contains(cluster.Locations, cluster.Location)}) + } + return clusters, nil +} + +// Contains checks if the given string array contains given string +func Contains(items []string, input string) bool { + for _, item := range items { + if item == input { + return true + } + } + return false +} diff --git a/pkg/kubetmuxp/kubetmuxp.go b/pkg/kubetmuxp/kubetmuxp.go index 296f3a0..09f7e34 100644 --- a/pkg/kubetmuxp/kubetmuxp.go +++ b/pkg/kubetmuxp/kubetmuxp.go @@ -17,10 +17,10 @@ type Envs map[string]string //Cluster represents a Kubernetes cluster type Cluster struct { Name string `yaml:"name"` - Zone string `yaml:"zone"` - Region string `yaml:"region"` + Zone string `yaml:"zone,omitempty"` + Region string `yaml:"region,omitempty"` Context string `yaml:"context"` - Envs `yaml:"envs"` + Envs `yaml:"envs,omitempty"` } // DefaultContextName returns default context name From 7731d9f16848ec76f2d72c9d3b50716e05cfa79d Mon Sep 17 00:00:00 2001 From: Dinesh Date: Tue, 21 Jan 2020 20:35:30 +0530 Subject: [PATCH 27/48] Add progress logs Signed-off-by: Dinesh --- cmd/config-generate.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/config-generate.go b/cmd/config-generate.go index f57dfc6..2a792de 100644 --- a/cmd/config-generate.go +++ b/cmd/config-generate.go @@ -20,6 +20,7 @@ var configGenerateCmd = &cobra.Command{ _, _ = fmt.Fprintln(os.Stderr, err) os.Exit(1) } + _, _ = fmt.Fprintf(os.Stderr, "Number of gcloud projects: %d\n", len(projectIds)) projects := make(kubetmuxp.Projects, 0, len(projectIds)) for _, projectId := range projectIds { clusters, err := gcloud.ListClusters(projectId) @@ -27,6 +28,7 @@ var configGenerateCmd = &cobra.Command{ _, _ = fmt.Fprintln(os.Stderr, err) os.Exit(1) } + _, _ = fmt.Fprintf(os.Stderr, "Number of clusters for %s project: %d\n", projectId, len(clusters)) kubetmuxpClusters := make(kubetmuxp.Clusters, 0, len(clusters)) for _, cluster := range clusters { zone := "" From 53f30b5a0db8f0c97a5d96b5037996df5d8782c4 Mon Sep 17 00:00:00 2001 From: Dinesh Date: Tue, 21 Jan 2020 21:00:29 +0530 Subject: [PATCH 28/48] Select projects for which config need to be generated Signed-off-by: Dinesh --- cmd/config-generate.go | 21 +++++++++++++++++++-- go.mod | 2 +- go.sum | 19 +++++++++++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/cmd/config-generate.go b/cmd/config-generate.go index 2a792de..b84232a 100644 --- a/cmd/config-generate.go +++ b/cmd/config-generate.go @@ -8,6 +8,7 @@ import ( "github.com/spf13/cobra" "github.com/thecasualcoder/kube-tmuxp/pkg/gcloud" "github.com/thecasualcoder/kube-tmuxp/pkg/kubetmuxp" + "gopkg.in/AlecAivazis/survey.v1" ) var configGenerateCmd = &cobra.Command{ @@ -21,8 +22,14 @@ var configGenerateCmd = &cobra.Command{ os.Exit(1) } _, _ = fmt.Fprintf(os.Stderr, "Number of gcloud projects: %d\n", len(projectIds)) - projects := make(kubetmuxp.Projects, 0, len(projectIds)) - for _, projectId := range projectIds { + selectedProjectIds, err := getSelectedProjects(projectIds) + if err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + _, _ = fmt.Fprintf(os.Stderr, "Number of selected gcloud projects: %d\n", len(selectedProjectIds)) + projects := make(kubetmuxp.Projects, 0, len(selectedProjectIds)) + for _, projectId := range selectedProjectIds { clusters, err := gcloud.ListClusters(projectId) if err != nil { _, _ = fmt.Fprintln(os.Stderr, err) @@ -60,6 +67,16 @@ var configGenerateCmd = &cobra.Command{ }, } +func getSelectedProjects(projects []string) ([]string, error) { + var selectedProjects []string + prompt := &survey.MultiSelect{ + Message: "Select gcloud projects that you want to configure:", + Options: projects, + } + err := survey.AskOne(prompt, &selectedProjects, func(ans interface{}) error { return nil }) + return selectedProjects, err +} + func init() { rootCmd.AddCommand(configGenerateCmd) } diff --git a/go.mod b/go.mod index f334ec2..c7b17b2 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,6 @@ go 1.13 require ( cloud.google.com/go v0.51.0 - github.com/ghodss/yaml v1.0.0 github.com/golang/mock v1.3.1 github.com/mitchellh/go-homedir v1.1.0 github.com/spf13/cobra v0.0.5 @@ -12,5 +11,6 @@ require ( github.com/stretchr/testify v1.4.0 google.golang.org/api v0.15.0 google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb + gopkg.in/AlecAivazis/survey.v1 v1.8.7 gopkg.in/yaml.v2 v2.2.7 ) diff --git a/go.sum b/go.sum index 8030045..5e62d7d 100644 --- a/go.sum +++ b/go.sum @@ -19,6 +19,8 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7 github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw= +github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -93,6 +95,8 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ= +github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -101,19 +105,28 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= 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/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= @@ -156,6 +169,7 @@ github.com/spf13/viper v1.5.0 h1:GpsTwfsQ27oS/Aha/6d1oD7tpKIqWnOA6tgOX9HHkt4= github.com/spf13/viper v1.5.0/go.mod h1:AkYRkVJF8TkSG/xet6PzXX+l39KhhXa2pdqVSxnTcn4= 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/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= @@ -177,9 +191,11 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -229,6 +245,7 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180606202747-9527bec2660b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -302,6 +319,8 @@ google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +gopkg.in/AlecAivazis/survey.v1 v1.8.7 h1:oBJqtgsyBLg9K5FK9twNUbcPnbCPoh+R9a+7nag3qJM= +gopkg.in/AlecAivazis/survey.v1 v1.8.7/go.mod h1:iBNOmqKz/NUbZx3bA+4hAGLRC7fSK7tgtVDT4tB22XA= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= From 159139052c5778fb029f27e6b221883717f5663e Mon Sep 17 00:00:00 2001 From: Dinesh Date: Tue, 21 Jan 2020 21:11:35 +0530 Subject: [PATCH 29/48] Add cli flag to skip confirmation for projects Signed-off-by: Dinesh --- cmd/config-generate.go | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/cmd/config-generate.go b/cmd/config-generate.go index b84232a..708888c 100644 --- a/cmd/config-generate.go +++ b/cmd/config-generate.go @@ -16,26 +16,18 @@ var configGenerateCmd = &cobra.Command{ Aliases: []string{"cgen"}, Short: "Generates configs for kube-tmuxp based on gcloud account", Run: func(cmd *cobra.Command, args []string) { - projectIds, err := gcloud.ListProjects() - if err != nil { - _, _ = fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - _, _ = fmt.Fprintf(os.Stderr, "Number of gcloud projects: %d\n", len(projectIds)) - selectedProjectIds, err := getSelectedProjects(projectIds) - if err != nil { - _, _ = fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - _, _ = fmt.Fprintf(os.Stderr, "Number of selected gcloud projects: %d\n", len(selectedProjectIds)) - projects := make(kubetmuxp.Projects, 0, len(selectedProjectIds)) - for _, projectId := range selectedProjectIds { + + projectIds := getGCloudProjects(allProjects) + + projects := make(kubetmuxp.Projects, 0, len(projectIds)) + for _, projectId := range projectIds { clusters, err := gcloud.ListClusters(projectId) if err != nil { _, _ = fmt.Fprintln(os.Stderr, err) os.Exit(1) } _, _ = fmt.Fprintf(os.Stderr, "Number of clusters for %s project: %d\n", projectId, len(clusters)) + kubetmuxpClusters := make(kubetmuxp.Clusters, 0, len(clusters)) for _, cluster := range clusters { zone := "" @@ -67,6 +59,25 @@ var configGenerateCmd = &cobra.Command{ }, } +func getGCloudProjects(allProjects bool) []string { + projectIds, err := gcloud.ListProjects() + if err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + _, _ = fmt.Fprintf(os.Stderr, "Number of gcloud projects: %d\n", len(projectIds)) + if allProjects { + return projectIds + } + selectedProjectIds, err := getSelectedProjects(projectIds) + if err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + _, _ = fmt.Fprintf(os.Stderr, "Number of selected gcloud projects: %d\n", len(selectedProjectIds)) + return selectedProjectIds +} + func getSelectedProjects(projects []string) ([]string, error) { var selectedProjects []string prompt := &survey.MultiSelect{ @@ -77,6 +88,9 @@ func getSelectedProjects(projects []string) ([]string, error) { return selectedProjects, err } +var allProjects bool + func init() { + configGenerateCmd.PersistentFlags().BoolVar(&allProjects, "allProjects", false, "Skip confirmation for projects") rootCmd.AddCommand(configGenerateCmd) } From 0336d186b786a8c41bf6ea1b6689c229eade3388 Mon Sep 17 00:00:00 2001 From: Dinesh Date: Mon, 27 Jan 2020 19:22:00 +0530 Subject: [PATCH 30/48] Ask the survey message in error stream Signed-off-by: Dinesh --- cmd/config-generate.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cmd/config-generate.go b/cmd/config-generate.go index 708888c..1fd2cc7 100644 --- a/cmd/config-generate.go +++ b/cmd/config-generate.go @@ -84,7 +84,11 @@ func getSelectedProjects(projects []string) ([]string, error) { Message: "Select gcloud projects that you want to configure:", Options: projects, } - err := survey.AskOne(prompt, &selectedProjects, func(ans interface{}) error { return nil }) + opt := func(options *survey.AskOptions) error { + options.Stdio.Out = os.Stderr + return nil + } + err := survey.AskOne(prompt, &selectedProjects, func(ans interface{}) error { return nil }, opt) return selectedProjects, err } From 0f55b2d66a4fe5bb3f84da02a33c50db8a4d6b6f Mon Sep 17 00:00:00 2001 From: Dinesh Date: Mon, 27 Jan 2020 21:30:38 +0530 Subject: [PATCH 31/48] Able to provide addtionalEnvs to config-generate Signed-off-by: Dinesh --- cmd/config-generate.go | 36 +++++++++++++++++++++++- cmd/config-generate_test.go | 56 +++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 cmd/config-generate_test.go diff --git a/cmd/config-generate.go b/cmd/config-generate.go index 1fd2cc7..d52904f 100644 --- a/cmd/config-generate.go +++ b/cmd/config-generate.go @@ -4,6 +4,7 @@ import ( "fmt" "gopkg.in/yaml.v2" "os" + "strings" "github.com/spf13/cobra" "github.com/thecasualcoder/kube-tmuxp/pkg/gcloud" @@ -19,6 +20,16 @@ var configGenerateCmd = &cobra.Command{ projectIds := getGCloudProjects(allProjects) + additionalEnvsMap := map[string]string{} + for _, env := range additionalEnvs { + envKeyValue := strings.Split(env, "=") + if len(envKeyValue) != 2 { + _, _ = fmt.Fprintln(os.Stderr, fmt.Sprint("wrong env format: should be key=value")) + os.Exit(1) + } + additionalEnvsMap[envKeyValue[0]] = envKeyValue[1] + } + projects := make(kubetmuxp.Projects, 0, len(projectIds)) for _, projectId := range projectIds { clusters, err := gcloud.ListClusters(projectId) @@ -37,12 +48,16 @@ var configGenerateCmd = &cobra.Command{ } else { zone = cluster.Location } + baseEnvs := map[string]string{ + "CLUSTER_NAME": cluster.Name, + "GCP_PROJECT_ID": projectId, + } kubetmuxpClusters = append(kubetmuxpClusters, kubetmuxp.Cluster{ Name: cluster.Name, Zone: zone, Region: region, Context: cluster.Name, - Envs: nil, + Envs: mergeEnvs(baseEnvs, additionalEnvsMap), }) } projects = append(projects, kubetmuxp.Project{ @@ -59,6 +74,23 @@ var configGenerateCmd = &cobra.Command{ }, } +func mergeEnvs(base, additionalEnvsMap map[string]string) map[string]string { + for k, v := range additionalEnvsMap { + if strings.HasPrefix(v, "$") { + newKeyFromValue := strings.Replace(v, "$", "", 1) + value, ok := base[newKeyFromValue] + if ok { + base[k] = value + } else { + base[k] = os.Getenv(newKeyFromValue) + } + continue + } + base[k] = v + } + return base +} + func getGCloudProjects(allProjects bool) []string { projectIds, err := gcloud.ListProjects() if err != nil { @@ -93,8 +125,10 @@ func getSelectedProjects(projects []string) ([]string, error) { } var allProjects bool +var additionalEnvs []string func init() { configGenerateCmd.PersistentFlags().BoolVar(&allProjects, "allProjects", false, "Skip confirmation for projects") + configGenerateCmd.Flags().StringSliceVar(&additionalEnvs, "additionalEnvs", nil, "Additional envs to be populated") rootCmd.AddCommand(configGenerateCmd) } diff --git a/cmd/config-generate_test.go b/cmd/config-generate_test.go new file mode 100644 index 0000000..685b17f --- /dev/null +++ b/cmd/config-generate_test.go @@ -0,0 +1,56 @@ +package cmd + +import ( + "github.com/stretchr/testify/assert" + "os" + "testing" +) + +func Test_mergeEnvs(t *testing.T) { + t.Run("merge simple envs", func(t *testing.T) { + result := mergeEnvs(map[string]string{ + "key": "value", + "key1": "oldValue", + }, map[string]string{ + "key1": "newValue", + "key2": "value", + }) + + assert.Equal(t, map[string]string{ + "key": "value", + "key1": "newValue", + "key2": "value", + }, result) + }) + + t.Run("merge additional envs containing base envs", func(t *testing.T) { + result := mergeEnvs(map[string]string{ + "key": "someValue", + "key1": "oldValue", + }, map[string]string{ + "key1": "$key", + "key2": "$key", + }) + + assert.Equal(t, map[string]string{ + "key": "someValue", + "key1": "someValue", + "key2": "someValue", + }, result) + }) + + t.Run("merge additional envs containing process/os envs", func(t *testing.T) { + assert.NoError(t, os.Setenv("SOME_KEY", "someEnvValue")) + + result := mergeEnvs(map[string]string{ + "key": "someValue", + }, map[string]string{ + "key1": "$SOME_KEY", + }) + + assert.Equal(t, map[string]string{ + "key": "someValue", + "key1": "someEnvValue", + }, result) + }) +} From 900ac4f32a82ef8994a4aeb0b46348c0aae3df12 Mon Sep 17 00:00:00 2001 From: Dinesh Date: Wed, 29 Jan 2020 21:29:16 +0530 Subject: [PATCH 32/48] Added few more kubetmuxp specific envs Signed-off-by: Dinesh --- cmd/config-generate.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmd/config-generate.go b/cmd/config-generate.go index d52904f..396c9a1 100644 --- a/cmd/config-generate.go +++ b/cmd/config-generate.go @@ -49,8 +49,10 @@ var configGenerateCmd = &cobra.Command{ zone = cluster.Location } baseEnvs := map[string]string{ - "CLUSTER_NAME": cluster.Name, - "GCP_PROJECT_ID": projectId, + "KUBETMUXP_CLUSTER_NAME": cluster.Name, + "KUBETMUXP_CLUSTER_LOCATION": cluster.Location, + "KUBETMUXP_CLUSTER_IS_REGIONAL": fmt.Sprintf("%v", cluster.IsRegional), + "GCP_PROJECT_ID": projectId, } kubetmuxpClusters = append(kubetmuxpClusters, kubetmuxp.Cluster{ Name: cluster.Name, From fe6c20f622327caf1733be50f8aa294d65f200a0 Mon Sep 17 00:00:00 2001 From: Dinesh Date: Wed, 29 Jan 2020 21:29:41 +0530 Subject: [PATCH 33/48] Expand the additional envs Signed-off-by: Dinesh --- cmd/config-generate.go | 14 ++++++-------- cmd/config-generate_test.go | 6 ++++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cmd/config-generate.go b/cmd/config-generate.go index 396c9a1..4eeca66 100644 --- a/cmd/config-generate.go +++ b/cmd/config-generate.go @@ -78,17 +78,15 @@ var configGenerateCmd = &cobra.Command{ func mergeEnvs(base, additionalEnvsMap map[string]string) map[string]string { for k, v := range additionalEnvsMap { - if strings.HasPrefix(v, "$") { - newKeyFromValue := strings.Replace(v, "$", "", 1) - value, ok := base[newKeyFromValue] + expandedValue := os.Expand(v, func(s string) string { + value, ok := base[s] if ok { - base[k] = value + return value } else { - base[k] = os.Getenv(newKeyFromValue) + return os.Getenv(s) } - continue - } - base[k] = v + }) + base[k] = expandedValue } return base } diff --git a/cmd/config-generate_test.go b/cmd/config-generate_test.go index 685b17f..0f7d004 100644 --- a/cmd/config-generate_test.go +++ b/cmd/config-generate_test.go @@ -45,12 +45,14 @@ func Test_mergeEnvs(t *testing.T) { result := mergeEnvs(map[string]string{ "key": "someValue", }, map[string]string{ - "key1": "$SOME_KEY", + "key1": "$SOME_KEY$SOME_KEY", + "key2": "$key$SOME_KEY", }) assert.Equal(t, map[string]string{ "key": "someValue", - "key1": "someEnvValue", + "key1": "someEnvValuesomeEnvValue", + "key2": "someValuesomeEnvValue", }, result) }) } From 1cdc91ef0a606d719990577d2359b90edbe07a6c Mon Sep 17 00:00:00 2001 From: Dinesh Date: Wed, 29 Jan 2020 22:36:54 +0530 Subject: [PATCH 34/48] Introduce apply flag which will directly create the tmuxp files Signed-off-by: Dinesh --- cmd/config-generate.go | 136 +++++++++++++++++++++++-------------- pkg/kubetmuxp/kubetmuxp.go | 10 +++ 2 files changed, 95 insertions(+), 51 deletions(-) diff --git a/cmd/config-generate.go b/cmd/config-generate.go index 4eeca66..eb05454 100644 --- a/cmd/config-generate.go +++ b/cmd/config-generate.go @@ -2,7 +2,11 @@ package cmd import ( "fmt" + "github.com/thecasualcoder/kube-tmuxp/pkg/commander" + "github.com/thecasualcoder/kube-tmuxp/pkg/filesystem" + "github.com/thecasualcoder/kube-tmuxp/pkg/kubeconfig" "gopkg.in/yaml.v2" + "io" "os" "strings" @@ -17,63 +21,92 @@ var configGenerateCmd = &cobra.Command{ Aliases: []string{"cgen"}, Short: "Generates configs for kube-tmuxp based on gcloud account", Run: func(cmd *cobra.Command, args []string) { + projects, err := getProjects() + if err != nil { + _, _ = fmt.Fprintf(cmd.ErrOrStderr(), err.Error()) + os.Exit(1) + } + if !apply { + printConfigFiles(projects, cmd.OutOrStdout()) + _, _ = fmt.Fprintf(cmd.ErrOrStderr(), "Run with --apply to directly generate tmuxp configs for various Kubernetes contexts\n") + return + } + err = generateKubeTmuxpFiles(projects) + if err != nil { + _, _ = fmt.Fprintf(cmd.ErrOrStderr(), err.Error()) + os.Exit(1) + } + }, +} - projectIds := getGCloudProjects(allProjects) +func generateKubeTmuxpFiles(projects kubetmuxp.Projects) error { + fs := &filesystem.Default{} + cmdr := &commander.Default{} + kubeCfg, err := kubeconfig.New(fs, cmdr) - additionalEnvsMap := map[string]string{} - for _, env := range additionalEnvs { - envKeyValue := strings.Split(env, "=") - if len(envKeyValue) != 2 { - _, _ = fmt.Fprintln(os.Stderr, fmt.Sprint("wrong env format: should be key=value")) - os.Exit(1) - } - additionalEnvsMap[envKeyValue[0]] = envKeyValue[1] + config, err := kubetmuxp.NewConfigWithProjects(projects, fs, kubeCfg) + if err != nil { + return err + } + return config.Process() +} + +func printConfigFiles(projects kubetmuxp.Projects, outStream io.Writer) { + bytes, err := yaml.Marshal(map[string]kubetmuxp.Projects{"projects": projects}) + if err != nil { + _, _ = fmt.Fprintln(outStream, err) + os.Exit(1) + } + fmt.Println(string(bytes)) +} + +func getProjects() (kubetmuxp.Projects, error) { + projectIds := getGCloudProjects(allProjects) + additionalEnvsMap := map[string]string{} + for _, env := range additionalEnvs { + envKeyValue := strings.Split(env, "=") + if len(envKeyValue) != 2 { + return nil, fmt.Errorf("wrong env format: should be key=value") } + additionalEnvsMap[envKeyValue[0]] = envKeyValue[1] + } + projects := make(kubetmuxp.Projects, 0, len(projectIds)) + for _, projectId := range projectIds { + clusters, err := gcloud.ListClusters(projectId) + if err != nil { + return nil, err + } + _, _ = fmt.Fprintf(os.Stderr, "Number of clusters for %s project: %d\n", projectId, len(clusters)) - projects := make(kubetmuxp.Projects, 0, len(projectIds)) - for _, projectId := range projectIds { - clusters, err := gcloud.ListClusters(projectId) - if err != nil { - _, _ = fmt.Fprintln(os.Stderr, err) - os.Exit(1) + kubetmuxpClusters := make(kubetmuxp.Clusters, 0, len(clusters)) + for _, cluster := range clusters { + zone := "" + region := "" + if cluster.IsRegional { + region = cluster.Location + } else { + zone = cluster.Location } - _, _ = fmt.Fprintf(os.Stderr, "Number of clusters for %s project: %d\n", projectId, len(clusters)) - - kubetmuxpClusters := make(kubetmuxp.Clusters, 0, len(clusters)) - for _, cluster := range clusters { - zone := "" - region := "" - if cluster.IsRegional { - region = cluster.Location - } else { - zone = cluster.Location - } - baseEnvs := map[string]string{ - "KUBETMUXP_CLUSTER_NAME": cluster.Name, - "KUBETMUXP_CLUSTER_LOCATION": cluster.Location, - "KUBETMUXP_CLUSTER_IS_REGIONAL": fmt.Sprintf("%v", cluster.IsRegional), - "GCP_PROJECT_ID": projectId, - } - kubetmuxpClusters = append(kubetmuxpClusters, kubetmuxp.Cluster{ - Name: cluster.Name, - Zone: zone, - Region: region, - Context: cluster.Name, - Envs: mergeEnvs(baseEnvs, additionalEnvsMap), - }) + baseEnvs := map[string]string{ + "KUBETMUXP_CLUSTER_NAME": cluster.Name, + "KUBETMUXP_CLUSTER_LOCATION": cluster.Location, + "KUBETMUXP_CLUSTER_IS_REGIONAL": fmt.Sprintf("%v", cluster.IsRegional), + "GCP_PROJECT_ID": projectId, } - projects = append(projects, kubetmuxp.Project{ - Name: projectId, - Clusters: kubetmuxpClusters, + kubetmuxpClusters = append(kubetmuxpClusters, kubetmuxp.Cluster{ + Name: cluster.Name, + Zone: zone, + Region: region, + Context: cluster.Name, + Envs: mergeEnvs(baseEnvs, additionalEnvsMap), }) } - bytes, err := yaml.Marshal(map[string]kubetmuxp.Projects{"projects": projects}) - if err != nil { - _, _ = fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - fmt.Println(string(bytes)) - }, + projects = append(projects, kubetmuxp.Project{ + Name: projectId, + Clusters: kubetmuxpClusters, + }) + } + return projects, nil } func mergeEnvs(base, additionalEnvsMap map[string]string) map[string]string { @@ -124,11 +157,12 @@ func getSelectedProjects(projects []string) ([]string, error) { return selectedProjects, err } -var allProjects bool +var allProjects, apply bool var additionalEnvs []string func init() { - configGenerateCmd.PersistentFlags().BoolVar(&allProjects, "allProjects", false, "Skip confirmation for projects") + configGenerateCmd.Flags().BoolVar(&allProjects, "allProjects", false, "Skip confirmation for projects") + configGenerateCmd.Flags().BoolVar(&apply, "apply", false, "Directly create the tmuxp configs for selected projects") configGenerateCmd.Flags().StringSliceVar(&additionalEnvs, "additionalEnvs", nil, "Additional envs to be populated") rootCmd.AddCommand(configGenerateCmd) } diff --git a/pkg/kubetmuxp/kubetmuxp.go b/pkg/kubetmuxp/kubetmuxp.go index 09f7e34..6ca201f 100644 --- a/pkg/kubetmuxp/kubetmuxp.go +++ b/pkg/kubetmuxp/kubetmuxp.go @@ -160,3 +160,13 @@ func NewConfig(cfgFile string, fs filesystem.FileSystem, kubeCfg kubeconfig.Kube return cfg, nil } + +// NewConfig creates a new kube-tmuxp Config for the given projects +func NewConfigWithProjects(projects Projects, fs filesystem.FileSystem, kubeCfg kubeconfig.KubeConfig) (Config, error) { + cfg := Config{ + filesystem: fs, + kubeCfg: kubeCfg, + Projects: projects, + } + return cfg, nil +} From a63d37acd9b2b79070d0a85b86e05cb305cd500d Mon Sep 17 00:00:00 2001 From: Dinesh Date: Wed, 29 Jan 2020 22:47:04 +0530 Subject: [PATCH 35/48] Rename config-generate to gcloud-generate Signed-off-by: Dinesh --- cmd/{config-generate.go => gcloud-generate.go} | 15 +++++++-------- ...g-generate_test.go => gcloud-generate_test.go} | 0 2 files changed, 7 insertions(+), 8 deletions(-) rename cmd/{config-generate.go => gcloud-generate.go} (91%) rename cmd/{config-generate_test.go => gcloud-generate_test.go} (100%) diff --git a/cmd/config-generate.go b/cmd/gcloud-generate.go similarity index 91% rename from cmd/config-generate.go rename to cmd/gcloud-generate.go index eb05454..2ac9ace 100644 --- a/cmd/config-generate.go +++ b/cmd/gcloud-generate.go @@ -16,10 +16,9 @@ import ( "gopkg.in/AlecAivazis/survey.v1" ) -var configGenerateCmd = &cobra.Command{ - Use: "config-generate", - Aliases: []string{"cgen"}, - Short: "Generates configs for kube-tmuxp based on gcloud account", +var gcloudGenerateCmd = &cobra.Command{ + Use: "gcloud-generate", + Short: "Generates configs for kube-tmuxp based on gcloud account", Run: func(cmd *cobra.Command, args []string) { projects, err := getProjects() if err != nil { @@ -161,8 +160,8 @@ var allProjects, apply bool var additionalEnvs []string func init() { - configGenerateCmd.Flags().BoolVar(&allProjects, "allProjects", false, "Skip confirmation for projects") - configGenerateCmd.Flags().BoolVar(&apply, "apply", false, "Directly create the tmuxp configs for selected projects") - configGenerateCmd.Flags().StringSliceVar(&additionalEnvs, "additionalEnvs", nil, "Additional envs to be populated") - rootCmd.AddCommand(configGenerateCmd) + gcloudGenerateCmd.Flags().BoolVar(&allProjects, "allProjects", false, "Skip confirmation for projects") + gcloudGenerateCmd.Flags().BoolVar(&apply, "apply", false, "Directly create the tmuxp configs for selected projects") + gcloudGenerateCmd.Flags().StringSliceVar(&additionalEnvs, "additionalEnvs", nil, "Additional envs to be populated") + rootCmd.AddCommand(gcloudGenerateCmd) } diff --git a/cmd/config-generate_test.go b/cmd/gcloud-generate_test.go similarity index 100% rename from cmd/config-generate_test.go rename to cmd/gcloud-generate_test.go From 672e2cf2ace30e0006d72b627c768d555bac4f7d Mon Sep 17 00:00:00 2001 From: Dinesh Date: Tue, 18 Feb 2020 20:49:03 +0100 Subject: [PATCH 36/48] Using commander to execute gcloud commands insteadof using google go-client Signed-off-by: Dinesh --- cmd/gcloud-generate.go | 23 ++++--- go.mod | 6 +- go.sum | 149 ----------------------------------------- pkg/gcloud/client.go | 59 +++++++++------- 4 files changed, 49 insertions(+), 188 deletions(-) diff --git a/cmd/gcloud-generate.go b/cmd/gcloud-generate.go index 2ac9ace..59a7003 100644 --- a/cmd/gcloud-generate.go +++ b/cmd/gcloud-generate.go @@ -20,7 +20,8 @@ var gcloudGenerateCmd = &cobra.Command{ Use: "gcloud-generate", Short: "Generates configs for kube-tmuxp based on gcloud account", Run: func(cmd *cobra.Command, args []string) { - projects, err := getProjects() + cmdr := &commander.Default{} + projects, err := getProjects(cmdr) if err != nil { _, _ = fmt.Fprintf(cmd.ErrOrStderr(), err.Error()) os.Exit(1) @@ -30,7 +31,7 @@ var gcloudGenerateCmd = &cobra.Command{ _, _ = fmt.Fprintf(cmd.ErrOrStderr(), "Run with --apply to directly generate tmuxp configs for various Kubernetes contexts\n") return } - err = generateKubeTmuxpFiles(projects) + err = generateKubeTmuxpFiles(cmdr, projects) if err != nil { _, _ = fmt.Fprintf(cmd.ErrOrStderr(), err.Error()) os.Exit(1) @@ -38,9 +39,8 @@ var gcloudGenerateCmd = &cobra.Command{ }, } -func generateKubeTmuxpFiles(projects kubetmuxp.Projects) error { +func generateKubeTmuxpFiles(cmdr commander.Commander, projects kubetmuxp.Projects) error { fs := &filesystem.Default{} - cmdr := &commander.Default{} kubeCfg, err := kubeconfig.New(fs, cmdr) config, err := kubetmuxp.NewConfigWithProjects(projects, fs, kubeCfg) @@ -59,8 +59,8 @@ func printConfigFiles(projects kubetmuxp.Projects, outStream io.Writer) { fmt.Println(string(bytes)) } -func getProjects() (kubetmuxp.Projects, error) { - projectIds := getGCloudProjects(allProjects) +func getProjects(cmdr commander.Commander) (kubetmuxp.Projects, error) { + projectIds := getGCloudProjects(cmdr, allProjects) additionalEnvsMap := map[string]string{} for _, env := range additionalEnvs { envKeyValue := strings.Split(env, "=") @@ -71,7 +71,7 @@ func getProjects() (kubetmuxp.Projects, error) { } projects := make(kubetmuxp.Projects, 0, len(projectIds)) for _, projectId := range projectIds { - clusters, err := gcloud.ListClusters(projectId) + clusters, err := gcloud.ListClusters(cmdr, projectId) if err != nil { return nil, err } @@ -81,7 +81,8 @@ func getProjects() (kubetmuxp.Projects, error) { for _, cluster := range clusters { zone := "" region := "" - if cluster.IsRegional { + isRegional := cluster.IsRegional() + if isRegional { region = cluster.Location } else { zone = cluster.Location @@ -89,7 +90,7 @@ func getProjects() (kubetmuxp.Projects, error) { baseEnvs := map[string]string{ "KUBETMUXP_CLUSTER_NAME": cluster.Name, "KUBETMUXP_CLUSTER_LOCATION": cluster.Location, - "KUBETMUXP_CLUSTER_IS_REGIONAL": fmt.Sprintf("%v", cluster.IsRegional), + "KUBETMUXP_CLUSTER_IS_REGIONAL": fmt.Sprintf("%v", isRegional), "GCP_PROJECT_ID": projectId, } kubetmuxpClusters = append(kubetmuxpClusters, kubetmuxp.Cluster{ @@ -123,8 +124,8 @@ func mergeEnvs(base, additionalEnvsMap map[string]string) map[string]string { return base } -func getGCloudProjects(allProjects bool) []string { - projectIds, err := gcloud.ListProjects() +func getGCloudProjects(cmdr commander.Commander, allProjects bool) []string { + projectIds, err := gcloud.ListProjects(cmdr) if err != nil { _, _ = fmt.Fprintln(os.Stderr, err) os.Exit(1) diff --git a/go.mod b/go.mod index c7b17b2..e5db322 100644 --- a/go.mod +++ b/go.mod @@ -3,14 +3,14 @@ module github.com/thecasualcoder/kube-tmuxp go 1.13 require ( - cloud.google.com/go v0.51.0 github.com/golang/mock v1.3.1 github.com/mitchellh/go-homedir v1.1.0 github.com/spf13/cobra v0.0.5 github.com/spf13/viper v1.5.0 github.com/stretchr/testify v1.4.0 - google.golang.org/api v0.15.0 - google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb + golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 // indirect + golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8 // indirect + golang.org/x/text v0.3.2 // indirect gopkg.in/AlecAivazis/survey.v1 v1.8.7 gopkg.in/yaml.v2 v2.2.7 ) diff --git a/go.sum b/go.sum index 5e62d7d..9fb3002 100644 --- a/go.sum +++ b/go.sum @@ -1,24 +1,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.51.0 h1:PvKAVQWCtlGUSlZkGW3QLelKaWq7KYv/MW1EboG8bfM= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go/bigquery v1.0.1 h1:hL+ycaJpVE9M7nLoiXb/Pn10ENE2u+oddxbD8uu0ZVU= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/datastore v1.0.0 h1:Kt+gOPPp2LEPWp8CSfxhsM8ik9CcyE/gYu+0r+RnZvM= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/pubsub v1.0.1 h1:W9tAK3E57P75u0XLLR82LZyw8VpAnhmyTOxW9qzmyj8= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/storage v1.0.0 h1:VV2nUM3wwLLGh9lSABFgZMjInyUbJeaRSE64WuAIQ+4= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw= github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -27,11 +9,7 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -45,13 +23,10 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= @@ -61,49 +36,24 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= @@ -142,14 +92,12 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -182,10 +130,6 @@ github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljT github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= @@ -193,58 +137,21 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299 h1:zQpM52jfKHG6II1ISZY1ZcpygvuSFZpLwfluuF89XOg= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180606202747-9527bec2660b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -253,79 +160,29 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8 h1:JA8d3MPx/IToSyXZG/RhwYEtfrKO1Fxrqe8KrkiLXKM= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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/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-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4 h1:Toz2IK7k8rbltAXwNAxKcn9OzqyNfMUhUNjz3sL0NMk= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.15.0 h1:yzlyyDW/J0w8yNFJIhiAJy4kq74S+1DOLdawELNxFMA= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb h1:ADPHZzpzM4tk4V4S5cnCrr5SwzvlrPRmqqCuJDB8UTs= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= gopkg.in/AlecAivazis/survey.v1 v1.8.7 h1:oBJqtgsyBLg9K5FK9twNUbcPnbCPoh+R9a+7nag3qJM= gopkg.in/AlecAivazis/survey.v1 v1.8.7/go.mod h1:iBNOmqKz/NUbZx3bA+4hAGLRC7fSK7tgtVDT4tB22XA= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -334,9 +191,3 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/pkg/gcloud/client.go b/pkg/gcloud/client.go index 6b38e40..6fcc074 100644 --- a/pkg/gcloud/client.go +++ b/pkg/gcloud/client.go @@ -1,29 +1,30 @@ package gcloud import ( - "cloud.google.com/go/container/apiv1" - "context" - "fmt" - "google.golang.org/api/cloudresourcemanager/v1" - container2 "google.golang.org/genproto/googleapis/container/v1" + "encoding/json" + "github.com/thecasualcoder/kube-tmuxp/pkg/commander" ) // ListProjects lists the projects for logged-in user -func ListProjects() ([]string, error) { - newService, err := cloudresourcemanager.NewService(context.TODO()) +func ListProjects(commander commander.Commander) ([]string, error) { + args := []string{ + "projects", + "list", + "--format=json", + } + response, err := commander.Execute("gcloud", args, nil) if err != nil { return nil, err } - projectsService := cloudresourcemanager.NewProjectsService(newService) - - response, err := projectsService.List().Do() + var parsedResponse []map[string]string + err = json.Unmarshal([]byte(response), &parsedResponse) if err != nil { return nil, err } - projectIds := make([]string, 0, len(response.Projects)) - for _, project := range response.Projects { - projectIds = append(projectIds, project.ProjectId) + projectIds := make([]string, 0, len(parsedResponse)) + for _, project := range parsedResponse { + projectIds = append(projectIds, project["projectId"]) } return projectIds, nil @@ -31,30 +32,38 @@ func ListProjects() ([]string, error) { // Cluster represent the GKE Cluster type Cluster struct { - Name string - Location string - IsRegional bool + Name string + Location string + Locations []string +} + +func (cluster Cluster) IsRegional() bool { + return Contains(cluster.Locations, cluster.Location) } // Clusters represents the list of Cluster type Clusters []Cluster // ListClusters for the given projectId -func ListClusters(projectId string) (Clusters, error) { - clusterManagerClient, err := container.NewClusterManagerClient(context.TODO()) +func ListClusters(cmdr commander.Commander, projectId string) (Clusters, error) { + args := []string{ + "container", + "clusters", + "list", + "--project", + projectId, + "--format=json", + } + response, err := cmdr.Execute("gcloud", args, nil) if err != nil { return nil, err } - - listClustersRequest := container2.ListClustersRequest{Parent: fmt.Sprintf("projects/%s/locations/%s", projectId, "-")} - response, err := clusterManagerClient.ListClusters(context.TODO(), &listClustersRequest) + var clusters []Cluster + err = json.Unmarshal([]byte(response), &clusters) if err != nil { return nil, err } - clusters := make(Clusters, 0, len(response.Clusters)) - for _, cluster := range response.Clusters { - clusters = append(clusters, Cluster{Name: cluster.Name, Location: cluster.Location, IsRegional: !Contains(cluster.Locations, cluster.Location)}) - } + return clusters, nil } From 25529f0735d384ecb0393943d95a3f444f1c89d4 Mon Sep 17 00:00:00 2001 From: Dinesh Date: Tue, 18 Feb 2020 21:06:01 +0100 Subject: [PATCH 37/48] Remove seting the configFile for viper Signed-off-by: Dinesh --- cmd/root.go | 12 ------- go.mod | 4 +-- go.sum | 102 ---------------------------------------------------- 3 files changed, 2 insertions(+), 116 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index 3601332..755a7b9 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -7,7 +7,6 @@ import ( "github.com/mitchellh/go-homedir" "github.com/spf13/cobra" - "github.com/spf13/viper" ) var cfgFile string @@ -27,7 +26,6 @@ func Execute() { } func init() { - cobra.OnInitialize(initConfig) home, err := homedir.Dir() if err != nil { fmt.Println(err) @@ -37,13 +35,3 @@ func init() { cfgFile = path.Join(home, configFileName) rootCmd.PersistentFlags().StringVar(&cfgFile, "config", cfgFile, "config file") } - -func initConfig() { - viper.SetConfigFile(cfgFile) - - viper.AutomaticEnv() - - if err := viper.ReadInConfig(); err != nil { - _, _ = fmt.Fprintln(os.Stderr, fmt.Sprintf("error reading config file %s: %v", viper.ConfigFileUsed(), err)) - } -} diff --git a/go.mod b/go.mod index e5db322..917ffcd 100644 --- a/go.mod +++ b/go.mod @@ -4,13 +4,13 @@ go 1.13 require ( github.com/golang/mock v1.3.1 + github.com/kr/pretty v0.1.0 // indirect github.com/mitchellh/go-homedir v1.1.0 github.com/spf13/cobra v0.0.5 - github.com/spf13/viper v1.5.0 github.com/stretchr/testify v1.4.0 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 // indirect golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8 // indirect - golang.org/x/text v0.3.2 // indirect gopkg.in/AlecAivazis/survey.v1 v1.8.7 + gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect gopkg.in/yaml.v2 v2.2.7 ) diff --git a/go.sum b/go.sum index 9fb3002..03a7bfe 100644 --- a/go.sum +++ b/go.sum @@ -1,66 +1,27 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw= github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= @@ -68,40 +29,21 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= 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/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= @@ -113,50 +55,23 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6 github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.5.0 h1:GpsTwfsQ27oS/Aha/6d1oD7tpKIqWnOA6tgOX9HHkt4= -github.com/spf13/viper v1.5.0/go.mod h1:AkYRkVJF8TkSG/xet6PzXX+l39KhhXa2pdqVSxnTcn4= 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/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180606202747-9527bec2660b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -165,29 +80,12 @@ golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8 h1:JA8d3MPx/IToSyXZG/RhwYEtf golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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.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-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= gopkg.in/AlecAivazis/survey.v1 v1.8.7 h1:oBJqtgsyBLg9K5FK9twNUbcPnbCPoh+R9a+7nag3qJM= gopkg.in/AlecAivazis/survey.v1 v1.8.7/go.mod h1:iBNOmqKz/NUbZx3bA+4hAGLRC7fSK7tgtVDT4tB22XA= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 16ceb667327d7402f23bb942c9bbe81760560807 Mon Sep 17 00:00:00 2001 From: Dinesh Date: Sat, 22 Feb 2020 11:58:48 +0100 Subject: [PATCH 38/48] Add proper error message and add unit tests Signed-off-by: Dinesh --- pkg/gcloud/client.go | 12 ++- pkg/gcloud/client_test.go | 160 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 168 insertions(+), 4 deletions(-) create mode 100644 pkg/gcloud/client_test.go diff --git a/pkg/gcloud/client.go b/pkg/gcloud/client.go index 6fcc074..f9cadfb 100644 --- a/pkg/gcloud/client.go +++ b/pkg/gcloud/client.go @@ -2,7 +2,9 @@ package gcloud import ( "encoding/json" + "fmt" "github.com/thecasualcoder/kube-tmuxp/pkg/commander" + "strings" ) // ListProjects lists the projects for logged-in user @@ -13,13 +15,14 @@ func ListProjects(commander commander.Commander) ([]string, error) { "--format=json", } response, err := commander.Execute("gcloud", args, nil) + fullCommand := strings.Join(append([]string{"gcloud"}, args...), " ") if err != nil { - return nil, err + return nil, fmt.Errorf("error executing %s: %v", fullCommand, err) } var parsedResponse []map[string]string err = json.Unmarshal([]byte(response), &parsedResponse) if err != nil { - return nil, err + return nil, fmt.Errorf("error unmarshaling the response from command %s: %v", fullCommand, err) } projectIds := make([]string, 0, len(parsedResponse)) @@ -55,13 +58,14 @@ func ListClusters(cmdr commander.Commander, projectId string) (Clusters, error) "--format=json", } response, err := cmdr.Execute("gcloud", args, nil) + fullCommand := strings.Join(append([]string{"gcloud"}, args...), " ") if err != nil { - return nil, err + return nil, fmt.Errorf("error executing %s: %v", fullCommand, err) } var clusters []Cluster err = json.Unmarshal([]byte(response), &clusters) if err != nil { - return nil, err + return nil, fmt.Errorf("error unmarshaling the response from command %s: %v", fullCommand, err) } return clusters, nil diff --git a/pkg/gcloud/client_test.go b/pkg/gcloud/client_test.go new file mode 100644 index 0000000..369cc3f --- /dev/null +++ b/pkg/gcloud/client_test.go @@ -0,0 +1,160 @@ +package gcloud + +import ( + "fmt" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" + "github.com/thecasualcoder/kube-tmuxp/pkg/internal/mock" + "testing" +) + +func TestListProjects(t *testing.T) { + t.Run("should return error if there is an error executing gcloud command", func(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + commander := mock.NewCommander(ctrl) + commander.EXPECT().Execute("gcloud", []string{"projects", "list", "--format=json",}, nil).Return("", fmt.Errorf("please login")) + + projects, err := ListProjects(commander) + + assert.EqualError(t, err, "error executing gcloud projects list --format=json: please login") + assert.Empty(t, projects) + }) + + t.Run("should return error if there is an unmarshal from gcloud command", func(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + commander := mock.NewCommander(ctrl) + commander.EXPECT().Execute("gcloud", []string{"projects", "list", "--format=json",}, nil).Return("invalid json response", nil) + + projects, err := ListProjects(commander) + + assert.EqualError(t, err, "error unmarshaling the response from command gcloud projects list --format=json: invalid character 'i' looking for beginning of value") + assert.Empty(t, projects) + }) + + t.Run("should return projects from gcloud command", func(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + commander := mock.NewCommander(ctrl) + commander.EXPECT().Execute("gcloud", []string{"projects", "list", "--format=json",}, nil).Return(`[ + { + "createTime": "2016-08-20T04:30:54.605Z", + "lifecycleState": "ACTIVE", + "name": "My Project", + "projectId": "clean-pottery", + "projectNumber": "10" + } +]`, nil) + + projects, err := ListProjects(commander) + + assert.NoError(t, err) + assert.Equal(t, []string{"clean-pottery"}, projects) + }) +} + +func TestListClusters(t *testing.T) { + projectId := "projectId" + + t.Run("should return error if there is an error executing gcloud command", func(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + commander := mock.NewCommander(ctrl) + commander.EXPECT().Execute("gcloud", []string{"container", + "clusters", + "list", + "--project", + projectId, + "--format=json", + }, nil).Return("", fmt.Errorf("please login")) + + projects, err := ListClusters(commander, projectId) + + assert.EqualError(t, err, "error executing gcloud container clusters list --project projectId --format=json: please login") + assert.Empty(t, projects) + }) + + t.Run("should return error if there is an unmarshal from gcloud command", func(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + commander := mock.NewCommander(ctrl) + commander.EXPECT().Execute("gcloud", []string{"container", + "clusters", + "list", + "--project", + projectId, + "--format=json", + }, nil).Return("invalid json response", nil) + + projects, err := ListClusters(commander, projectId) + + assert.EqualError(t, err, "error unmarshaling the response from command gcloud container clusters list --project projectId --format=json: invalid character 'i' looking for beginning of value") + assert.Empty(t, projects) + }) + + t.Run("should return clusters from gcloud command", func(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + commander := mock.NewCommander(ctrl) + commander.EXPECT().Execute("gcloud", []string{"container", + "clusters", + "list", + "--project", + projectId, + "--format=json", + }, nil).Return(`[ + { + "currentNodeCount": 8, + "databaseEncryption": { + "state": "DECRYPTED" + }, + "defaultMaxPodsConstraint": { + "maxPodsPerNode": "110" + }, + "location": "asia-southeast1", + "locations": [ + "asia-southeast1-a", + "asia-southeast1-c", + "asia-southeast1-b" + ], + "name": "cluster-one", + "network": "default", + "nodeIpv4CidrSize": 24, + "status": "RUNNING", + "subnetwork": "default-subnet", + "zone": "asia-southeast1" + }, + { + "currentNodeCount": 8, + "databaseEncryption": { + "state": "DECRYPTED" + }, + "defaultMaxPodsConstraint": { + "maxPodsPerNode": "110" + }, + "location": "asia-southeast1", + "locations": [ + "asia-southeast1-a", + "asia-southeast1-c", + "asia-southeast1-b" + ], + "name": "cluster-two", + "network": "default", + "nodeIpv4CidrSize": 24, + "status": "RUNNING", + "subnetwork": "default-subnet", + "zone": "asia-southeast1" + } +]`, nil) + + expectedClusters := Clusters{ + Cluster{Name: "cluster-one", Location: "asia-southeast1", Locations: []string{"asia-southeast1-a", "asia-southeast1-c", "asia-southeast1-b"}}, + Cluster{Name: "cluster-two", Location: "asia-southeast1", Locations: []string{"asia-southeast1-a", "asia-southeast1-c", "asia-southeast1-b"}}} + + projects, err := ListClusters(commander, projectId) + + assert.NoError(t, err) + assert.Equal(t, expectedClusters, projects) + }) +} From 524130829e98e49353cffeb4dd4e85b34c0b2742 Mon Sep 17 00:00:00 2001 From: Dinesh Date: Sat, 22 Feb 2020 12:36:53 +0100 Subject: [PATCH 39/48] Introduce Project struct to parse gcloud projects safely Signed-off-by: Dinesh --- cmd/gcloud-generate.go | 42 +++++++++++++++++++++------------------ pkg/gcloud/client.go | 39 +++++++++++++++++++++++++++++------- pkg/gcloud/client_test.go | 25 ++++++++++++++++++----- 3 files changed, 75 insertions(+), 31 deletions(-) diff --git a/cmd/gcloud-generate.go b/cmd/gcloud-generate.go index 59a7003..ec6d0f5 100644 --- a/cmd/gcloud-generate.go +++ b/cmd/gcloud-generate.go @@ -60,7 +60,7 @@ func printConfigFiles(projects kubetmuxp.Projects, outStream io.Writer) { } func getProjects(cmdr commander.Commander) (kubetmuxp.Projects, error) { - projectIds := getGCloudProjects(cmdr, allProjects) + gCloudProjects := getGCloudProjects(cmdr, allProjects) additionalEnvsMap := map[string]string{} for _, env := range additionalEnvs { envKeyValue := strings.Split(env, "=") @@ -69,13 +69,13 @@ func getProjects(cmdr commander.Commander) (kubetmuxp.Projects, error) { } additionalEnvsMap[envKeyValue[0]] = envKeyValue[1] } - projects := make(kubetmuxp.Projects, 0, len(projectIds)) - for _, projectId := range projectIds { - clusters, err := gcloud.ListClusters(cmdr, projectId) + projects := make(kubetmuxp.Projects, 0, len(gCloudProjects)) + for _, gCloudProject := range gCloudProjects { + clusters, err := gcloud.ListClusters(cmdr, gCloudProject.ProjectId) if err != nil { return nil, err } - _, _ = fmt.Fprintf(os.Stderr, "Number of clusters for %s project: %d\n", projectId, len(clusters)) + _, _ = fmt.Fprintf(os.Stderr, "Number of clusters for %s project: %d\n", gCloudProject, len(clusters)) kubetmuxpClusters := make(kubetmuxp.Clusters, 0, len(clusters)) for _, cluster := range clusters { @@ -91,7 +91,7 @@ func getProjects(cmdr commander.Commander) (kubetmuxp.Projects, error) { "KUBETMUXP_CLUSTER_NAME": cluster.Name, "KUBETMUXP_CLUSTER_LOCATION": cluster.Location, "KUBETMUXP_CLUSTER_IS_REGIONAL": fmt.Sprintf("%v", isRegional), - "GCP_PROJECT_ID": projectId, + "GCP_PROJECT_ID": gCloudProject.ProjectId, } kubetmuxpClusters = append(kubetmuxpClusters, kubetmuxp.Cluster{ Name: cluster.Name, @@ -102,7 +102,7 @@ func getProjects(cmdr commander.Commander) (kubetmuxp.Projects, error) { }) } projects = append(projects, kubetmuxp.Project{ - Name: projectId, + Name: gCloudProject.ProjectId, Clusters: kubetmuxpClusters, }) } @@ -124,37 +124,41 @@ func mergeEnvs(base, additionalEnvsMap map[string]string) map[string]string { return base } -func getGCloudProjects(cmdr commander.Commander, allProjects bool) []string { - projectIds, err := gcloud.ListProjects(cmdr) +func getGCloudProjects(cmdr commander.Commander, allProjects bool) gcloud.Projects { + projects, err := gcloud.ListProjects(cmdr) if err != nil { _, _ = fmt.Fprintln(os.Stderr, err) os.Exit(1) } - _, _ = fmt.Fprintf(os.Stderr, "Number of gcloud projects: %d\n", len(projectIds)) + _, _ = fmt.Fprintf(os.Stderr, "Number of gcloud projects: %d\n", len(projects)) if allProjects { - return projectIds + return projects } - selectedProjectIds, err := getSelectedProjects(projectIds) + selectedProjects, err := getSelectedProjects(projects) if err != nil { _, _ = fmt.Fprintln(os.Stderr, err) os.Exit(1) } - _, _ = fmt.Fprintf(os.Stderr, "Number of selected gcloud projects: %d\n", len(selectedProjectIds)) - return selectedProjectIds + _, _ = fmt.Fprintf(os.Stderr, "Number of selected gcloud projects: %d\n", len(selectedProjects)) + return selectedProjects } -func getSelectedProjects(projects []string) ([]string, error) { - var selectedProjects []string +func getSelectedProjects(projects gcloud.Projects) (gcloud.Projects, error) { + var selectedProjectIDs []string prompt := &survey.MultiSelect{ Message: "Select gcloud projects that you want to configure:", - Options: projects, + Options: projects.IDs(), } opt := func(options *survey.AskOptions) error { options.Stdio.Out = os.Stderr return nil } - err := survey.AskOne(prompt, &selectedProjects, func(ans interface{}) error { return nil }, opt) - return selectedProjects, err + validator := func(ans interface{}) error { return nil } + err := survey.AskOne(prompt, &selectedProjectIDs, validator, opt) + if err != nil { + return nil, fmt.Errorf("error selecting project: %v", err) + } + return projects.Filter(selectedProjectIDs), nil } var allProjects, apply bool diff --git a/pkg/gcloud/client.go b/pkg/gcloud/client.go index f9cadfb..d97c97b 100644 --- a/pkg/gcloud/client.go +++ b/pkg/gcloud/client.go @@ -8,7 +8,7 @@ import ( ) // ListProjects lists the projects for logged-in user -func ListProjects(commander commander.Commander) ([]string, error) { +func ListProjects(commander commander.Commander) (Projects, error) { args := []string{ "projects", "list", @@ -19,18 +19,43 @@ func ListProjects(commander commander.Commander) ([]string, error) { if err != nil { return nil, fmt.Errorf("error executing %s: %v", fullCommand, err) } - var parsedResponse []map[string]string - err = json.Unmarshal([]byte(response), &parsedResponse) + var projects []Project + err = json.Unmarshal([]byte(response), &projects) if err != nil { return nil, fmt.Errorf("error unmarshaling the response from command %s: %v", fullCommand, err) } - projectIds := make([]string, 0, len(parsedResponse)) - for _, project := range parsedResponse { - projectIds = append(projectIds, project["projectId"]) + return projects, nil +} + +// Project represent the GCP project +type Project struct { + ProjectId string `json:"projectId"` +} + +// Projects represent the list of GCP projects +type Projects []Project + +func (p Projects) IDs() []string { + acc := make([]string, 0, len(p)) + for _, project := range p { + acc = append(acc, project.ProjectId) } + return acc +} - return projectIds, nil +func (p Projects) Filter(projectIDs []string) Projects { + projectMap := map[string]Project{} + for _, project := range p { + projectMap[project.ProjectId] = project + } + result := make(Projects, 0, len(p)) + for _, id := range projectIDs { + if project, ok := projectMap[id]; ok { + result = append(result, project) + } + } + return result } // Cluster represent the GKE Cluster diff --git a/pkg/gcloud/client_test.go b/pkg/gcloud/client_test.go index 369cc3f..60eb392 100644 --- a/pkg/gcloud/client_test.go +++ b/pkg/gcloud/client_test.go @@ -13,7 +13,7 @@ func TestListProjects(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() commander := mock.NewCommander(ctrl) - commander.EXPECT().Execute("gcloud", []string{"projects", "list", "--format=json",}, nil).Return("", fmt.Errorf("please login")) + commander.EXPECT().Execute("gcloud", []string{"projects", "list", "--format=json"}, nil).Return("", fmt.Errorf("please login")) projects, err := ListProjects(commander) @@ -25,7 +25,7 @@ func TestListProjects(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() commander := mock.NewCommander(ctrl) - commander.EXPECT().Execute("gcloud", []string{"projects", "list", "--format=json",}, nil).Return("invalid json response", nil) + commander.EXPECT().Execute("gcloud", []string{"projects", "list", "--format=json"}, nil).Return("invalid json response", nil) projects, err := ListProjects(commander) @@ -37,20 +37,23 @@ func TestListProjects(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() commander := mock.NewCommander(ctrl) - commander.EXPECT().Execute("gcloud", []string{"projects", "list", "--format=json",}, nil).Return(`[ + commander.EXPECT().Execute("gcloud", []string{"projects", "list", "--format=json"}, nil).Return(`[ { "createTime": "2016-08-20T04:30:54.605Z", "lifecycleState": "ACTIVE", "name": "My Project", "projectId": "clean-pottery", - "projectNumber": "10" + "projectNumber": "10", + "users": [ + "someuser" + ] } ]`, nil) projects, err := ListProjects(commander) assert.NoError(t, err) - assert.Equal(t, []string{"clean-pottery"}, projects) + assert.Equal(t, Projects{Project{ProjectId: "clean-pottery"}}, projects) }) } @@ -158,3 +161,15 @@ func TestListClusters(t *testing.T) { assert.Equal(t, expectedClusters, projects) }) } + +func TestProjects_IDs(t *testing.T) { + projects := Projects{Project{ProjectId: "project_one"}, Project{ProjectId: "project_two"}} + + assert.Equal(t, []string{"project_one", "project_two"}, projects.IDs()) +} + +func TestProjects_Filter(t *testing.T) { + projects := Projects{Project{ProjectId: "project_one"}, Project{ProjectId: "project_two"}} + + assert.Equal(t, Projects{Project{ProjectId: "project_one"}}, projects.Filter([]string{"project_one", "invalid_project"})) +} From 7b2c58b98aa7a6cd4c028a69a8bf77014e147c2c Mon Sep 17 00:00:00 2001 From: Dinesh Date: Sat, 22 Feb 2020 12:38:30 +0100 Subject: [PATCH 40/48] Fix the IsRegional calculation and added tests Signed-off-by: Dinesh --- pkg/gcloud/client.go | 2 +- pkg/gcloud/client_test.go | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/pkg/gcloud/client.go b/pkg/gcloud/client.go index d97c97b..2caac14 100644 --- a/pkg/gcloud/client.go +++ b/pkg/gcloud/client.go @@ -66,7 +66,7 @@ type Cluster struct { } func (cluster Cluster) IsRegional() bool { - return Contains(cluster.Locations, cluster.Location) + return !Contains(cluster.Locations, cluster.Location) } // Clusters represents the list of Cluster diff --git a/pkg/gcloud/client_test.go b/pkg/gcloud/client_test.go index 60eb392..1e6a609 100644 --- a/pkg/gcloud/client_test.go +++ b/pkg/gcloud/client_test.go @@ -173,3 +173,17 @@ func TestProjects_Filter(t *testing.T) { assert.Equal(t, Projects{Project{ProjectId: "project_one"}}, projects.Filter([]string{"project_one", "invalid_project"})) } + +func TestCluster_IsRegional(t *testing.T) { + t.Run("should return true for regional clusters", func(t *testing.T) { + cluster := Cluster{Name: "cluster-one", Location: "asia-southeast1", Locations: []string{"asia-southeast1-a", "asia-southeast1-c", "asia-southeast1-b"}} + + assert.True(t, cluster.IsRegional()) + }) + + t.Run("should return false for zonal clusters", func(t *testing.T) { + cluster := Cluster{Name: "cluster-one", Location: "asia-southeast1-a", Locations: []string{"asia-southeast1-a", "asia-southeast1-c", "asia-southeast1-b"}} + + assert.False(t, cluster.IsRegional()) + }) +} From a9730a2fad1c5d8ddf29ec8fce00677cf11b62a2 Mon Sep 17 00:00:00 2001 From: Dinesh Date: Sat, 14 Mar 2020 13:30:35 +0530 Subject: [PATCH 41/48] Add --projectID flag --- cmd/gcloud-generate.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cmd/gcloud-generate.go b/cmd/gcloud-generate.go index ec6d0f5..7d07bd5 100644 --- a/cmd/gcloud-generate.go +++ b/cmd/gcloud-generate.go @@ -60,7 +60,12 @@ func printConfigFiles(projects kubetmuxp.Projects, outStream io.Writer) { } func getProjects(cmdr commander.Commander) (kubetmuxp.Projects, error) { - gCloudProjects := getGCloudProjects(cmdr, allProjects) + var gCloudProjects gcloud.Projects + if projectID != "" { + gCloudProjects = gcloud.Projects{gcloud.Project{ProjectId: projectID}} + } else { + gCloudProjects = getGCloudProjects(cmdr, allProjects) + } additionalEnvsMap := map[string]string{} for _, env := range additionalEnvs { envKeyValue := strings.Split(env, "=") @@ -162,10 +167,12 @@ func getSelectedProjects(projects gcloud.Projects) (gcloud.Projects, error) { } var allProjects, apply bool +var projectID string var additionalEnvs []string func init() { gcloudGenerateCmd.Flags().BoolVar(&allProjects, "allProjects", false, "Skip confirmation for projects") + gcloudGenerateCmd.Flags().StringVar(&projectID, "projectID", "", "Project ID to which the configurations need to be fetched") gcloudGenerateCmd.Flags().BoolVar(&apply, "apply", false, "Directly create the tmuxp configs for selected projects") gcloudGenerateCmd.Flags().StringSliceVar(&additionalEnvs, "additionalEnvs", nil, "Additional envs to be populated") rootCmd.AddCommand(gcloudGenerateCmd) From bd78db9a3b7234d0e91bc776325d83e578f70e4c Mon Sep 17 00:00:00 2001 From: Dinesh Date: Sat, 14 Mar 2020 13:41:10 +0530 Subject: [PATCH 42/48] Add fuzzysearch feature to select the projects in prompt --- cmd/gcloud-generate.go | 10 ++++++++++ go.mod | 1 + go.sum | 5 +++++ 3 files changed, 16 insertions(+) diff --git a/cmd/gcloud-generate.go b/cmd/gcloud-generate.go index 7d07bd5..71a4cb3 100644 --- a/cmd/gcloud-generate.go +++ b/cmd/gcloud-generate.go @@ -2,6 +2,7 @@ package cmd import ( "fmt" + "github.com/lithammer/fuzzysearch/fuzzy" "github.com/thecasualcoder/kube-tmuxp/pkg/commander" "github.com/thecasualcoder/kube-tmuxp/pkg/filesystem" "github.com/thecasualcoder/kube-tmuxp/pkg/kubeconfig" @@ -153,6 +154,15 @@ func getSelectedProjects(projects gcloud.Projects) (gcloud.Projects, error) { prompt := &survey.MultiSelect{ Message: "Select gcloud projects that you want to configure:", Options: projects.IDs(), + FilterFn: func(s string, options []string) []string { + var acc []string + for _, option := range options { + if fuzzy.Match(s, option) { + acc = append(acc, option) + } + } + return acc + }, } opt := func(options *survey.AskOptions) error { options.Stdio.Out = os.Stderr diff --git a/go.mod b/go.mod index 917ffcd..121d18d 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.13 require ( github.com/golang/mock v1.3.1 github.com/kr/pretty v0.1.0 // indirect + github.com/lithammer/fuzzysearch v1.1.0 github.com/mitchellh/go-homedir v1.1.0 github.com/spf13/cobra v0.0.5 github.com/stretchr/testify v1.4.0 diff --git a/go.sum b/go.sum index 03a7bfe..67c25e1 100644 --- a/go.sum +++ b/go.sum @@ -28,6 +28,8 @@ github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lithammer/fuzzysearch v1.1.0 h1:go9v8tLCrNTTlH42OAaq4eHFe81TDHEnlrMEb6R4f+A= +github.com/lithammer/fuzzysearch v1.1.0/go.mod h1:Bqx4wo8lTOFcJr3ckpY6HA9lEIOO0H5HrkJ5CsN56HQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -80,6 +82,9 @@ golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8 h1:JA8d3MPx/IToSyXZG/RhwYEtf golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= gopkg.in/AlecAivazis/survey.v1 v1.8.7 h1:oBJqtgsyBLg9K5FK9twNUbcPnbCPoh+R9a+7nag3qJM= gopkg.in/AlecAivazis/survey.v1 v1.8.7/go.mod h1:iBNOmqKz/NUbZx3bA+4hAGLRC7fSK7tgtVDT4tB22XA= From d0872ec5176b778358e9159fe2ccb6f7ce097378 Mon Sep 17 00:00:00 2001 From: Dinesh Date: Sat, 14 Mar 2020 14:05:02 +0530 Subject: [PATCH 43/48] Can handle multiple projectIDs with --projectIDs flag --- cmd/gcloud-generate.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/cmd/gcloud-generate.go b/cmd/gcloud-generate.go index 71a4cb3..f02588b 100644 --- a/cmd/gcloud-generate.go +++ b/cmd/gcloud-generate.go @@ -61,9 +61,11 @@ func printConfigFiles(projects kubetmuxp.Projects, outStream io.Writer) { } func getProjects(cmdr commander.Commander) (kubetmuxp.Projects, error) { - var gCloudProjects gcloud.Projects - if projectID != "" { - gCloudProjects = gcloud.Projects{gcloud.Project{ProjectId: projectID}} + gCloudProjects := gcloud.Projects{} + if projectIDs != nil && len(projectIDs) > 0 { + for _, projectID := range projectIDs { + gCloudProjects = append(gCloudProjects, gcloud.Project{ProjectId: projectID}) + } } else { gCloudProjects = getGCloudProjects(cmdr, allProjects) } @@ -177,12 +179,11 @@ func getSelectedProjects(projects gcloud.Projects) (gcloud.Projects, error) { } var allProjects, apply bool -var projectID string -var additionalEnvs []string +var additionalEnvs, projectIDs []string func init() { gcloudGenerateCmd.Flags().BoolVar(&allProjects, "allProjects", false, "Skip confirmation for projects") - gcloudGenerateCmd.Flags().StringVar(&projectID, "projectID", "", "Project ID to which the configurations need to be fetched") + gcloudGenerateCmd.Flags().StringSliceVar(&projectIDs, "projectIDs", nil, "Comma separated Project IDs to which the configurations need to be fetched") gcloudGenerateCmd.Flags().BoolVar(&apply, "apply", false, "Directly create the tmuxp configs for selected projects") gcloudGenerateCmd.Flags().StringSliceVar(&additionalEnvs, "additionalEnvs", nil, "Additional envs to be populated") rootCmd.AddCommand(gcloudGenerateCmd) From 5d7cc169a4d9d0369c7f6fa302aba4702811c85f Mon Sep 17 00:00:00 2001 From: Dinesh Date: Wed, 18 Mar 2020 22:54:55 +0530 Subject: [PATCH 44/48] Update readme Signed-off-by: Dinesh --- README.md | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/README.md b/README.md index f29d398..4114dca 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,49 @@ kube-tmuxp gen Default config path is `$HOME/.kube-tmuxp.yaml`. If you are using a different path, then use the `--config` flag to specify that path. Refer `kube-tmuxp --help` for more details. +## Generate kube-tmuxp config file for gcloud + +```bash +$ kube-tmuxp gcloud-generate --help +Generates configs for kube-tmuxp based on gcloud account + +Usage: + kube-tmuxp gcloud-generate [flags] + +Flags: + --additionalEnvs strings Additional envs to be populated + --allProjects Skip confirmation for projects + --apply Directly create the tmuxp configs for selected projects + -h, --help help for gcloud-generate + --projectIDs strings Comma separated Project IDs to which the configurations need to be fetched + +``` + +#### Examples: +1) Interactively select projects: +```bash +$ kube-tmuxp gcloud-generate +# this will prompt for the projectIDs selection. Type to filter and select using space +# fuzzy search will work +``` +2) Specify projectIDs: +```bash +$ kube-tmuxp gcloud-generate --projectIDs project1,project2 +``` +3) For all projects: +```bash +$ kube-tmuxp gcloud-generate --allProjects +``` +4) Use env variables in kube-tmuxp: +> kube-tmuxp provides four envs: `KUBETMUXP_CLUSTER_NAME`, `KUBETMUXP_CLUSTER_LOCATION`, `KUBETMUXP_CLUSTER_IS_REGIONAL`, `GCP_PROJECT_ID`. We can pass additional envs also. +```bash +$ kube-tmuxp gcloud-generate --additionalEnvs 'NEW_KEY=new_value,NEW_ENV=$HOME,KUBE_CONFIG=$HOME/.kube/configs/$KUBETMUXP_CLUSTER_NAME' +# each tmux session will have 7 envs (4 predefined, 3 additionalEnvs passed as argument) +``` +5) Directly create the kubeconfigs and tmuxp files (instead of kube-tmuxp config files): +```bash +$ kube-tmuxp gcloud-generate --apply +``` ## Start a session ``` From 4cac56bdb20716a252603b353017f0c181c0a555 Mon Sep 17 00:00:00 2001 From: Dinesh Date: Wed, 25 Mar 2020 11:22:28 +0530 Subject: [PATCH 45/48] use linux conventions for flags Signed-off-by: Dinesh --- README.md | 6 +++--- cmd/gcloud-generate.go | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 4114dca..2438766 100644 --- a/README.md +++ b/README.md @@ -69,11 +69,11 @@ Usage: kube-tmuxp gcloud-generate [flags] Flags: - --additionalEnvs strings Additional envs to be populated - --allProjects Skip confirmation for projects + --additional-envs strings Additional envs to be populated + --all-projects Skip confirmation for projects --apply Directly create the tmuxp configs for selected projects -h, --help help for gcloud-generate - --projectIDs strings Comma separated Project IDs to which the configurations need to be fetched + --project-ids strings Comma separated Project IDs to which the configurations need to be fetched ``` diff --git a/cmd/gcloud-generate.go b/cmd/gcloud-generate.go index f02588b..3de7477 100644 --- a/cmd/gcloud-generate.go +++ b/cmd/gcloud-generate.go @@ -182,9 +182,9 @@ var allProjects, apply bool var additionalEnvs, projectIDs []string func init() { - gcloudGenerateCmd.Flags().BoolVar(&allProjects, "allProjects", false, "Skip confirmation for projects") - gcloudGenerateCmd.Flags().StringSliceVar(&projectIDs, "projectIDs", nil, "Comma separated Project IDs to which the configurations need to be fetched") + gcloudGenerateCmd.Flags().BoolVar(&allProjects, "all-projects", false, "Skip confirmation for projects") + gcloudGenerateCmd.Flags().StringSliceVar(&projectIDs, "project-ids", nil, "Comma separated Project IDs to which the configurations need to be fetched") gcloudGenerateCmd.Flags().BoolVar(&apply, "apply", false, "Directly create the tmuxp configs for selected projects") - gcloudGenerateCmd.Flags().StringSliceVar(&additionalEnvs, "additionalEnvs", nil, "Additional envs to be populated") + gcloudGenerateCmd.Flags().StringSliceVar(&additionalEnvs, "additional-envs", nil, "Additional envs to be populated") rootCmd.AddCommand(gcloudGenerateCmd) } From a742c66e32550e3b50427d5b7110c6009d9b539e Mon Sep 17 00:00:00 2001 From: Dinesh Date: Sat, 9 May 2020 22:16:39 +0530 Subject: [PATCH 46/48] Moved gcloud subcommand inside generate 1) Move almost all logic to pkg folder 2) Created two types of generator 1) based on file 2) based on gcloud Signed-off-by: Dinesh --- cmd/generate.go | 36 ++++--- pkg/file/generator.go | 41 +++++++ .../gcloud/generator.go | 100 +++++++++--------- .../gcloud/generator_test.go | 3 +- pkg/generator/generator.go | 58 ++++++++++ pkg/generator/generator_test.go | 39 +++++++ 6 files changed, 210 insertions(+), 67 deletions(-) create mode 100644 pkg/file/generator.go rename cmd/gcloud-generate.go => pkg/gcloud/generator.go (63%) rename cmd/gcloud-generate_test.go => pkg/gcloud/generator_test.go (98%) create mode 100644 pkg/generator/generator.go create mode 100644 pkg/generator/generator_test.go diff --git a/cmd/generate.go b/cmd/generate.go index 0502bfa..622fc61 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -2,13 +2,12 @@ package cmd import ( "fmt" + "github.com/thecasualcoder/kube-tmuxp/pkg/generator" "os" "github.com/spf13/cobra" "github.com/thecasualcoder/kube-tmuxp/pkg/commander" "github.com/thecasualcoder/kube-tmuxp/pkg/filesystem" - "github.com/thecasualcoder/kube-tmuxp/pkg/kubeconfig" - "github.com/thecasualcoder/kube-tmuxp/pkg/kubetmuxp" ) var generateCmd = &cobra.Command{ @@ -16,28 +15,35 @@ var generateCmd = &cobra.Command{ Aliases: []string{"gen"}, Short: "Generates tmuxp configs for various Kubernetes contexts", Run: func(cmd *cobra.Command, args []string) { + options := generator.Options{ + From: from, + AllProjects: allProjects, + ProjectIDs: projectIDs, + AdditionalEnvs: additionalEnvs, + Apply: apply, + CfgFile: cfgFile, + } fs := &filesystem.Default{} cmdr := &commander.Default{} - kubeCfg, err := kubeconfig.New(fs, cmdr) - if err != nil { - fmt.Println(err) - os.Exit(1) - } - fmt.Println("Using config file:", cfgFile) - kubetmuxpCfg, err := kubetmuxp.NewConfig(cfgFile, fs, kubeCfg) + generator, err := generator.NewGenerator(options, fs, cmdr) if err != nil { - fmt.Println(err) - os.Exit(1) - } - - if err = kubetmuxpCfg.Process(); err != nil { - fmt.Println(err) + _, _ = fmt.Fprintf(cmd.ErrOrStderr(), err.Error()) os.Exit(1) } + generator.Generate(cmd.OutOrStderr(), cmd.ErrOrStderr()) }, } +var from string +var allProjects, apply bool +var additionalEnvs, projectIDs []string + func init() { + generateCmd.Flags().StringVar(&from, "from", "file", "source from which the tmuxp config files are generated") + generateCmd.Flags().BoolVar(&allProjects, "all-projects", false, "Skip confirmation for projects") + generateCmd.Flags().StringSliceVar(&projectIDs, "project-ids", nil, "Comma separated Project IDs to which the configurations need to be fetched") + generateCmd.Flags().BoolVar(&apply, "apply", false, "Directly create the tmuxp configs for selected projects") + generateCmd.Flags().StringSliceVar(&additionalEnvs, "additional-envs", nil, "Additional envs to be populated") rootCmd.AddCommand(generateCmd) } diff --git a/pkg/file/generator.go b/pkg/file/generator.go new file mode 100644 index 0000000..9b59e0f --- /dev/null +++ b/pkg/file/generator.go @@ -0,0 +1,41 @@ +package file + +import ( + "fmt" + "github.com/thecasualcoder/kube-tmuxp/pkg/commander" + "github.com/thecasualcoder/kube-tmuxp/pkg/filesystem" + "github.com/thecasualcoder/kube-tmuxp/pkg/kubeconfig" + "github.com/thecasualcoder/kube-tmuxp/pkg/kubetmuxp" + "io" + "os" +) + +type Generator struct { + fs filesystem.FileSystem + cmdr commander.Commander + cfgFile string +} + +func NewGenerator(fs filesystem.FileSystem, cmdr commander.Commander, cfgFile string) Generator { + return Generator{fs: fs, cmdr: cmdr, cfgFile: cfgFile} +} + +func (g Generator) Generate(_, errStream io.Writer) { + kubeCfg, err := kubeconfig.New(g.fs, g.cmdr) + if err != nil { + _, _ = fmt.Fprintf(errStream, err.Error()) + os.Exit(1) + } + + fmt.Println("Using config file:", g.cfgFile) + kubetmuxpCfg, err := kubetmuxp.NewConfig(g.cfgFile, g.fs, kubeCfg) + if err != nil { + _, _ = fmt.Fprintf(errStream, err.Error()) + os.Exit(1) + } + + if err = kubetmuxpCfg.Process(); err != nil { + _, _ = fmt.Fprintf(errStream, err.Error()) + os.Exit(1) + } +} diff --git a/cmd/gcloud-generate.go b/pkg/gcloud/generator.go similarity index 63% rename from cmd/gcloud-generate.go rename to pkg/gcloud/generator.go index 3de7477..a0b3bdc 100644 --- a/cmd/gcloud-generate.go +++ b/pkg/gcloud/generator.go @@ -1,4 +1,4 @@ -package cmd +package gcloud import ( "fmt" @@ -6,41 +6,50 @@ import ( "github.com/thecasualcoder/kube-tmuxp/pkg/commander" "github.com/thecasualcoder/kube-tmuxp/pkg/filesystem" "github.com/thecasualcoder/kube-tmuxp/pkg/kubeconfig" + "github.com/thecasualcoder/kube-tmuxp/pkg/kubetmuxp" + "gopkg.in/AlecAivazis/survey.v1" "gopkg.in/yaml.v2" "io" "os" "strings" - - "github.com/spf13/cobra" - "github.com/thecasualcoder/kube-tmuxp/pkg/gcloud" - "github.com/thecasualcoder/kube-tmuxp/pkg/kubetmuxp" - "gopkg.in/AlecAivazis/survey.v1" ) -var gcloudGenerateCmd = &cobra.Command{ - Use: "gcloud-generate", - Short: "Generates configs for kube-tmuxp based on gcloud account", - Run: func(cmd *cobra.Command, args []string) { - cmdr := &commander.Default{} - projects, err := getProjects(cmdr) - if err != nil { - _, _ = fmt.Fprintf(cmd.ErrOrStderr(), err.Error()) - os.Exit(1) - } - if !apply { - printConfigFiles(projects, cmd.OutOrStdout()) - _, _ = fmt.Fprintf(cmd.ErrOrStderr(), "Run with --apply to directly generate tmuxp configs for various Kubernetes contexts\n") - return - } - err = generateKubeTmuxpFiles(cmdr, projects) - if err != nil { - _, _ = fmt.Fprintf(cmd.ErrOrStderr(), err.Error()) - os.Exit(1) - } - }, +type Generator struct { + projectIDs []string + allProjects bool + additionalEnvs []string + apply bool +} + +func NewGenerator(projectIDs []string, allProjects bool, additionalEnvs []string, apply bool) Generator { + return Generator{ + projectIDs: projectIDs, + allProjects: allProjects, + additionalEnvs: additionalEnvs, + apply: apply, + } } -func generateKubeTmuxpFiles(cmdr commander.Commander, projects kubetmuxp.Projects) error { +func (g Generator) Generate(outStream, errStream io.Writer) { + cmdr := &commander.Default{} + projects, err := g.getProjects(cmdr) + if err != nil { + _, _ = fmt.Fprintf(errStream, err.Error()) + os.Exit(1) + } + if !g.apply { + g.printConfigFiles(projects, outStream) + _, _ = fmt.Fprintf(errStream, "Run with --apply to directly generate tmuxp configs for various Kubernetes contexts\n") + return + } + err = g.generateKubeTmuxpFiles(cmdr, projects) + if err != nil { + _, _ = fmt.Fprintf(errStream, err.Error()) + os.Exit(1) + } +} + +func (g Generator) generateKubeTmuxpFiles(cmdr commander.Commander, projects kubetmuxp.Projects) error { fs := &filesystem.Default{} kubeCfg, err := kubeconfig.New(fs, cmdr) @@ -51,7 +60,7 @@ func generateKubeTmuxpFiles(cmdr commander.Commander, projects kubetmuxp.Project return config.Process() } -func printConfigFiles(projects kubetmuxp.Projects, outStream io.Writer) { +func (g Generator) printConfigFiles(projects kubetmuxp.Projects, outStream io.Writer) { bytes, err := yaml.Marshal(map[string]kubetmuxp.Projects{"projects": projects}) if err != nil { _, _ = fmt.Fprintln(outStream, err) @@ -60,17 +69,17 @@ func printConfigFiles(projects kubetmuxp.Projects, outStream io.Writer) { fmt.Println(string(bytes)) } -func getProjects(cmdr commander.Commander) (kubetmuxp.Projects, error) { - gCloudProjects := gcloud.Projects{} - if projectIDs != nil && len(projectIDs) > 0 { - for _, projectID := range projectIDs { - gCloudProjects = append(gCloudProjects, gcloud.Project{ProjectId: projectID}) +func (g Generator) getProjects(cmdr commander.Commander) (kubetmuxp.Projects, error) { + gCloudProjects := Projects{} + if g.projectIDs != nil && len(g.projectIDs) > 0 { + for _, projectID := range g.projectIDs { + gCloudProjects = append(gCloudProjects, Project{ProjectId: projectID}) } } else { - gCloudProjects = getGCloudProjects(cmdr, allProjects) + gCloudProjects = getGCloudProjects(cmdr, g.allProjects) } additionalEnvsMap := map[string]string{} - for _, env := range additionalEnvs { + for _, env := range g.additionalEnvs { envKeyValue := strings.Split(env, "=") if len(envKeyValue) != 2 { return nil, fmt.Errorf("wrong env format: should be key=value") @@ -79,7 +88,7 @@ func getProjects(cmdr commander.Commander) (kubetmuxp.Projects, error) { } projects := make(kubetmuxp.Projects, 0, len(gCloudProjects)) for _, gCloudProject := range gCloudProjects { - clusters, err := gcloud.ListClusters(cmdr, gCloudProject.ProjectId) + clusters, err := ListClusters(cmdr, gCloudProject.ProjectId) if err != nil { return nil, err } @@ -132,8 +141,8 @@ func mergeEnvs(base, additionalEnvsMap map[string]string) map[string]string { return base } -func getGCloudProjects(cmdr commander.Commander, allProjects bool) gcloud.Projects { - projects, err := gcloud.ListProjects(cmdr) +func getGCloudProjects(cmdr commander.Commander, allProjects bool) Projects { + projects, err := ListProjects(cmdr) if err != nil { _, _ = fmt.Fprintln(os.Stderr, err) os.Exit(1) @@ -151,7 +160,7 @@ func getGCloudProjects(cmdr commander.Commander, allProjects bool) gcloud.Projec return selectedProjects } -func getSelectedProjects(projects gcloud.Projects) (gcloud.Projects, error) { +func getSelectedProjects(projects Projects) (Projects, error) { var selectedProjectIDs []string prompt := &survey.MultiSelect{ Message: "Select gcloud projects that you want to configure:", @@ -177,14 +186,3 @@ func getSelectedProjects(projects gcloud.Projects) (gcloud.Projects, error) { } return projects.Filter(selectedProjectIDs), nil } - -var allProjects, apply bool -var additionalEnvs, projectIDs []string - -func init() { - gcloudGenerateCmd.Flags().BoolVar(&allProjects, "all-projects", false, "Skip confirmation for projects") - gcloudGenerateCmd.Flags().StringSliceVar(&projectIDs, "project-ids", nil, "Comma separated Project IDs to which the configurations need to be fetched") - gcloudGenerateCmd.Flags().BoolVar(&apply, "apply", false, "Directly create the tmuxp configs for selected projects") - gcloudGenerateCmd.Flags().StringSliceVar(&additionalEnvs, "additional-envs", nil, "Additional envs to be populated") - rootCmd.AddCommand(gcloudGenerateCmd) -} diff --git a/cmd/gcloud-generate_test.go b/pkg/gcloud/generator_test.go similarity index 98% rename from cmd/gcloud-generate_test.go rename to pkg/gcloud/generator_test.go index 0f7d004..4455179 100644 --- a/cmd/gcloud-generate_test.go +++ b/pkg/gcloud/generator_test.go @@ -1,4 +1,4 @@ -package cmd +package gcloud import ( "github.com/stretchr/testify/assert" @@ -56,3 +56,4 @@ func Test_mergeEnvs(t *testing.T) { }, result) }) } + diff --git a/pkg/generator/generator.go b/pkg/generator/generator.go new file mode 100644 index 0000000..362b647 --- /dev/null +++ b/pkg/generator/generator.go @@ -0,0 +1,58 @@ +package generator + +import ( + "fmt" + "github.com/thecasualcoder/kube-tmuxp/pkg/commander" + "github.com/thecasualcoder/kube-tmuxp/pkg/file" + "github.com/thecasualcoder/kube-tmuxp/pkg/filesystem" + "github.com/thecasualcoder/kube-tmuxp/pkg/gcloud" + "io" +) + +type Generator interface { + Generate(outStream, errStream io.Writer) +} + +type Options struct { + From string + AllProjects bool + ProjectIDs []string + AdditionalEnvs []string + Apply bool + CfgFile string +} + +func NewGenerator(options Options, fs filesystem.FileSystem, cmdr commander.Commander) (Generator, error) { + switch options.From { + case "file": + if err := areFlagsValidForSourceFile(options.AllProjects, options.ProjectIDs, options.AdditionalEnvs); err != nil { + return nil, fmt.Errorf("error in the flags for source type 'file': %s", err) + } + return file.NewGenerator(fs, cmdr, options.CfgFile), nil + case "gcloud": + return gcloud.NewGenerator(options.ProjectIDs, options.AllProjects, options.AdditionalEnvs, options.Apply), nil + default: + return nil, fmt.Errorf("invalid source provided: valid sources are file,gcloud") + } +} + +func areFlagsValidForSourceFile(allProjects bool, projectIDs, additionalEnvs []string) error { + err := "" + counter := 1 + if projectIDs != nil { + err += fmt.Sprintf("\n %d) %s", counter, "project-ids should be empty for source file") + counter++ + } + if allProjects { + err += fmt.Sprintf("\n %d) %s", counter, "all-projects should be false for source file") + counter++ + } + if additionalEnvs != nil { + err += fmt.Sprintf("\n %d) %s", counter, "additional-envs should be empty for source file") + } + + if err != "" { + return fmt.Errorf("%s\n", err) + } + return nil +} diff --git a/pkg/generator/generator_test.go b/pkg/generator/generator_test.go new file mode 100644 index 0000000..116a650 --- /dev/null +++ b/pkg/generator/generator_test.go @@ -0,0 +1,39 @@ +package generator + +import ( + "github.com/stretchr/testify/assert" + "github.com/thecasualcoder/kube-tmuxp/pkg/file" + "github.com/thecasualcoder/kube-tmuxp/pkg/gcloud" + "testing" +) + +func TestNewGenerator(t *testing.T) { + + t.Run("should fail if invalid from source is given", func(t *testing.T) { + generator, err := NewGenerator(Options{From: "invalid"}, nil, nil) + + assert.EqualError(t, err, "invalid source provided: valid sources are file,gcloud") + assert.Nil(t, generator) + }) + + t.Run("should create gcloud generator for gcloud option", func(t *testing.T) { + generator, err := NewGenerator(Options{From: "gcloud"}, nil, nil) + + assert.Nil(t, err) + assert.Equal(t, generator, gcloud.NewGenerator(nil, false, nil, false)) + }) + + t.Run("should create file generator if options are valid", func(t *testing.T) { + generator, err := NewGenerator(Options{From: "file"}, nil, nil) + + assert.Nil(t, err) + assert.Equal(t, generator, file.NewGenerator(nil, nil, "")) + }) + + t.Run("should fail if if options are invalid for file generator", func(t *testing.T) { + generator, err := NewGenerator(Options{From: "file", AllProjects: true, ProjectIDs: []string{"project1"}, AdditionalEnvs: []string{"a=1"}}, nil, nil) + + assert.Nil(t, generator) + assert.EqualError(t, err, "error in the flags for source type 'file': \n 1) project-ids should be empty for source file\n 2) all-projects should be false for source file\n 3) additional-envs should be empty for source file\n") + }) +} From b4121efb1f1d386e046f1c16556d2e6522f4509b Mon Sep 17 00:00:00 2001 From: Dinesh Date: Sat, 9 May 2020 22:49:10 +0530 Subject: [PATCH 47/48] Move config flag from root to generate command Signed-off-by: Dinesh --- cmd/generate.go | 14 ++++++++++++++ cmd/root.go | 18 +----------------- pkg/gcloud/generator_test.go | 1 - 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/cmd/generate.go b/cmd/generate.go index 622fc61..e2f21ae 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -2,8 +2,10 @@ package cmd import ( "fmt" + "github.com/mitchellh/go-homedir" "github.com/thecasualcoder/kube-tmuxp/pkg/generator" "os" + "path" "github.com/spf13/cobra" "github.com/thecasualcoder/kube-tmuxp/pkg/commander" @@ -35,11 +37,13 @@ var generateCmd = &cobra.Command{ }, } +var cfgFile string var from string var allProjects, apply bool var additionalEnvs, projectIDs []string func init() { + generateCmd.Flags().StringVar(&cfgFile, "config", getDefaultConfigPath(), "config file") generateCmd.Flags().StringVar(&from, "from", "file", "source from which the tmuxp config files are generated") generateCmd.Flags().BoolVar(&allProjects, "all-projects", false, "Skip confirmation for projects") generateCmd.Flags().StringSliceVar(&projectIDs, "project-ids", nil, "Comma separated Project IDs to which the configurations need to be fetched") @@ -47,3 +51,13 @@ func init() { generateCmd.Flags().StringSliceVar(&additionalEnvs, "additional-envs", nil, "Additional envs to be populated") rootCmd.AddCommand(generateCmd) } + +func getDefaultConfigPath() string { + home, err := homedir.Dir() + if err != nil { + fmt.Println(err) + os.Exit(1) + } + configFileName := ".kube-tmuxp.yaml" + return path.Join(home, configFileName) +} diff --git a/cmd/root.go b/cmd/root.go index 755a7b9..2684b5d 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -2,15 +2,10 @@ package cmd import ( "fmt" - "os" - "path" - - "github.com/mitchellh/go-homedir" "github.com/spf13/cobra" + "os" ) -var cfgFile string - var rootCmd = &cobra.Command{ Use: "kube-tmuxp", Short: `Tool to generate tmuxp configs that help to switch between multiple Kubernetes contexts safely`, @@ -24,14 +19,3 @@ func Execute() { os.Exit(1) } } - -func init() { - home, err := homedir.Dir() - if err != nil { - fmt.Println(err) - os.Exit(1) - } - configFileName := ".kube-tmuxp.yaml" - cfgFile = path.Join(home, configFileName) - rootCmd.PersistentFlags().StringVar(&cfgFile, "config", cfgFile, "config file") -} diff --git a/pkg/gcloud/generator_test.go b/pkg/gcloud/generator_test.go index 4455179..68a0be1 100644 --- a/pkg/gcloud/generator_test.go +++ b/pkg/gcloud/generator_test.go @@ -56,4 +56,3 @@ func Test_mergeEnvs(t *testing.T) { }, result) }) } - From f1f386a0ebc771018c2f22b8649c8151779cdceb Mon Sep 17 00:00:00 2001 From: Krishnaswamy Subramanian Date: Mon, 13 Sep 2021 09:32:18 +0530 Subject: [PATCH 48/48] Format README and source files --- README.md | 34 +++++++++++++++++++++++++++------ cmd/generate.go | 5 +++-- cmd/root.go | 3 ++- pkg/file/generator.go | 5 +++-- pkg/gcloud/client.go | 3 ++- pkg/gcloud/client_test.go | 3 ++- pkg/gcloud/generator.go | 7 ++++--- pkg/gcloud/generator_test.go | 3 ++- pkg/generator/generator.go | 3 ++- pkg/generator/generator_test.go | 3 ++- 10 files changed, 50 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 2438766..0c0268b 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,18 @@ [![Build Status](https://travis-ci.org/thecasualcoder/kube-tmuxp.svg?branch=master)](https://travis-ci.org/thecasualcoder/kube-tmuxp) -Tool to generate tmuxp configs that help to switch between multiple [Kubernetes](https://kubernetes.io/) contexts safely. +Tool to generate tmuxp configs that help to switch between multiple [Kubernetes](https://kubernetes.io/) contexts +safely. ## Introduction -When working with multiple Kubernetes clusters its painful to switch context using [`kubectl`](https://github.com/kubernetes/kubernetes/tree/master/cmd/kubectl) or [`kubectx`](https://github.com/ahmetb/kubectx). There are also possibilities of making unintentional changes. +When working with multiple Kubernetes clusters its painful to switch context +using [`kubectl`](https://github.com/kubernetes/kubernetes/tree/master/cmd/kubectl) +or [`kubectx`](https://github.com/ahmetb/kubectx). There are also possibilities of making unintentional changes. -`kube-tmuxp` solves this by using one preconfigured `tmux` session per Kubernetes cluster. Each `tmux` session contains only one Kubernetes context thus preventing accidental context switching inside a session. Contexts can be switched by switching `tmux` sessions. For example: `[tmux prefix] + S`. +`kube-tmuxp` solves this by using one preconfigured `tmux` session per Kubernetes cluster. Each `tmux` session contains +only one Kubernetes context thus preventing accidental context switching inside a session. Contexts can be switched by +switching `tmux` sessions. For example: `[tmux prefix] + S`. Given a config similar to [config.sample.yaml](./config.sample.yaml), `kube-tmuxp` generates: @@ -57,7 +62,8 @@ cp ./out/kube-tmuxp /usr/local/bin/kube-tmuxp kube-tmuxp gen ``` -Default config path is `$HOME/.kube-tmuxp.yaml`. If you are using a different path, then use the `--config` flag to specify that path. Refer `kube-tmuxp --help` for more details. +Default config path is `$HOME/.kube-tmuxp.yaml`. If you are using a different path, then use the `--config` flag to +specify that path. Refer `kube-tmuxp --help` for more details. ## Generate kube-tmuxp config file for gcloud @@ -78,30 +84,42 @@ Flags: ``` #### Examples: + 1) Interactively select projects: + ```bash $ kube-tmuxp gcloud-generate # this will prompt for the projectIDs selection. Type to filter and select using space # fuzzy search will work ``` + 2) Specify projectIDs: + ```bash $ kube-tmuxp gcloud-generate --projectIDs project1,project2 ``` + 3) For all projects: + ```bash $ kube-tmuxp gcloud-generate --allProjects ``` + 4) Use env variables in kube-tmuxp: + > kube-tmuxp provides four envs: `KUBETMUXP_CLUSTER_NAME`, `KUBETMUXP_CLUSTER_LOCATION`, `KUBETMUXP_CLUSTER_IS_REGIONAL`, `GCP_PROJECT_ID`. We can pass additional envs also. + ```bash $ kube-tmuxp gcloud-generate --additionalEnvs 'NEW_KEY=new_value,NEW_ENV=$HOME,KUBE_CONFIG=$HOME/.kube/configs/$KUBETMUXP_CLUSTER_NAME' # each tmux session will have 7 envs (4 predefined, 3 additionalEnvs passed as argument) ``` + 5) Directly create the kubeconfigs and tmuxp files (instead of kube-tmuxp config files): + ```bash $ kube-tmuxp gcloud-generate --apply ``` + ## Start a session ``` @@ -112,8 +130,12 @@ Now you will be inside a `tmux` session preconfigured with Kubernetes context `m ## Handy bash functions -Use the `bash` functions available [here](https://github.com/arunvelsriram/dotfiles/blob/master/bash_it_custom/plugins/kube-tmuxp.plugin.bash) to switch, kill sessions easily. Special thanks to [@jskswamy](https://github.com/jskswamy) for writing these awesome functions. +Use the `bash` functions +available [here](https://github.com/arunvelsriram/dotfiles/blob/master/bash_it_custom/plugins/kube-tmuxp.plugin.bash) to +switch, kill sessions easily. Special thanks to [@jskswamy](https://github.com/jskswamy) for writing these awesome +functions. ## Limitations -* Currently works for Google Kubernetes Engine (GKE) only. However, it can be extended to work with any Kubernetes clusters. Feel free to submit a PR for this. +* Currently works for Google Kubernetes Engine (GKE) only. However, it can be extended to work with any Kubernetes + clusters. Feel free to submit a PR for this. diff --git a/cmd/generate.go b/cmd/generate.go index e2f21ae..6a60b81 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -2,11 +2,12 @@ package cmd import ( "fmt" - "github.com/mitchellh/go-homedir" - "github.com/thecasualcoder/kube-tmuxp/pkg/generator" "os" "path" + "github.com/mitchellh/go-homedir" + "github.com/thecasualcoder/kube-tmuxp/pkg/generator" + "github.com/spf13/cobra" "github.com/thecasualcoder/kube-tmuxp/pkg/commander" "github.com/thecasualcoder/kube-tmuxp/pkg/filesystem" diff --git a/cmd/root.go b/cmd/root.go index 2684b5d..9df5879 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -2,8 +2,9 @@ package cmd import ( "fmt" - "github.com/spf13/cobra" "os" + + "github.com/spf13/cobra" ) var rootCmd = &cobra.Command{ diff --git a/pkg/file/generator.go b/pkg/file/generator.go index 9b59e0f..c256e2a 100644 --- a/pkg/file/generator.go +++ b/pkg/file/generator.go @@ -2,12 +2,13 @@ package file import ( "fmt" + "io" + "os" + "github.com/thecasualcoder/kube-tmuxp/pkg/commander" "github.com/thecasualcoder/kube-tmuxp/pkg/filesystem" "github.com/thecasualcoder/kube-tmuxp/pkg/kubeconfig" "github.com/thecasualcoder/kube-tmuxp/pkg/kubetmuxp" - "io" - "os" ) type Generator struct { diff --git a/pkg/gcloud/client.go b/pkg/gcloud/client.go index 2caac14..357849f 100644 --- a/pkg/gcloud/client.go +++ b/pkg/gcloud/client.go @@ -3,8 +3,9 @@ package gcloud import ( "encoding/json" "fmt" - "github.com/thecasualcoder/kube-tmuxp/pkg/commander" "strings" + + "github.com/thecasualcoder/kube-tmuxp/pkg/commander" ) // ListProjects lists the projects for logged-in user diff --git a/pkg/gcloud/client_test.go b/pkg/gcloud/client_test.go index 1e6a609..ea2d205 100644 --- a/pkg/gcloud/client_test.go +++ b/pkg/gcloud/client_test.go @@ -2,10 +2,11 @@ package gcloud import ( "fmt" + "testing" + "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" "github.com/thecasualcoder/kube-tmuxp/pkg/internal/mock" - "testing" ) func TestListProjects(t *testing.T) { diff --git a/pkg/gcloud/generator.go b/pkg/gcloud/generator.go index a0b3bdc..efab23b 100644 --- a/pkg/gcloud/generator.go +++ b/pkg/gcloud/generator.go @@ -2,6 +2,10 @@ package gcloud import ( "fmt" + "io" + "os" + "strings" + "github.com/lithammer/fuzzysearch/fuzzy" "github.com/thecasualcoder/kube-tmuxp/pkg/commander" "github.com/thecasualcoder/kube-tmuxp/pkg/filesystem" @@ -9,9 +13,6 @@ import ( "github.com/thecasualcoder/kube-tmuxp/pkg/kubetmuxp" "gopkg.in/AlecAivazis/survey.v1" "gopkg.in/yaml.v2" - "io" - "os" - "strings" ) type Generator struct { diff --git a/pkg/gcloud/generator_test.go b/pkg/gcloud/generator_test.go index 68a0be1..d443c9d 100644 --- a/pkg/gcloud/generator_test.go +++ b/pkg/gcloud/generator_test.go @@ -1,9 +1,10 @@ package gcloud import ( - "github.com/stretchr/testify/assert" "os" "testing" + + "github.com/stretchr/testify/assert" ) func Test_mergeEnvs(t *testing.T) { diff --git a/pkg/generator/generator.go b/pkg/generator/generator.go index 362b647..d21dc90 100644 --- a/pkg/generator/generator.go +++ b/pkg/generator/generator.go @@ -2,11 +2,12 @@ package generator import ( "fmt" + "io" + "github.com/thecasualcoder/kube-tmuxp/pkg/commander" "github.com/thecasualcoder/kube-tmuxp/pkg/file" "github.com/thecasualcoder/kube-tmuxp/pkg/filesystem" "github.com/thecasualcoder/kube-tmuxp/pkg/gcloud" - "io" ) type Generator interface { diff --git a/pkg/generator/generator_test.go b/pkg/generator/generator_test.go index 116a650..b5691f0 100644 --- a/pkg/generator/generator_test.go +++ b/pkg/generator/generator_test.go @@ -1,10 +1,11 @@ package generator import ( + "testing" + "github.com/stretchr/testify/assert" "github.com/thecasualcoder/kube-tmuxp/pkg/file" "github.com/thecasualcoder/kube-tmuxp/pkg/gcloud" - "testing" ) func TestNewGenerator(t *testing.T) {