github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/modelcmd/base_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package modelcmd_test 5 6 import ( 7 "io/ioutil" 8 "strings" 9 10 "github.com/juju/cmd" 11 "github.com/juju/cmd/cmdtesting" 12 "github.com/juju/errors" 13 "github.com/juju/testing" 14 jc "github.com/juju/testing/checkers" 15 gc "gopkg.in/check.v1" 16 17 "github.com/juju/juju/api" 18 "github.com/juju/juju/apiserver/params" 19 "github.com/juju/juju/cloud" 20 "github.com/juju/juju/cmd/modelcmd" 21 "github.com/juju/juju/core/model" 22 "github.com/juju/juju/environs" 23 "github.com/juju/juju/jujuclient" 24 coretesting "github.com/juju/juju/testing" 25 ) 26 27 type BaseCommandSuite struct { 28 testing.IsolationSuite 29 store *jujuclient.MemStore 30 } 31 32 var _ = gc.Suite(&BaseCommandSuite{}) 33 34 func (s *BaseCommandSuite) SetUpTest(c *gc.C) { 35 s.IsolationSuite.SetUpTest(c) 36 37 s.store = jujuclient.NewMemStore() 38 s.store.CurrentControllerName = "foo" 39 s.store.Controllers["foo"] = jujuclient.ControllerDetails{ 40 APIEndpoints: []string{"testing.invalid:1234"}, 41 } 42 s.store.Models["foo"] = &jujuclient.ControllerModels{ 43 Models: map[string]jujuclient.ModelDetails{ 44 "admin/badmodel": {ModelUUID: "deadbeef", ModelType: model.IAAS}, 45 "admin/goodmodel": {ModelUUID: "deadbeef2", ModelType: model.IAAS}, 46 }, 47 CurrentModel: "admin/badmodel", 48 } 49 s.store.Accounts["foo"] = jujuclient.AccountDetails{ 50 User: "bar", Password: "hunter2", 51 } 52 } 53 54 func (s *BaseCommandSuite) assertUnknownModel(c *gc.C, baseCmd *modelcmd.ModelCommandBase, current, expectedCurrent string) { 55 s.store.Models["foo"].CurrentModel = current 56 apiOpen := func(*api.Info, api.DialOpts) (api.Connection, error) { 57 return nil, errors.Trace(¶ms.Error{Code: params.CodeModelNotFound, Message: "model deaddeaf not found"}) 58 } 59 baseCmd.SetClientStore(s.store) 60 baseCmd.SetAPIOpen(apiOpen) 61 modelcmd.InitContexts(&cmd.Context{Stderr: ioutil.Discard}, baseCmd) 62 modelcmd.SetRunStarted(baseCmd) 63 baseCmd.SetModelName("foo:admin/badmodel", false) 64 conn, err := baseCmd.NewAPIRoot() 65 c.Assert(conn, gc.IsNil) 66 msg := strings.Replace(err.Error(), "\n", "", -1) 67 c.Assert(msg, gc.Equals, `model "admin/badmodel" has been removed from the controller, run 'juju models' and switch to one of them.`) 68 c.Assert(s.store.Models["foo"].Models, gc.HasLen, 1) 69 c.Assert(s.store.Models["foo"].Models["admin/goodmodel"], gc.DeepEquals, 70 jujuclient.ModelDetails{ModelUUID: "deadbeef2", ModelType: model.IAAS}) 71 c.Assert(s.store.Models["foo"].CurrentModel, gc.Equals, expectedCurrent) 72 } 73 74 func (s *BaseCommandSuite) TestUnknownModel(c *gc.C) { 75 s.assertUnknownModel(c, new(modelcmd.ModelCommandBase), "admin/badmodel", "admin/badmodel") 76 } 77 78 func (s *BaseCommandSuite) TestUnknownUncachedModel(c *gc.C) { 79 baseCmd := new(modelcmd.ModelCommandBase) 80 baseCmd.CanClearCurrentModel = false 81 baseCmd.RemoveModelFromClientStore(s.store, "foo", "admin/nonexistent") 82 // expecting silence in the logs since this model has never been cached. 83 c.Assert(c.GetTestLog(), gc.DeepEquals, "") 84 } 85 86 func (s *BaseCommandSuite) TestUnknownModelCanRemoveCachedCurrent(c *gc.C) { 87 baseCmd := new(modelcmd.ModelCommandBase) 88 baseCmd.CanClearCurrentModel = true 89 s.assertUnknownModel(c, baseCmd, "admin/badmodel", "") 90 } 91 92 func (s *BaseCommandSuite) TestUnknownModelNotCurrent(c *gc.C) { 93 s.assertUnknownModel(c, new(modelcmd.ModelCommandBase), "admin/goodmodel", "admin/goodmodel") 94 } 95 96 func (s *BaseCommandSuite) TestUnknownModelNotCurrentCanRemoveCachedCurrent(c *gc.C) { 97 baseCmd := new(modelcmd.ModelCommandBase) 98 baseCmd.CanClearCurrentModel = true 99 s.assertUnknownModel(c, baseCmd, "admin/goodmodel", "admin/goodmodel") 100 } 101 102 type NewGetBootstrapConfigParamsFuncSuite struct { 103 testing.IsolationSuite 104 } 105 106 var _ = gc.Suite(&NewGetBootstrapConfigParamsFuncSuite{}) 107 108 func (NewGetBootstrapConfigParamsFuncSuite) TestDetectCredentials(c *gc.C) { 109 clientStore := jujuclient.NewMemStore() 110 clientStore.Controllers["foo"] = jujuclient.ControllerDetails{} 111 clientStore.BootstrapConfig["foo"] = jujuclient.BootstrapConfig{ 112 Cloud: "cloud", 113 CloudType: "cloud-type", 114 ControllerModelUUID: coretesting.ModelTag.Id(), 115 Config: map[string]interface{}{ 116 "name": "foo", 117 "type": "cloud-type", 118 }, 119 } 120 var registry mockProviderRegistry 121 122 f := modelcmd.NewGetBootstrapConfigParamsFunc( 123 cmdtesting.Context(c), 124 clientStore, 125 ®istry, 126 ) 127 _, params, err := f("foo") 128 c.Assert(err, jc.ErrorIsNil) 129 c.Assert(params.Cloud.Credential.Label, gc.Equals, "finalized") 130 } 131 132 func (NewGetBootstrapConfigParamsFuncSuite) TestCloudCACert(c *gc.C) { 133 fakeCert := coretesting.CACert 134 clientStore := jujuclient.NewMemStore() 135 clientStore.Controllers["foo"] = jujuclient.ControllerDetails{} 136 clientStore.BootstrapConfig["foo"] = jujuclient.BootstrapConfig{ 137 Cloud: "cloud", 138 CloudType: "cloud-type", 139 ControllerModelUUID: coretesting.ModelTag.Id(), 140 Config: map[string]interface{}{ 141 "name": "foo", 142 "type": "cloud-type", 143 }, 144 CloudCACertificates: []string{fakeCert}, 145 } 146 var registry mockProviderRegistry 147 148 f := modelcmd.NewGetBootstrapConfigParamsFunc( 149 cmdtesting.Context(c), 150 clientStore, 151 ®istry, 152 ) 153 _, params, err := f("foo") 154 c.Assert(err, jc.ErrorIsNil) 155 c.Assert(params.Cloud.CACertificates, jc.SameContents, []string{fakeCert}) 156 } 157 158 type mockProviderRegistry struct { 159 environs.ProviderRegistry 160 } 161 162 func (r *mockProviderRegistry) Provider(t string) (environs.EnvironProvider, error) { 163 return &mockEnvironProvider{}, nil 164 } 165 166 type mockEnvironProvider struct { 167 environs.EnvironProvider 168 } 169 170 func (p *mockEnvironProvider) DetectCredentials() (*cloud.CloudCredential, error) { 171 return cloud.NewEmptyCloudCredential(), nil 172 } 173 174 func (p *mockEnvironProvider) FinalizeCredential( 175 _ environs.FinalizeCredentialContext, 176 args environs.FinalizeCredentialParams, 177 ) (*cloud.Credential, error) { 178 out := args.Credential 179 out.Label = "finalized" 180 return &out, nil 181 } 182 183 func (p *mockEnvironProvider) CredentialSchemas() map[cloud.AuthType]cloud.CredentialSchema { 184 return map[cloud.AuthType]cloud.CredentialSchema{cloud.EmptyAuthType: {}} 185 }