github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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 firewallMode string 36 err string 37 sslHostnameVerification bool 38 sslHostnameSet bool 39 blockStorageSource string 40 } 41 42 var requiredConfig = testing.Attrs{} 43 44 func (t configTest) check(c *gc.C) { 45 attrs := testing.FakeConfig().Merge(testing.Attrs{ 46 "type": "openstack", 47 }).Merge(t.config) 48 49 cfg, err := config.New(config.NoDefaults, attrs) 50 c.Assert(err, jc.ErrorIsNil) 51 52 credential := cloud.NewCredential(cloud.UserPassAuthType, map[string]string{ 53 "username": "user", 54 "password": "secret", 55 "tenant-name": "sometenant", 56 }) 57 cloudSpec := environs.CloudSpec{ 58 Type: "openstack", 59 Name: "openstack", 60 Endpoint: "http://auth", 61 Region: "Configtest", 62 Credential: &credential, 63 } 64 65 e, err := environs.New(environs.OpenParams{ 66 Cloud: cloudSpec, 67 Config: cfg, 68 }) 69 if t.change != nil { 70 c.Assert(err, jc.ErrorIsNil) 71 72 // Testing a change in configuration. 73 var old, changed, valid *config.Config 74 osenv := e.(*Environ) 75 old = osenv.ecfg().Config 76 changed, err = old.Apply(t.change) 77 c.Assert(err, jc.ErrorIsNil) 78 79 // Keep err for validation below. 80 valid, err = providerInstance.Validate(changed, old) 81 if err == nil { 82 err = osenv.SetConfig(valid) 83 } 84 } 85 if t.err != "" { 86 c.Check(err, gc.ErrorMatches, t.err) 87 return 88 } 89 c.Assert(err, jc.ErrorIsNil) 90 91 ecfg := e.(*Environ).ecfg() 92 c.Assert(ecfg.Name(), gc.Equals, "testenv") 93 if t.firewallMode != "" { 94 c.Assert(ecfg.FirewallMode(), gc.Equals, t.firewallMode) 95 } 96 c.Assert(ecfg.useFloatingIP(), gc.Equals, t.useFloatingIP) 97 c.Assert(ecfg.useDefaultSecurityGroup(), gc.Equals, t.useDefaultSecurityGroup) 98 c.Assert(ecfg.network(), gc.Equals, t.network) 99 // Default should be true 100 expectedHostnameVerification := true 101 if t.sslHostnameSet { 102 expectedHostnameVerification = t.sslHostnameVerification 103 } 104 c.Assert(ecfg.SSLHostnameVerification(), gc.Equals, expectedHostnameVerification) 105 for name, expect := range t.expect { 106 actual, found := ecfg.UnknownAttrs()[name] 107 c.Check(found, jc.IsTrue) 108 c.Check(actual, gc.Equals, expect) 109 } 110 if t.blockStorageSource != "" { 111 storage, ok := ecfg.StorageDefaultBlockSource() 112 c.Assert(ok, jc.IsTrue) 113 c.Assert(storage, gc.Equals, t.blockStorageSource) 114 } 115 } 116 117 func (s *ConfigSuite) SetUpTest(c *gc.C) { 118 s.BaseSuite.SetUpTest(c) 119 s.PatchValue(&authenticateClient, func(authenticator) error { return nil }) 120 } 121 122 var configTests = []configTest{ 123 { 124 summary: "default use floating ip", 125 config: requiredConfig, 126 // Do not use floating IP's by default. 127 useFloatingIP: false, 128 }, { 129 summary: "use floating ip", 130 config: requiredConfig.Merge(testing.Attrs{ 131 "use-floating-ip": true, 132 }), 133 useFloatingIP: true, 134 }, { 135 summary: "default use default security group", 136 config: requiredConfig, 137 // Do not use default security group by default. 138 useDefaultSecurityGroup: false, 139 }, { 140 summary: "use default security group", 141 config: requiredConfig.Merge(testing.Attrs{ 142 "use-default-secgroup": true, 143 }), 144 useDefaultSecurityGroup: true, 145 }, { 146 summary: "admin-secret given", 147 config: requiredConfig.Merge(testing.Attrs{ 148 "admin-secret": "Futumpsh", 149 }), 150 }, { 151 summary: "default firewall-mode", 152 config: requiredConfig, 153 firewallMode: config.FwInstance, 154 }, { 155 summary: "instance firewall-mode", 156 config: requiredConfig.Merge(testing.Attrs{ 157 "firewall-mode": "instance", 158 }), 159 firewallMode: config.FwInstance, 160 }, { 161 summary: "global firewall-mode", 162 config: requiredConfig.Merge(testing.Attrs{ 163 "firewall-mode": "global", 164 }), 165 firewallMode: config.FwGlobal, 166 }, { 167 summary: "none firewall-mode", 168 config: requiredConfig.Merge(testing.Attrs{ 169 "firewall-mode": "none", 170 }), 171 firewallMode: config.FwNone, 172 }, { 173 config: requiredConfig.Merge(testing.Attrs{ 174 "future": "hammerstein", 175 }), 176 expect: testing.Attrs{ 177 "future": "hammerstein", 178 }, 179 }, { 180 config: requiredConfig, 181 change: testing.Attrs{ 182 "future": "hammerstein", 183 }, 184 expect: testing.Attrs{ 185 "future": "hammerstein", 186 }, 187 }, { 188 config: requiredConfig, 189 change: testing.Attrs{ 190 "ssl-hostname-verification": false, 191 }, 192 sslHostnameVerification: false, 193 sslHostnameSet: true, 194 }, { 195 config: requiredConfig, 196 change: testing.Attrs{ 197 "ssl-hostname-verification": true, 198 }, 199 sslHostnameVerification: true, 200 sslHostnameSet: true, 201 }, { 202 summary: "default network", 203 config: requiredConfig, 204 network: "", 205 }, { 206 summary: "network", 207 config: requiredConfig.Merge(testing.Attrs{ 208 "network": "a-network-label", 209 }), 210 network: "a-network-label", 211 }, { 212 summary: "block storage specified", 213 config: requiredConfig.Merge(testing.Attrs{ 214 "storage-default-block-source": "my-cinder", 215 }), 216 blockStorageSource: "my-cinder", 217 }, 218 } 219 220 func (s *ConfigSuite) TestConfig(c *gc.C) { 221 for i, t := range configTests { 222 c.Logf("test %d: %s (%v)", i, t.summary, t.config) 223 t.check(c) 224 } 225 } 226 227 func (s *ConfigSuite) TestDeprecatedAttributesRemoved(c *gc.C) { 228 attrs := testing.FakeConfig().Merge(testing.Attrs{ 229 "type": "openstack", 230 "default-image-id": "id-1234", 231 "default-instance-type": "big", 232 }) 233 234 cfg, err := config.New(config.NoDefaults, attrs) 235 c.Assert(err, jc.ErrorIsNil) 236 // Keep err for validation below. 237 valid, err := providerInstance.Validate(cfg, nil) 238 c.Assert(err, jc.ErrorIsNil) 239 // Check deprecated attributes removed. 240 allAttrs := valid.AllAttrs() 241 for _, attr := range []string{"default-image-id", "default-instance-type"} { 242 _, ok := allAttrs[attr] 243 c.Assert(ok, jc.IsFalse) 244 } 245 } 246 247 func (s *ConfigSuite) TestPrepareConfigSetsDefaultBlockSource(c *gc.C) { 248 attrs := testing.FakeConfig().Merge(testing.Attrs{ 249 "type": "openstack", 250 }) 251 cfg, err := config.New(config.NoDefaults, attrs) 252 c.Assert(err, jc.ErrorIsNil) 253 _, ok := cfg.StorageDefaultBlockSource() 254 c.Assert(ok, jc.IsFalse) 255 256 cfg, err = providerInstance.PrepareConfig(prepareConfigParams(cfg)) 257 c.Assert(err, jc.ErrorIsNil) 258 source, ok := cfg.StorageDefaultBlockSource() 259 c.Assert(ok, jc.IsTrue) 260 c.Assert(source, gc.Equals, "cinder") 261 } 262 263 func prepareConfigParams(cfg *config.Config) environs.PrepareConfigParams { 264 credential := cloud.NewCredential(cloud.UserPassAuthType, map[string]string{ 265 "username": "user", 266 "password": "secret", 267 "tenant-name": "sometenant", 268 }) 269 return environs.PrepareConfigParams{ 270 Config: cfg, 271 Cloud: environs.CloudSpec{ 272 Type: "openstack", 273 Name: "canonistack", 274 Region: "region", 275 Endpoint: "http://auth", 276 Credential: &credential, 277 }, 278 } 279 } 280 281 func (*ConfigSuite) TestSchema(c *gc.C) { 282 fields := providerInstance.Schema() 283 // Check that all the fields defined in environs/config 284 // are in the returned schema. 285 globalFields, err := config.Schema(nil) 286 c.Assert(err, gc.IsNil) 287 for name, field := range globalFields { 288 c.Check(fields[name], jc.DeepEquals, field) 289 } 290 }