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