Skip to content

Commit 85c672d

Browse files
committed
Implement adding regional clusters
1 parent d8c0060 commit 85c672d

File tree

7 files changed

+123
-15
lines changed

7 files changed

+123
-15
lines changed

cmd/generate.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"os"
77

8+
"github.com/arunvelsriram/kube-tmuxp/pkg/commander"
89
"github.com/arunvelsriram/kube-tmuxp/pkg/filesystem"
910
"github.com/arunvelsriram/kube-tmuxp/pkg/kubeconfig"
1011
"github.com/arunvelsriram/kube-tmuxp/pkg/kubetmuxp"
@@ -23,7 +24,7 @@ var generateCmd = &cobra.Command{
2324
}
2425
bufioReader := bufio.NewReader(reader)
2526

26-
kubeCfg, err := kubeconfig.New(filesystem.Default{})
27+
kubeCfg, err := kubeconfig.New(filesystem.Default{}, commander.Default{})
2728
if err != nil {
2829
fmt.Println(err)
2930
os.Exit(1)

pkg/commander/commander.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77

88
// Commander is an interface to execute commands
99
type Commander interface {
10-
Execute(cmd string, args []string) ([]string, error)
10+
Execute(cmdStr string, args []string, envs []string) (string, error)
1111
}
1212

1313
// Default is a Commander implementation that

pkg/internal/mock/commander.go

+5-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/kubeconfig/kubeconfig.go

+40-2
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
11
package kubeconfig
22

33
import (
4+
"fmt"
45
"os"
56
"path"
67

8+
"github.com/arunvelsriram/kube-tmuxp/pkg/commander"
79
"github.com/arunvelsriram/kube-tmuxp/pkg/filesystem"
810
)
911

1012
// KubeConfig exposes methods to perform actions on kubeconfig
1113
type KubeConfig struct {
1214
filesystem filesystem.FileSystem
15+
commander commander.Commander
1316
dir string
1417
}
1518

1619
// Delete deletes the kubeconfig file for the given context
17-
func (k *KubeConfig) Delete(context string) error {
20+
func (k KubeConfig) Delete(context string) error {
1821
file := path.Join(k.dir, context)
1922

2023
if err := k.filesystem.Remove(file); err != nil && !os.IsNotExist(err) {
@@ -24,8 +27,42 @@ func (k *KubeConfig) Delete(context string) error {
2427
return nil
2528
}
2629

30+
// AddRegionalCluster imports Kubernetes context for
31+
// regional Kubernetes cluster
32+
func (k KubeConfig) AddRegionalCluster(project string, cluster string, region string, context string) error {
33+
kubeconfig := path.Join(k.dir, context)
34+
envs := []string{
35+
"CLOUDSDK_CONTAINER_USE_V1_API_CLIENT=false",
36+
"CLOUDSDK_CONTAINER_USE_V1_API=false",
37+
fmt.Sprintf("KUBECONFIG=%s", kubeconfig),
38+
}
39+
args := []string{
40+
"beta",
41+
"container",
42+
"clusters",
43+
"get-credentials",
44+
cluster,
45+
fmt.Sprintf("--region=%s", region),
46+
fmt.Sprintf("--project=%s", project),
47+
}
48+
out, err := k.commander.Execute("gcloud", args, envs)
49+
if err != nil {
50+
return err
51+
}
52+
53+
fmt.Println(out)
54+
55+
return nil
56+
}
57+
58+
// AddZonalCluster imports Kubernetes context for
59+
// zonal Kubernetes cluster
60+
func AddZonalCluster(project string, cluster string, zone string, context string) error {
61+
return nil
62+
}
63+
2764
// New returns a new KubeConfig
28-
func New(fs filesystem.FileSystem) (KubeConfig, error) {
65+
func New(fs filesystem.FileSystem, cmdr commander.Commander) (KubeConfig, error) {
2966
home, err := fs.HomeDir()
3067
if err != nil {
3168
return KubeConfig{}, err
@@ -34,6 +71,7 @@ func New(fs filesystem.FileSystem) (KubeConfig, error) {
3471

3572
return KubeConfig{
3673
filesystem: fs,
74+
commander: cmdr,
3775
dir: kubeConfigsDir,
3876
}, nil
3977
}

pkg/kubeconfig/kubeconfig_test.go

+72-5
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@ func TestNew(t *testing.T) {
1616
ctrl := gomock.NewController(t)
1717
defer ctrl.Finish()
1818

19+
mockCmdr := mock.NewCommander(ctrl)
1920
mockFS := mock.NewFileSystem(ctrl)
2021
mockFS.EXPECT().HomeDir().Return("/Users/test", nil)
2122

22-
kubeCfg, err := kubeconfig.New(mockFS)
23+
kubeCfg, err := kubeconfig.New(mockFS, mockCmdr)
2324

2425
assert.Nil(t, err)
2526
assert.NotNil(t, kubeCfg)
@@ -29,9 +30,10 @@ func TestNew(t *testing.T) {
2930
ctrl := gomock.NewController(t)
3031
defer ctrl.Finish()
3132

33+
mockCmdr := mock.NewCommander(ctrl)
3234
mockFS := mock.NewFileSystem(ctrl)
3335
mockFS.EXPECT().HomeDir().Return("", fmt.Errorf("some error"))
34-
_, err := kubeconfig.New(mockFS)
36+
_, err := kubeconfig.New(mockFS, mockCmdr)
3537

3638
assert.EqualError(t, err, "some error")
3739
})
@@ -42,11 +44,12 @@ func TestDelete(t *testing.T) {
4244
ctrl := gomock.NewController(t)
4345
defer ctrl.Finish()
4446

47+
mockCmdr := mock.NewCommander(ctrl)
4548
mockFS := mock.NewFileSystem(ctrl)
4649
mockFS.EXPECT().HomeDir().Return("/Users/test", nil)
4750
mockFS.EXPECT().Remove("/Users/test/.kube/configs/context-name").Return(nil)
4851

49-
kubeCfg, _ := kubeconfig.New(mockFS)
52+
kubeCfg, _ := kubeconfig.New(mockFS, mockCmdr)
5053
err := kubeCfg.Delete("context-name")
5154

5255
assert.Nil(t, err)
@@ -56,11 +59,12 @@ func TestDelete(t *testing.T) {
5659
ctrl := gomock.NewController(t)
5760
defer ctrl.Finish()
5861

62+
mockCmdr := mock.NewCommander(ctrl)
5963
mockFS := mock.NewFileSystem(ctrl)
6064
mockFS.EXPECT().HomeDir().Return("/Users/test", nil)
6165
mockFS.EXPECT().Remove("/Users/test/.kube/configs/context-name").Return(&os.PathError{Op: "remove", Path: "/Users/test/.kube/configs/context-name", Err: os.ErrNotExist})
6266

63-
kubeCfg, _ := kubeconfig.New(mockFS)
67+
kubeCfg, _ := kubeconfig.New(mockFS, mockCmdr)
6468
err := kubeCfg.Delete("context-name")
6569

6670
assert.Nil(t, err)
@@ -70,13 +74,76 @@ func TestDelete(t *testing.T) {
7074
ctrl := gomock.NewController(t)
7175
defer ctrl.Finish()
7276

77+
mockCmdr := mock.NewCommander(ctrl)
7378
mockFS := mock.NewFileSystem(ctrl)
7479
mockFS.EXPECT().HomeDir().Return("/Users/test", nil)
7580
mockFS.EXPECT().Remove("/Users/test/.kube/configs/context-name").Return(fmt.Errorf("some error"))
7681

77-
kubeCfg, _ := kubeconfig.New(mockFS)
82+
kubeCfg, _ := kubeconfig.New(mockFS, mockCmdr)
7883
err := kubeCfg.Delete("context-name")
7984

8085
assert.EqualError(t, err, "some error")
8186
})
8287
}
88+
89+
func TestAddRegionalCluster(t *testing.T) {
90+
t.Run("should invoke command for adding regional cluster", func(*testing.T) {
91+
ctrl := gomock.NewController(t)
92+
defer ctrl.Finish()
93+
94+
mockFS := mock.NewFileSystem(ctrl)
95+
mockFS.EXPECT().HomeDir().Return("/Users/test", nil)
96+
97+
mockCmdr := mock.NewCommander(ctrl)
98+
args := []string{
99+
"beta",
100+
"container",
101+
"clusters",
102+
"get-credentials",
103+
"test-cluster",
104+
"--region=test-region",
105+
"--project=test-project",
106+
}
107+
envs := []string{
108+
"CLOUDSDK_CONTAINER_USE_V1_API_CLIENT=false",
109+
"CLOUDSDK_CONTAINER_USE_V1_API=false",
110+
"KUBECONFIG=/Users/test/.kube/configs/test-context",
111+
}
112+
mockCmdr.EXPECT().Execute("gcloud", args, envs).Return("Context added successfully", nil)
113+
114+
kubeCfg, _ := kubeconfig.New(mockFS, mockCmdr)
115+
err := kubeCfg.AddRegionalCluster("test-project", "test-cluster", "test-region", "test-context")
116+
117+
assert.Nil(t, err)
118+
})
119+
120+
t.Run("should return error if command failed to execute", func(*testing.T) {
121+
ctrl := gomock.NewController(t)
122+
defer ctrl.Finish()
123+
124+
mockFS := mock.NewFileSystem(ctrl)
125+
mockFS.EXPECT().HomeDir().Return("/Users/test", nil)
126+
127+
mockCmdr := mock.NewCommander(ctrl)
128+
args := []string{
129+
"beta",
130+
"container",
131+
"clusters",
132+
"get-credentials",
133+
"test-cluster",
134+
"--region=test-region",
135+
"--project=test-project",
136+
}
137+
envs := []string{
138+
"CLOUDSDK_CONTAINER_USE_V1_API_CLIENT=false",
139+
"CLOUDSDK_CONTAINER_USE_V1_API=false",
140+
"KUBECONFIG=/Users/test/.kube/configs/test-context",
141+
}
142+
mockCmdr.EXPECT().Execute("gcloud", args, envs).Return("", fmt.Errorf("some error"))
143+
144+
kubeCfg, _ := kubeconfig.New(mockFS, mockCmdr)
145+
err := kubeCfg.AddRegionalCluster("test-project", "test-cluster", "test-region", "test-context")
146+
147+
assert.EqualError(t, err, "some error")
148+
})
149+
}

pkg/kubetmuxp/kubetmuxp_test.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@ import (
1313
)
1414

1515
func getKubeCfg(ctrl *gomock.Controller) kubeconfig.KubeConfig {
16+
mockCmdr := mock.NewCommander(ctrl)
1617
mockFS := mock.NewFileSystem(ctrl)
1718
mockFS.EXPECT().HomeDir().Return("/Users/test", nil)
18-
kubeCfg, _ := kubeconfig.New(mockFS)
19+
kubeCfg, _ := kubeconfig.New(mockFS, mockCmdr)
1920
return kubeCfg
2021
}
2122

scripts/mocks

+1
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
set -e
44

55
mockgen -source=pkg/filesystem/filesystem.go -destination=pkg/internal/mock/filesystem.go -package=mock -mock_names=FileSystem=FileSystem
6+
mockgen -source=pkg/commander/commander.go -destination=pkg/internal/mock/commander.go -package=mock -mock_names=Commander=Commander

0 commit comments

Comments
 (0)