Merge lp:~wallyworld/juju-core/add-machine-panic into lp:~go-bot/juju-core/trunk

Proposed by Ian Booth
Status: Merged
Approved by: Ian Booth
Approved revision: no longer in the source branch.
Merged at revision: 1591
Proposed branch: lp:~wallyworld/juju-core/add-machine-panic
Merge into: lp:~go-bot/juju-core/trunk
Diff against target: 351 lines (+93/-135)
9 files modified
cmd/juju/addmachine.go (+1/-1)
cmd/juju/addmachine_test.go (+8/-4)
cmd/juju/addunit.go (+1/-2)
cmd/names.go (+25/-0)
cmd/names_test.go (+36/-0)
names/machine.go (+3/-13)
names/machine_test.go (+3/-32)
names/service_test.go (+16/-1)
state/state_test.go (+0/-82)
To merge this branch: bzr merge lp:~wallyworld/juju-core/add-machine-panic
Reviewer Review Type Date Requested Status
Juju Engineering Pending
Review via email: mp+178185@code.launchpad.net

Commit message

Remove panic for bad arg to add-machine

If add-machine is invoked with a machine id as the
argument, it no longer panics.

The recently refactored IsMachineOrNewContainer
method was moved from the names package to cmd
since it's only used there. Plus there were left
over tests in state which were duplicated in names
and some of the tests were missing so I fix that
as well.

https://codereview.appspot.com/12309043/

Description of the change

Remove panic for bad arg to add-machine

If add-machine is invoked with a machine id as the
argument, it no longer panics.

The recently refactored IsMachineOrNewContainer
method was moved from the names package to cmd
since it's only used there. Plus there were left
over tests in state which were duplicated in names
and some of the tests were missing so I fix that
as well.

https://codereview.appspot.com/12309043/

To post a comment you must log in.
Revision history for this message
Ian Booth (wallyworld) wrote :

Reviewers: mp+178185_code.launchpad.net,

Message:
Please take a look.

Description:
Remove panic for bad arg to add-machine

If add-machine is invoked with a machine id as the
argument, it no longer panics.

The recently refactored IsMachineOrNewContainer
method was moved from the names package to cmd
since it's only used there. Plus there were left
over tests in state which were duplicated in names
and some of the tests were missing so I fix that
as well.

https://code.launchpad.net/~wallyworld/juju-core/add-machine-panic/+merge/178185

(do not edit description out of merge proposal)

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

Affected files:
   A [revision details]
   M cmd/juju/addmachine.go
   M cmd/juju/addmachine_test.go
   M cmd/juju/addunit.go
   A cmd/names.go
   A cmd/names_test.go
   M names/machine.go
   M names/machine_test.go
   M names/service_test.go
   M state/state_test.go

Revision history for this message
Tim Penhey (thumper) wrote :
Revision history for this message
Dimiter Naydenov (dimitern) wrote :
Revision history for this message
Ian Booth (wallyworld) wrote :

https://codereview.appspot.com/12309043/diff/1/cmd/names.go
File cmd/names.go (right):

https://codereview.appspot.com/12309043/diff/1/cmd/names.go#newcode8
cmd/names.go:8: "regexp"
On 2013/08/02 08:51:03, dimitern wrote:
> "regexp"

> "...names"

Done.

https://codereview.appspot.com/12309043/diff/1/cmd/names_test.go
File cmd/names_test.go (right):

https://codereview.appspot.com/12309043/diff/1/cmd/names_test.go#newcode12
cmd/names_test.go:12: type NamesSuite struct {
On 2013/08/02 08:51:03, dimitern wrote:
> s/NamesSuite/namesSuite/ ?

Done.

https://codereview.appspot.com/12309043/diff/1/names/machine.go
File names/machine.go (right):

https://codereview.appspot.com/12309043/diff/1/names/machine.go#newcode14
names/machine.go:14: var (
On 2013/08/02 08:51:03, dimitern wrote:
> var validMachine = ...

Done.

https://codereview.appspot.com/12309043/diff/1/names/service_test.go
File names/service_test.go (right):

https://codereview.appspot.com/12309043/diff/1/names/service_test.go#newcode36
names/service_test.go:36:
On 2013/08/02 08:51:03, dimitern wrote:
> d

Done.

https://codereview.appspot.com/12309043/

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

The attempt to merge lp:~wallyworld/juju-core/add-machine-panic into lp:juju-core failed. Below is the output from the failed tests.

ok launchpad.net/juju-core/agent 1.834s
ok launchpad.net/juju-core/agent/tools 25.645s
ok launchpad.net/juju-core/bzr 6.633s
ok launchpad.net/juju-core/cert 2.235s
ok launchpad.net/juju-core/charm 0.552s
? launchpad.net/juju-core/charm/hooks [no test files]
ok launchpad.net/juju-core/cloudinit 0.024s
ok launchpad.net/juju-core/cmd 0.306s
? launchpad.net/juju-core/cmd/builddb [no test files]
? 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 99.876s
ok launchpad.net/juju-core/cmd/jujud 48.141s
ok launchpad.net/juju-core/cmd/plugins/juju-metadata 0.885s
ok launchpad.net/juju-core/constraints 0.039s
ok launchpad.net/juju-core/container/lxc 0.331s
? launchpad.net/juju-core/container/lxc/mock [no test files]
ok launchpad.net/juju-core/downloader 5.282s
ok launchpad.net/juju-core/environs 1.236s
? launchpad.net/juju-core/environs/all [no test files]
ok launchpad.net/juju-core/environs/azure 3.034s
ok launchpad.net/juju-core/environs/cloudinit 0.482s
ok launchpad.net/juju-core/environs/config 0.696s
ok launchpad.net/juju-core/environs/dummy 15.957s
ok launchpad.net/juju-core/environs/ec2 181.906s
ok launchpad.net/juju-core/environs/imagemetadata 0.305s
ok launchpad.net/juju-core/environs/instances 0.238s
ok launchpad.net/juju-core/environs/jujutest 0.320s
ok launchpad.net/juju-core/environs/local 1.204s
? launchpad.net/juju-core/environs/local/storage [no test files]
ok launchpad.net/juju-core/environs/localstorage 0.203s
ok launchpad.net/juju-core/environs/maas 2.047s
ok launchpad.net/juju-core/environs/openstack 3.827s
? launchpad.net/juju-core/environs/provider [no test files]
ok launchpad.net/juju-core/environs/sync 0.273s
ok launchpad.net/juju-core/environs/testing 0.022s
? launchpad.net/juju-core/errors [no test files]
ok launchpad.net/juju-core/instance 0.032s
ok launchpad.net/juju-core/juju 11.628s
ok launchpad.net/juju-core/juju/osenv 0.237s
? launchpad.net/juju-core/juju/testing [no test files]
ok launchpad.net/juju-core/log 0.018s
ok launchpad.net/juju-core/log/syslog 0.027s
ok launchpad.net/juju-core/names 0.029s
ok launchpad.net/juju-core/rpc 0.259s
ok launchpad.net/juju-core/rpc/jsoncodec 0.222s
ok launchpad.net/juju-core/schema 0.020s
FAIL launchpad.net/juju-core/state [build failed]
? launchpad.net/juju-core/state/api [no test files]
ok launchpad.net/juju-core/state/api/agent 1.784s
? launchpad.net/juju-core/state/api/common [no test files]
ok launchpad.net/juju-core/state/api/deployer 5.224s
ok launchpad.net/juju-core/state/api/machiner 2.556s
ok launchpad.net/juju-core/state/api/params 0.032s
ok launchpad.net/juju-core/state/api/upgrader 2.869s
ok launchpad.net/juju-core/state/api/watcher 2.955s
ok launchpad.net/juju-core/state/apiserver 2.710s
ok launchpad.net/juju-core/state/apiserver/agent 2.529s
ok launchpad.net/juju-core/state/apiserver/client 13.238s
ok launchpad.net/juju-co...

Read more...

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'cmd/juju/addmachine.go'
2--- cmd/juju/addmachine.go 2013-07-30 23:46:30 +0000
3+++ cmd/juju/addmachine.go 2013-08-02 22:26:24 +0000
4@@ -57,7 +57,7 @@
5 }
6 // container arg can either be 'type:machine' or 'type'
7 if c.ContainerType, err = instance.ParseSupportedContainerType(containerSpec); err != nil {
8- if !names.IsMachineOrNewContainer(containerSpec) {
9+ if names.IsMachine(containerSpec) || !cmd.IsMachineOrNewContainer(containerSpec) {
10 return fmt.Errorf("malformed container argument %q", containerSpec)
11 }
12 sep := strings.Index(containerSpec, ":")
13
14=== modified file 'cmd/juju/addmachine_test.go'
15--- cmd/juju/addmachine_test.go 2013-07-16 00:47:26 +0000
16+++ cmd/juju/addmachine_test.go 2013-08-02 22:26:24 +0000
17@@ -92,10 +92,14 @@
18 }
19
20 func (s *AddMachineSuite) TestAddMachineErrors(c *C) {
21- err := runAddMachine(c, ":foo")
22- c.Assert(err, ErrorMatches, `malformed container argument ":foo"`)
23- err = runAddMachine(c, "foo:")
24- c.Assert(err, ErrorMatches, `malformed container argument "foo:"`)
25+ err := runAddMachine(c, ":lxc")
26+ c.Assert(err, ErrorMatches, `malformed container argument ":lxc"`)
27+ err = runAddMachine(c, "lxc:")
28+ c.Assert(err, ErrorMatches, `malformed container argument "lxc:"`)
29+ err = runAddMachine(c, "2")
30+ c.Assert(err, ErrorMatches, `malformed container argument "2"`)
31+ err = runAddMachine(c, "foo")
32+ c.Assert(err, ErrorMatches, `malformed container argument "foo"`)
33 err = runAddMachine(c, "lxc", "--constraints", "container=lxc")
34 c.Assert(err, ErrorMatches, `container constraint "lxc" not allowed when adding a machine`)
35 }
36
37=== modified file 'cmd/juju/addunit.go'
38--- cmd/juju/addunit.go 2013-07-30 23:46:30 +0000
39+++ cmd/juju/addunit.go 2013-08-02 22:26:24 +0000
40@@ -11,7 +11,6 @@
41
42 "launchpad.net/juju-core/cmd"
43 "launchpad.net/juju-core/juju"
44- "launchpad.net/juju-core/names"
45 "launchpad.net/juju-core/state/api/params"
46 "launchpad.net/juju-core/state/statecmd"
47 )
48@@ -36,7 +35,7 @@
49 if c.NumUnits > 1 {
50 return errors.New("cannot use --num-units > 1 with --to")
51 }
52- if !names.IsMachineOrNewContainer(c.ToMachineSpec) {
53+ if !cmd.IsMachineOrNewContainer(c.ToMachineSpec) {
54 return fmt.Errorf("invalid --to parameter %q", c.ToMachineSpec)
55 }
56 }
57
58=== added file 'cmd/names.go'
59--- cmd/names.go 1970-01-01 00:00:00 +0000
60+++ cmd/names.go 2013-08-02 22:26:24 +0000
61@@ -0,0 +1,25 @@
62+// Copyright 2012, 2013 Canonical Ltd.
63+// Licensed under the AGPLv3, see LICENCE file for details.
64+
65+package cmd
66+
67+import (
68+ "regexp"
69+
70+ "launchpad.net/juju-core/names"
71+)
72+
73+const (
74+ ContainerSnippet = "(/[a-z]+/" + names.NumberSnippet + ")"
75+ ContainerSpecSnippet = "([a-z]+:)?"
76+)
77+
78+var (
79+ validMachineOrNewContainer = regexp.MustCompile("^" + ContainerSpecSnippet + names.MachineSnippet + "$")
80+)
81+
82+// IsMachineOrNewContainer returns whether spec is a valid machine id
83+// or new container definition.
84+func IsMachineOrNewContainer(spec string) bool {
85+ return validMachineOrNewContainer.MatchString(spec)
86+}
87
88=== added file 'cmd/names_test.go'
89--- cmd/names_test.go 1970-01-01 00:00:00 +0000
90+++ cmd/names_test.go 2013-08-02 22:26:24 +0000
91@@ -0,0 +1,36 @@
92+// Copyright 2012, 2013 Canonical Ltd.
93+// Licensed under the AGPLv3, see LICENCE file for details.
94+
95+package cmd_test
96+
97+import (
98+ gc "launchpad.net/gocheck"
99+
100+ "launchpad.net/juju-core/cmd"
101+)
102+
103+type namesSuite struct {
104+}
105+
106+var _ = gc.Suite(&namesSuite{})
107+
108+func (*namesSuite) TestNameChecks(c *gc.C) {
109+ assertMachineOrNewContainer := func(s string, expect bool) {
110+ c.Assert(cmd.IsMachineOrNewContainer(s), gc.Equals, expect)
111+ }
112+ assertMachineOrNewContainer("0", true)
113+ assertMachineOrNewContainer("00", false)
114+ assertMachineOrNewContainer("1", true)
115+ assertMachineOrNewContainer("0/lxc/0", true)
116+ assertMachineOrNewContainer("lxc:0", true)
117+ assertMachineOrNewContainer("lxc:lxc:0", false)
118+ assertMachineOrNewContainer("kvm:0/lxc/1", true)
119+ assertMachineOrNewContainer("lxc:", false)
120+ assertMachineOrNewContainer(":lxc", false)
121+ assertMachineOrNewContainer("0/lxc/", false)
122+ assertMachineOrNewContainer("0/lxc", false)
123+ assertMachineOrNewContainer("kvm:0/lxc", false)
124+ assertMachineOrNewContainer("0/lxc/01", false)
125+ assertMachineOrNewContainer("0/lxc/10", true)
126+ assertMachineOrNewContainer("0/kvm/4", true)
127+}
128
129=== modified file 'names/machine.go'
130--- names/machine.go 2013-07-30 18:27:04 +0000
131+++ names/machine.go 2013-08-02 22:26:24 +0000
132@@ -7,27 +7,17 @@
133 )
134
135 const (
136- ContainerSnippet = "(/[a-z]+/" + NumberSnippet + ")"
137- MachineSnippet = NumberSnippet + ContainerSnippet + "*"
138- ContainerSpecSnippet = "([a-z]+:)?"
139+ ContainerSnippet = "(/[a-z]+/" + NumberSnippet + ")"
140+ MachineSnippet = NumberSnippet + ContainerSnippet + "*"
141 )
142
143-var (
144- validMachine = regexp.MustCompile("^" + MachineSnippet + "$")
145- validMachineOrNewContainer = regexp.MustCompile("^" + ContainerSpecSnippet + MachineSnippet + "$")
146-)
147+var validMachine = regexp.MustCompile("^" + MachineSnippet + "$")
148
149 // IsMachine returns whether id is a valid machine id.
150 func IsMachine(id string) bool {
151 return validMachine.MatchString(id)
152 }
153
154-// IsMachineOrNewContainer returns whether spec is a valid machine id
155-// or new container definition.
156-func IsMachineOrNewContainer(spec string) bool {
157- return validMachineOrNewContainer.MatchString(spec)
158-}
159-
160 // MachineTag returns the tag for the machine with the given id.
161 func MachineTag(id string) string {
162 tag := makeTag(MachineTagKind, id)
163
164=== modified file 'names/machine_test.go'
165--- names/machine_test.go 2013-07-31 14:21:38 +0000
166+++ names/machine_test.go 2013-08-02 22:26:24 +0000
167@@ -64,6 +64,9 @@
168 {pattern: "1/foo", valid: false},
169 {pattern: "2/foo/", valid: false},
170 {pattern: "3/lxc/42", valid: true},
171+ {pattern: "3/lxc-nodash/42", valid: false},
172+ {pattern: "0/lxc/00", valid: false},
173+ {pattern: "0/lxc/0/", valid: false},
174 {pattern: "03/lxc/42", valid: false},
175 {pattern: "3/lxc/042", valid: false},
176 {pattern: "4/foo/bar", valid: false},
177@@ -81,35 +84,3 @@
178 c.Assert(names.IsMachine(test.pattern), gc.Equals, test.valid)
179 }
180 }
181-
182-var machineOrNewContainerTests = []struct {
183- pattern string
184- valid bool
185-}{
186- {pattern: "42", valid: true},
187- {pattern: "0", valid: true},
188- {pattern: "042", valid: false},
189- {pattern: ":42", valid: false},
190- {pattern: "lxc:42", valid: true},
191- {pattern: "lxc:042", valid: false},
192- {pattern: "lxc:0", valid: true},
193- {pattern: "foo42", valid: false},
194- {pattern: "foo", valid: false},
195- {pattern: "foo:3/", valid: false},
196- {pattern: "kvm:3/foo", valid: false},
197- {pattern: "kvm:3/foo/", valid: false},
198- {pattern: "lxc:42/kvm/0", valid: true},
199- {pattern: "lxc:042/kvm/0", valid: false},
200- {pattern: "lxc:42/kvm/00", valid: false},
201- {pattern: "lxc:42/kvm/56/lxc/0", valid: true},
202- {pattern: "lxc:042/kvm/56/lxc/0", valid: false},
203- {pattern: "lxc:42/kvm/056/lxc/0", valid: false},
204- {pattern: "lxc:42/kvm/56/lxc/00", valid: false},
205-}
206-
207-func (s *machineSuite) TestMachineOrNewContainerFormats(c *gc.C) {
208- for i, test := range machineOrNewContainerTests {
209- c.Logf("test %d: %q", i, test.pattern)
210- c.Assert(names.IsMachineOrNewContainer(test.pattern), gc.Equals, test.valid)
211- }
212-}
213
214=== modified file 'names/service_test.go'
215--- names/service_test.go 2013-07-31 14:21:38 +0000
216+++ names/service_test.go 2013-08-02 22:26:24 +0000
217@@ -17,6 +17,7 @@
218 pattern string
219 valid bool
220 }{
221+ {pattern: "", valid: false},
222 {pattern: "wordpress", valid: true},
223 {pattern: "foo42", valid: true},
224 {pattern: "doing55in54", valid: true},
225@@ -27,11 +28,25 @@
226 {pattern: "foo/42", valid: false},
227 {pattern: "is-it-", valid: false},
228 {pattern: "broken2-", valid: false},
229+ {pattern: "foo2", valid: true},
230+ {pattern: "foo-2", valid: false},
231 }
232
233 func (s *serviceSuite) TestServiceNameFormats(c *gc.C) {
234+ assertService := func(s string, expect bool) {
235+ c.Assert(names.IsService(s), gc.Equals, expect)
236+ // Check that anything that is considered a valid service name
237+ // is also (in)valid if a(n) (in)valid unit designator is added
238+ // to it.
239+ c.Assert(names.IsUnit(s+"/0"), gc.Equals, expect)
240+ c.Assert(names.IsUnit(s+"/99"), gc.Equals, expect)
241+ c.Assert(names.IsUnit(s+"/-1"), gc.Equals, false)
242+ c.Assert(names.IsUnit(s+"/blah"), gc.Equals, false)
243+ c.Assert(names.IsUnit(s+"/"), gc.Equals, false)
244+ }
245+
246 for i, test := range serviceNameTests {
247 c.Logf("test %d: %q", i, test.pattern)
248- c.Assert(names.IsService(test.pattern), gc.Equals, test.valid)
249+ assertService(test.pattern, test.valid)
250 }
251 }
252
253=== modified file 'state/state_test.go'
254--- state/state_test.go 2013-08-01 15:41:09 +0000
255+++ state/state_test.go 2013-08-02 22:26:24 +0000
256@@ -19,7 +19,6 @@
257 "launchpad.net/juju-core/environs/config"
258 "launchpad.net/juju-core/errors"
259 "launchpad.net/juju-core/instance"
260- "launchpad.net/juju-core/names"
261 "launchpad.net/juju-core/state"
262 "launchpad.net/juju-core/state/api/params"
263 statetesting "launchpad.net/juju-core/state/testing"
264@@ -1046,87 +1045,6 @@
265 }
266 }
267
268-func (*StateSuite) TestNameChecks(c *gc.C) {
269- assertService := func(s string, expect bool) {
270- c.Assert(names.IsService(s), gc.Equals, expect)
271- // Check that anything that is considered a valid service name
272- // is also (in)valid if a(n) (in)valid unit designator is added
273- // to it.
274- c.Assert(names.IsUnit(s+"/0"), gc.Equals, expect)
275- c.Assert(names.IsUnit(s+"/99"), gc.Equals, expect)
276- c.Assert(names.IsUnit(s+"/-1"), gc.Equals, false)
277- c.Assert(names.IsUnit(s+"/blah"), gc.Equals, false)
278- c.Assert(names.IsUnit(s+"/"), gc.Equals, false)
279- }
280- // Service names must be non-empty...
281- assertService("", false)
282- // must not consist entirely of numbers
283- assertService("33", false)
284- // may consist of a single word
285- assertService("wordpress", true)
286- // may contain hyphen-seperated words...
287- assertService("super-duper-wordpress", true)
288- // ...but those words must have at least one letter in them
289- assertService("super-1234-wordpress", false)
290- // may contain internal numbers.
291- assertService("w0rd-pre55", true)
292- // must not begin with a number
293- assertService("3wordpress", false)
294- // but internal, hyphen-sperated words can begin with numbers
295- assertService("foo-2foo", true)
296- // and may end with a number...
297- assertService("foo2", true)
298- // ...unless that number is all by itself
299- assertService("foo-2", false)
300-
301- assertMachine := func(s string, expect bool) {
302- c.Assert(names.IsMachine(s), gc.Equals, expect)
303- }
304- assertMachine("0", true)
305- assertMachine("00", false)
306- assertMachine("1", true)
307- assertMachine("1000001", true)
308- assertMachine("01", false)
309- assertMachine("-1", false)
310- assertMachine("", false)
311- assertMachine("cantankerous", false)
312- // And container specs
313- assertMachine("0/", false)
314- assertMachine("0/0", false)
315- assertMachine("0/lxc", false)
316- assertMachine("0/lxc/", false)
317- assertMachine("0/lxc/0", true)
318- assertMachine("0/lxc/0/", false)
319- assertMachine("0/lxc/00", false)
320- assertMachine("0/lxc/01", false)
321- assertMachine("0/lxc/10", true)
322- assertMachine("0/kvm/4", true)
323- assertMachine("0/no-dash/0", false)
324- assertMachine("0/lxc/1/embedded/2", true)
325-
326- assertMachineOrNewContainer := func(s string, expect bool) {
327- c.Assert(names.IsMachineOrNewContainer(s), gc.Equals, expect)
328- }
329- assertMachineOrNewContainer("0", true)
330- assertMachineOrNewContainer("00", false)
331- assertMachineOrNewContainer("1", true)
332- assertMachineOrNewContainer("0/lxc/0", true)
333- assertMachineOrNewContainer("lxc:0", true)
334- assertMachineOrNewContainer("lxc:lxc:0", false)
335- assertMachineOrNewContainer("kvm:0/lxc/1", true)
336- assertMachineOrNewContainer("lxc:", false)
337- assertMachineOrNewContainer(":lxc", false)
338- assertMachineOrNewContainer("0/lxc/", false)
339- assertMachineOrNewContainer("0/lxc", false)
340- assertMachineOrNewContainer("kvm:0/lxc", false)
341- assertMachine("0/lxc/00", false)
342- assertMachine("0/lxc/01", false)
343- assertMachineOrNewContainer("0/lxc/01", false)
344- assertMachineOrNewContainer("0/lxc/10", true)
345- assertMachineOrNewContainer("0/kvm/4", true)
346- assertMachine("0/lxc/1/embedded/2", true)
347-}
348-
349 type attrs map[string]interface{}
350
351 func (s *StateSuite) TestWatchEnvironConfig(c *gc.C) {

Subscribers

People subscribed via source and target branches

to status/vote changes: