LEFT | RIGHT |
1 package cloudinit_test | 1 package cloudinit_test |
2 | 2 |
3 import ( | 3 import ( |
4 "encoding/base64" | 4 "encoding/base64" |
5 . "launchpad.net/gocheck" | 5 . "launchpad.net/gocheck" |
6 "launchpad.net/goyaml" | 6 "launchpad.net/goyaml" |
7 "launchpad.net/juju-core/environs/cloudinit" | 7 "launchpad.net/juju-core/environs/cloudinit" |
8 "launchpad.net/juju-core/environs/config" | 8 "launchpad.net/juju-core/environs/config" |
9 "launchpad.net/juju-core/state" | 9 "launchpad.net/juju-core/state" |
10 "launchpad.net/juju-core/testing" | 10 "launchpad.net/juju-core/testing" |
11 "launchpad.net/juju-core/version" | 11 "launchpad.net/juju-core/version" |
12 "regexp" | 12 "regexp" |
13 "strings" | 13 "strings" |
14 ) | 14 ) |
15 | 15 |
16 // Use local suite since this file lives in the ec2 package | 16 // Use local suite since this file lives in the ec2 package |
17 // for testing internals. | 17 // for testing internals. |
18 type cloudinitSuite struct{} | 18 type cloudinitSuite struct{} |
19 | 19 |
20 var _ = Suite(cloudinitSuite{}) | 20 var _ = Suite(cloudinitSuite{}) |
21 | 21 |
22 var envConfig = mustNewConfig(map[string]interface{}{ | 22 var envConfig = mustNewConfig(map[string]interface{}{ |
23 "type": "ec2", | 23 "type": "ec2", |
24 "name": "foo", | 24 "name": "foo", |
25 "default-series": "series", | 25 "default-series": "series", |
26 "authorized-keys": "keys", | 26 "authorized-keys": "keys", |
27 » "ca-cert": testing.CACertPEM, | 27 » "ca-cert": testing.CACert, |
28 }) | 28 }) |
29 | 29 |
30 func mustNewConfig(m map[string]interface{}) *config.Config { | 30 func mustNewConfig(m map[string]interface{}) *config.Config { |
31 cfg, err := config.New(m) | 31 cfg, err := config.New(m) |
32 if err != nil { | 32 if err != nil { |
33 panic(err) | 33 panic(err) |
34 } | 34 } |
35 return cfg | 35 return cfg |
36 } | 36 } |
37 | 37 |
38 // Each test gives a cloudinit config - we check the | 38 // Each test gives a cloudinit config - we check the |
39 // output to see if it looks correct. | 39 // output to see if it looks correct. |
40 var cloudinitTests = []cloudinit.MachineConfig{ | 40 var cloudinitTests = []cloudinit.MachineConfig{ |
41 { | 41 { |
42 InstanceIdAccessor: "$instance_id", | 42 InstanceIdAccessor: "$instance_id", |
43 MachineId: 0, | 43 MachineId: 0, |
44 ProviderType: "ec2", | 44 ProviderType: "ec2", |
45 AuthorizedKeys: "sshkey1", | 45 AuthorizedKeys: "sshkey1", |
46 Tools: newSimpleTools("1.2.3-linux-amd64"), | 46 Tools: newSimpleTools("1.2.3-linux-amd64"), |
47 StateServer: true, | 47 StateServer: true, |
48 » » StateServerPEM: serverPEM, | 48 » » StateServerCert: serverCert, |
| 49 » » StateServerKey: serverKey, |
49 StateInfo: &state.Info{ | 50 StateInfo: &state.Info{ |
50 Password: "arble", | 51 Password: "arble", |
51 }, | 52 }, |
52 Config: envConfig, | 53 Config: envConfig, |
53 DataDir: "/var/lib/juju", | 54 DataDir: "/var/lib/juju", |
54 }, | 55 }, |
55 { | 56 { |
56 MachineId: 99, | 57 MachineId: 99, |
57 ProviderType: "ec2", | 58 ProviderType: "ec2", |
58 AuthorizedKeys: "sshkey1", | 59 AuthorizedKeys: "sshkey1", |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 {"missing environment configuration", func(cfg *cloudinit.MachineConfig)
{ | 253 {"missing environment configuration", func(cfg *cloudinit.MachineConfig)
{ |
253 cfg.Config = nil | 254 cfg.Config = nil |
254 }}, | 255 }}, |
255 {"missing state info", func(cfg *cloudinit.MachineConfig) { | 256 {"missing state info", func(cfg *cloudinit.MachineConfig) { |
256 cfg.StateInfo = nil | 257 cfg.StateInfo = nil |
257 }}, | 258 }}, |
258 {"missing state hosts", func(cfg *cloudinit.MachineConfig) { | 259 {"missing state hosts", func(cfg *cloudinit.MachineConfig) { |
259 cfg.StateServer = false | 260 cfg.StateServer = false |
260 cfg.StateInfo = &state.Info{EntityName: "machine-99"} | 261 cfg.StateInfo = &state.Info{EntityName: "machine-99"} |
261 }}, | 262 }}, |
262 » {"missing state server PEM", func(cfg *cloudinit.MachineConfig) { | 263 » {"missing state server certificate", func(cfg *cloudinit.MachineConfig)
{ |
263 » » cfg.StateServerPEM = []byte{} | 264 » » cfg.StateServerCert = []byte{} |
| 265 » }}, |
| 266 » {"missing state server private key", func(cfg *cloudinit.MachineConfig)
{ |
| 267 » » cfg.StateServerKey = []byte{} |
264 }}, | 268 }}, |
265 {"missing var directory", func(cfg *cloudinit.MachineConfig) { | 269 {"missing var directory", func(cfg *cloudinit.MachineConfig) { |
266 cfg.DataDir = "" | 270 cfg.DataDir = "" |
267 }}, | 271 }}, |
268 {"missing tools", func(cfg *cloudinit.MachineConfig) { | 272 {"missing tools", func(cfg *cloudinit.MachineConfig) { |
269 cfg.Tools = nil | 273 cfg.Tools = nil |
270 }}, | 274 }}, |
271 {"missing tools URL", func(cfg *cloudinit.MachineConfig) { | 275 {"missing tools URL", func(cfg *cloudinit.MachineConfig) { |
272 cfg.Tools = &state.Tools{} | 276 cfg.Tools = &state.Tools{} |
273 }}, | 277 }}, |
(...skipping 23 matching lines...) Expand all Loading... |
297 {"password has disallowed characters", func(cfg *cloudinit.MachineConfig
) { | 301 {"password has disallowed characters", func(cfg *cloudinit.MachineConfig
) { |
298 cfg.StateInfo.Password = "\n" | 302 cfg.StateInfo.Password = "\n" |
299 }}, | 303 }}, |
300 } | 304 } |
301 | 305 |
302 // TestCloudInitVerify checks that required fields are appropriately | 306 // TestCloudInitVerify checks that required fields are appropriately |
303 // checked for by NewCloudInit. | 307 // checked for by NewCloudInit. |
304 func (cloudinitSuite) TestCloudInitVerify(c *C) { | 308 func (cloudinitSuite) TestCloudInitVerify(c *C) { |
305 cfg := &cloudinit.MachineConfig{ | 309 cfg := &cloudinit.MachineConfig{ |
306 StateServer: true, | 310 StateServer: true, |
307 » » StateServerPEM: serverPEM, | 311 » » StateServerCert: serverCert, |
| 312 » » StateServerKey: serverKey, |
308 InstanceIdAccessor: "$instance_id", | 313 InstanceIdAccessor: "$instance_id", |
309 ProviderType: "ec2", | 314 ProviderType: "ec2", |
310 MachineId: 99, | 315 MachineId: 99, |
311 Tools: newSimpleTools("9.9.9-linux-arble"), | 316 Tools: newSimpleTools("9.9.9-linux-arble"), |
312 AuthorizedKeys: "sshkey1", | 317 AuthorizedKeys: "sshkey1", |
313 StateInfo: &state.Info{ | 318 StateInfo: &state.Info{ |
314 Addrs: []string{"host"}, | 319 Addrs: []string{"host"}, |
315 }, | 320 }, |
316 Config: envConfig, | 321 Config: envConfig, |
317 DataDir: "/var/lib/juju", | 322 DataDir: "/var/lib/juju", |
318 } | 323 } |
319 // check that the base configuration does not give an error | 324 // check that the base configuration does not give an error |
320 _, err := cloudinit.New(cfg) | 325 _, err := cloudinit.New(cfg) |
321 c.Assert(err, IsNil) | 326 c.Assert(err, IsNil) |
322 | 327 |
323 for i, test := range verifyTests { | 328 for i, test := range verifyTests { |
324 c.Logf("test %d. %s", i, test.err) | 329 c.Logf("test %d. %s", i, test.err) |
325 cfg1 := *cfg | 330 cfg1 := *cfg |
326 test.mutate(&cfg1) | 331 test.mutate(&cfg1) |
327 t, err := cloudinit.New(&cfg1) | 332 t, err := cloudinit.New(&cfg1) |
328 c.Assert(err, ErrorMatches, "invalid machine configuration: "+te
st.err) | 333 c.Assert(err, ErrorMatches, "invalid machine configuration: "+te
st.err) |
329 c.Assert(t, IsNil) | 334 c.Assert(t, IsNil) |
330 } | 335 } |
331 } | 336 } |
332 | 337 |
333 var serverPEM = []byte(` | 338 var serverCert = []byte(` |
334 -----BEGIN CERTIFICATE----- | 339 -----BEGIN CERTIFICATE----- |
335 MIIBdzCCASOgAwIBAgIBADALBgkqhkiG9w0BAQUwHjENMAsGA1UEChMEanVqdTEN | 340 MIIBdzCCASOgAwIBAgIBADALBgkqhkiG9w0BAQUwHjENMAsGA1UEChMEanVqdTEN |
336 MAsGA1UEAxMEcm9vdDAeFw0xMjExMDgxNjIyMzRaFw0xMzExMDgxNjI3MzRaMBwx | 341 MAsGA1UEAxMEcm9vdDAeFw0xMjExMDgxNjIyMzRaFw0xMzExMDgxNjI3MzRaMBwx |
337 DDAKBgNVBAoTA2htbTEMMAoGA1UEAxMDYW55MFowCwYJKoZIhvcNAQEBA0sAMEgC | 342 DDAKBgNVBAoTA2htbTEMMAoGA1UEAxMDYW55MFowCwYJKoZIhvcNAQEBA0sAMEgC |
338 QQCACqz6JPwM7nbxAWub+APpnNB7myckWJ6nnsPKi9SipP1hyhfzkp8RGMJ5Uv7y | 343 QQCACqz6JPwM7nbxAWub+APpnNB7myckWJ6nnsPKi9SipP1hyhfzkp8RGMJ5Uv7y |
339 8CSTtJ8kg/ibka1VV8LvP9tnAgMBAAGjUjBQMA4GA1UdDwEB/wQEAwIAsDAdBgNV | 344 8CSTtJ8kg/ibka1VV8LvP9tnAgMBAAGjUjBQMA4GA1UdDwEB/wQEAwIAsDAdBgNV |
340 HQ4EFgQU6G1ERaHCgfAv+yoDMFVpDbLOmIQwHwYDVR0jBBgwFoAUP/mfUdwOlHfk | 345 HQ4EFgQU6G1ERaHCgfAv+yoDMFVpDbLOmIQwHwYDVR0jBBgwFoAUP/mfUdwOlHfk |
341 fR+gLQjslxf64w0wCwYJKoZIhvcNAQEFA0EAbn0MaxWVgGYBomeLYfDdb8vCq/5/ | 346 fR+gLQjslxf64w0wCwYJKoZIhvcNAQEFA0EAbn0MaxWVgGYBomeLYfDdb8vCq/5/ |
342 G/2iCUQCXsVrBparMLFnor/iKOkJB5n3z3rtu70rFt+DpX6L8uBR3LB3+A== | 347 G/2iCUQCXsVrBparMLFnor/iKOkJB5n3z3rtu70rFt+DpX6L8uBR3LB3+A== |
343 -----END CERTIFICATE----- | 348 -----END CERTIFICATE----- |
| 349 `) |
| 350 |
| 351 var serverKey = []byte(` |
344 -----BEGIN RSA PRIVATE KEY----- | 352 -----BEGIN RSA PRIVATE KEY----- |
345 MIIBPAIBAAJBAIAKrPok/AzudvEBa5v4A+mc0HubJyRYnqeew8qL1KKk/WHKF/OS | 353 MIIBPAIBAAJBAIAKrPok/AzudvEBa5v4A+mc0HubJyRYnqeew8qL1KKk/WHKF/OS |
346 nxEYwnlS/vLwJJO0nySD+JuRrVVXwu8/22cCAwEAAQJBAJsk1F0wTRuaIhJ5xxqw | 354 nxEYwnlS/vLwJJO0nySD+JuRrVVXwu8/22cCAwEAAQJBAJsk1F0wTRuaIhJ5xxqw |
347 FIWPFep/n5jhrDOsIs6cSaRbfIBy3rAl956pf/MHKvf/IXh7KlG9p36IW49hjQHK | 355 FIWPFep/n5jhrDOsIs6cSaRbfIBy3rAl956pf/MHKvf/IXh7KlG9p36IW49hjQHK |
348 7HkCIQD2CqyV1ppNPFSoCI8mSwO8IZppU3i2V4MhpwnqHz3H0wIhAIU5XIlhLJW8 | 356 7HkCIQD2CqyV1ppNPFSoCI8mSwO8IZppU3i2V4MhpwnqHz3H0wIhAIU5XIlhLJW8 |
349 TNOaFMEia/TuYofdwJnYvi9t0v4UKBWdAiEA76AtvjEoTpi3in/ri0v78zp2/KXD | 357 TNOaFMEia/TuYofdwJnYvi9t0v4UKBWdAiEA76AtvjEoTpi3in/ri0v78zp2/KXD |
350 JzPMDvZ0fYS30ukCIA1stlJxpFiCXQuFn0nG+jH4Q52FTv8xxBhrbLOFvHRRAiEA | 358 JzPMDvZ0fYS30ukCIA1stlJxpFiCXQuFn0nG+jH4Q52FTv8xxBhrbLOFvHRRAiEA |
351 2Vc9NN09ty+HZgxpwqIA1fHVuYJY9GMPG1LnTnZ9INg= | 359 2Vc9NN09ty+HZgxpwqIA1fHVuYJY9GMPG1LnTnZ9INg= |
352 -----END RSA PRIVATE KEY----- | 360 -----END RSA PRIVATE KEY----- |
353 `[1:]) | 361 `[1:]) |
LEFT | RIGHT |