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 }