Merge lp:~thumper/juju-core/kvm-constraints into lp:~go-bot/juju-core/trunk

Proposed by Tim Penhey on 2013-12-05
Status: Merged
Approved by: Tim Penhey on 2013-12-06
Approved revision: 1930
Merged at revision: 2123
Proposed branch: lp:~thumper/juju-core/kvm-constraints
Merge into: lp:~go-bot/juju-core/trunk
Diff against target: 554 lines (+265/-57)
10 files modified
container/kvm/container.go (+12/-15)
container/kvm/interface.go (+12/-7)
container/kvm/kvm.go (+81/-6)
container/kvm/kvm_test.go (+132/-1)
container/kvm/libvirt.go (+12/-1)
container/kvm/live_test.go (+2/-2)
container/kvm/mock/mock-kvm.go (+1/-7)
container/kvm/mock/mock-kvm_test.go (+8/-18)
provider/local/environ.go (+4/-0)
testing/testbase/log.go (+1/-0)
To merge this branch: bzr merge lp:~thumper/juju-core/kvm-constraints
Reviewer Review Type Date Requested Status
juju hackers 2013-12-05 Pending
Review via email: mp+197815@code.launchpad.net

Commit Message

Make KVM respect constraints.

The uvtool CLI allows us to specify memory, disk
and cores on the command-line. Constraints often
ask for a subset (or superset) of these.

This branch translates between the juju constraints
format to the command line params that the uvt-kvm
tool wants.

If constraints are supplied that KVM doesn't support,
a log entry is written out at INFO level. It isn't
really a warning, just an informational that we are
ignoring it.

Also, the local provider wasn't passing the constraints
through as the FinishMachineConfig only set the constraints
on the config object if it was a state server node. I am
a little unclear on the implications of this for other
providers.

https://codereview.appspot.com/37610043/

Description of the Change

Make KVM respect constraints.

The uvtool CLI allows us to specify memory, disk
and cores on the command-line. Constraints often
ask for a subset (or superset) of these.

This branch translates between the juju constraints
format to the command line params that the uvt-kvm
tool wants.

If constraints are supplied that KVM doesn't support,
a log entry is written out at INFO level. It isn't
really a warning, just an informational that we are
ignoring it.

Also, the local provider wasn't passing the constraints
through as the FinishMachineConfig only set the constraints
on the config object if it was a state server node. I am
a little unclear on the implications of this for other
providers.

https://codereview.appspot.com/37610043/

To post a comment you must log in.
Tim Penhey (thumper) wrote :

Reviewers: mp+197815_code.launchpad.net,

Message:
Please take a look.

Description:
Make KVM respect constraints.

The uvtool CLI allows us to specify memory, disk
and cores on the command-line. Constraints often
ask for a subset (or superset) of these.

This branch translates between the juju constraints
format to the command line params that the uvt-kvm
tool wants.

If constraints are supplied that KVM doesn't support,
a log entry is written out at INFO level. It isn't
really a warning, just an informational that we are
ignoring it.

Also, the local provider wasn't passing the constraints
through as the FinishMachineConfig only set the constraints
on the config object if it was a state server node. I am
a little unclear on the implications of this for other
providers.

https://code.launchpad.net/~thumper/juju-core/kvm-constraints/+merge/197815

(do not edit description out of merge proposal)

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

Affected files (+250, -39 lines):
   A [revision details]
   M container/kvm/container.go
   M container/kvm/interface.go
   M container/kvm/kvm.go
   M container/kvm/kvm_test.go
   M container/kvm/libvirt.go
   M container/kvm/live_test.go
   M container/kvm/mock/mock-kvm.go
   M provider/local/environ.go

Ian Booth (wallyworld) wrote :

I have an issue with the early conversion of mem, cores etc to strings.
Thoughts on my comments?

I also think we need a todo and a comment to explain the machine config
constraints things since the cons is passed in to FinishMachineConfig
and then set and the reader will be confused without a comment. I think
we should be able to clean it up, hence a todo.

https://codereview.appspot.com/37610043/diff/1/container/kvm/kvm.go
File container/kvm/kvm.go (right):

https://codereview.appspot.com/37610043/diff/1/container/kvm/kvm.go#newcode30
container/kvm/kvm.go:30: DefaultDisk uint64 = 8 // GB
Perhaps a comment about how we need opinionated defaults because blah
blah

https://codereview.appspot.com/37610043/diff/1/container/kvm/libvirt.go
File container/kvm/libvirt.go (right):

https://codereview.appspot.com/37610043/diff/1/container/kvm/libvirt.go#newcode61
container/kvm/libvirt.go:61: RootDisk string
-1 to these as strings.
They should remain as ints and any formatting like sprintf should occur
when the command line args to uvt-kvm are generated

https://codereview.appspot.com/37610043/

Tim Penhey (thumper) wrote :

Please take a look.

https://codereview.appspot.com/37610043/diff/1/container/kvm/kvm.go
File container/kvm/kvm.go (right):

https://codereview.appspot.com/37610043/diff/1/container/kvm/kvm.go#newcode30
container/kvm/kvm.go:30: DefaultDisk uint64 = 8 // GB
On 2013/12/05 04:23:31, wallyworld wrote:
> Perhaps a comment about how we need opinionated defaults because blah
blah

Done.

https://codereview.appspot.com/37610043/diff/1/container/kvm/libvirt.go
File container/kvm/libvirt.go (right):

https://codereview.appspot.com/37610043/diff/1/container/kvm/libvirt.go#newcode61
container/kvm/libvirt.go:61: RootDisk string
On 2013/12/05 04:23:31, wallyworld wrote:
> -1 to these as strings.
> They should remain as ints and any formatting like sprintf should
occur when the
> command line args to uvt-kvm are generated

Done.

https://codereview.appspot.com/37610043/

Ian Booth (wallyworld) wrote :

LGTM. Thanks for the changes

https://codereview.appspot.com/37610043/

Go Bot (go-bot) wrote :
Download full text (8.4 KiB)

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

ok launchpad.net/juju-core/agent 1.204s
ok launchpad.net/juju-core/agent/tools 0.256s
ok launchpad.net/juju-core/bzr 6.914s
ok launchpad.net/juju-core/cert 3.133s
ok launchpad.net/juju-core/charm 0.509s
? launchpad.net/juju-core/charm/hooks [no test files]
ok launchpad.net/juju-core/cloudinit 0.027s
ok launchpad.net/juju-core/cloudinit/sshinit 1.117s
ok launchpad.net/juju-core/cmd 0.225s
? 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 189.009s
ok launchpad.net/juju-core/cmd/jujud 56.977s
ok launchpad.net/juju-core/cmd/plugins/juju-metadata 2.782s
? launchpad.net/juju-core/cmd/plugins/juju-update-bootstrap [no test files]
ok launchpad.net/juju-core/constraints 0.026s
ok launchpad.net/juju-core/container 0.060s
ok launchpad.net/juju-core/container/factory 0.060s
ok launchpad.net/juju-core/container/kvm 0.287s
FAIL launchpad.net/juju-core/container/kvm/mock [build failed]
? launchpad.net/juju-core/container/kvm/testing [no test files]
ok launchpad.net/juju-core/container/lxc 0.353s
? launchpad.net/juju-core/container/lxc/mock [no test files]
? launchpad.net/juju-core/container/lxc/testing [no test files]
? launchpad.net/juju-core/container/testing [no test files]
ok launchpad.net/juju-core/downloader 5.277s
ok launchpad.net/juju-core/environs 3.100s
ok launchpad.net/juju-core/environs/bootstrap 5.095s
ok launchpad.net/juju-core/environs/cloudinit 0.496s
ok launchpad.net/juju-core/environs/config 2.107s
ok launchpad.net/juju-core/environs/configstore 0.041s
ok launchpad.net/juju-core/environs/filestorage 0.031s
ok launchpad.net/juju-core/environs/httpstorage 1.092s
ok launchpad.net/juju-core/environs/imagemetadata 0.568s
? launchpad.net/juju-core/environs/imagemetadata/testing [no test files]
ok launchpad.net/juju-core/environs/instances 0.053s
ok launchpad.net/juju-core/environs/jujutest 0.284s
ok launchpad.net/juju-core/environs/manual 7.214s
ok launchpad.net/juju-core/environs/simplestreams 0.335s
? launchpad.net/juju-core/environs/simplestreams/testing [no test files]
ok launchpad.net/juju-core/environs/sshstorage 1.179s
ok launchpad.net/juju-core/environs/storage 1.130s
ok launchpad.net/juju-core/environs/sync 29.500s
ok launchpad.net/juju-core/environs/testing 0.195s
ok launchpad.net/juju-core/environs/tools 6.824s
? launchpad.net/juju-core/environs/tools/testing [no test files]
ok launchpad.net/juju-core/errors 0.016s
ok launchpad.net/juju-core/instance 0.023s
? launchpad.net/juju-core/instance/testing [no test files]
ok launchpad.net/juju-core/juju 18.196s
ok launchpad.net/juju-core/juju/osenv 0.018s
? launchpad.net/juju-core/juju/testing [no test files]
ok launchpad.net/juju-core/log 0.015s
ok launchpad.net/juju-core/log/syslog 0.018s
ok launchpad.net/juju-core/names 0.026s
? launchpad.net/juju-core/provider [no test files]
? launchpad.net/juju-core/provider/all [no test files]
ok launchpa...

Read more...

Go Bot (go-bot) wrote :
Download full text (22.5 KiB)

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

ok launchpad.net/juju-core/agent 1.241s
ok launchpad.net/juju-core/agent/tools 0.219s
ok launchpad.net/juju-core/bzr 6.822s
ok launchpad.net/juju-core/cert 3.220s
ok launchpad.net/juju-core/charm 0.601s
? launchpad.net/juju-core/charm/hooks [no test files]
ok launchpad.net/juju-core/cloudinit 0.027s
ok launchpad.net/juju-core/cloudinit/sshinit 1.035s
ok launchpad.net/juju-core/cmd 0.196s
? 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 194.163s
ok launchpad.net/juju-core/cmd/jujud 57.278s
ok launchpad.net/juju-core/cmd/plugins/juju-metadata 2.864s
? launchpad.net/juju-core/cmd/plugins/juju-update-bootstrap [no test files]
ok launchpad.net/juju-core/constraints 0.028s
ok launchpad.net/juju-core/container 0.056s
ok launchpad.net/juju-core/container/factory 0.061s
ok launchpad.net/juju-core/container/kvm 0.278s
ok launchpad.net/juju-core/container/kvm/mock 0.035s
? launchpad.net/juju-core/container/kvm/testing [no test files]
ok launchpad.net/juju-core/container/lxc 0.291s
? launchpad.net/juju-core/container/lxc/mock [no test files]
? launchpad.net/juju-core/container/lxc/testing [no test files]
? launchpad.net/juju-core/container/testing [no test files]
ok launchpad.net/juju-core/downloader 5.299s
ok launchpad.net/juju-core/environs 3.135s
ok launchpad.net/juju-core/environs/bootstrap 5.181s
ok launchpad.net/juju-core/environs/cloudinit 0.488s
ok launchpad.net/juju-core/environs/config 1.984s
ok launchpad.net/juju-core/environs/configstore 0.061s
ok launchpad.net/juju-core/environs/filestorage 0.034s
ok launchpad.net/juju-core/environs/httpstorage 1.018s
ok launchpad.net/juju-core/environs/imagemetadata 0.492s
? launchpad.net/juju-core/environs/imagemetadata/testing [no test files]
ok launchpad.net/juju-core/environs/instances 0.066s
ok launchpad.net/juju-core/environs/jujutest 0.252s
ok launchpad.net/juju-core/environs/manual 7.722s
ok launchpad.net/juju-core/environs/simplestreams 0.349s
? launchpad.net/juju-core/environs/simplestreams/testing [no test files]
ok launchpad.net/juju-core/environs/sshstorage 1.156s
ok launchpad.net/juju-core/environs/storage 1.204s
ok launchpad.net/juju-core/environs/sync 30.216s
ok launchpad.net/juju-core/environs/testing 0.200s
ok launchpad.net/juju-core/environs/tools 6.961s
? launchpad.net/juju-core/environs/tools/testing [no test files]
ok launchpad.net/juju-core/errors 0.016s
ok launchpad.net/juju-core/instance 0.024s
? launchpad.net/juju-core/instance/testing [no test files]
ok launchpad.net/juju-core/juju 19.404s
ok launchpad.net/juju-core/juju/osenv 0.025s
? launchpad.net/juju-core/juju/testing [no test files]
ok launchpad.net/juju-core/log 0.016s
ok launchpad.net/juju-core/log/syslog 0.024s
ok launchpad.net/juju-core/names 0.038s
? launchpad.net/juju-core/provider [no test files]
? launchpad.net/juju-core/provider/all [no test files]
ok launchpad.net/ju...

1930. By Tim Penhey on 2013-12-06

Isolate the logging suite from user's environment.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'container/kvm/container.go'
2--- container/kvm/container.go 2013-11-25 03:36:54 +0000
3+++ container/kvm/container.go 2013-12-06 01:14:58 +0000
4@@ -25,21 +25,15 @@
5 return c.name
6 }
7
8-func (c *kvmContainer) Start(
9- series string,
10- arch string,
11- userDataFile string,
12- network *container.NetworkConfig,
13-) error {
14- // TODO: handle memory, cpu, disk etc.
15- logger.Debugf("Synchronise images for %s %s", series, arch)
16- if err := SyncImages(series, arch); err != nil {
17+func (c *kvmContainer) Start(params StartParams) error {
18+ logger.Debugf("Synchronise images for %s %s", params.Series, params.Arch)
19+ if err := SyncImages(params.Series, params.Arch); err != nil {
20 return err
21 }
22 var bridge string
23- if network != nil {
24- if network.NetworkType == container.BridgeNetwork {
25- bridge = network.Device
26+ if params.Network != nil {
27+ if params.Network.NetworkType == container.BridgeNetwork {
28+ bridge = params.Network.Device
29 } else {
30 return log.LoggedErrorf(logger, "Non-bridge network devices not yet supported")
31 }
32@@ -47,10 +41,13 @@
33 logger.Debugf("Create the machine %s", c.name)
34 if err := CreateMachine(CreateMachineParams{
35 Hostname: c.name,
36- Series: series,
37- Arch: arch,
38- UserDataFile: userDataFile,
39+ Series: params.Series,
40+ Arch: params.Arch,
41+ UserDataFile: params.UserDataFile,
42 NetworkBridge: bridge,
43+ Memory: params.Memory,
44+ CpuCores: params.CpuCores,
45+ RootDisk: params.RootDisk,
46 }); err != nil {
47 return err
48 }
49
50=== modified file 'container/kvm/interface.go'
51--- container/kvm/interface.go 2013-11-18 22:20:40 +0000
52+++ container/kvm/interface.go 2013-12-06 01:14:58 +0000
53@@ -7,6 +7,17 @@
54 "launchpad.net/juju-core/container"
55 )
56
57+// StartParams is a simple parameter struct for Container.Start.
58+type StartParams struct {
59+ Series string
60+ Arch string
61+ UserDataFile string
62+ Network *container.NetworkConfig
63+ Memory uint64 // MB
64+ CpuCores uint64
65+ RootDisk uint64 // GB
66+}
67+
68 // Container represents a virtualized container instance and provides
69 // operations to create, maintain and destroy the container.
70 type Container interface {
71@@ -15,13 +26,7 @@
72 Name() string
73
74 // Start runs the container as a daemon.
75- // TODO: add constraints.
76- Start(
77- series string,
78- arch string,
79- userDataFile string,
80- network *container.NetworkConfig,
81- ) error
82+ Start(params StartParams) error
83
84 // Stop terminates the running container.
85 Stop() error
86
87=== modified file 'container/kvm/kvm.go'
88--- container/kvm/kvm.go 2013-12-04 02:37:05 +0000
89+++ container/kvm/kvm.go 2013-12-06 01:14:58 +0000
90@@ -10,6 +10,7 @@
91
92 "launchpad.net/loggo"
93
94+ "launchpad.net/juju-core/constraints"
95 "launchpad.net/juju-core/container"
96 "launchpad.net/juju-core/environs/cloudinit"
97 "launchpad.net/juju-core/instance"
98@@ -23,6 +24,19 @@
99
100 KvmObjectFactory ContainerFactory = &containerFactory{}
101 DefaultKvmBridge = "virbr0"
102+
103+ // In order for Juju to be able to create the hardware characteristics of
104+ // the kvm machines it creates, we need to be explicit in our definition
105+ // of memory, cpu-cores and root-disk. The defaults here have been
106+ // extracted from the uvt-kvm executable.
107+ DefaultMemory uint64 = 512 // MB
108+ DefaultCpu uint64 = 1
109+ DefaultDisk uint64 = 8 // GB
110+
111+ // There are some values where it doesn't make sense to go below.
112+ MinMemory uint64 = 512 // MB
113+ MinCpu uint64 = 1
114+ MinDisk uint64 = 2 // GB
115 )
116
117 // IsKVMSupported calls into the kvm-ok executable from the cpu-checkers package.
118@@ -85,16 +99,26 @@
119 return nil, nil, log.LoggedErrorf(logger, "failed to write user data: %v", err)
120 }
121 // Create the container.
122- arch := version.Current.Arch
123- hardware := &instance.HardwareCharacteristics{
124- Arch: &arch,
125+ startParams := ParseConstraintsToStartParams(machineConfig.Constraints)
126+ startParams.Arch = version.Current.Arch
127+ startParams.Series = series
128+ startParams.Network = network
129+ startParams.UserDataFile = userDataFilename
130+
131+ var hardware instance.HardwareCharacteristics
132+ hardware, err = instance.ParseHardware(
133+ fmt.Sprintf("arch=%s mem=%vM root-disk=%vG cpu-cores=%v",
134+ startParams.Arch, startParams.Memory, startParams.RootDisk, startParams.CpuCores))
135+ if err != nil {
136+ logger.Warningf("failed to parse hardware: %v", err)
137 }
138- logger.Tracef("create the container")
139- if err := kvmContainer.Start(series, arch, userDataFilename, network); err != nil {
140+
141+ logger.Tracef("create the container, constraints: %v", machineConfig.Constraints)
142+ if err := kvmContainer.Start(startParams); err != nil {
143 return nil, nil, log.LoggedErrorf(logger, "kvm container creation failed: %v", err)
144 }
145 logger.Tracef("kvm container created")
146- return &kvmInstance{kvmContainer, name}, hardware, nil
147+ return &kvmInstance{kvmContainer, name}, &hardware, nil
148 }
149
150 func (manager *containerManager) StopContainer(instance instance.Instance) error {
151@@ -126,3 +150,54 @@
152 }
153 return
154 }
155+
156+// ParseConstraintsToStartParams takes a constrants object and returns a bare
157+// StartParams object that has Memory, Cpu, and Disk populated. If there are
158+// no defined values in the constraints for those fields, default values are
159+// used. Other constrains cause a warning to be emitted.
160+func ParseConstraintsToStartParams(cons constraints.Value) StartParams {
161+ params := StartParams{
162+ Memory: DefaultMemory,
163+ CpuCores: DefaultCpu,
164+ RootDisk: DefaultDisk,
165+ }
166+
167+ if cons.Mem != nil {
168+ mem := *cons.Mem
169+ if mem < MinMemory {
170+ params.Memory = MinMemory
171+ } else {
172+ params.Memory = mem
173+ }
174+ }
175+ if cons.CpuCores != nil {
176+ cores := *cons.CpuCores
177+ if cores < MinCpu {
178+ params.CpuCores = MinCpu
179+ } else {
180+ params.CpuCores = cores
181+ }
182+ }
183+ if cons.RootDisk != nil {
184+ size := *cons.RootDisk / 1024
185+ if size < MinDisk {
186+ params.RootDisk = MinDisk
187+ } else {
188+ params.RootDisk = size
189+ }
190+ }
191+ if cons.Arch != nil {
192+ logger.Infof("arch constraint of %q being ignored as not supported", *cons.Arch)
193+ }
194+ if cons.Container != nil {
195+ logger.Infof("container constraint of %q being ignored as not supported", *cons.Container)
196+ }
197+ if cons.CpuPower != nil {
198+ logger.Infof("cpu-power constraint of %v being ignored as not supported", *cons.CpuPower)
199+ }
200+ if cons.Tags != nil {
201+ logger.Infof("tags constraint of %q being ignored as not supported", strings.Join(*cons.Tags, ","))
202+ }
203+
204+ return params
205+}
206
207=== modified file 'container/kvm/kvm_test.go'
208--- container/kvm/kvm_test.go 2013-12-04 04:18:39 +0000
209+++ container/kvm/kvm_test.go 2013-12-06 01:14:58 +0000
210@@ -7,13 +7,16 @@
211 "path/filepath"
212
213 gc "launchpad.net/gocheck"
214+ "launchpad.net/loggo"
215
216+ "launchpad.net/juju-core/constraints"
217 "launchpad.net/juju-core/container"
218 "launchpad.net/juju-core/container/kvm"
219 kvmtesting "launchpad.net/juju-core/container/kvm/testing"
220 containertesting "launchpad.net/juju-core/container/testing"
221 "launchpad.net/juju-core/instance"
222 jc "launchpad.net/juju-core/testing/checkers"
223+ "launchpad.net/juju-core/testing/testbase"
224 "launchpad.net/juju-core/version"
225 )
226
227@@ -46,7 +49,11 @@
228 func (s *KVMSuite) createRunningContainer(c *gc.C, name string) kvm.Container {
229 kvmContainer := s.Factory.New(name)
230 network := container.BridgeNetworkConfig("testbr0")
231- c.Assert(kvmContainer.Start("quantal", version.Current.Arch, "userdata.txt", network), gc.IsNil)
232+ c.Assert(kvmContainer.Start(kvm.StartParams{
233+ Series: "quantal",
234+ Arch: version.Current.Arch,
235+ UserDataFile: "userdata.txt",
236+ Network: network}), gc.IsNil)
237 return kvmContainer
238 }
239
240@@ -91,3 +98,127 @@
241 // but instead, in the removed container dir
242 c.Assert(filepath.Join(s.RemovedDir, name), jc.IsDirectory)
243 }
244+
245+type ConstraintsSuite struct {
246+ testbase.LoggingSuite
247+}
248+
249+var _ = gc.Suite(&ConstraintsSuite{})
250+
251+func (s *ConstraintsSuite) TestDefaults(c *gc.C) {
252+
253+ for _, test := range []struct {
254+ cons string
255+ expected kvm.StartParams
256+ infoLog []string
257+ }{{
258+ expected: kvm.StartParams{
259+ Memory: kvm.DefaultMemory,
260+ CpuCores: kvm.DefaultCpu,
261+ RootDisk: kvm.DefaultDisk,
262+ },
263+ }, {
264+ cons: "mem=256M",
265+ expected: kvm.StartParams{
266+ Memory: kvm.MinMemory,
267+ CpuCores: kvm.DefaultCpu,
268+ RootDisk: kvm.DefaultDisk,
269+ },
270+ }, {
271+ cons: "mem=4G",
272+ expected: kvm.StartParams{
273+ Memory: 4 * 1024,
274+ CpuCores: kvm.DefaultCpu,
275+ RootDisk: kvm.DefaultDisk,
276+ },
277+ }, {
278+ cons: "cpu-cores=4",
279+ expected: kvm.StartParams{
280+ Memory: kvm.DefaultMemory,
281+ CpuCores: 4,
282+ RootDisk: kvm.DefaultDisk,
283+ },
284+ }, {
285+ cons: "cpu-cores=0",
286+ expected: kvm.StartParams{
287+ Memory: kvm.DefaultMemory,
288+ CpuCores: kvm.MinCpu,
289+ RootDisk: kvm.DefaultDisk,
290+ },
291+ }, {
292+ cons: "root-disk=512M",
293+ expected: kvm.StartParams{
294+ Memory: kvm.DefaultMemory,
295+ CpuCores: kvm.DefaultCpu,
296+ RootDisk: kvm.MinDisk,
297+ },
298+ }, {
299+ cons: "root-disk=4G",
300+ expected: kvm.StartParams{
301+ Memory: kvm.DefaultMemory,
302+ CpuCores: kvm.DefaultCpu,
303+ RootDisk: 4,
304+ },
305+ }, {
306+ cons: "arch=arm",
307+ expected: kvm.StartParams{
308+ Memory: kvm.DefaultMemory,
309+ CpuCores: kvm.DefaultCpu,
310+ RootDisk: kvm.DefaultDisk,
311+ },
312+ infoLog: []string{
313+ `arch constraint of "arm" being ignored as not supported`,
314+ },
315+ }, {
316+ cons: "container=lxc",
317+ expected: kvm.StartParams{
318+ Memory: kvm.DefaultMemory,
319+ CpuCores: kvm.DefaultCpu,
320+ RootDisk: kvm.DefaultDisk,
321+ },
322+ infoLog: []string{
323+ `container constraint of "lxc" being ignored as not supported`,
324+ },
325+ }, {
326+ cons: "cpu-power=100",
327+ expected: kvm.StartParams{
328+ Memory: kvm.DefaultMemory,
329+ CpuCores: kvm.DefaultCpu,
330+ RootDisk: kvm.DefaultDisk,
331+ },
332+ infoLog: []string{
333+ `cpu-power constraint of 100 being ignored as not supported`,
334+ },
335+ }, {
336+ cons: "tags=foo,bar",
337+ expected: kvm.StartParams{
338+ Memory: kvm.DefaultMemory,
339+ CpuCores: kvm.DefaultCpu,
340+ RootDisk: kvm.DefaultDisk,
341+ },
342+ infoLog: []string{
343+ `tags constraint of "foo,bar" being ignored as not supported`,
344+ },
345+ }, {
346+ cons: "mem=4G cpu-cores=4 root-disk=20G arch=arm cpu-power=100 container=lxc tags=foo,bar",
347+ expected: kvm.StartParams{
348+ Memory: 4 * 1024,
349+ CpuCores: 4,
350+ RootDisk: 20,
351+ },
352+ infoLog: []string{
353+ `arch constraint of "arm" being ignored as not supported`,
354+ `container constraint of "lxc" being ignored as not supported`,
355+ `cpu-power constraint of 100 being ignored as not supported`,
356+ `tags constraint of "foo,bar" being ignored as not supported`,
357+ },
358+ }} {
359+ tw := &loggo.TestWriter{}
360+ c.Assert(loggo.RegisterWriter("constraint-tester", tw, loggo.DEBUG), gc.IsNil)
361+ cons := constraints.MustParse(test.cons)
362+ params := kvm.ParseConstraintsToStartParams(cons)
363+ c.Check(params, gc.DeepEquals, test.expected)
364+ c.Check(tw.Log, jc.LogMatches, test.infoLog)
365+ loggo.RemoveWriter("constraint-tester")
366+ }
367+}
368
369=== modified file 'container/kvm/libvirt.go'
370--- container/kvm/libvirt.go 2013-12-02 04:11:35 +0000
371+++ container/kvm/libvirt.go 2013-12-06 01:14:58 +0000
372@@ -56,7 +56,9 @@
373 Arch string
374 UserDataFile string
375 NetworkBridge string
376- // TODO memory, cpu and disk
377+ Memory uint64
378+ CpuCores uint64
379+ RootDisk uint64
380 }
381
382 // CreateMachine creates a virtual machine and starts it.
383@@ -74,6 +76,15 @@
384 if params.NetworkBridge != "" {
385 args = append(args, "--bridge", params.NetworkBridge)
386 }
387+ if params.Memory != 0 {
388+ args = append(args, "--memory", fmt.Sprint(params.Memory))
389+ }
390+ if params.CpuCores != 0 {
391+ args = append(args, "--cpu", fmt.Sprint(params.CpuCores))
392+ }
393+ if params.RootDisk != 0 {
394+ args = append(args, "--disk", fmt.Sprint(params.RootDisk))
395+ }
396 // TODO add memory, cpu and disk prior to hostname
397 args = append(args, params.Hostname)
398 if params.Series != "" {
399
400=== modified file 'container/kvm/live_test.go'
401--- container/kvm/live_test.go 2013-12-04 22:36:00 +0000
402+++ container/kvm/live_test.go 2013-12-06 01:14:58 +0000
403@@ -4,6 +4,7 @@
404 package kvm_test
405
406 import (
407+ "fmt"
408 "os"
409 "runtime"
410
411@@ -98,8 +99,7 @@
412 inst, hardware, err := manager.StartContainer(machineConfig, "precise", network)
413 c.Assert(err, gc.IsNil)
414 c.Assert(hardware, gc.NotNil)
415- arch := version.Current.Arch
416- expected := instance.HardwareCharacteristics{Arch: &arch}.String()
417+ expected := fmt.Sprintf("arch=%s cpu-cores=1 mem=512M root-disk=8192M", version.Current.Arch)
418 c.Assert(hardware.String(), gc.Equals, expected)
419 return inst
420 }
421
422=== modified file 'container/kvm/mock/mock-kvm.go'
423--- container/kvm/mock/mock-kvm.go 2013-11-18 22:26:36 +0000
424+++ container/kvm/mock/mock-kvm.go 2013-12-06 01:14:58 +0000
425@@ -6,7 +6,6 @@
426 import (
427 "fmt"
428
429- "launchpad.net/juju-core/container"
430 "launchpad.net/juju-core/container/kvm"
431 )
432
433@@ -67,12 +66,7 @@
434 return mock.name
435 }
436
437-func (mock *mockContainer) Start(
438- series string,
439- arch string,
440- userDataFile string,
441- network *container.NetworkConfig,
442-) error {
443+func (mock *mockContainer) Start(params kvm.StartParams) error {
444 if mock.started {
445 return fmt.Errorf("container is already running")
446 }
447
448=== modified file 'container/kvm/mock/mock-kvm_test.go'
449--- container/kvm/mock/mock-kvm_test.go 2013-11-18 22:26:36 +0000
450+++ container/kvm/mock/mock-kvm_test.go 2013-12-06 01:14:58 +0000
451@@ -6,27 +6,17 @@
452 import (
453 gc "launchpad.net/gocheck"
454
455- "launchpad.net/juju-core/container"
456 "launchpad.net/juju-core/container/kvm"
457 "launchpad.net/juju-core/container/kvm/mock"
458 jc "launchpad.net/juju-core/testing/checkers"
459 "launchpad.net/juju-core/testing/testbase"
460- "launchpad.net/juju-core/version"
461 )
462
463 type MockSuite struct {
464 testbase.LoggingSuite
465 }
466
467-var (
468- _ = gc.Suite(&MockSuite{})
469-
470- // Start args
471- series = "quantal"
472- arch = version.Current.Arch
473- userData = "/some/path/to/userdata.txt"
474- network = container.BridgeNetworkConfig("testbr0")
475-)
476+var _ = gc.Suite(&MockSuite{})
477
478 func (*MockSuite) TestListInitiallyEmpty(c *gc.C) {
479 factory := mock.MockFactory()
480@@ -62,7 +52,7 @@
481 func (*MockSuite) TestContainerStartStarts(c *gc.C) {
482 factory := mock.MockFactory()
483 container := factory.New("first")
484- err := container.Start(series, arch, userData, network)
485+ err := container.Start(kvm.StartParams{})
486 c.Assert(err, gc.IsNil)
487 c.Assert(container.IsRunning(), jc.IsTrue)
488 }
489@@ -70,16 +60,16 @@
490 func (*MockSuite) TestContainerStartingRunningErrors(c *gc.C) {
491 factory := mock.MockFactory()
492 container := factory.New("first")
493- err := container.Start(series, arch, userData, network)
494+ err := container.Start(kvm.StartParams{})
495 c.Assert(err, gc.IsNil)
496- err = container.Start(series, arch, userData, network)
497+ err = container.Start(kvm.StartParams{})
498 c.Assert(err, gc.ErrorMatches, "container is already running")
499 }
500
501 func (*MockSuite) TestContainerStoppingRunningStops(c *gc.C) {
502 factory := mock.MockFactory()
503 container := factory.New("first")
504- err := container.Start(series, arch, userData, network)
505+ err := container.Start(kvm.StartParams{})
506 c.Assert(err, gc.IsNil)
507 err = container.Stop()
508 c.Assert(err, gc.IsNil)
509@@ -142,8 +132,8 @@
510
511 first := factory.New("first")
512 second := factory.New("second")
513- first.Start(series, arch, userData, network)
514- second.Start(series, arch, userData, network)
515+ first.Start(kvm.StartParams{})
516+ second.Start(kvm.StartParams{})
517 second.Stop()
518 first.Stop()
519
520@@ -161,7 +151,7 @@
521 factory.AddListener(second)
522
523 container := factory.New("container")
524- container.Start(series, arch, userData, network)
525+ container.Start(kvm.StartParams{})
526 container.Stop()
527
528 c.Assert(<-first, gc.Equals, mock.Event{mock.Started, "container"})
529
530=== modified file 'provider/local/environ.go'
531--- provider/local/environ.go 2013-12-04 02:37:05 +0000
532+++ provider/local/environ.go 2013-12-06 01:14:58 +0000
533@@ -294,6 +294,10 @@
534 if err := environs.FinishMachineConfig(machineConfig, env.config.Config, cons); err != nil {
535 return nil, nil, err
536 }
537+ // TODO: evaluate the impact of setting the contstraints on the
538+ // machineConfig for all machines rather than just state server nodes.
539+ // This limiation is why the constraints are assigned directly here.
540+ machineConfig.Constraints = cons
541 machineConfig.AgentEnvironment[agent.Namespace] = env.config.namespace()
542 inst, hardware, err := env.containerManager.StartContainer(machineConfig, series, network)
543 if err != nil {
544
545=== modified file 'testing/testbase/log.go'
546--- testing/testbase/log.go 2013-09-24 15:27:44 +0000
547+++ testing/testbase/log.go 2013-12-06 01:14:58 +0000
548@@ -37,6 +37,7 @@
549
550 func (t *LoggingSuite) SetUpTest(c *gc.C) {
551 t.CleanupSuite.SetUpTest(c)
552+ t.PatchEnvironment("JUJU_LOGGING_CONFIG", "")
553 t.setUp(c)
554 }
555

Subscribers

People subscribed via source and target branches

to status/vote changes: