github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/cloud/updatecredential_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package cloud_test
     5  
     6  import (
     7  	"io/ioutil"
     8  	"os"
     9  	"strings"
    10  
    11  	jujucmd "github.com/juju/cmd"
    12  	"github.com/juju/cmd/cmdtesting"
    13  	"github.com/juju/errors"
    14  	jc "github.com/juju/testing/checkers"
    15  	gc "gopkg.in/check.v1"
    16  	"gopkg.in/juju/names.v2"
    17  
    18  	"github.com/juju/juju/apiserver/common"
    19  	"github.com/juju/juju/apiserver/params"
    20  	jujucloud "github.com/juju/juju/cloud"
    21  	"github.com/juju/juju/cmd/juju/cloud"
    22  	"github.com/juju/juju/jujuclient"
    23  	"github.com/juju/juju/testing"
    24  )
    25  
    26  type updateCredentialSuite struct {
    27  	testing.BaseSuite
    28  }
    29  
    30  var _ = gc.Suite(&updateCredentialSuite{})
    31  
    32  func (s *updateCredentialSuite) TestBadArgs(c *gc.C) {
    33  	store := &jujuclient.MemStore{
    34  		Controllers: map[string]jujuclient.ControllerDetails{
    35  			"controller": {},
    36  		},
    37  		CurrentControllerName: "controller",
    38  	}
    39  	cmd := cloud.NewUpdateCredentialCommandForTest(store, nil)
    40  	_, err := cmdtesting.RunCommand(c, cmd)
    41  	c.Assert(err, gc.ErrorMatches, "Usage: juju update-credential <cloud-name> <credential-name>")
    42  	_, err = cmdtesting.RunCommand(c, cmd, "cloud", "credential", "extra")
    43  	c.Assert(err, gc.ErrorMatches, `unrecognized args: \["extra"\]`)
    44  }
    45  
    46  func (s *updateCredentialSuite) TestMissingCredential(c *gc.C) {
    47  	store := &jujuclient.MemStore{
    48  		Controllers: map[string]jujuclient.ControllerDetails{
    49  			"controller": {},
    50  		},
    51  		CurrentControllerName: "controller",
    52  		Credentials: map[string]jujucloud.CloudCredential{
    53  			"aws": {
    54  				AuthCredentials: map[string]jujucloud.Credential{
    55  					"my-credential": jujucloud.NewCredential(jujucloud.AccessKeyAuthType, nil),
    56  				},
    57  			},
    58  		},
    59  	}
    60  	cmd := cloud.NewUpdateCredentialCommandForTest(store, nil)
    61  	ctx, err := cmdtesting.RunCommand(c, cmd, "aws", "foo")
    62  	c.Assert(err, jc.ErrorIsNil)
    63  	output := cmdtesting.Stderr(ctx)
    64  	output = strings.Replace(output, "\n", "", -1)
    65  	c.Assert(output, gc.Equals, `No credential called "foo" exists for cloud "aws"`)
    66  }
    67  
    68  func (s *updateCredentialSuite) TestBadCloudName(c *gc.C) {
    69  	store := &jujuclient.MemStore{
    70  		Controllers: map[string]jujuclient.ControllerDetails{
    71  			"controller": {},
    72  		},
    73  		CurrentControllerName: "controller",
    74  	}
    75  	cmd := cloud.NewUpdateCredentialCommandForTest(store, nil)
    76  	ctx, err := cmdtesting.RunCommand(c, cmd, "somecloud", "foo")
    77  	c.Assert(err, jc.ErrorIsNil)
    78  	output := cmdtesting.Stderr(ctx)
    79  	output = strings.Replace(output, "\n", "", -1)
    80  	c.Assert(output, gc.Equals, `Cloud "somecloud" not found`)
    81  }
    82  
    83  func (s *updateCredentialSuite) TestUpdate(c *gc.C) {
    84  	fake := &fakeUpdateCredentialAPI{
    85  		updateCredentialsCheckModelsF: func(tag names.CloudCredentialTag, credential jujucloud.Credential) ([]params.UpdateCredentialModelResult, error) {
    86  			c.Assert(tag, gc.DeepEquals, names.NewCloudCredentialTag("aws/admin@local/my-credential"))
    87  			c.Assert(credential, jc.DeepEquals, jujucloud.NewCredential(jujucloud.AccessKeyAuthType, map[string]string{"access-key": "key", "secret-key": "secret"}))
    88  			return nil, nil
    89  		},
    90  	}
    91  
    92  	cmd := cloud.NewUpdateCredentialCommandForTest(s.store(c), fake)
    93  	ctx, err := cmdtesting.RunCommand(c, cmd, "aws", "my-credential")
    94  	c.Assert(err, jc.ErrorIsNil)
    95  	c.Assert(cmdtesting.Stderr(ctx), gc.Equals, `
    96  Controller credential "my-credential" for user "admin@local" on cloud "aws" updated.
    97  For more information, see ‘juju show-credential aws my-credential’.
    98  `[1:])
    99  }
   100  
   101  func (s *updateCredentialSuite) TestUpdateCredentialWithFilePath(c *gc.C) {
   102  	tmpFile, err := ioutil.TempFile("", "juju-bootstrap-test")
   103  	c.Assert(err, jc.ErrorIsNil)
   104  	defer func() {
   105  		tmpFile.Close()
   106  		err := os.Remove(tmpFile.Name())
   107  		c.Assert(err, jc.ErrorIsNil)
   108  	}()
   109  
   110  	store := &jujuclient.MemStore{
   111  		Controllers: map[string]jujuclient.ControllerDetails{
   112  			"controller": {},
   113  		},
   114  		CurrentControllerName: "controller",
   115  		Accounts: map[string]jujuclient.AccountDetails{
   116  			"controller": {
   117  				User: "admin@local",
   118  			},
   119  		},
   120  		Credentials: map[string]jujucloud.CloudCredential{
   121  			"google": {
   122  				AuthCredentials: map[string]jujucloud.Credential{
   123  					"gce": jujucloud.NewCredential(
   124  						jujucloud.JSONFileAuthType,
   125  						map[string]string{"file": tmpFile.Name()},
   126  					),
   127  				},
   128  			},
   129  		},
   130  	}
   131  
   132  	contents := []byte("{something: special}\n")
   133  	err = ioutil.WriteFile(tmpFile.Name(), contents, 0644)
   134  	c.Assert(err, jc.ErrorIsNil)
   135  
   136  	fake := &fakeUpdateCredentialAPI{
   137  		updateCredentialsCheckModelsF: func(tag names.CloudCredentialTag, credential jujucloud.Credential) ([]params.UpdateCredentialModelResult, error) {
   138  			c.Assert(tag, gc.DeepEquals, names.NewCloudCredentialTag("google/admin@local/gce"))
   139  			c.Assert(credential.Attributes()["file"], gc.Equals, string(contents))
   140  			return nil, nil
   141  		},
   142  	}
   143  	cmd := cloud.NewUpdateCredentialCommandForTest(store, fake)
   144  	_, err = cmdtesting.RunCommand(c, cmd, "google", "gce")
   145  	c.Assert(err, jc.ErrorIsNil)
   146  }
   147  
   148  func (s *updateCredentialSuite) store(c *gc.C) jujuclient.ClientStore {
   149  	authCreds := map[string]string{"access-key": "key", "secret-key": "secret"}
   150  	return &jujuclient.MemStore{
   151  		Controllers: map[string]jujuclient.ControllerDetails{
   152  			"controller": {},
   153  		},
   154  		CurrentControllerName: "controller",
   155  		Accounts: map[string]jujuclient.AccountDetails{
   156  			"controller": {
   157  				User: "admin@local",
   158  			},
   159  		},
   160  		Credentials: map[string]jujucloud.CloudCredential{
   161  			"aws": {
   162  				AuthCredentials: map[string]jujucloud.Credential{
   163  					"my-credential": jujucloud.NewCredential(jujucloud.AccessKeyAuthType, authCreds),
   164  				},
   165  			},
   166  		},
   167  	}
   168  }
   169  
   170  func (s *updateCredentialSuite) TestUpdateResultError(c *gc.C) {
   171  	fake := &fakeUpdateCredentialAPI{
   172  		updateCredentialsCheckModelsF: func(tag names.CloudCredentialTag, credential jujucloud.Credential) ([]params.UpdateCredentialModelResult, error) {
   173  			return nil, errors.New("kaboom")
   174  		},
   175  	}
   176  	cmd := cloud.NewUpdateCredentialCommandForTest(s.store(c), fake)
   177  	ctx, err := cmdtesting.RunCommand(c, cmd, "aws", "my-credential")
   178  	c.Assert(err, gc.NotNil)
   179  	c.Assert(cmdtesting.Stderr(ctx), gc.Equals, "Controller credential \"my-credential\" for user \"admin@local\" on cloud \"aws\" not updated: kaboom.\n")
   180  	c.Assert(cmdtesting.Stdout(ctx), gc.Equals, "")
   181  }
   182  func (s *updateCredentialSuite) TestUpdateWithModels(c *gc.C) {
   183  	fake := &fakeUpdateCredentialAPI{
   184  		updateCredentialsCheckModelsF: func(tag names.CloudCredentialTag, credential jujucloud.Credential) ([]params.UpdateCredentialModelResult, error) {
   185  			return []params.UpdateCredentialModelResult{
   186  				{
   187  					ModelName: "model-a",
   188  					Errors: []params.ErrorResult{
   189  						{common.ServerError(errors.New("kaboom"))},
   190  						{common.ServerError(errors.New("kaboom 2"))},
   191  					},
   192  				},
   193  				{
   194  					ModelName: "model-b",
   195  					Errors: []params.ErrorResult{
   196  						{common.ServerError(errors.New("one failure"))},
   197  					},
   198  				},
   199  				{
   200  					ModelName: "model-c",
   201  				},
   202  			}, errors.New("models issues")
   203  		},
   204  	}
   205  	cmd := cloud.NewUpdateCredentialCommandForTest(s.store(c), fake)
   206  	ctx, err := cmdtesting.RunCommand(c, cmd, "aws", "my-credential")
   207  	c.Assert(err, gc.DeepEquals, jujucmd.ErrSilent)
   208  	c.Assert(cmdtesting.Stderr(ctx), gc.Equals, `
   209  Credential valid for:
   210    model-c
   211  Credential invalid for:
   212    model-a:
   213      kaboom
   214      kaboom 2
   215    model-b:
   216      one failure
   217  Controller credential "my-credential" for user "admin@local" on cloud "aws" not updated: models issues.
   218  `[1:])
   219  	c.Assert(cmdtesting.Stdout(ctx), gc.Equals, "")
   220  }
   221  
   222  type fakeUpdateCredentialAPI struct {
   223  	updateCredentialsCheckModelsF func(tag names.CloudCredentialTag, credential jujucloud.Credential) ([]params.UpdateCredentialModelResult, error)
   224  }
   225  
   226  func (f *fakeUpdateCredentialAPI) UpdateCredentialsCheckModels(tag names.CloudCredentialTag, credential jujucloud.Credential) ([]params.UpdateCredentialModelResult, error) {
   227  	return f.updateCredentialsCheckModelsF(tag, credential)
   228  }
   229  
   230  func (*fakeUpdateCredentialAPI) Close() error {
   231  	return nil
   232  }