github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/caas/gke_test.go (about) 1 // Copyright 2019 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package caas 5 6 import ( 7 "bytes" 8 "io/ioutil" 9 "os" 10 "path/filepath" 11 "strings" 12 13 "github.com/golang/mock/gomock" 14 "github.com/juju/cmd" 15 "github.com/juju/cmd/cmdtesting" 16 "github.com/juju/testing" 17 jc "github.com/juju/testing/checkers" 18 "github.com/juju/utils/exec" 19 gc "gopkg.in/check.v1" 20 21 "github.com/juju/juju/cmd/juju/caas/mocks" 22 ) 23 24 type gkeSuite struct { 25 testing.IsolationSuite 26 } 27 28 var _ = gc.Suite(&gkeSuite{}) 29 30 func (s *gkeSuite) SetUpTest(c *gc.C) { 31 s.IsolationSuite.SetUpTest(c) 32 err := os.Setenv("PATH", "/path/to/here") 33 c.Assert(err, jc.ErrorIsNil) 34 } 35 36 func (s *gkeSuite) TestInteractiveParams(c *gc.C) { 37 ctrl := gomock.NewController(c) 38 defer ctrl.Finish() 39 40 mockRunner := mocks.NewMockCommandRunner(ctrl) 41 gke := &gke{CommandRunner: mockRunner} 42 43 gomock.InOrder( 44 mockRunner.EXPECT().RunCommands(exec.RunParams{ 45 Commands: "gcloud auth list --format value\\(account,status\\)", 46 Environment: []string{"KUBECONFIG=", "PATH=/path/to/here"}, 47 }).Times(1). 48 Return(&exec.ExecResponse{ 49 Code: 0, 50 Stdout: []byte("mysecret\ndefaultSecret *"), 51 }, nil), 52 mockRunner.EXPECT().RunCommands(exec.RunParams{ 53 Commands: "gcloud projects list --account mysecret --filter lifecycleState:ACTIVE --format value\\(projectId\\)", 54 Environment: []string{"KUBECONFIG=", "PATH=/path/to/here"}, 55 }).Times(1). 56 Return(&exec.ExecResponse{ 57 Code: 0, 58 Stdout: []byte("myproject"), 59 }, nil), 60 mockRunner.EXPECT().RunCommands(exec.RunParams{ 61 Commands: "gcloud container clusters list --filter status:RUNNING --account mysecret --project myproject --format value\\(name,zone\\)", 62 Environment: []string{"KUBECONFIG=", "PATH=/path/to/here"}, 63 }).Times(1). 64 Return(&exec.ExecResponse{ 65 Code: 0, 66 Stdout: []byte("mycluster somezone"), 67 }, nil), 68 ) 69 70 stdin := strings.NewReader("mysecret\nmyproject\nmycluster in somezone\n") 71 out := &bytes.Buffer{} 72 ctx := &cmd.Context{ 73 Dir: c.MkDir(), 74 Stdout: out, 75 Stderr: ioutil.Discard, 76 Stdin: stdin, 77 } 78 expected := ` 79 Available Accounts 80 mysecret 81 defaultSecret 82 83 Select account [defaultSecret]: 84 Available Projects 85 myproject 86 87 Select project [myproject]: 88 Available Clusters 89 mycluster in somezone 90 91 Select cluster [mycluster in somezone]: 92 `[1:] 93 94 outParams, err := gke.interactiveParams(ctx, &clusterParams{}) 95 c.Check(err, jc.ErrorIsNil) 96 c.Check(cmdtesting.Stdout(ctx), gc.Equals, expected) 97 c.Assert(outParams, jc.DeepEquals, &clusterParams{ 98 project: "myproject", 99 name: "mycluster", 100 region: "somezone", 101 credential: "mysecret", 102 }) 103 } 104 105 func (s *gkeSuite) TestInteractiveParamsProjectSpecified(c *gc.C) { 106 ctrl := gomock.NewController(c) 107 defer ctrl.Finish() 108 109 mockRunner := mocks.NewMockCommandRunner(ctrl) 110 gke := &gke{CommandRunner: mockRunner} 111 112 gomock.InOrder( 113 mockRunner.EXPECT().RunCommands(exec.RunParams{ 114 Commands: "gcloud container clusters list --filter status:RUNNING --account mysecret --project myproject --format value\\(name,zone\\)", 115 Environment: []string{"KUBECONFIG=", "PATH=/path/to/here"}, 116 }).Times(1). 117 Return(&exec.ExecResponse{ 118 Code: 0, 119 Stdout: []byte("mycluster somezone"), 120 }, nil), 121 ) 122 123 stdin := strings.NewReader("mycluster in somezone\n") 124 out := &bytes.Buffer{} 125 ctx := &cmd.Context{ 126 Dir: c.MkDir(), 127 Stdout: out, 128 Stderr: ioutil.Discard, 129 Stdin: stdin, 130 } 131 expected := ` 132 Available Clusters 133 mycluster in somezone 134 135 Select cluster [mycluster in somezone]: 136 `[1:] 137 138 outParams, err := gke.interactiveParams(ctx, &clusterParams{ 139 project: "myproject", 140 credential: "mysecret", 141 }) 142 c.Check(err, jc.ErrorIsNil) 143 c.Check(cmdtesting.Stdout(ctx), gc.Equals, expected) 144 c.Assert(outParams, jc.DeepEquals, &clusterParams{ 145 project: "myproject", 146 name: "mycluster", 147 region: "somezone", 148 credential: "mysecret", 149 }) 150 } 151 152 func (s *gkeSuite) TestInteractiveParamsProjectAndRegionSpecified(c *gc.C) { 153 ctrl := gomock.NewController(c) 154 defer ctrl.Finish() 155 156 mockRunner := mocks.NewMockCommandRunner(ctrl) 157 gke := &gke{CommandRunner: mockRunner} 158 159 gomock.InOrder( 160 mockRunner.EXPECT().RunCommands(exec.RunParams{ 161 Commands: "gcloud container clusters list --filter status:RUNNING --account mysecret --project myproject --format value\\(name,zone\\) --region somezone", 162 Environment: []string{"KUBECONFIG=", "PATH=/path/to/here"}, 163 }).Times(1). 164 Return(&exec.ExecResponse{ 165 Code: 0, 166 Stdout: []byte("mycluster somezone"), 167 }, nil), 168 ) 169 170 stdin := strings.NewReader("mycluster in somezone\n") 171 out := &bytes.Buffer{} 172 ctx := &cmd.Context{ 173 Dir: c.MkDir(), 174 Stdout: out, 175 Stderr: ioutil.Discard, 176 Stdin: stdin, 177 } 178 expected := ` 179 Available Clusters 180 mycluster in somezone 181 182 Select cluster [mycluster in somezone]: 183 `[1:] 184 185 outParams, err := gke.interactiveParams(ctx, &clusterParams{ 186 project: "myproject", 187 region: "somezone", 188 credential: "mysecret", 189 }) 190 c.Check(err, jc.ErrorIsNil) 191 c.Check(cmdtesting.Stdout(ctx), gc.Equals, expected) 192 c.Assert(outParams, jc.DeepEquals, &clusterParams{ 193 project: "myproject", 194 name: "mycluster", 195 region: "somezone", 196 credential: "mysecret", 197 }) 198 } 199 200 func (s *gkeSuite) TestGetKubeConfig(c *gc.C) { 201 ctrl := gomock.NewController(c) 202 defer ctrl.Finish() 203 204 mockRunner := mocks.NewMockCommandRunner(ctrl) 205 configFile := filepath.Join(c.MkDir(), "config") 206 err := os.Setenv("KUBECONFIG", configFile) 207 c.Assert(err, jc.ErrorIsNil) 208 gke := &gke{CommandRunner: mockRunner} 209 err = ioutil.WriteFile(configFile, []byte("data"), 0644) 210 c.Assert(err, jc.ErrorIsNil) 211 212 gomock.InOrder( 213 mockRunner.EXPECT().RunCommands(exec.RunParams{ 214 Commands: "gcloud container clusters get-credentials mycluster --account mysecret --project myproject --region somezone", 215 Environment: []string{"KUBECONFIG=" + configFile, "PATH=/path/to/here"}, 216 }).Times(1). 217 Return(&exec.ExecResponse{ 218 Code: 0, 219 }, nil), 220 ) 221 rdr, clusterName, err := gke.getKubeConfig(&clusterParams{ 222 project: "myproject", 223 region: "somezone", 224 name: "mycluster", 225 credential: "mysecret", 226 }) 227 c.Check(err, jc.ErrorIsNil) 228 defer rdr.Close() 229 230 c.Assert(clusterName, gc.Equals, "gke_myproject_somezone_mycluster") 231 data, err := ioutil.ReadAll(rdr) 232 c.Assert(err, jc.ErrorIsNil) 233 c.Assert(string(data), gc.DeepEquals, "data") 234 }