github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/controller/modelmanager/createmodel_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package modelmanager_test 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/testing" 9 jc "github.com/juju/testing/checkers" 10 "github.com/juju/utils" 11 "github.com/juju/version" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/cloud" 15 "github.com/juju/juju/controller/modelmanager" 16 "github.com/juju/juju/environs" 17 "github.com/juju/juju/environs/config" 18 _ "github.com/juju/juju/provider/all" 19 _ "github.com/juju/juju/provider/azure" 20 _ "github.com/juju/juju/provider/dummy" 21 _ "github.com/juju/juju/provider/ec2" 22 _ "github.com/juju/juju/provider/joyent" 23 _ "github.com/juju/juju/provider/maas" 24 _ "github.com/juju/juju/provider/openstack" 25 coretesting "github.com/juju/juju/testing" 26 "github.com/juju/juju/tools" 27 ) 28 29 type ModelConfigCreatorSuite struct { 30 coretesting.BaseSuite 31 fake fakeProvider 32 creator modelmanager.ModelConfigCreator 33 baseConfig *config.Config 34 } 35 36 var _ = gc.Suite(&ModelConfigCreatorSuite{}) 37 38 func (s *ModelConfigCreatorSuite) SetUpTest(c *gc.C) { 39 s.BaseSuite.SetUpTest(c) 40 s.fake = fakeProvider{ 41 restrictedConfigAttributes: []string{"restricted"}, 42 } 43 s.creator = modelmanager.ModelConfigCreator{ 44 Provider: func(provider string) (environs.EnvironProvider, error) { 45 if provider != "fake" { 46 return nil, errors.Errorf("expected fake, got %s", provider) 47 } 48 return &s.fake, nil 49 }, 50 } 51 baseConfig, err := config.New( 52 config.UseDefaults, 53 coretesting.FakeConfig().Merge(coretesting.Attrs{ 54 "type": "fake", 55 "restricted": "area51", 56 "agent-version": "2.0.0", 57 }), 58 ) 59 c.Assert(err, jc.ErrorIsNil) 60 s.baseConfig = baseConfig 61 } 62 63 func (s *ModelConfigCreatorSuite) newModelConfig(attrs map[string]interface{}) (*config.Config, error) { 64 cloudSpec := environs.CloudSpec{Type: "fake"} 65 return s.creator.NewModelConfig(cloudSpec, s.baseConfig, attrs) 66 } 67 68 func (s *ModelConfigCreatorSuite) TestCreateModelValidatesConfig(c *gc.C) { 69 newModelUUID := utils.MustNewUUID().String() 70 cfg, err := s.newModelConfig(coretesting.Attrs( 71 s.baseConfig.AllAttrs(), 72 ).Merge(coretesting.Attrs{ 73 "name": "new-model", 74 "additional": "value", 75 "uuid": newModelUUID, 76 })) 77 c.Assert(err, jc.ErrorIsNil) 78 expected := s.baseConfig.AllAttrs() 79 expected["name"] = "new-model" 80 expected["type"] = "fake" 81 expected["additional"] = "value" 82 expected["uuid"] = newModelUUID 83 c.Assert(cfg.AllAttrs(), jc.DeepEquals, expected) 84 85 s.fake.Stub.CheckCallNames(c, 86 "PrepareConfig", 87 "Validate", 88 ) 89 validateCall := s.fake.Stub.Calls()[1] 90 c.Assert(validateCall.Args, gc.HasLen, 2) 91 c.Assert(validateCall.Args[0], gc.Equals, cfg) 92 c.Assert(validateCall.Args[1], gc.IsNil) 93 } 94 95 func (s *ModelConfigCreatorSuite) TestCreateModelSameAgentVersion(c *gc.C) { 96 cfg, err := s.newModelConfig(coretesting.Attrs( 97 s.baseConfig.AllAttrs(), 98 ).Merge(coretesting.Attrs{ 99 "name": "new-model", 100 "uuid": utils.MustNewUUID().String(), 101 })) 102 c.Assert(err, jc.ErrorIsNil) 103 104 baseAgentVersion, ok := s.baseConfig.AgentVersion() 105 c.Assert(ok, jc.IsTrue) 106 agentVersion, ok := cfg.AgentVersion() 107 c.Assert(ok, jc.IsTrue) 108 c.Assert(agentVersion, gc.Equals, baseAgentVersion) 109 } 110 111 func (s *ModelConfigCreatorSuite) TestCreateModelGreaterAgentVersion(c *gc.C) { 112 _, err := s.newModelConfig(coretesting.Attrs( 113 s.baseConfig.AllAttrs(), 114 ).Merge(coretesting.Attrs{ 115 "name": "new-model", 116 "uuid": utils.MustNewUUID().String(), 117 "agent-version": "2.0.1", 118 })) 119 c.Assert(err, gc.ErrorMatches, 120 "agent-version .* cannot be greater than the controller .*") 121 } 122 123 func (s *ModelConfigCreatorSuite) TestCreateModelLesserAgentVersionNoToolsFinder(c *gc.C) { 124 _, err := s.newModelConfig(coretesting.Attrs( 125 s.baseConfig.AllAttrs(), 126 ).Merge(coretesting.Attrs{ 127 "name": "new-model", 128 "uuid": utils.MustNewUUID().String(), 129 "agent-version": "1.9.9", 130 })) 131 c.Assert(err, gc.ErrorMatches, 132 "agent-version does not match base config, and no tools-finder is supplied") 133 } 134 135 func (s *ModelConfigCreatorSuite) TestCreateModelLesserAgentVersionToolsFinderFound(c *gc.C) { 136 s.creator.FindTools = func(version.Number) (tools.List, error) { 137 return tools.List{ 138 {}, //contents don't matter, just need a non-empty list 139 }, nil 140 } 141 cfg, err := s.newModelConfig(coretesting.Attrs( 142 s.baseConfig.AllAttrs(), 143 ).Merge(coretesting.Attrs{ 144 "name": "new-model", 145 "uuid": utils.MustNewUUID().String(), 146 "agent-version": "1.9.9", 147 })) 148 c.Assert(err, jc.ErrorIsNil) 149 agentVersion, ok := cfg.AgentVersion() 150 c.Assert(ok, jc.IsTrue) 151 c.Assert(agentVersion, gc.Equals, version.MustParse("1.9.9")) 152 } 153 154 func (s *ModelConfigCreatorSuite) TestCreateModelLesserAgentVersionToolsFinderNotFound(c *gc.C) { 155 s.creator.FindTools = func(version.Number) (tools.List, error) { 156 return tools.List{}, nil 157 } 158 _, err := s.newModelConfig(coretesting.Attrs( 159 s.baseConfig.AllAttrs(), 160 ).Merge(coretesting.Attrs{ 161 "name": "new-model", 162 "uuid": utils.MustNewUUID().String(), 163 "agent-version": "1.9.9", 164 })) 165 c.Assert(err, gc.ErrorMatches, "no agent binaries found for version .*") 166 } 167 168 type fakeProvider struct { 169 testing.Stub 170 environs.EnvironProvider 171 restrictedConfigAttributes []string 172 } 173 174 func (p *fakeProvider) Validate(cfg, old *config.Config) (*config.Config, error) { 175 p.MethodCall(p, "Validate", cfg, old) 176 return cfg, p.NextErr() 177 } 178 179 func (p *fakeProvider) PrepareConfig(args environs.PrepareConfigParams) (*config.Config, error) { 180 p.MethodCall(p, "PrepareConfig", args) 181 return args.Config, p.NextErr() 182 } 183 184 func (p *fakeProvider) CredentialSchemas() map[cloud.AuthType]cloud.CredentialSchema { 185 return map[cloud.AuthType]cloud.CredentialSchema{ 186 cloud.UserPassAuthType: { 187 { 188 "username", cloud.CredentialAttr{Description: "The username"}, 189 }, { 190 "password", cloud.CredentialAttr{ 191 Description: "The password", 192 Hidden: true, 193 }, 194 }, 195 }, 196 } 197 } 198 199 func (p *fakeProvider) DetectCredentials() (*cloud.CloudCredential, error) { 200 return nil, errors.NotFoundf("credentials") 201 }