12
12
gc "launchpad.net/gocheck"
13
"launchpad.net/goyaml"
14
13
"launchpad.net/loggo"
16
15
"launchpad.net/juju-core/environs"
17
16
"launchpad.net/juju-core/environs/config"
18
17
"launchpad.net/juju-core/testing"
18
jc "launchpad.net/juju-core/testing/checkers"
19
"launchpad.net/juju-core/testing/testbase"
21
22
type ConfigSuite struct {
23
24
savedVars map[string]string
24
25
oldJujuHome *testing.FakeHome
49
50
// baseConfigResult when mutated by the mutate function, or that the
50
51
// parse matches the given error.
51
52
type configTest struct {
56
envVars map[string]string
69
firewallMode config.FirewallMode
54
config map[string]interface{}
55
change map[string]interface{}
56
expect map[string]interface{}
57
envVars map[string]string
71
sslHostnameVerification bool
73
75
type attrs map[string]interface{}
81
83
func (t configTest) check(c *gc.C) {
83
"environments": attrs{
86
"authorized-keys": "fakekey",
90
testenv := envs["environments"].(attrs)["testenv"].(attrs)
91
for k, v := range t.config {
94
if _, ok := testenv["control-bucket"]; !ok {
95
testenv["control-bucket"] = "x"
97
data, err := goyaml.Marshal(envs)
84
attrs := testing.FakeConfig().Merge(testing.Attrs{
86
"control-bucket": "x",
89
cfg, err := config.New(config.NoDefaults, attrs)
98
90
c.Assert(err, gc.IsNil)
100
es, err := environs.ReadEnvironsBytes(data)
101
c.Check(err, gc.IsNil)
103
92
// Set environment variables if any.
104
93
savedVars := make(map[string]string)
105
94
if t.envVars != nil {
153
142
c.Assert(ecfg.password(), gc.Equals, t.password)
154
143
c.Assert(ecfg.tenantName(), gc.Equals, t.tenantName)
155
144
c.Assert(ecfg.authURL(), gc.Equals, t.authURL)
156
expected := map[string]interface{}{
145
expected := map[string]string{
157
146
"username": t.username,
158
147
"password": t.password,
159
148
"tenant-name": t.tenantName,
163
152
c.Assert(err, gc.IsNil)
164
153
c.Assert(expected, gc.DeepEquals, actual)
166
if t.pbucketURL != "" {
167
c.Assert(ecfg.publicBucketURL(), gc.Equals, t.pbucketURL)
168
c.Assert(ecfg.publicBucket(), gc.Equals, t.publicBucket)
155
if t.toolsURL != "" {
156
toolsURL, ok := ecfg.ToolsURL()
157
c.Assert(ok, jc.IsTrue)
158
c.Assert(toolsURL, gc.Equals, t.toolsURL)
170
160
if t.firewallMode != "" {
171
161
c.Assert(ecfg.FirewallMode(), gc.Equals, t.firewallMode)
173
163
c.Assert(ecfg.useFloatingIP(), gc.Equals, t.useFloatingIP)
164
// Default should be true
165
expectedHostnameVerification := true
166
if t.sslHostnameSet {
167
expectedHostnameVerification = t.sslHostnameVerification
169
c.Assert(ecfg.SSLHostnameVerification(), gc.Equals, expectedHostnameVerification)
174
170
for name, expect := range t.expect {
175
171
actual, found := ecfg.UnknownAttrs()[name]
176
172
c.Check(found, gc.Equals, true)
226
err: ".*expected string, got 666",
222
err: `.*expected string, got int\(666\)`,
228
224
summary: "missing region in environment",
229
225
envVars: map[string]string{
239
err: ".*expected string, got 666",
235
err: `.*expected string, got int\(666\)`,
241
237
summary: "missing username in environment",
242
238
err: "required environment variable not set for credentials attribute: User",
252
err: ".*expected string, got 666",
248
err: `.*expected string, got int\(666\)`,
254
250
summary: "missing password in environment",
255
251
err: "required environment variable not set for credentials attribute: Secrets",
263
259
"tenant-name": 666,
265
err: ".*expected string, got 666",
261
err: `.*expected string, got int\(666\)`,
267
263
summary: "missing tenant in environment",
268
264
err: "required environment variable not set for credentials attribute: TenantName",
278
err: ".*expected string, got 666",
274
err: `.*expected string, got int\(666\)`,
280
276
summary: "missing auth-url in environment",
281
277
err: "required environment variable not set for credentials attribute: URL",
330
326
"control-bucket": 666,
332
err: ".*expected string, got 666",
328
err: `.*expected string, got int\(666\)`,
334
330
summary: "changing control-bucket",
379
375
useFloatingIP: true,
381
summary: "public bucket URL",
383
"public-bucket": "juju-dist-non-default",
384
"public-bucket-url": "http://some/url",
386
publicBucket: "juju-dist-non-default",
387
pbucketURL: "http://some/url",
389
summary: "public bucket URL with default bucket",
391
"public-bucket-url": "http://some/url",
393
publicBucket: "juju-dist",
394
pbucketURL: "http://some/url",
377
summary: "public bucket URL with tools URL",
379
"public-bucket-url": "http://some/url",
380
"tools-url": "http://tools/url",
382
toolsURL: "http://tools/url",
396
384
summary: "admin-secret given",
403
391
firewallMode: config.FwInstance,
405
summary: "unset firewall-mode",
409
firewallMode: config.FwInstance,
411
393
summary: "instance firewall-mode",
413
395
"firewall-mode": "instance",
434
416
"future": "hammerstein",
420
"ssl-hostname-verification": false,
422
sslHostnameVerification: false,
423
sslHostnameSet: true,
426
"ssl-hostname-verification": true,
428
sslHostnameVerification: true,
429
sslHostnameSet: true,
441
func (s *ConfigSuite) TestPrepareInsertsUniqueControlBucket(c *gc.C) {
442
s.setupEnvCredentials()
443
attrs := testing.FakeConfig().Merge(testing.Attrs{
446
cfg, err := config.New(config.NoDefaults, attrs)
447
c.Assert(err, gc.IsNil)
449
env0, err := providerInstance.Prepare(cfg)
450
c.Assert(err, gc.IsNil)
451
bucket0 := env0.(*environ).ecfg().controlBucket()
452
c.Assert(bucket0, gc.Matches, "[a-f0-9]{32}")
454
env1, err := providerInstance.Prepare(cfg)
455
c.Assert(err, gc.IsNil)
456
bucket1 := env1.(*environ).ecfg().controlBucket()
457
c.Assert(bucket1, gc.Matches, "[a-f0-9]{32}")
459
c.Assert(bucket1, gc.Not(gc.Equals), bucket0)
462
func (s *ConfigSuite) TestPrepareDoesNotTouchExistingControlBucket(c *gc.C) {
463
s.setupEnvCredentials()
464
attrs := testing.FakeConfig().Merge(testing.Attrs{
466
"control-bucket": "burblefoo",
468
cfg, err := config.New(config.NoDefaults, attrs)
469
c.Assert(err, gc.IsNil)
471
env, err := providerInstance.Prepare(cfg)
472
c.Assert(err, gc.IsNil)
473
bucket := env.(*environ).ecfg().controlBucket()
474
c.Assert(bucket, gc.Equals, "burblefoo")
447
477
func (s *ConfigSuite) setupEnvCredentials() {
448
478
os.Setenv("OS_USERNAME", "user")
449
479
os.Setenv("OS_PASSWORD", "secret")
492
520
func (s *ConfigDeprecationSuite) setupEnv(c *gc.C, deprecatedKey, value string) {
493
521
s.setupEnvCredentials()
494
attrs := map[string]interface{}{
497
"control-bucket": "x",
498
"authorized-keys": "fakekey",
499
deprecatedKey: value,
522
attrs := testing.FakeConfig().Merge(testing.Attrs{
525
"control-bucket": "x",
526
deprecatedKey: value,
501
528
_, err := environs.NewFromAttrs(attrs)
502
529
c.Assert(err, gc.IsNil)
506
533
for attr, value := range map[string]string{
507
534
"default-image-id": "foo",
508
535
"default-instance-type": "bar",
536
"public-bucket-url": "somewhere",
511
539
s.setupEnv(c, attr, value)
513
541
stripped := strings.Replace(s.writer.messages[0], "\n", "", -1)
514
expected := fmt.Sprintf(`.*Config attribute "%s" \(%s\) is deprecated and ignored.*`, attr, value)
542
expected := fmt.Sprintf(`.*Config attribute "%s" \(%s\) is deprecated.*`, attr, value)
515
543
c.Assert(stripped, gc.Matches, expected)