3
// TODO: Clean this up so it matches environs/openstack/config_test.go.
7
"launchpad.net/goamz/aws"
8
. "launchpad.net/gocheck"
10
"launchpad.net/juju-core/environs"
11
"launchpad.net/juju-core/environs/config"
12
"launchpad.net/juju-core/testing"
18
// Use local suite since this file lives in the ec2 package
19
// for testing internals.
20
type ConfigSuite struct {
21
savedHome, savedAccessKey, savedSecretKey string
24
var _ = Suite(&ConfigSuite{})
26
var configTestRegion = aws.Region{
28
EC2Endpoint: "testregion.nowhere:1234",
31
var testAuth = aws.Auth{"gopher", "long teeth"}
33
// configTest specifies a config parsing test, checking that env when
34
// parsed as the ec2 section of a config file matches baseConfigResult
35
// when mutated by the mutate function, or that the parse matches the
37
type configTest struct {
46
firewallMode config.FirewallMode
50
type attrs map[string]interface{}
52
func (t configTest) check(c *C) {
54
"environments": attrs{
57
"ca-cert": testing.CACert,
58
"ca-private-key": testing.CAKey,
62
testenv := envs["environments"].(attrs)["testenv"].(attrs)
63
for k, v := range t.config {
66
if _, ok := testenv["control-bucket"]; !ok {
67
testenv["control-bucket"] = "x"
69
data, err := goyaml.Marshal(envs)
72
es, err := environs.ReadEnvironsBytes(data)
75
e, err := es.Open("testenv")
79
// Testing a change in configuration.
80
var old, changed, valid *config.Config
81
ec2env := e.(*environ)
82
old = ec2env.ecfg().Config
83
changed, err = old.Apply(t.change)
86
// Keep err for validation below.
87
valid, err = providerInstance.Validate(changed, old)
89
err = ec2env.SetConfig(valid)
93
c.Check(err, ErrorMatches, t.err)
98
ecfg := e.(*environ).ecfg()
99
c.Assert(ecfg.Name(), Equals, "testenv")
100
c.Assert(ecfg.controlBucket(), Equals, "x")
102
c.Assert(ecfg.region(), Equals, t.region)
105
c.Assert(ecfg.publicBucket(), Equals, t.pbucket)
107
if t.accessKey != "" {
108
c.Assert(ecfg.accessKey(), Equals, t.accessKey)
109
c.Assert(ecfg.secretKey(), Equals, t.secretKey)
110
expected := map[string]interface{}{
111
"access-key": t.accessKey,
112
"secret-key": t.secretKey,
115
actual, err := e.Provider().SecretAttrs(ecfg.Config)
117
c.Assert(expected, DeepEquals, actual)
119
c.Assert(ecfg.accessKey(), DeepEquals, testAuth.AccessKey)
120
c.Assert(ecfg.secretKey(), DeepEquals, testAuth.SecretKey)
122
if t.firewallMode != "" {
123
c.Assert(ecfg.FirewallMode(), Equals, t.firewallMode)
126
// check storage buckets are configured correctly
128
c.Assert(env.Storage().(*storage).bucket.Region.Name, Equals, ecfg.region())
129
c.Assert(env.PublicStorage().(*storage).bucket.Region.Name, Equals, ecfg.publicBucketRegion())
132
var configTests = []configTest{
135
pbucket: "juju-dist",
137
// check that region defaults to us-east-1
142
"region": "eu-west-1",
149
err: ".*invalid region name.*",
152
"region": "configtest",
154
region: "configtest",
157
"region": "configtest",
160
"region": "us-east-1",
162
err: `cannot change region from "configtest" to "us-east-1"`,
167
err: ".*expected string, got 666",
172
err: ".*expected string, got 666",
177
err: ".*expected string, got 666",
180
"control-bucket": 666,
182
err: ".*expected string, got 666",
185
"control-bucket": "new-x",
187
err: `cannot change control-bucket from "x" to "new-x"`,
190
"public-bucket": 666,
192
err: ".*expected string, got 666",
194
// check that the public-bucket defaults to juju-dist
196
pbucket: "juju-dist",
199
"public-bucket": "foo",
203
// check that public-bucket-region defaults to
204
// us-east-1, the S3 endpoint that owns juju-dist
206
pbucketRegion: "us-east-1",
209
"public-bucket-region": "foo",
211
err: ".*invalid public-bucket-region name.*",
214
"public-bucket-region": "ap-southeast-1",
216
pbucketRegion: "ap-southeast-1",
219
"region": "us-west-1",
220
"public-bucket-region": "ap-southeast-1",
223
pbucketRegion: "us-east-1",
226
"access-key": "jujuer",
227
"secret-key": "open sesame",
230
secretKey: "open sesame",
233
"access-key": "jujuer",
235
err: ".*environment has no access-key or secret-key",
238
"secret-key": "badness",
240
err: ".*environment has no access-key or secret-key",
243
"admin-secret": "Futumpsh",
247
firewallMode: config.FwInstance,
252
firewallMode: config.FwInstance,
255
"firewall-mode": "instance",
257
firewallMode: config.FwInstance,
260
"firewall-mode": "global",
262
firewallMode: config.FwGlobal,
265
"ssl-hostname-verification": false,
267
err: "disabling ssh-hostname-verification is not supported",
271
func indent(s string, with string) string {
273
lines := strings.Split(s, "\n")
274
for _, l := range lines {
280
func (s *ConfigSuite) SetUpTest(c *C) {
281
s.savedHome = os.Getenv("HOME")
282
s.savedAccessKey = os.Getenv("AWS_ACCESS_KEY_ID")
283
s.savedSecretKey = os.Getenv("AWS_SECRET_ACCESS_KEY")
286
sshDir := filepath.Join(home, ".ssh")
287
err := os.Mkdir(sshDir, 0777)
289
err = ioutil.WriteFile(filepath.Join(sshDir, "id_rsa.pub"), []byte("sshkey\n"), 0666)
292
os.Setenv("HOME", home)
293
os.Setenv("AWS_ACCESS_KEY_ID", testAuth.AccessKey)
294
os.Setenv("AWS_SECRET_ACCESS_KEY", testAuth.SecretKey)
295
aws.Regions["configtest"] = configTestRegion
298
func (s *ConfigSuite) TearDownTest(c *C) {
299
os.Setenv("HOME", s.savedHome)
300
os.Setenv("AWS_ACCESS_KEY_ID", s.savedAccessKey)
301
os.Setenv("AWS_SECRET_ACCESS_KEY", s.savedSecretKey)
302
delete(aws.Regions, "configtest")
305
func (s *ConfigSuite) TestConfig(c *C) {
306
for i, t := range configTests {
307
c.Logf("test %d: %v", i, t.config)
312
func (s *ConfigSuite) TestMissingAuth(c *C) {
313
os.Setenv("AWS_ACCESS_KEY_ID", "")
314
os.Setenv("AWS_SECRET_ACCESS_KEY", "")
315
test := configTests[0]
316
test.err = "environment has no access-key or secret-key"