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  }