Merge lp:~gz/juju-core/openstack_network_config_1241674 into lp:~go-bot/juju-core/trunk

Proposed by Martin Packman
Status: Merged
Approved by: Martin Packman
Approved revision: no longer in the source branch.
Merged at revision: 2255
Proposed branch: lp:~gz/juju-core/openstack_network_config_1241674
Merge into: lp:~go-bot/juju-core/trunk
Diff against target: 281 lines (+148/-9)
6 files modified
dependencies.tsv (+1/-1)
provider/openstack/config.go (+6/-0)
provider/openstack/config_test.go (+11/-0)
provider/openstack/export_test.go (+5/-0)
provider/openstack/local_test.go (+70/-0)
provider/openstack/provider.go (+55/-8)
To merge this branch: bzr merge lp:~gz/juju-core/openstack_network_config_1241674
Reviewer Review Type Date Requested Status
Juju Engineering Pending
Review via email: mp+203114@code.launchpad.net

Commit message

provider/openstack: Add network config option

Resolve issue with running juju on openstack setups with
multiple networks, by allowing the user to supply a
network label or id that juju should use for its machines.

https://codereview.appspot.com/52710048/

R=natefinch

Description of the change

provider/openstack: Add network config option

Resolve issue with running juju on openstack setups with
multiple networks, by allowing the user to supply a
network label or id that juju should use for its machines.

https://codereview.appspot.com/52710048/

To post a comment you must log in.
Revision history for this message
Martin Packman (gz) wrote :

Reviewers: mp+203114_code.launchpad.net,

Message:
Please take a look.

Description:
provider/openstack: Add network config option

Resolve issue with running juju on openstack setups with
multiple networks, by allowing the user to supply a
network label or id that juju should use for its machines.

Note: this still requires a dependencies.tsv goose bump

https://code.launchpad.net/~gz/juju-core/openstack_network_config_1241674/+merge/203114

(do not edit description out of merge proposal)

Please review this at https://codereview.appspot.com/52710048/

Affected files (+146, -8 lines):
   A [revision details]
   M provider/openstack/config.go
   M provider/openstack/config_test.go
   M provider/openstack/export_test.go
   M provider/openstack/local_test.go
   M provider/openstack/provider.go

Revision history for this message
William Reade (fwereade) wrote :

quick comments -- thoughts?

https://codereview.appspot.com/52710048/diff/1/provider/openstack/config.go
File provider/openstack/config.go (right):

https://codereview.appspot.com/52710048/diff/1/provider/openstack/config.go#newcode42
provider/openstack/config.go:42: "network": "",
this feels like maybe it should be an Omit?

https://codereview.appspot.com/52710048/diff/1/provider/openstack/config.go#newcode95
provider/openstack/config.go:95: return c.attrs["network"].(string)
and this a `,ok`?

https://codereview.appspot.com/52710048/diff/1/provider/openstack/local_test.go
File provider/openstack/local_test.go (right):

https://codereview.appspot.com/52710048/diff/1/provider/openstack/local_test.go#newcode364
provider/openstack/local_test.go:364: "network":
"f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
a thought: default-network? private-network?

https://codereview.appspot.com/52710048/diff/1/provider/openstack/local_test.go#newcode371
provider/openstack/local_test.go:371: c.Assert(err, gc.ErrorMatches,
"(?s)cannot run instance: .*itemNotFound.*")
I'd like to see a more precise error check here really.

https://codereview.appspot.com/52710048/

Revision history for this message
Martin Packman (gz) wrote :

Please take a look.

https://codereview.appspot.com/52710048/diff/1/provider/openstack/local_test.go
File provider/openstack/local_test.go (right):

https://codereview.appspot.com/52710048/diff/1/provider/openstack/local_test.go#newcode364
provider/openstack/local_test.go:364: "network":
"f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
On 2014/01/24 16:53:49, fwereade wrote:
> a thought: default-network? private-network?

Yeah, config named 'network' is bad, but I think config for this at all
is bad. And it should take multiple values. I am resolved to leave some
bikeshedding for post 1.17.1 over this. :)

https://codereview.appspot.com/52710048/diff/1/provider/openstack/local_test.go#newcode371
provider/openstack/local_test.go:371: c.Assert(err, gc.ErrorMatches,
"(?s)cannot run instance: .*itemNotFound.*")
On 2014/01/24 16:53:49, fwereade wrote:
> I'd like to see a more precise error check here really.

Sadly our errors through goose are massively verbose, and the real
errors from (older at least) openstack versions are actually this
impresice. It might be an argument for doing more prechecking even when
a valid uuid is supplied.

https://codereview.appspot.com/52710048/

Revision history for this message
Martin Packman (gz) wrote :

Please take a look.

https://codereview.appspot.com/52710048/diff/1/provider/openstack/local_test.go
File provider/openstack/local_test.go (right):

https://codereview.appspot.com/52710048/diff/1/provider/openstack/local_test.go#newcode364
provider/openstack/local_test.go:364: "network":
"f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
On 2014/01/24 16:53:49, fwereade wrote:
> a thought: default-network? private-network?

Yeah, config named 'network' is bad, but I think config for this at all
is bad. And it should take multiple values. I am resolved to leave some
bikeshedding for post 1.17.1 over this. :)

https://codereview.appspot.com/52710048/diff/1/provider/openstack/local_test.go#newcode371
provider/openstack/local_test.go:371: c.Assert(err, gc.ErrorMatches,
"(?s)cannot run instance: .*itemNotFound.*")
On 2014/01/24 16:53:49, fwereade wrote:
> I'd like to see a more precise error check here really.

Sadly our errors through goose are massively verbose, and the real
errors from (older at least) openstack versions are actually this
impresice. It might be an argument for doing more prechecking even when
a valid uuid is supplied.

https://codereview.appspot.com/52710048/

Revision history for this message
Nate Finch (natefinch) wrote :

LGTM with a couple small points.

https://codereview.appspot.com/52710048/diff/20001/provider/openstack/provider.go
File provider/openstack/provider.go (right):

https://codereview.appspot.com/52710048/diff/20001/provider/openstack/provider.go#newcode79
provider/openstack/provider.go:79: # networks specifies the network
label or uuid to bring machines up on, in
s/networks/network

https://codereview.appspot.com/52710048/diff/20001/provider/openstack/provider.go#newcode642
provider/openstack/provider.go:642: var uuidRegexp =
regexp.MustCompile(uuidPattern)
Seems like there ought to be a function that verifies guids in Go
instead of hand-writing a regex...

https://codereview.appspot.com/52710048/

Revision history for this message
Nate Finch (natefinch) wrote :

LGTM with a couple small points.

https://codereview.appspot.com/52710048/diff/20001/provider/openstack/provider.go
File provider/openstack/provider.go (right):

https://codereview.appspot.com/52710048/diff/20001/provider/openstack/provider.go#newcode79
provider/openstack/provider.go:79: # networks specifies the network
label or uuid to bring machines up on, in
s/networks/network

https://codereview.appspot.com/52710048/diff/20001/provider/openstack/provider.go#newcode642
provider/openstack/provider.go:642: var uuidRegexp =
regexp.MustCompile(uuidPattern)
Seems like there ought to be a function that verifies guids in Go
instead of hand-writing a regex...

https://codereview.appspot.com/52710048/

Revision history for this message
Martin Packman (gz) wrote :

Please take a look.

https://codereview.appspot.com/52710048/diff/20001/provider/openstack/provider.go
File provider/openstack/provider.go (right):

https://codereview.appspot.com/52710048/diff/20001/provider/openstack/provider.go#newcode79
provider/openstack/provider.go:79: # networks specifies the network
label or uuid to bring machines up on, in
On 2014/01/24 20:12:45, nate.finch wrote:
> s/networks/network

Will fix... I did plan to allow supplying multiple initially, but we'll
leave that for later.

https://codereview.appspot.com/52710048/diff/20001/provider/openstack/provider.go#newcode642
provider/openstack/provider.go:642: var uuidRegexp =
regexp.MustCompile(uuidPattern)
On 2014/01/24 20:12:45, nate.finch wrote:
> Seems like there ought to be a function that verifies guids in Go
instead of
> hand-writing a regex...

Yes, yes there should. The best I could find was:

<https://github.com/nu7hatch/gouuid/blob/master/uuid.go>

https://codereview.appspot.com/52710048/

Revision history for this message
Go Bot (go-bot) wrote :
Download full text (104.9 KiB)

The attempt to merge lp:~gz/juju-core/openstack_network_config_1241674 into lp:juju-core failed. Below is the output from the failed tests.

ok launchpad.net/juju-core/agent 1.372s
ok launchpad.net/juju-core/agent/tools 0.281s
ok launchpad.net/juju-core/bzr 8.517s
ok launchpad.net/juju-core/cert 3.220s
ok launchpad.net/juju-core/charm 0.685s
? launchpad.net/juju-core/charm/hooks [no test files]
? launchpad.net/juju-core/charm/testing [no test files]
ok launchpad.net/juju-core/cloudinit 0.034s
ok launchpad.net/juju-core/cloudinit/sshinit 1.075s
ok launchpad.net/juju-core/cmd 0.276s
ok launchpad.net/juju-core/cmd/charm-admin 0.869s
? launchpad.net/juju-core/cmd/charmd [no test files]
? launchpad.net/juju-core/cmd/charmload [no test files]
ok launchpad.net/juju-core/cmd/juju 259.043s

----------------------------------------------------------------------
FAIL: machine_test.go:278: MachineSuite.TestManageEnviron

[LOG] 83.93422 DEBUG juju.environs.configstore Making /tmp/gocheck-2202916659517317514/50/home/ubuntu/.juju/environments
[LOG] 84.05088 DEBUG juju.environs.tools reading v1.* tools
[LOG] 84.05098 INFO juju environs/testing: uploading FAKE tools 1.17.1-precise-amd64
[LOG] 84.05221 DEBUG juju.environs.tools no architecture specified when finding tools, looking for any
[LOG] 84.05222 DEBUG juju.environs.tools no series specified when finding tools, looking for any
[LOG] 84.05233 DEBUG juju.environs.simplestreams fetchData failed for "http://127.0.0.1:53656/dummyenv/private/tools/streams/v1/index.sjson": file "tools/streams/v1/index.sjson" not found not found
[LOG] 84.05236 DEBUG juju.environs.simplestreams cannot load index "http://127.0.0.1:53656/dummyenv/private/tools/streams/v1/index.sjson": invalid URL "http://127.0.0.1:53656/dummyenv/private/tools/streams/v1/index.sjson" not found
[LOG] 84.05240 DEBUG juju.environs.simplestreams fetchData failed for "http://127.0.0.1:53656/dummyenv/private/tools/streams/v1/index.json": file "tools/streams/v1/index.json" not found not found
[LOG] 84.05242 DEBUG juju.environs.simplestreams cannot load index "http://127.0.0.1:53656/dummyenv/private/tools/streams/v1/index.json": invalid URL "http://127.0.0.1:53656/dummyenv/private/tools/streams/v1/index.json" not found
[LOG] 84.05287 INFO juju.environs.tools Writing tools/streams/v1/index.json
[LOG] 84.05294 INFO juju.environs.tools Writing tools/streams/v1/com.ubuntu.juju:released:tools.json
[LOG] 84.05313 INFO juju.environs.bootstrap bootstrapping environment "dummyenv"
[LOG] 84.05321 DEBUG juju.environs.bootstrap looking for bootstrap tools: series="precise", arch=<nil>, version=1.17.1
[LOG] 84.05324 INFO juju.environs.tools reading tools with major.minor version 1.17
[LOG] 84.05328 INFO juju.environs.tools filtering tools by version: 1.17.1
[LOG] 84.05328 INFO juju.environs.tools filtering tools by series: precise
[LOG] 84.05331 DEBUG juju.environs.tools no architecture specified when finding tools, looking for any
[LOG] 84.05333 DEBUG juju.environs.simplestreams fetchData failed for "http://127.0.0.1:53656/dummyenv/private/tools/streams/v1/index.sjson": file "tools/streams/v1/index.sjson" not found not found
[LOG] 84.05...

Revision history for this message
Go Bot (go-bot) wrote :
Download full text (57.2 KiB)

The attempt to merge lp:~gz/juju-core/openstack_network_config_1241674 into lp:juju-core failed. Below is the output from the failed tests.

ok launchpad.net/juju-core/agent 1.542s
ok launchpad.net/juju-core/agent/tools 0.285s
ok launchpad.net/juju-core/bzr 8.752s
ok launchpad.net/juju-core/cert 3.794s
ok launchpad.net/juju-core/charm 0.619s
? launchpad.net/juju-core/charm/hooks [no test files]
? launchpad.net/juju-core/charm/testing [no test files]
ok launchpad.net/juju-core/cloudinit 0.040s
ok launchpad.net/juju-core/cloudinit/sshinit 1.063s
ok launchpad.net/juju-core/cmd 0.224s
ok launchpad.net/juju-core/cmd/charm-admin 0.836s
? launchpad.net/juju-core/cmd/charmd [no test files]
? launchpad.net/juju-core/cmd/charmload [no test files]
ok launchpad.net/juju-core/cmd/juju 232.068s

----------------------------------------------------------------------
FAIL: machine_test.go:329: MachineSuite.TestManageEnvironRunsInstancePoller

[LOG] 51.17876 DEBUG juju.environs.configstore Making /tmp/gocheck-5793183108815074904/64/home/ubuntu/.juju/environments
[LOG] 51.26292 DEBUG juju.environs.tools reading v1.* tools
[LOG] 51.26297 INFO juju environs/testing: uploading FAKE tools 1.17.1-precise-amd64
[LOG] 51.27510 DEBUG juju.environs.tools no architecture specified when finding tools, looking for any
[LOG] 51.27512 DEBUG juju.environs.tools no series specified when finding tools, looking for any
[LOG] 51.27519 DEBUG juju.environs.simplestreams fetchData failed for "http://127.0.0.1:40458/dummyenv/private/tools/streams/v1/index.sjson": file "tools/streams/v1/index.sjson" not found not found
[LOG] 51.27521 DEBUG juju.environs.simplestreams cannot load index "http://127.0.0.1:40458/dummyenv/private/tools/streams/v1/index.sjson": invalid URL "http://127.0.0.1:40458/dummyenv/private/tools/streams/v1/index.sjson" not found
[LOG] 51.27525 DEBUG juju.environs.simplestreams fetchData failed for "http://127.0.0.1:40458/dummyenv/private/tools/streams/v1/index.json": file "tools/streams/v1/index.json" not found not found
[LOG] 51.27527 DEBUG juju.environs.simplestreams cannot load index "http://127.0.0.1:40458/dummyenv/private/tools/streams/v1/index.json": invalid URL "http://127.0.0.1:40458/dummyenv/private/tools/streams/v1/index.json" not found
[LOG] 51.27555 INFO juju.environs.tools Writing tools/streams/v1/index.json
[LOG] 51.27564 INFO juju.environs.tools Writing tools/streams/v1/com.ubuntu.juju:released:tools.json
[LOG] 51.27579 INFO juju.environs.bootstrap bootstrapping environment "dummyenv"
[LOG] 51.27585 DEBUG juju.environs.bootstrap looking for bootstrap tools: series="precise", arch=<nil>, version=1.17.1
[LOG] 51.27586 INFO juju.environs.tools reading tools with major.minor version 1.17
[LOG] 51.27588 INFO juju.environs.tools filtering tools by version: 1.17.1
[LOG] 51.27588 INFO juju.environs.tools filtering tools by series: precise
[LOG] 51.27590 DEBUG juju.environs.tools no architecture specified when finding tools, looking for any
[LOG] 51.27594 DEBUG juju.environs.simplestreams fetchData failed for "http://127.0.0.1:40458/dummyenv/private/tools/streams/v1/index.sjson": file "tools/streams/v1/index.sjson" not found not...

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'dependencies.tsv'
--- dependencies.tsv 2014-01-22 01:37:16 +0000
+++ dependencies.tsv 2014-01-24 20:43:20 +0000
@@ -6,7 +6,7 @@
6launchpad.net/gocheck bzr gustavo@niemeyer.net-20130302024745-6ikofwq2c03h7giu 856launchpad.net/gocheck bzr gustavo@niemeyer.net-20130302024745-6ikofwq2c03h7giu 85
7launchpad.net/golxc bzr ian.booth@canonical.com-20140116225718-lvoikrb0me6zugin 67launchpad.net/golxc bzr ian.booth@canonical.com-20140116225718-lvoikrb0me6zugin 6
8launchpad.net/gomaasapi bzr ian.booth@canonical.com-20131017011445-m1hmr0ap14osd7li 478launchpad.net/gomaasapi bzr ian.booth@canonical.com-20131017011445-m1hmr0ap14osd7li 47
9launchpad.net/goose bzr tarmac-20131223000240-y2igxjt3kznam7vi 1149launchpad.net/goose bzr tarmac-20140124165235-h9rloooc531udms5 116
10launchpad.net/goyaml bzr gustavo@niemeyer.net-20131114120802-abe042syx64z2m7s 5010launchpad.net/goyaml bzr gustavo@niemeyer.net-20131114120802-abe042syx64z2m7s 50
11launchpad.net/gwacl bzr tarmac-20131031081035-b33m6fyrrdiuf408 22911launchpad.net/gwacl bzr tarmac-20131031081035-b33m6fyrrdiuf408 229
12launchpad.net/loggo bzr tim.penhey@canonical.com-20130729043644-ym0cscir1cist4sm 3912launchpad.net/loggo bzr tim.penhey@canonical.com-20130729043644-ym0cscir1cist4sm 39
1313
=== modified file 'provider/openstack/config.go'
--- provider/openstack/config.go 2013-12-23 00:46:18 +0000
+++ provider/openstack/config.go 2014-01-24 20:43:20 +0000
@@ -25,6 +25,7 @@
25 "control-bucket": schema.String(),25 "control-bucket": schema.String(),
26 "use-floating-ip": schema.Bool(),26 "use-floating-ip": schema.Bool(),
27 "use-default-secgroup": schema.Bool(),27 "use-default-secgroup": schema.Bool(),
28 "network": schema.String(),
28}29}
29var configDefaults = schema.Defaults{30var configDefaults = schema.Defaults{
30 "username": "",31 "username": "",
@@ -38,6 +39,7 @@
38 "control-bucket": "",39 "control-bucket": "",
39 "use-floating-ip": false,40 "use-floating-ip": false,
40 "use-default-secgroup": false,41 "use-default-secgroup": false,
42 "network": "",
41}43}
4244
43type environConfig struct {45type environConfig struct {
@@ -89,6 +91,10 @@
89 return c.attrs["use-default-secgroup"].(bool)91 return c.attrs["use-default-secgroup"].(bool)
90}92}
9193
94func (c *environConfig) network() string {
95 return c.attrs["network"].(string)
96}
97
92func (p environProvider) newConfig(cfg *config.Config) (*environConfig, error) {98func (p environProvider) newConfig(cfg *config.Config) (*environConfig, error) {
93 valid, err := p.Validate(cfg, nil)99 valid, err := p.Validate(cfg, nil)
94 if err != nil {100 if err != nil {
95101
=== modified file 'provider/openstack/config_test.go'
--- provider/openstack/config_test.go 2013-12-23 00:46:18 +0000
+++ provider/openstack/config_test.go 2014-01-24 20:43:20 +0000
@@ -58,6 +58,7 @@
58 toolsURL string58 toolsURL string
59 useFloatingIP bool59 useFloatingIP bool
60 useDefaultSecurityGroup bool60 useDefaultSecurityGroup bool
61 network string
61 username string62 username string
62 password string63 password string
63 tenantName string64 tenantName string
@@ -161,6 +162,7 @@
161 }162 }
162 c.Assert(ecfg.useFloatingIP(), gc.Equals, t.useFloatingIP)163 c.Assert(ecfg.useFloatingIP(), gc.Equals, t.useFloatingIP)
163 c.Assert(ecfg.useDefaultSecurityGroup(), gc.Equals, t.useDefaultSecurityGroup)164 c.Assert(ecfg.useDefaultSecurityGroup(), gc.Equals, t.useDefaultSecurityGroup)
165 c.Assert(ecfg.network(), gc.Equals, t.network)
164 // Default should be true166 // Default should be true
165 expectedHostnameVerification := true167 expectedHostnameVerification := true
166 if t.sslHostnameSet {168 if t.sslHostnameSet {
@@ -430,6 +432,15 @@
430 },432 },
431 sslHostnameVerification: true,433 sslHostnameVerification: true,
432 sslHostnameSet: true,434 sslHostnameSet: true,
435 }, {
436 summary: "default network",
437 network: "",
438 }, {
439 summary: "network",
440 config: attrs{
441 "network": "a-network-label",
442 },
443 network: "a-network-label",
433 },444 },
434}445}
435446
436447
=== modified file 'provider/openstack/export_test.go'
--- provider/openstack/export_test.go 2013-12-10 04:25:06 +0000
+++ provider/openstack/export_test.go 2014-01-24 20:43:20 +0000
@@ -311,3 +311,8 @@
311func GetNovaClient(e environs.Environ) *nova.Client {311func GetNovaClient(e environs.Environ) *nova.Client {
312 return e.(*environ).nova()312 return e.(*environ).nova()
313}313}
314
315// ResolveNetwork exposes environ helper function resolveNetwork for testing
316func ResolveNetwork(e environs.Environ, networkName string) (string, error) {
317 return e.(*environ).resolveNetwork(networkName)
318}
314319
=== modified file 'provider/openstack/local_test.go'
--- provider/openstack/local_test.go 2013-12-20 02:38:56 +0000
+++ provider/openstack/local_test.go 2014-01-24 20:43:20 +0000
@@ -332,6 +332,48 @@
332 c.Assert(hc.CpuPower, gc.IsNil)332 c.Assert(hc.CpuPower, gc.IsNil)
333}333}
334334
335func (s *localServerSuite) TestStartInstanceNetwork(c *gc.C) {
336 cfg, err := config.New(config.NoDefaults, s.TestConfig.Merge(coretesting.Attrs{
337 // A label that corresponds to a nova test service network
338 "network": "net",
339 }))
340 c.Assert(err, gc.IsNil)
341 env, err := environs.New(cfg)
342 c.Assert(err, gc.IsNil)
343 inst, _ := testing.AssertStartInstance(c, env, "100")
344 err = env.StopInstances([]instance.Instance{inst})
345 c.Assert(err, gc.IsNil)
346}
347
348func (s *localServerSuite) TestStartInstanceNetworkUnknownLabel(c *gc.C) {
349 cfg, err := config.New(config.NoDefaults, s.TestConfig.Merge(coretesting.Attrs{
350 // A label that has no related network in the nova test service
351 "network": "no-network-with-this-label",
352 }))
353 c.Assert(err, gc.IsNil)
354 env, err := environs.New(cfg)
355 c.Assert(err, gc.IsNil)
356 inst, _, err := testing.StartInstance(env, "100")
357 c.Check(inst, gc.IsNil)
358 c.Assert(err, gc.ErrorMatches, "No networks exist with label .*")
359}
360
361func (s *localServerSuite) TestStartInstanceNetworkUnknownId(c *gc.C) {
362 cfg, err := config.New(config.NoDefaults, s.TestConfig.Merge(coretesting.Attrs{
363 // A valid UUID but no related network in the nova test service
364 "network": "f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
365 }))
366 c.Assert(err, gc.IsNil)
367 env, err := environs.New(cfg)
368 c.Assert(err, gc.IsNil)
369 inst, _, err := testing.StartInstance(env, "100")
370 c.Check(inst, gc.IsNil)
371 c.Assert(err, gc.ErrorMatches, "cannot run instance: (\\n|.)*"+
372 "caused by: "+
373 "request \\(.*/servers\\) returned unexpected status: "+
374 "404; error info: .*itemNotFound.*")
375}
376
335var instanceGathering = []struct {377var instanceGathering = []struct {
336 ids []instance.Id378 ids []instance.Id
337 err error379 err error
@@ -939,3 +981,31 @@
939 c.Assert(err, gc.IsNil)981 c.Assert(err, gc.IsNil)
940 c.Check(insts, gc.HasLen, 1)982 c.Check(insts, gc.HasLen, 1)
941}983}
984
985func (s *localServerSuite) TestResolveNetworkUUID(c *gc.C) {
986 env := s.Prepare(c)
987 var sampleUUID = "f81d4fae-7dec-11d0-a765-00a0c91e6bf6"
988 networkId, err := openstack.ResolveNetwork(env, sampleUUID)
989 c.Assert(err, gc.IsNil)
990 c.Assert(networkId, gc.Equals, sampleUUID)
991}
992
993func (s *localServerSuite) TestResolveNetworkLabel(c *gc.C) {
994 env := s.Prepare(c)
995 // For now this test has to cheat and use knowledge of goose internals
996 var networkLabel = "net"
997 var expectNetworkId = "1"
998 networkId, err := openstack.ResolveNetwork(env, networkLabel)
999 c.Assert(err, gc.IsNil)
1000 c.Assert(networkId, gc.Equals, expectNetworkId)
1001}
1002
1003func (s *localServerSuite) TestResolveNetworkNotPresent(c *gc.C) {
1004 env := s.Prepare(c)
1005 var notPresentNetwork = "no-network-with-this-label"
1006 networkId, err := openstack.ResolveNetwork(env, notPresentNetwork)
1007 c.Check(networkId, gc.Equals, "")
1008 c.Assert(err, gc.ErrorMatches, `No networks exist with label "no-network-with-this-label"`)
1009}
1010
1011// TODO(gz): TestResolveNetworkMultipleMatching when can inject new networks
9421012
=== modified file 'provider/openstack/provider.go'
--- provider/openstack/provider.go 2014-01-20 17:18:13 +0000
+++ provider/openstack/provider.go 2014-01-24 20:43:20 +0000
@@ -10,6 +10,7 @@
10 "fmt"10 "fmt"
11 "io/ioutil"11 "io/ioutil"
12 "net/http"12 "net/http"
13 "regexp"
13 "strings"14 "strings"
14 "sync"15 "sync"
15 "time"16 "time"
@@ -75,6 +76,10 @@
75 # Openstack security group assigned.76 # Openstack security group assigned.
76 # use-default-secgroup: false77 # use-default-secgroup: false
7778
79 # network specifies the network label or uuid to bring machines up on, in
80 # the case where multiple networks exist. It may be omitted otherwise.
81 # network: <your network label or uuid>
82
78 # tools-metadata-url specifies the location of the Juju tools and metadata. It defaults to the83 # tools-metadata-url specifies the location of the Juju tools and metadata. It defaults to the
79 # global public tools metadata location https://streams.canonical.com/tools.84 # global public tools metadata location https://streams.canonical.com/tools.
80 # tools-metadata-url: https://you-tools-metadata-url85 # tools-metadata-url: https://you-tools-metadata-url
@@ -631,6 +636,37 @@
631 return e.toolsSources, nil636 return e.toolsSources, nil
632}637}
633638
639// TODO(gz): Move this somewhere more reusable
640const uuidPattern = "^([a-fA-F0-9]{8})-([a-fA-f0-9]{4})-([1-5][a-fA-f0-9]{3})-([a-fA-f0-9]{4})-([a-fA-f0-9]{12})$"
641
642var uuidRegexp = regexp.MustCompile(uuidPattern)
643
644// resolveNetwork takes either a network id or label and returns a network id
645func (e *environ) resolveNetwork(networkName string) (string, error) {
646 if uuidRegexp.MatchString(networkName) {
647 // Network id supplied, assume valid as boot will fail if not
648 return networkName, nil
649 }
650 // Network label supplied, resolve to a network id
651 networks, err := e.nova().ListNetworks()
652 if err != nil {
653 return "", err
654 }
655 var networkIds = []string{}
656 for _, network := range networks {
657 if network.Label == networkName {
658 networkIds = append(networkIds, network.Id)
659 }
660 }
661 switch len(networkIds) {
662 case 1:
663 return networkIds[0], nil
664 case 0:
665 return "", fmt.Errorf("No networks exist with label %q", networkName)
666 }
667 return "", fmt.Errorf("Multiple networks with label %q: %v", networkName, networkIds)
668}
669
634// allocatePublicIP tries to find an available floating IP address, or670// allocatePublicIP tries to find an available floating IP address, or
635// allocates a new one, returning it, or an error671// allocates a new one, returning it, or an error
636func (e *environ) allocatePublicIP() (*nova.FloatingIP, error) {672func (e *environ) allocatePublicIP() (*nova.FloatingIP, error) {
@@ -711,6 +747,16 @@
711 return nil, nil, fmt.Errorf("cannot make user data: %v", err)747 return nil, nil, fmt.Errorf("cannot make user data: %v", err)
712 }748 }
713 logger.Debugf("openstack user data; %d bytes", len(userData))749 logger.Debugf("openstack user data; %d bytes", len(userData))
750 var networks = []nova.ServerNetworks{}
751 usingNetwork := e.ecfg().network()
752 if usingNetwork != "" {
753 networkId, err := e.resolveNetwork(usingNetwork)
754 if err != nil {
755 return nil, nil, err
756 }
757 logger.Debugf("using network id %q", networkId)
758 networks = append(networks, nova.ServerNetworks{NetworkId: networkId})
759 }
714 withPublicIP := e.ecfg().useFloatingIP()760 withPublicIP := e.ecfg().useFloatingIP()
715 var publicIP *nova.FloatingIP761 var publicIP *nova.FloatingIP
716 if withPublicIP {762 if withPublicIP {
@@ -730,16 +776,17 @@
730 for i, g := range groups {776 for i, g := range groups {
731 groupNames[i] = nova.SecurityGroupName{g.Name}777 groupNames[i] = nova.SecurityGroupName{g.Name}
732 }778 }
733779 var opts = nova.RunServerOpts{
780 Name: e.machineFullName(machineConfig.MachineId),
781 FlavorId: spec.InstanceType.Id,
782 ImageId: spec.Image.Id,
783 UserData: userData,
784 SecurityGroupNames: groupNames,
785 Networks: networks,
786 }
734 var server *nova.Entity787 var server *nova.Entity
735 for a := shortAttempt.Start(); a.Next(); {788 for a := shortAttempt.Start(); a.Next(); {
736 server, err = e.nova().RunServer(nova.RunServerOpts{789 server, err = e.nova().RunServer(opts)
737 Name: e.machineFullName(machineConfig.MachineId),
738 FlavorId: spec.InstanceType.Id,
739 ImageId: spec.Image.Id,
740 UserData: userData,
741 SecurityGroupNames: groupNames,
742 })
743 if err == nil || !gooseerrors.IsNotFound(err) {790 if err == nil || !gooseerrors.IsNotFound(err) {
744 break791 break
745 }792 }

Subscribers

People subscribed via source and target branches

to status/vote changes: