Merge lp:~thumper/juju-core/container-interface into lp:~go-bot/juju-core/trunk

Proposed by Tim Penhey
Status: Merged
Approved by: Tim Penhey
Approved revision: no longer in the source branch.
Merged at revision: 2047
Proposed branch: lp:~thumper/juju-core/container-interface
Merge into: lp:~go-bot/juju-core/trunk
Prerequisite: lp:~thumper/juju-core/fix-add-machine-test
Diff against target: 439 lines (+104/-81)
6 files modified
container/interface.go (+31/-0)
container/lxc/lxc.go (+21/-61)
container/lxc/lxc_test.go (+15/-14)
container/network.go (+29/-0)
provider/local/environ.go (+4/-3)
worker/provisioner/lxc-broker.go (+4/-3)
To merge this branch: bzr merge lp:~thumper/juju-core/container-interface
Reviewer Review Type Date Requested Status
Juju Engineering Pending
Review via email: mp+194757@code.launchpad.net

Commit message

Move generic bits to container package.

The ContainerManager and the config type to create
it are common over both LXC and KVM. Also, network
config is similarly generic.

Most of this work is just moving types, changing imports
and parameter types.

https://codereview.appspot.com/24780043/

Description of the change

Move generic bits to container package.

The ContainerManager and the config type to create
it are common over both LXC and KVM. Also, network
config is similarly generic.

Most of this work is just moving types, changing imports
and parameter types.

https://codereview.appspot.com/24780043/

To post a comment you must log in.
Revision history for this message
Tim Penhey (thumper) wrote :

Reviewers: mp+194757_code.launchpad.net,

Message:
Please take a look.

Description:
Move generic bits to container package.

The ContainerManager and the config type to create
it are common over both LXC and KVM. Also, network
config is similarly generic.

Most of this work is just moving types, changing imports
and parameter types.

https://code.launchpad.net/~thumper/juju-core/container-interface/+merge/194757

Requires:
https://code.launchpad.net/~thumper/juju-core/fix-add-machine-test/+merge/194753

(do not edit description out of merge proposal)

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

Affected files (+106, -81 lines):
   A [revision details]
   A container/interface.go
   M container/lxc/lxc.go
   M container/lxc/lxc_test.go
   A container/network.go
   M provider/local/environ.go
   M worker/provisioner/lxc-broker.go

Revision history for this message
Ian Booth (wallyworld) wrote :

LGTM. Very pleased to see this factored out.

https://codereview.appspot.com/24780043/diff/1/container/network.go
File container/network.go (right):

https://codereview.appspot.com/24780043/diff/1/container/network.go#newcode7
container/network.go:7: // BridgeNetwork will have the container use the
lxc bridge.
s/lxc/network ?

https://codereview.appspot.com/24780043/

Revision history for this message
Tim Penhey (thumper) wrote :

https://codereview.appspot.com/24780043/diff/1/container/network.go
File container/network.go (right):

https://codereview.appspot.com/24780043/diff/1/container/network.go#newcode7
container/network.go:7: // BridgeNetwork will have the container use the
lxc bridge.
On 2013/11/11 22:59:14, wallyworld wrote:
> s/lxc/network ?

Done.

https://codereview.appspot.com/24780043/

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

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

ok launchpad.net/juju-core/agent 1.201s
ok launchpad.net/juju-core/agent/tools 0.267s
ok launchpad.net/juju-core/bzr 6.855s
ok launchpad.net/juju-core/cert 3.465s
ok launchpad.net/juju-core/charm 0.581s
? launchpad.net/juju-core/charm/hooks [no test files]
ok launchpad.net/juju-core/cloudinit 0.027s
ok launchpad.net/juju-core/cmd 0.375s
? 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 178.824s
ok launchpad.net/juju-core/cmd/jujud 57.811s
ok launchpad.net/juju-core/cmd/plugins/juju-metadata 2.720s
ok launchpad.net/juju-core/constraints 0.027s
? launchpad.net/juju-core/container [no test files]
ok launchpad.net/juju-core/container/lxc 0.331s
? launchpad.net/juju-core/container/lxc/mock [no test files]
? launchpad.net/juju-core/container/lxc/testing [no test files]
ok launchpad.net/juju-core/downloader 5.341s
ok launchpad.net/juju-core/environs 3.161s
ok launchpad.net/juju-core/environs/bootstrap 5.180s
ok launchpad.net/juju-core/environs/cloudinit 0.484s
ok launchpad.net/juju-core/environs/config 1.413s
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 0.980s
ok launchpad.net/juju-core/environs/imagemetadata 0.506s
? launchpad.net/juju-core/environs/imagemetadata/testing [no test files]
ok launchpad.net/juju-core/environs/instances 0.063s
ok launchpad.net/juju-core/environs/jujutest 0.274s
ok launchpad.net/juju-core/environs/manual 5.997s
ok launchpad.net/juju-core/environs/simplestreams 0.338s
? launchpad.net/juju-core/environs/simplestreams/testing [no test files]
ok launchpad.net/juju-core/environs/sshstorage 1.165s
ok launchpad.net/juju-core/environs/storage 1.169s
ok launchpad.net/juju-core/environs/sync 28.368s
ok launchpad.net/juju-core/environs/testing 0.228s
ok launchpad.net/juju-core/environs/tools 6.683s
? 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.022s
? launchpad.net/juju-core/instance/testing [no test files]
ok launchpad.net/juju-core/juju 17.994s
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.016s
ok launchpad.net/juju-core/log/syslog 0.025s
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 launchpad.net/juju-core/provider/azure 6.147s
ok launchpad.net/juju-core/provider/common 0.387s
ok launchpad.net/juju-core/provider/dummy 21.004s
ok launchpad.net/juju-core/provider/ec2 5.081s
ok launchpad.net/juju-core/provider/ec2/httpstorage 0.246s
ok launchpad.net/juju-core/provider/local 2.290s
ok launchpad.net/juju-core/provider/maas 10.071s
ok launchpad.net/juju-core/provider/null 1.300s
ok launchpa...

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file 'container/interface.go'
--- container/interface.go 1970-01-01 00:00:00 +0000
+++ container/interface.go 2013-11-12 00:35:23 +0000
@@ -0,0 +1,31 @@
1// Copyright 2013 Canonical Ltd.
2// Licensed under the AGPLv3, see LICENCE file for details.
3
4package container
5
6import (
7 "launchpad.net/juju-core/environs/cloudinit"
8 "launchpad.net/juju-core/instance"
9)
10
11// ManagerConfig contains the initialization parameters for the ContainerManager.
12// The name of the manager is used to namespace the containers on the machine.
13type ManagerConfig struct {
14 Name string
15 LogDir string
16}
17
18// Manager is responsible for starting containers, and stopping and listing
19// containers that it has started.
20type Manager interface {
21 // StartContainer creates and starts a new container for the specified machine.
22 StartContainer(
23 machineConfig *cloudinit.MachineConfig,
24 series string,
25 network *NetworkConfig) (instance.Instance, error)
26 // StopContainer stops and destroyes the container identified by Instance.
27 StopContainer(instance.Instance) error
28 // ListContainers return a list of containers that have been started by
29 // this manager.
30 ListContainers() ([]instance.Instance, error)
31}
032
=== modified file 'container/lxc/lxc.go'
--- container/lxc/lxc.go 2013-11-11 10:57:06 +0000
+++ container/lxc/lxc.go 2013-11-12 00:35:23 +0000
@@ -14,6 +14,7 @@
14 "launchpad.net/golxc"14 "launchpad.net/golxc"
15 "launchpad.net/loggo"15 "launchpad.net/loggo"
1616
17 "launchpad.net/juju-core/container"
17 "launchpad.net/juju-core/environs/cloudinit"18 "launchpad.net/juju-core/environs/cloudinit"
18 "launchpad.net/juju-core/instance"19 "launchpad.net/juju-core/instance"
19 "launchpad.net/juju-core/names"20 "launchpad.net/juju-core/names"
@@ -33,58 +34,14 @@
33)34)
3435
35const (36const (
36 // BridgeNetwork will have the container use the lxc bridge.
37 bridgeNetwork = "bridge"
38 // PhyscialNetwork will have the container use a specified network device.
39 physicalNetwork = "physical"
40 // DefaultLxcBridge is the package created container bridge37 // DefaultLxcBridge is the package created container bridge
41 DefaultLxcBridge = "lxcbr0"38 DefaultLxcBridge = "lxcbr0"
42)39)
4340
44// NetworkConfig defines how the container network will be configured.
45type NetworkConfig struct {
46 networkType string
47 device string
48}
49
50// DefaultNetworkConfig returns a valid NetworkConfig to use the41// DefaultNetworkConfig returns a valid NetworkConfig to use the
51// defaultLxcBridge that is created by the lxc package.42// defaultLxcBridge that is created by the lxc package.
52func DefaultNetworkConfig() *NetworkConfig {43func DefaultNetworkConfig() *container.NetworkConfig {
53 return &NetworkConfig{bridgeNetwork, DefaultLxcBridge}44 return container.BridgeNetworkConfig(DefaultLxcBridge)
54}
55
56// BridgeNetworkConfig returns a valid NetworkConfig to use the specified
57// device as a network bridge for the container.
58func BridgeNetworkConfig(device string) *NetworkConfig {
59 return &NetworkConfig{bridgeNetwork, device}
60}
61
62// PhysicalNetworkConfig returns a valid NetworkConfig to use the specified
63// device as the network device for the container.
64func PhysicalNetworkConfig(device string) *NetworkConfig {
65 return &NetworkConfig{physicalNetwork, device}
66}
67
68// ManagerConfig contains the initialization parameters for the ContainerManager.
69type ManagerConfig struct {
70 Name string
71 LogDir string
72}
73
74// ContainerManager is responsible for starting containers, and stopping and
75// listing containers that it has started. The name of the manager is used to
76// namespace the lxc containers on the machine.
77type ContainerManager interface {
78 // StartContainer creates and starts a new lxc container for the specified machine.
79 StartContainer(
80 machineConfig *cloudinit.MachineConfig,
81 series string,
82 network *NetworkConfig) (instance.Instance, error)
83 // StopContainer stops and destroyes the lxc container identified by Instance.
84 StopContainer(instance.Instance) error
85 // ListContainers return a list of containers that have been started by
86 // this manager.
87 ListContainers() ([]instance.Instance, error)
88}45}
8946
90type containerManager struct {47type containerManager struct {
@@ -92,10 +49,13 @@
92 logdir string49 logdir string
93}50}
9451
52// containerManager implements container.Manager.
53var _ container.Manager = (*containerManager)(nil)
54
95// NewContainerManager returns a manager object that can start and stop lxc55// NewContainerManager returns a manager object that can start and stop lxc
96// containers. The containers that are created are namespaced by the name56// containers. The containers that are created are namespaced by the name
97// parameter.57// parameter.
98func NewContainerManager(conf ManagerConfig) ContainerManager {58func NewContainerManager(conf container.ManagerConfig) container.Manager {
99 logdir := "/var/log/juju"59 logdir := "/var/log/juju"
100 if conf.LogDir != "" {60 if conf.LogDir != "" {
101 logdir = conf.LogDir61 logdir = conf.LogDir
@@ -106,7 +66,7 @@
106func (manager *containerManager) StartContainer(66func (manager *containerManager) StartContainer(
107 machineConfig *cloudinit.MachineConfig,67 machineConfig *cloudinit.MachineConfig,
108 series string,68 series string,
109 network *NetworkConfig) (instance.Instance, error) {69 network *container.NetworkConfig) (instance.Instance, error) {
11070
111 name := names.MachineTag(machineConfig.MachineId)71 name := names.MachineTag(machineConfig.MachineId)
112 if manager.name != "" {72 if manager.name != "" {
@@ -115,7 +75,7 @@
115 // Note here that the lxcObjectFacotry only returns a valid container75 // Note here that the lxcObjectFacotry only returns a valid container
116 // object, and doesn't actually construct the underlying lxc container on76 // object, and doesn't actually construct the underlying lxc container on
117 // disk.77 // disk.
118 container := LxcObjectFactory.New(name)78 lxcContainer := LxcObjectFactory.New(name)
11979
120 // Create the cloud-init.80 // Create the cloud-init.
121 directory := jujuContainerDirectory(name)81 directory := jujuContainerDirectory(name)
@@ -144,7 +104,7 @@
144 }104 }
145 // Create the container.105 // Create the container.
146 logger.Tracef("create the container")106 logger.Tracef("create the container")
147 if err := container.Create(configFile, defaultTemplate, templateParams...); err != nil {107 if err := lxcContainer.Create(configFile, defaultTemplate, templateParams...); err != nil {
148 logger.Errorf("lxc container creation failed: %v", err)108 logger.Errorf("lxc container creation failed: %v", err)
149 return nil, err109 return nil, err
150 }110 }
@@ -165,18 +125,18 @@
165 // Start the lxc container with the appropriate settings for grabbing the125 // Start the lxc container with the appropriate settings for grabbing the
166 // console output and a log file.126 // console output and a log file.
167 consoleFile := filepath.Join(directory, "console.log")127 consoleFile := filepath.Join(directory, "console.log")
168 container.SetLogFile(filepath.Join(directory, "container.log"), golxc.LogDebug)128 lxcContainer.SetLogFile(filepath.Join(directory, "container.log"), golxc.LogDebug)
169 logger.Tracef("start the container")129 logger.Tracef("start the container")
170 // We explicitly don't pass through the config file to the container.Start130 // We explicitly don't pass through the config file to the container.Start
171 // method as we have passed it through at container creation time. This131 // method as we have passed it through at container creation time. This
172 // is necessary to get the appropriate rootfs reference without explicitly132 // is necessary to get the appropriate rootfs reference without explicitly
173 // setting it ourselves.133 // setting it ourselves.
174 if err = container.Start("", consoleFile); err != nil {134 if err = lxcContainer.Start("", consoleFile); err != nil {
175 logger.Errorf("container failed to start: %v", err)135 logger.Errorf("container failed to start: %v", err)
176 return nil, err136 return nil, err
177 }137 }
178 logger.Tracef("container started")138 logger.Tracef("container started")
179 return &lxcInstance{container, name}, nil139 return &lxcInstance{lxcContainer, name}, nil
180}140}
181141
182func (manager *containerManager) StopContainer(instance instance.Instance) error {142func (manager *containerManager) StopContainer(instance instance.Instance) error {
@@ -262,23 +222,23 @@
262 return fmt.Sprintf(networkTemplate, networkType, networkLink)222 return fmt.Sprintf(networkTemplate, networkType, networkLink)
263}223}
264224
265func generateNetworkConfig(network *NetworkConfig) string {225func generateNetworkConfig(network *container.NetworkConfig) string {
266 if network == nil {226 if network == nil {
267 logger.Warningf("network unspecified, using default networking config")227 logger.Warningf("network unspecified, using default networking config")
268 network = DefaultNetworkConfig()228 network = DefaultNetworkConfig()
269 }229 }
270 switch network.networkType {230 switch network.NetworkType {
271 case physicalNetwork:231 case container.PhysicalNetwork:
272 return networkConfigTemplate("phys", network.device)232 return networkConfigTemplate("phys", network.Device)
273 default:233 default:
274 logger.Warningf("Unknown network config type %q: using bridge", network.networkType)234 logger.Warningf("Unknown network config type %q: using bridge", network.NetworkType)
275 fallthrough235 fallthrough
276 case bridgeNetwork:236 case container.BridgeNetwork:
277 return networkConfigTemplate("veth", network.device)237 return networkConfigTemplate("veth", network.Device)
278 }238 }
279}239}
280240
281func writeLxcConfig(network *NetworkConfig, directory, logdir string) (string, error) {241func writeLxcConfig(network *container.NetworkConfig, directory, logdir string) (string, error) {
282 networkConfig := generateNetworkConfig(network)242 networkConfig := generateNetworkConfig(network)
283 configFilename := filepath.Join(directory, "lxc.conf")243 configFilename := filepath.Join(directory, "lxc.conf")
284 configContent := fmt.Sprintf(localConfig, networkConfig, logdir)244 configContent := fmt.Sprintf(localConfig, networkConfig, logdir)
285245
=== modified file 'container/lxc/lxc_test.go'
--- container/lxc/lxc_test.go 2013-11-11 10:57:06 +0000
+++ container/lxc/lxc_test.go 2013-11-12 00:35:23 +0000
@@ -15,6 +15,7 @@
15 "launchpad.net/goyaml"15 "launchpad.net/goyaml"
16 "launchpad.net/loggo"16 "launchpad.net/loggo"
1717
18 "launchpad.net/juju-core/container"
18 "launchpad.net/juju-core/container/lxc"19 "launchpad.net/juju-core/container/lxc"
19 lxctesting "launchpad.net/juju-core/container/lxc/testing"20 lxctesting "launchpad.net/juju-core/container/lxc/testing"
20 "launchpad.net/juju-core/environs"21 "launchpad.net/juju-core/environs"
@@ -65,7 +66,7 @@
65 aptConfigScript = fmt.Sprintf("#!/bin/sh\n echo '%s\n%s'", configHttpProxy, configProxyExtra)66 aptConfigScript = fmt.Sprintf("#!/bin/sh\n echo '%s\n%s'", configHttpProxy, configProxyExtra)
66)67)
6768
68func StartContainer(c *gc.C, manager lxc.ContainerManager, machineId string) instance.Instance {69func StartContainer(c *gc.C, manager container.Manager, machineId string) instance.Instance {
69 stateInfo := jujutesting.FakeStateInfo(machineId)70 stateInfo := jujutesting.FakeStateInfo(machineId)
70 apiInfo := jujutesting.FakeAPIInfo(machineId)71 apiInfo := jujutesting.FakeAPIInfo(machineId)
71 machineConfig := environs.NewMachineConfig(machineId, "fake-nonce", stateInfo, apiInfo)72 machineConfig := environs.NewMachineConfig(machineId, "fake-nonce", stateInfo, apiInfo)
@@ -75,14 +76,14 @@
75 }76 }
7677
77 series := "series"78 series := "series"
78 network := lxc.BridgeNetworkConfig("nic42")79 network := container.BridgeNetworkConfig("nic42")
79 inst, err := manager.StartContainer(machineConfig, series, network)80 inst, err := manager.StartContainer(machineConfig, series, network)
80 c.Assert(err, gc.IsNil)81 c.Assert(err, gc.IsNil)
81 return inst82 return inst
82}83}
8384
84func (s *LxcSuite) TestStartContainer(c *gc.C) {85func (s *LxcSuite) TestStartContainer(c *gc.C) {
85 manager := lxc.NewContainerManager(lxc.ManagerConfig{})86 manager := lxc.NewContainerManager(container.ManagerConfig{})
86 instance := StartContainer(c, manager, "1/lxc/0")87 instance := StartContainer(c, manager, "1/lxc/0")
8788
88 name := string(instance.Id())89 name := string(instance.Id())
@@ -130,7 +131,7 @@
130}131}
131132
132func (s *LxcSuite) TestContainerState(c *gc.C) {133func (s *LxcSuite) TestContainerState(c *gc.C) {
133 manager := lxc.NewContainerManager(lxc.ManagerConfig{})134 manager := lxc.NewContainerManager(container.ManagerConfig{})
134 instance := StartContainer(c, manager, "1/lxc/0")135 instance := StartContainer(c, manager, "1/lxc/0")
135136
136 // The mock container will be immediately "running".137 // The mock container will be immediately "running".
@@ -144,7 +145,7 @@
144}145}
145146
146func (s *LxcSuite) TestStopContainer(c *gc.C) {147func (s *LxcSuite) TestStopContainer(c *gc.C) {
147 manager := lxc.NewContainerManager(lxc.ManagerConfig{})148 manager := lxc.NewContainerManager(container.ManagerConfig{})
148 instance := StartContainer(c, manager, "1/lxc/0")149 instance := StartContainer(c, manager, "1/lxc/0")
149150
150 err := manager.StopContainer(instance)151 err := manager.StopContainer(instance)
@@ -158,7 +159,7 @@
158}159}
159160
160func (s *LxcSuite) TestStopContainerNameClash(c *gc.C) {161func (s *LxcSuite) TestStopContainerNameClash(c *gc.C) {
161 manager := lxc.NewContainerManager(lxc.ManagerConfig{})162 manager := lxc.NewContainerManager(container.ManagerConfig{})
162 instance := StartContainer(c, manager, "1/lxc/0")163 instance := StartContainer(c, manager, "1/lxc/0")
163164
164 name := string(instance.Id())165 name := string(instance.Id())
@@ -176,14 +177,14 @@
176}177}
177178
178func (s *LxcSuite) TestNamedManagerPrefix(c *gc.C) {179func (s *LxcSuite) TestNamedManagerPrefix(c *gc.C) {
179 manager := lxc.NewContainerManager(lxc.ManagerConfig{Name: "eric"})180 manager := lxc.NewContainerManager(container.ManagerConfig{Name: "eric"})
180 instance := StartContainer(c, manager, "1/lxc/0")181 instance := StartContainer(c, manager, "1/lxc/0")
181 c.Assert(string(instance.Id()), gc.Equals, "eric-machine-1-lxc-0")182 c.Assert(string(instance.Id()), gc.Equals, "eric-machine-1-lxc-0")
182}183}
183184
184func (s *LxcSuite) TestListContainers(c *gc.C) {185func (s *LxcSuite) TestListContainers(c *gc.C) {
185 foo := lxc.NewContainerManager(lxc.ManagerConfig{Name: "foo"})186 foo := lxc.NewContainerManager(container.ManagerConfig{Name: "foo"})
186 bar := lxc.NewContainerManager(lxc.ManagerConfig{Name: "bar"})187 bar := lxc.NewContainerManager(container.ManagerConfig{Name: "bar"})
187188
188 foo1 := StartContainer(c, foo, "1/lxc/0")189 foo1 := StartContainer(c, foo, "1/lxc/0")
189 foo2 := StartContainer(c, foo, "1/lxc/1")190 foo2 := StartContainer(c, foo, "1/lxc/1")
@@ -202,14 +203,14 @@
202}203}
203204
204func (s *LxcSuite) TestStartContainerAutostarts(c *gc.C) {205func (s *LxcSuite) TestStartContainerAutostarts(c *gc.C) {
205 manager := lxc.NewContainerManager(lxc.ManagerConfig{})206 manager := lxc.NewContainerManager(container.ManagerConfig{})
206 instance := StartContainer(c, manager, "1/lxc/0")207 instance := StartContainer(c, manager, "1/lxc/0")
207 autostartLink := lxc.RestartSymlink(string(instance.Id()))208 autostartLink := lxc.RestartSymlink(string(instance.Id()))
208 c.Assert(autostartLink, jc.IsSymlink)209 c.Assert(autostartLink, jc.IsSymlink)
209}210}
210211
211func (s *LxcSuite) TestStopContainerRemovesAutostartLink(c *gc.C) {212func (s *LxcSuite) TestStopContainerRemovesAutostartLink(c *gc.C) {
212 manager := lxc.NewContainerManager(lxc.ManagerConfig{})213 manager := lxc.NewContainerManager(container.ManagerConfig{})
213 instance := StartContainer(c, manager, "1/lxc/0")214 instance := StartContainer(c, manager, "1/lxc/0")
214 err := manager.StopContainer(instance)215 err := manager.StopContainer(instance)
215 c.Assert(err, gc.IsNil)216 c.Assert(err, gc.IsNil)
@@ -225,7 +226,7 @@
225226
226func (*NetworkSuite) TestGenerateNetworkConfig(c *gc.C) {227func (*NetworkSuite) TestGenerateNetworkConfig(c *gc.C) {
227 for _, test := range []struct {228 for _, test := range []struct {
228 config *lxc.NetworkConfig229 config *container.NetworkConfig
229 net string230 net string
230 link string231 link string
231 }{{232 }{{
@@ -237,11 +238,11 @@
237 net: "veth",238 net: "veth",
238 link: "lxcbr0",239 link: "lxcbr0",
239 }, {240 }, {
240 config: lxc.BridgeNetworkConfig("foo"),241 config: container.BridgeNetworkConfig("foo"),
241 net: "veth",242 net: "veth",
242 link: "foo",243 link: "foo",
243 }, {244 }, {
244 config: lxc.PhysicalNetworkConfig("foo"),245 config: container.PhysicalNetworkConfig("foo"),
245 net: "phys",246 net: "phys",
246 link: "foo",247 link: "foo",
247 }} {248 }} {
248249
=== added file 'container/network.go'
--- container/network.go 1970-01-01 00:00:00 +0000
+++ container/network.go 2013-11-12 00:35:23 +0000
@@ -0,0 +1,29 @@
1// Copyright 2013 Canonical Ltd.
2// Licensed under the AGPLv3, see LICENCE file for details.
3
4package container
5
6const (
7 // BridgeNetwork will have the container use the network bridge.
8 BridgeNetwork = "bridge"
9 // PhyscialNetwork will have the container use a specified network device.
10 PhysicalNetwork = "physical"
11)
12
13// NetworkConfig defines how the container network will be configured.
14type NetworkConfig struct {
15 NetworkType string
16 Device string
17}
18
19// BridgeNetworkConfig returns a valid NetworkConfig to use the specified
20// device as a network bridge for the container.
21func BridgeNetworkConfig(device string) *NetworkConfig {
22 return &NetworkConfig{BridgeNetwork, device}
23}
24
25// PhysicalNetworkConfig returns a valid NetworkConfig to use the specified
26// device as the network device for the container.
27func PhysicalNetworkConfig(device string) *NetworkConfig {
28 return &NetworkConfig{PhysicalNetwork, device}
29}
030
=== modified file 'provider/local/environ.go'
--- provider/local/environ.go 2013-11-07 09:09:55 +0000
+++ provider/local/environ.go 2013-11-12 00:35:23 +0000
@@ -16,6 +16,7 @@
16 "launchpad.net/juju-core/agent"16 "launchpad.net/juju-core/agent"
17 agenttools "launchpad.net/juju-core/agent/tools"17 agenttools "launchpad.net/juju-core/agent/tools"
18 "launchpad.net/juju-core/constraints"18 "launchpad.net/juju-core/constraints"
19 "launchpad.net/juju-core/container"
19 "launchpad.net/juju-core/container/lxc"20 "launchpad.net/juju-core/container/lxc"
20 "launchpad.net/juju-core/environs"21 "launchpad.net/juju-core/environs"
21 "launchpad.net/juju-core/environs/cloudinit"22 "launchpad.net/juju-core/environs/cloudinit"
@@ -58,7 +59,7 @@
58 name string59 name string
59 sharedStorageListener net.Listener60 sharedStorageListener net.Listener
60 storageListener net.Listener61 storageListener net.Listener
61 containerManager lxc.ContainerManager62 containerManager container.Manager
62}63}
6364
64// GetToolsSources returns a list of sources which are used to search for simplestreams tools metadata.65// GetToolsSources returns a list of sources which are used to search for simplestreams tools metadata.
@@ -175,7 +176,7 @@
175 env.name = ecfg.Name()176 env.name = ecfg.Name()
176177
177 env.containerManager = lxc.NewContainerManager(178 env.containerManager = lxc.NewContainerManager(
178 lxc.ManagerConfig{179 container.ManagerConfig{
179 Name: env.config.namespace(),180 Name: env.config.namespace(),
180 LogDir: env.config.logDir(),181 LogDir: env.config.logDir(),
181 })182 })
@@ -266,7 +267,7 @@
266 machineConfig.Tools = possibleTools[0]267 machineConfig.Tools = possibleTools[0]
267 machineConfig.MachineContainerType = instance.LXC268 machineConfig.MachineContainerType = instance.LXC
268 logger.Debugf("tools: %#v", machineConfig.Tools)269 logger.Debugf("tools: %#v", machineConfig.Tools)
269 network := lxc.BridgeNetworkConfig(env.config.networkBridge())270 network := container.BridgeNetworkConfig(env.config.networkBridge())
270 if err := environs.FinishMachineConfig(machineConfig, env.config.Config, cons); err != nil {271 if err := environs.FinishMachineConfig(machineConfig, env.config.Config, cons); err != nil {
271 return nil, nil, err272 return nil, nil, err
272 }273 }
273274
=== modified file 'worker/provisioner/lxc-broker.go'
--- worker/provisioner/lxc-broker.go 2013-10-31 21:36:40 +0000
+++ worker/provisioner/lxc-broker.go 2013-11-12 00:35:23 +0000
@@ -8,6 +8,7 @@
88
9 "launchpad.net/juju-core/agent"9 "launchpad.net/juju-core/agent"
10 "launchpad.net/juju-core/constraints"10 "launchpad.net/juju-core/constraints"
11 "launchpad.net/juju-core/container"
11 "launchpad.net/juju-core/container/lxc"12 "launchpad.net/juju-core/container/lxc"
12 "launchpad.net/juju-core/environs"13 "launchpad.net/juju-core/environs"
13 "launchpad.net/juju-core/environs/cloudinit"14 "launchpad.net/juju-core/environs/cloudinit"
@@ -27,7 +28,7 @@
2728
28func NewLxcBroker(api APICalls, tools *tools.Tools, agentConfig agent.Config) environs.InstanceBroker {29func NewLxcBroker(api APICalls, tools *tools.Tools, agentConfig agent.Config) environs.InstanceBroker {
29 return &lxcBroker{30 return &lxcBroker{
30 manager: lxc.NewContainerManager(lxc.ManagerConfig{Name: "juju"}),31 manager: lxc.NewContainerManager(container.ManagerConfig{Name: "juju"}),
31 api: api,32 api: api,
32 tools: tools,33 tools: tools,
33 agentConfig: agentConfig,34 agentConfig: agentConfig,
@@ -35,7 +36,7 @@
35}36}
3637
37type lxcBroker struct {38type lxcBroker struct {
38 manager lxc.ContainerManager39 manager container.Manager
39 api APICalls40 api APICalls
40 tools *tools.Tools41 tools *tools.Tools
41 agentConfig agent.Config42 agentConfig agent.Config
@@ -57,7 +58,7 @@
57 if bridgeDevice == "" {58 if bridgeDevice == "" {
58 bridgeDevice = lxc.DefaultLxcBridge59 bridgeDevice = lxc.DefaultLxcBridge
59 }60 }
60 network := lxc.BridgeNetworkConfig(bridgeDevice)61 network := container.BridgeNetworkConfig(bridgeDevice)
6162
62 series := possibleTools.OneSeries()63 series := possibleTools.OneSeries()
63 machineConfig.MachineContainerType = instance.LXC64 machineConfig.MachineContainerType = instance.LXC

Subscribers

People subscribed via source and target branches

to status/vote changes: