github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/openstack/config_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package openstack 5 6 import ( 7 jc "github.com/juju/testing/checkers" 8 gc "gopkg.in/check.v1" 9 10 "github.com/juju/juju/cloud" 11 "github.com/juju/juju/environs" 12 "github.com/juju/juju/environs/config" 13 "github.com/juju/juju/testing" 14 ) 15 16 type ConfigSuite struct { 17 testing.BaseSuite 18 } 19 20 var _ = gc.Suite(&ConfigSuite{}) 21 22 // configTest specifies a config parsing test, checking that env when 23 // parsed as the openstack section of a config file matches 24 // baseConfigResult when mutated by the mutate function, or that the 25 // parse matches the given error. 26 type configTest struct { 27 summary string 28 config testing.Attrs 29 change map[string]interface{} 30 expect map[string]interface{} 31 region string 32 useFloatingIP bool 33 useDefaultSecurityGroup bool 34 network string 35 externalNetwork string 36 firewallMode string 37 err string 38 sslHostnameVerification bool 39 sslHostnameSet bool 40 blockStorageSource string 41 } 42 43 var requiredConfig = testing.Attrs{} 44 45 func (t configTest) check(c *gc.C) { 46 attrs := testing.FakeConfig().Merge(testing.Attrs{ 47 "type": "openstack", 48 }).Merge(t.config) 49 50 cfg, err := config.New(config.NoDefaults, attrs) 51 c.Assert(err, jc.ErrorIsNil) 52 53 credential := cloud.NewCredential(cloud.UserPassAuthType, map[string]string{ 54 "username": "user", 55 "password": "secret", 56 "tenant-name": "sometenant", 57 }) 58 cloudSpec := environs.CloudSpec{ 59 Type: "openstack", 60 Name: "openstack", 61 Endpoint: "http://auth", 62 Region: "Configtest", 63 Credential: &credential, 64 } 65 66 e, err := environs.New(environs.OpenParams{ 67 Cloud: cloudSpec, 68 Config: cfg, 69 }) 70 if t.change != nil { 71 c.Assert(err, jc.ErrorIsNil) 72 73 // Testing a change in configuration. 74 var old, changed, valid *config.Config 75 osenv := e.(*Environ) 76 old = osenv.ecfg().Config 77 changed, err = old.Apply(t.change) 78 c.Assert(err, jc.ErrorIsNil) 79 80 // Keep err for validation below. 81 valid, err = providerInstance.Validate(changed, old) 82 if err == nil { 83 err = osenv.SetConfig(valid) 84 } 85 } 86 if t.err != "" { 87 c.Check(err, gc.ErrorMatches, t.err) 88 return 89 } 90 c.Assert(err, jc.ErrorIsNil) 91 92 ecfg := e.(*Environ).ecfg() 93 c.Assert(ecfg.Name(), gc.Equals, "testmodel") 94 if t.firewallMode != "" { 95 c.Assert(ecfg.FirewallMode(), gc.Equals, t.firewallMode) 96 } 97 c.Assert(ecfg.useFloatingIP(), gc.Equals, t.useFloatingIP) 98 c.Assert(ecfg.useDefaultSecurityGroup(), gc.Equals, t.useDefaultSecurityGroup) 99 c.Assert(ecfg.network(), gc.Equals, t.network) 100 c.Assert(ecfg.externalNetwork(), gc.Equals, t.externalNetwork) 101 // Default should be true 102 expectedHostnameVerification := true 103 if t.sslHostnameSet { 104 expectedHostnameVerification = t.sslHostnameVerification 105 } 106 c.Assert(ecfg.SSLHostnameVerification(), gc.Equals, expectedHostnameVerification) 107 for name, expect := range t.expect { 108 actual, found := ecfg.UnknownAttrs()[name] 109 c.Check(found, jc.IsTrue) 110 c.Check(actual, gc.Equals, expect) 111 } 112 if t.blockStorageSource != "" { 113 storage, ok := ecfg.StorageDefaultBlockSource() 114 c.Assert(ok, jc.IsTrue) 115 c.Assert(storage, gc.Equals, t.blockStorageSource) 116 } 117 } 118 119 func (s *ConfigSuite) SetUpTest(c *gc.C) { 120 s.BaseSuite.SetUpTest(c) 121 s.PatchValue(&authenticateClient, func(authenticator) error { return nil }) 122 } 123 124 var configTests = []configTest{ 125 { 126 summary: "default use floating ip", 127 config: requiredConfig, 128 // Do not use floating IP's by default. 129 useFloatingIP: false, 130 }, { 131 summary: "use floating ip", 132 config: requiredConfig.Merge(testing.Attrs{ 133 "use-floating-ip": true, 134 }), 135 useFloatingIP: true, 136 }, { 137 summary: "default use default security group", 138 config: requiredConfig, 139 // Do not use default security group by default. 140 useDefaultSecurityGroup: false, 141 }, { 142 summary: "use default security group", 143 config: requiredConfig.Merge(testing.Attrs{ 144 "use-default-secgroup": true, 145 }), 146 useDefaultSecurityGroup: true, 147 }, { 148 summary: "admin-secret given", 149 config: requiredConfig.Merge(testing.Attrs{ 150 "admin-secret": "Futumpsh", 151 }), 152 }, { 153 summary: "default firewall-mode", 154 config: requiredConfig, 155 firewallMode: config.FwInstance, 156 }, { 157 summary: "instance firewall-mode", 158 config: requiredConfig.Merge(testing.Attrs{ 159 "firewall-mode": "instance", 160 }), 161 firewallMode: config.FwInstance, 162 }, { 163 summary: "global firewall-mode", 164 config: requiredConfig.Merge(testing.Attrs{ 165 "firewall-mode": "global", 166 }), 167 firewallMode: config.FwGlobal, 168 }, { 169 summary: "none firewall-mode", 170 config: requiredConfig.Merge(testing.Attrs{ 171 "firewall-mode": "none", 172 }), 173 firewallMode: config.FwNone, 174 }, { 175 config: requiredConfig.Merge(testing.Attrs{ 176 "future": "hammerstein", 177 }), 178 expect: testing.Attrs{ 179 "future": "hammerstein", 180 }, 181 }, { 182 config: requiredConfig, 183 change: testing.Attrs{ 184 "future": "hammerstein", 185 }, 186 expect: testing.Attrs{ 187 "future": "hammerstein", 188 }, 189 }, { 190 config: requiredConfig, 191 change: testing.Attrs{ 192 "ssl-hostname-verification": false, 193 }, 194 sslHostnameVerification: false, 195 sslHostnameSet: true, 196 }, { 197 config: requiredConfig, 198 change: testing.Attrs{ 199 "ssl-hostname-verification": true, 200 }, 201 sslHostnameVerification: true, 202 sslHostnameSet: true, 203 }, { 204 summary: "default network", 205 config: requiredConfig, 206 network: "", 207 }, { 208 summary: "network", 209 config: requiredConfig.Merge(testing.Attrs{ 210 NetworkKey: "a-network-label", 211 }), 212 network: "a-network-label", 213 }, {}, { 214 summary: "default external network", 215 config: requiredConfig, 216 externalNetwork: "", 217 }, { 218 summary: "external network", 219 config: requiredConfig.Merge(testing.Attrs{ 220 "external-network": "a-external-network-label", 221 }), 222 externalNetwork: "a-external-network-label", 223 }, { 224 summary: "block storage specified", 225 config: requiredConfig.Merge(testing.Attrs{ 226 "storage-default-block-source": "my-cinder", 227 }), 228 blockStorageSource: "my-cinder", 229 }, { 230 summary: "use gbp set, ptg not set", 231 config: requiredConfig.Merge(testing.Attrs{ 232 "use-openstack-gbp": true, 233 }), 234 err: "policy-target-group must be set when use-openstack-gbp is set", 235 }, { 236 summary: "use gbp set, ptg set", 237 config: requiredConfig.Merge(testing.Attrs{ 238 "use-openstack-gbp": true, 239 "policy-target-group": "fb19cd79-a25c-4357-9271-b071c5cb726c", 240 }), 241 }, { 242 summary: "use gbp not set, ptg set", 243 config: requiredConfig.Merge(testing.Attrs{ 244 "policy-target-group": "fb19cd79-a25c-4357-9271-b071c5cb726c", 245 }), 246 }, { 247 summary: "use gbp set, ptg set, network set", 248 config: requiredConfig.Merge(testing.Attrs{ 249 "use-openstack-gbp": true, 250 "policy-target-group": "fb19cd79-a25c-4357-9271-b071c5cb726c", 251 "network": "fb19cd79-a25c-4357-9271-b071c5cb726c", 252 }), 253 err: "cannot use 'network' config setting when use-openstack-gbp is set", 254 }, { 255 summary: "use gbp set, ptg not an UUID", 256 config: requiredConfig.Merge(testing.Attrs{ 257 "use-openstack-gbp": true, 258 "policy-target-group": "groundcontroltomajortom", 259 }), 260 err: "policy-target-group has invalid UUID: .*", 261 }, 262 } 263 264 func (s *ConfigSuite) TestConfig(c *gc.C) { 265 for i, t := range configTests { 266 c.Logf("test %d: %s (%v)", i, t.summary, t.config) 267 t.check(c) 268 } 269 } 270 271 func (s *ConfigSuite) TestDeprecatedAttributesRemoved(c *gc.C) { 272 attrs := testing.FakeConfig().Merge(testing.Attrs{ 273 "type": "openstack", 274 "default-image-id": "id-1234", 275 "default-instance-type": "big", 276 }) 277 278 cfg, err := config.New(config.NoDefaults, attrs) 279 c.Assert(err, jc.ErrorIsNil) 280 // Keep err for validation below. 281 valid, err := providerInstance.Validate(cfg, nil) 282 c.Assert(err, jc.ErrorIsNil) 283 // Check deprecated attributes removed. 284 allAttrs := valid.AllAttrs() 285 for _, attr := range []string{"default-image-id", "default-instance-type"} { 286 _, ok := allAttrs[attr] 287 c.Assert(ok, jc.IsFalse) 288 } 289 } 290 291 func (s *ConfigSuite) TestPrepareConfigSetsDefaultBlockSource(c *gc.C) { 292 attrs := testing.FakeConfig().Merge(testing.Attrs{ 293 "type": "openstack", 294 }) 295 cfg, err := config.New(config.NoDefaults, attrs) 296 c.Assert(err, jc.ErrorIsNil) 297 _, ok := cfg.StorageDefaultBlockSource() 298 c.Assert(ok, jc.IsFalse) 299 300 cfg, err = providerInstance.PrepareConfig(prepareConfigParams(cfg)) 301 c.Assert(err, jc.ErrorIsNil) 302 source, ok := cfg.StorageDefaultBlockSource() 303 c.Assert(ok, jc.IsTrue) 304 c.Assert(source, gc.Equals, "cinder") 305 } 306 307 func prepareConfigParams(cfg *config.Config) environs.PrepareConfigParams { 308 credential := cloud.NewCredential(cloud.UserPassAuthType, map[string]string{ 309 "username": "user", 310 "password": "secret", 311 "tenant-name": "sometenant", 312 }) 313 return environs.PrepareConfigParams{ 314 Config: cfg, 315 Cloud: environs.CloudSpec{ 316 Type: "openstack", 317 Name: "canonistack", 318 Region: "region", 319 Endpoint: "http://auth", 320 Credential: &credential, 321 }, 322 } 323 } 324 325 func (*ConfigSuite) TestSchema(c *gc.C) { 326 fields := providerInstance.Schema() 327 // Check that all the fields defined in environs/config 328 // are in the returned schema. 329 globalFields, err := config.Schema(nil) 330 c.Assert(err, gc.IsNil) 331 for name, field := range globalFields { 332 c.Check(fields[name], jc.DeepEquals, field) 333 } 334 }