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
=== modified file 'cmd/juju/addmachine.go'
--- cmd/juju/addmachine.go 2013-07-30 23:46:30 +0000
+++ cmd/juju/addmachine.go 2013-08-02 22:26:24 +0000
@@ -57,7 +57,7 @@
57 }57 }
58 // container arg can either be 'type:machine' or 'type'58 // container arg can either be 'type:machine' or 'type'
59 if c.ContainerType, err = instance.ParseSupportedContainerType(containerSpec); err != nil {59 if c.ContainerType, err = instance.ParseSupportedContainerType(containerSpec); err != nil {
60 if !names.IsMachineOrNewContainer(containerSpec) {60 if names.IsMachine(containerSpec) || !cmd.IsMachineOrNewContainer(containerSpec) {
61 return fmt.Errorf("malformed container argument %q", containerSpec)61 return fmt.Errorf("malformed container argument %q", containerSpec)
62 }62 }
63 sep := strings.Index(containerSpec, ":")63 sep := strings.Index(containerSpec, ":")
6464
=== modified file 'cmd/juju/addmachine_test.go'
--- cmd/juju/addmachine_test.go 2013-07-16 00:47:26 +0000
+++ cmd/juju/addmachine_test.go 2013-08-02 22:26:24 +0000
@@ -92,10 +92,14 @@
92}92}
9393
94func (s *AddMachineSuite) TestAddMachineErrors(c *C) {94func (s *AddMachineSuite) TestAddMachineErrors(c *C) {
95 err := runAddMachine(c, ":foo")95 err := runAddMachine(c, ":lxc")
96 c.Assert(err, ErrorMatches, `malformed container argument ":foo"`)96 c.Assert(err, ErrorMatches, `malformed container argument ":lxc"`)
97 err = runAddMachine(c, "foo:")97 err = runAddMachine(c, "lxc:")
98 c.Assert(err, ErrorMatches, `malformed container argument "foo:"`)98 c.Assert(err, ErrorMatches, `malformed container argument "lxc:"`)
99 err = runAddMachine(c, "2")
100 c.Assert(err, ErrorMatches, `malformed container argument "2"`)
101 err = runAddMachine(c, "foo")
102 c.Assert(err, ErrorMatches, `malformed container argument "foo"`)
99 err = runAddMachine(c, "lxc", "--constraints", "container=lxc")103 err = runAddMachine(c, "lxc", "--constraints", "container=lxc")
100 c.Assert(err, ErrorMatches, `container constraint "lxc" not allowed when adding a machine`)104 c.Assert(err, ErrorMatches, `container constraint "lxc" not allowed when adding a machine`)
101}105}
102106
=== modified file 'cmd/juju/addunit.go'
--- cmd/juju/addunit.go 2013-07-30 23:46:30 +0000
+++ cmd/juju/addunit.go 2013-08-02 22:26:24 +0000
@@ -11,7 +11,6 @@
1111
12 "launchpad.net/juju-core/cmd"12 "launchpad.net/juju-core/cmd"
13 "launchpad.net/juju-core/juju"13 "launchpad.net/juju-core/juju"
14 "launchpad.net/juju-core/names"
15 "launchpad.net/juju-core/state/api/params"14 "launchpad.net/juju-core/state/api/params"
16 "launchpad.net/juju-core/state/statecmd"15 "launchpad.net/juju-core/state/statecmd"
17)16)
@@ -36,7 +35,7 @@
36 if c.NumUnits > 1 {35 if c.NumUnits > 1 {
37 return errors.New("cannot use --num-units > 1 with --to")36 return errors.New("cannot use --num-units > 1 with --to")
38 }37 }
39 if !names.IsMachineOrNewContainer(c.ToMachineSpec) {38 if !cmd.IsMachineOrNewContainer(c.ToMachineSpec) {
40 return fmt.Errorf("invalid --to parameter %q", c.ToMachineSpec)39 return fmt.Errorf("invalid --to parameter %q", c.ToMachineSpec)
41 }40 }
42 }41 }
4342
=== added file 'cmd/names.go'
--- cmd/names.go 1970-01-01 00:00:00 +0000
+++ cmd/names.go 2013-08-02 22:26:24 +0000
@@ -0,0 +1,25 @@
1// Copyright 2012, 2013 Canonical Ltd.
2// Licensed under the AGPLv3, see LICENCE file for details.
3
4package cmd
5
6import (
7 "regexp"
8
9 "launchpad.net/juju-core/names"
10)
11
12const (
13 ContainerSnippet = "(/[a-z]+/" + names.NumberSnippet + ")"
14 ContainerSpecSnippet = "([a-z]+:)?"
15)
16
17var (
18 validMachineOrNewContainer = regexp.MustCompile("^" + ContainerSpecSnippet + names.MachineSnippet + "$")
19)
20
21// IsMachineOrNewContainer returns whether spec is a valid machine id
22// or new container definition.
23func IsMachineOrNewContainer(spec string) bool {
24 return validMachineOrNewContainer.MatchString(spec)
25}
026
=== added file 'cmd/names_test.go'
--- cmd/names_test.go 1970-01-01 00:00:00 +0000
+++ cmd/names_test.go 2013-08-02 22:26:24 +0000
@@ -0,0 +1,36 @@
1// Copyright 2012, 2013 Canonical Ltd.
2// Licensed under the AGPLv3, see LICENCE file for details.
3
4package cmd_test
5
6import (
7 gc "launchpad.net/gocheck"
8
9 "launchpad.net/juju-core/cmd"
10)
11
12type namesSuite struct {
13}
14
15var _ = gc.Suite(&namesSuite{})
16
17func (*namesSuite) TestNameChecks(c *gc.C) {
18 assertMachineOrNewContainer := func(s string, expect bool) {
19 c.Assert(cmd.IsMachineOrNewContainer(s), gc.Equals, expect)
20 }
21 assertMachineOrNewContainer("0", true)
22 assertMachineOrNewContainer("00", false)
23 assertMachineOrNewContainer("1", true)
24 assertMachineOrNewContainer("0/lxc/0", true)
25 assertMachineOrNewContainer("lxc:0", true)
26 assertMachineOrNewContainer("lxc:lxc:0", false)
27 assertMachineOrNewContainer("kvm:0/lxc/1", true)
28 assertMachineOrNewContainer("lxc:", false)
29 assertMachineOrNewContainer(":lxc", false)
30 assertMachineOrNewContainer("0/lxc/", false)
31 assertMachineOrNewContainer("0/lxc", false)
32 assertMachineOrNewContainer("kvm:0/lxc", false)
33 assertMachineOrNewContainer("0/lxc/01", false)
34 assertMachineOrNewContainer("0/lxc/10", true)
35 assertMachineOrNewContainer("0/kvm/4", true)
36}
037
=== modified file 'names/machine.go'
--- names/machine.go 2013-07-30 18:27:04 +0000
+++ names/machine.go 2013-08-02 22:26:24 +0000
@@ -7,27 +7,17 @@
7)7)
88
9const (9const (
10 ContainerSnippet = "(/[a-z]+/" + NumberSnippet + ")"10 ContainerSnippet = "(/[a-z]+/" + NumberSnippet + ")"
11 MachineSnippet = NumberSnippet + ContainerSnippet + "*"11 MachineSnippet = NumberSnippet + ContainerSnippet + "*"
12 ContainerSpecSnippet = "([a-z]+:)?"
13)12)
1413
15var (14var validMachine = regexp.MustCompile("^" + MachineSnippet + "$")
16 validMachine = regexp.MustCompile("^" + MachineSnippet + "$")
17 validMachineOrNewContainer = regexp.MustCompile("^" + ContainerSpecSnippet + MachineSnippet + "$")
18)
1915
20// IsMachine returns whether id is a valid machine id.16// IsMachine returns whether id is a valid machine id.
21func IsMachine(id string) bool {17func IsMachine(id string) bool {
22 return validMachine.MatchString(id)18 return validMachine.MatchString(id)
23}19}
2420
25// IsMachineOrNewContainer returns whether spec is a valid machine id
26// or new container definition.
27func IsMachineOrNewContainer(spec string) bool {
28 return validMachineOrNewContainer.MatchString(spec)
29}
30
31// MachineTag returns the tag for the machine with the given id.21// MachineTag returns the tag for the machine with the given id.
32func MachineTag(id string) string {22func MachineTag(id string) string {
33 tag := makeTag(MachineTagKind, id)23 tag := makeTag(MachineTagKind, id)
3424
=== modified file 'names/machine_test.go'
--- names/machine_test.go 2013-07-31 14:21:38 +0000
+++ names/machine_test.go 2013-08-02 22:26:24 +0000
@@ -64,6 +64,9 @@
64 {pattern: "1/foo", valid: false},64 {pattern: "1/foo", valid: false},
65 {pattern: "2/foo/", valid: false},65 {pattern: "2/foo/", valid: false},
66 {pattern: "3/lxc/42", valid: true},66 {pattern: "3/lxc/42", valid: true},
67 {pattern: "3/lxc-nodash/42", valid: false},
68 {pattern: "0/lxc/00", valid: false},
69 {pattern: "0/lxc/0/", valid: false},
67 {pattern: "03/lxc/42", valid: false},70 {pattern: "03/lxc/42", valid: false},
68 {pattern: "3/lxc/042", valid: false},71 {pattern: "3/lxc/042", valid: false},
69 {pattern: "4/foo/bar", valid: false},72 {pattern: "4/foo/bar", valid: false},
@@ -81,35 +84,3 @@
81 c.Assert(names.IsMachine(test.pattern), gc.Equals, test.valid)84 c.Assert(names.IsMachine(test.pattern), gc.Equals, test.valid)
82 }85 }
83}86}
84
85var machineOrNewContainerTests = []struct {
86 pattern string
87 valid bool
88}{
89 {pattern: "42", valid: true},
90 {pattern: "0", valid: true},
91 {pattern: "042", valid: false},
92 {pattern: ":42", valid: false},
93 {pattern: "lxc:42", valid: true},
94 {pattern: "lxc:042", valid: false},
95 {pattern: "lxc:0", valid: true},
96 {pattern: "foo42", valid: false},
97 {pattern: "foo", valid: false},
98 {pattern: "foo:3/", valid: false},
99 {pattern: "kvm:3/foo", valid: false},
100 {pattern: "kvm:3/foo/", valid: false},
101 {pattern: "lxc:42/kvm/0", valid: true},
102 {pattern: "lxc:042/kvm/0", valid: false},
103 {pattern: "lxc:42/kvm/00", valid: false},
104 {pattern: "lxc:42/kvm/56/lxc/0", valid: true},
105 {pattern: "lxc:042/kvm/56/lxc/0", valid: false},
106 {pattern: "lxc:42/kvm/056/lxc/0", valid: false},
107 {pattern: "lxc:42/kvm/56/lxc/00", valid: false},
108}
109
110func (s *machineSuite) TestMachineOrNewContainerFormats(c *gc.C) {
111 for i, test := range machineOrNewContainerTests {
112 c.Logf("test %d: %q", i, test.pattern)
113 c.Assert(names.IsMachineOrNewContainer(test.pattern), gc.Equals, test.valid)
114 }
115}
11687
=== modified file 'names/service_test.go'
--- names/service_test.go 2013-07-31 14:21:38 +0000
+++ names/service_test.go 2013-08-02 22:26:24 +0000
@@ -17,6 +17,7 @@
17 pattern string17 pattern string
18 valid bool18 valid bool
19}{19}{
20 {pattern: "", valid: false},
20 {pattern: "wordpress", valid: true},21 {pattern: "wordpress", valid: true},
21 {pattern: "foo42", valid: true},22 {pattern: "foo42", valid: true},
22 {pattern: "doing55in54", valid: true},23 {pattern: "doing55in54", valid: true},
@@ -27,11 +28,25 @@
27 {pattern: "foo/42", valid: false},28 {pattern: "foo/42", valid: false},
28 {pattern: "is-it-", valid: false},29 {pattern: "is-it-", valid: false},
29 {pattern: "broken2-", valid: false},30 {pattern: "broken2-", valid: false},
31 {pattern: "foo2", valid: true},
32 {pattern: "foo-2", valid: false},
30}33}
3134
32func (s *serviceSuite) TestServiceNameFormats(c *gc.C) {35func (s *serviceSuite) TestServiceNameFormats(c *gc.C) {
36 assertService := func(s string, expect bool) {
37 c.Assert(names.IsService(s), gc.Equals, expect)
38 // Check that anything that is considered a valid service name
39 // is also (in)valid if a(n) (in)valid unit designator is added
40 // to it.
41 c.Assert(names.IsUnit(s+"/0"), gc.Equals, expect)
42 c.Assert(names.IsUnit(s+"/99"), gc.Equals, expect)
43 c.Assert(names.IsUnit(s+"/-1"), gc.Equals, false)
44 c.Assert(names.IsUnit(s+"/blah"), gc.Equals, false)
45 c.Assert(names.IsUnit(s+"/"), gc.Equals, false)
46 }
47
33 for i, test := range serviceNameTests {48 for i, test := range serviceNameTests {
34 c.Logf("test %d: %q", i, test.pattern)49 c.Logf("test %d: %q", i, test.pattern)
35 c.Assert(names.IsService(test.pattern), gc.Equals, test.valid)50 assertService(test.pattern, test.valid)
36 }51 }
37}52}
3853
=== modified file 'state/state_test.go'
--- state/state_test.go 2013-08-01 15:41:09 +0000
+++ state/state_test.go 2013-08-02 22:26:24 +0000
@@ -19,7 +19,6 @@
19 "launchpad.net/juju-core/environs/config"19 "launchpad.net/juju-core/environs/config"
20 "launchpad.net/juju-core/errors"20 "launchpad.net/juju-core/errors"
21 "launchpad.net/juju-core/instance"21 "launchpad.net/juju-core/instance"
22 "launchpad.net/juju-core/names"
23 "launchpad.net/juju-core/state"22 "launchpad.net/juju-core/state"
24 "launchpad.net/juju-core/state/api/params"23 "launchpad.net/juju-core/state/api/params"
25 statetesting "launchpad.net/juju-core/state/testing"24 statetesting "launchpad.net/juju-core/state/testing"
@@ -1046,87 +1045,6 @@
1046 }1045 }
1047}1046}
10481047
1049func (*StateSuite) TestNameChecks(c *gc.C) {
1050 assertService := func(s string, expect bool) {
1051 c.Assert(names.IsService(s), gc.Equals, expect)
1052 // Check that anything that is considered a valid service name
1053 // is also (in)valid if a(n) (in)valid unit designator is added
1054 // to it.
1055 c.Assert(names.IsUnit(s+"/0"), gc.Equals, expect)
1056 c.Assert(names.IsUnit(s+"/99"), gc.Equals, expect)
1057 c.Assert(names.IsUnit(s+"/-1"), gc.Equals, false)
1058 c.Assert(names.IsUnit(s+"/blah"), gc.Equals, false)
1059 c.Assert(names.IsUnit(s+"/"), gc.Equals, false)
1060 }
1061 // Service names must be non-empty...
1062 assertService("", false)
1063 // must not consist entirely of numbers
1064 assertService("33", false)
1065 // may consist of a single word
1066 assertService("wordpress", true)
1067 // may contain hyphen-seperated words...
1068 assertService("super-duper-wordpress", true)
1069 // ...but those words must have at least one letter in them
1070 assertService("super-1234-wordpress", false)
1071 // may contain internal numbers.
1072 assertService("w0rd-pre55", true)
1073 // must not begin with a number
1074 assertService("3wordpress", false)
1075 // but internal, hyphen-sperated words can begin with numbers
1076 assertService("foo-2foo", true)
1077 // and may end with a number...
1078 assertService("foo2", true)
1079 // ...unless that number is all by itself
1080 assertService("foo-2", false)
1081
1082 assertMachine := func(s string, expect bool) {
1083 c.Assert(names.IsMachine(s), gc.Equals, expect)
1084 }
1085 assertMachine("0", true)
1086 assertMachine("00", false)
1087 assertMachine("1", true)
1088 assertMachine("1000001", true)
1089 assertMachine("01", false)
1090 assertMachine("-1", false)
1091 assertMachine("", false)
1092 assertMachine("cantankerous", false)
1093 // And container specs
1094 assertMachine("0/", false)
1095 assertMachine("0/0", false)
1096 assertMachine("0/lxc", false)
1097 assertMachine("0/lxc/", false)
1098 assertMachine("0/lxc/0", true)
1099 assertMachine("0/lxc/0/", false)
1100 assertMachine("0/lxc/00", false)
1101 assertMachine("0/lxc/01", false)
1102 assertMachine("0/lxc/10", true)
1103 assertMachine("0/kvm/4", true)
1104 assertMachine("0/no-dash/0", false)
1105 assertMachine("0/lxc/1/embedded/2", true)
1106
1107 assertMachineOrNewContainer := func(s string, expect bool) {
1108 c.Assert(names.IsMachineOrNewContainer(s), gc.Equals, expect)
1109 }
1110 assertMachineOrNewContainer("0", true)
1111 assertMachineOrNewContainer("00", false)
1112 assertMachineOrNewContainer("1", true)
1113 assertMachineOrNewContainer("0/lxc/0", true)
1114 assertMachineOrNewContainer("lxc:0", true)
1115 assertMachineOrNewContainer("lxc:lxc:0", false)
1116 assertMachineOrNewContainer("kvm:0/lxc/1", true)
1117 assertMachineOrNewContainer("lxc:", false)
1118 assertMachineOrNewContainer(":lxc", false)
1119 assertMachineOrNewContainer("0/lxc/", false)
1120 assertMachineOrNewContainer("0/lxc", false)
1121 assertMachineOrNewContainer("kvm:0/lxc", false)
1122 assertMachine("0/lxc/00", false)
1123 assertMachine("0/lxc/01", false)
1124 assertMachineOrNewContainer("0/lxc/01", false)
1125 assertMachineOrNewContainer("0/lxc/10", true)
1126 assertMachineOrNewContainer("0/kvm/4", true)
1127 assertMachine("0/lxc/1/embedded/2", true)
1128}
1129
1130type attrs map[string]interface{}1048type attrs map[string]interface{}
11311049
1132func (s *StateSuite) TestWatchEnvironConfig(c *gc.C) {1050func (s *StateSuite) TestWatchEnvironConfig(c *gc.C) {

Subscribers

People subscribed via source and target branches

to status/vote changes: