Skip to content

Commit cc19c59

Browse files
committed
Adds new interfaces and shims to containerizer package to support provisioner testing.
Updates bridge policy tests to accomodate new shims. Uses new shims in provisioner API server and regenerated local mocks.
1 parent f2a40bd commit cc19c59

File tree

7 files changed

+253
-67
lines changed

7 files changed

+253
-67
lines changed

apiserver/facades/agent/provisioner/machine_mock_test.go

Lines changed: 70 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apiserver/facades/agent/provisioner/provisioner.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -803,7 +803,6 @@ type Machine interface {
803803
containerizer.Container
804804
InstanceId() (instance.Id, error)
805805
IsManual() (bool, error)
806-
AllLinkLayerDevices() ([]*state.LinkLayerDevice, error)
807806
MachineTag() names.MachineTag
808807
}
809808

@@ -848,17 +847,21 @@ func (p *ProvisionerAPI) processEachContainer(args params.Entities, handler perC
848847
// The auth function (canAccess) checks that the machine is a
849848
// top level machine (we filter those out next) or that the
850849
// machine has the host as a parent.
851-
container, err := p.getMachine(canAccess, machineTag)
850+
ctr, err := p.getMachine(canAccess, machineTag)
852851
if err != nil {
853852
handler.SetError(i, common.ServerError(err))
854853
continue
855-
} else if !container.IsContainer() {
854+
} else if !ctr.IsContainer() {
856855
err = errors.Errorf("cannot prepare network config for %q: not a container", machineTag)
857856
handler.SetError(i, common.ServerError(err))
858857
continue
859858
}
860859

861-
if err := handler.ProcessOneContainer(env, p.providerCallContext, i, hostMachine, container); err != nil {
860+
if err := handler.ProcessOneContainer(
861+
env, p.providerCallContext, i,
862+
&containerizer.MachineShim{Machine: hostMachine},
863+
&containerizer.MachineShim{Machine: ctr},
864+
); err != nil {
862865
handler.SetError(i, common.ServerError(err))
863866
continue
864867
}

network/containerizer/bridgepolicy.go

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515

1616
"github.com/juju/juju/instance"
1717
"github.com/juju/juju/network"
18+
1819
// Used for some constants and things like LinkLayerDevice[Args]
1920
"github.com/juju/juju/state"
2021
)
@@ -39,28 +40,6 @@ type BridgePolicy struct {
3940
ContainerNetworkingMethod string
4041
}
4142

42-
// Machine describes either a host machine, or a container machine. Either way
43-
// *state.Machine should fulfill the interface in non-test code.
44-
type Machine interface {
45-
Id() string
46-
AllSpaces() (set.Strings, error)
47-
LinkLayerDevicesForSpaces([]string) (map[string][]*state.LinkLayerDevice, error)
48-
}
49-
50-
var _ Machine = (*state.Machine)(nil)
51-
52-
// Container describes the extra attributes we need to be able to update the
53-
// devices for a container.
54-
// *state.Machine should fulfill the interface.
55-
type Container interface {
56-
Machine
57-
ContainerType() instance.ContainerType
58-
DesiredSpaces() (set.Strings, error)
59-
SetLinkLayerDevices(...state.LinkLayerDeviceArgs) error
60-
}
61-
62-
var _ Container = (*state.Machine)(nil)
63-
6443
// inferContainerSpaces tries to find a valid space for the container to be
6544
// on. This should only be used when the container itself doesn't have any
6645
// valid constraints on what spaces it should be in.
@@ -119,7 +98,7 @@ func (p *BridgePolicy) determineContainerSpaces(m Machine, containerMachine Cont
11998
// findSpacesAndDevicesForContainer looks up what spaces the container wants
12099
// to be in, and what spaces the host machine is already in, and tries to
121100
// find the devices on the host that are useful for the container.
122-
func (p *BridgePolicy) findSpacesAndDevicesForContainer(m Machine, containerMachine Container) (set.Strings, map[string][]*state.LinkLayerDevice, error) {
101+
func (p *BridgePolicy) findSpacesAndDevicesForContainer(m Machine, containerMachine Container) (set.Strings, map[string][]LinkLayerDevice, error) {
123102
containerSpaces, err := p.determineContainerSpaces(m, containerMachine, "")
124103
if err != nil {
125104
return nil, nil, errors.Trace(err)
@@ -133,7 +112,7 @@ func (p *BridgePolicy) findSpacesAndDevicesForContainer(m Machine, containerMach
133112
return containerSpaces, devicesPerSpace, nil
134113
}
135114

136-
func possibleBridgeTarget(dev *state.LinkLayerDevice) (bool, error) {
115+
func possibleBridgeTarget(dev LinkLayerDevice) (bool, error) {
137116
// LoopbackDevices can never be bridged
138117
if dev.Type() == state.LoopbackDevice || dev.Type() == state.BridgeDevice {
139118
return false, nil
@@ -164,7 +143,7 @@ func possibleBridgeTarget(dev *state.LinkLayerDevice) (bool, error) {
164143
return false, nil
165144
}
166145

167-
func formatDeviceMap(spacesToDevices map[string][]*state.LinkLayerDevice) string {
146+
func formatDeviceMap(spacesToDevices map[string][]LinkLayerDevice) string {
168147
spaceNames := make([]string, len(spacesToDevices))
169148
i := 0
170149
for spaceName := range spacesToDevices {
@@ -223,7 +202,7 @@ func BridgeNameForDevice(device string) string {
223202
func (b *BridgePolicy) FindMissingBridgesForContainer(m Machine, containerMachine Container) ([]network.DeviceToBridge, int, error) {
224203
reconfigureDelay := 0
225204
containerSpaces, devicesPerSpace, err := b.findSpacesAndDevicesForContainer(m, containerMachine)
226-
hostDeviceByName := make(map[string]*state.LinkLayerDevice, 0)
205+
hostDeviceByName := make(map[string]LinkLayerDevice, 0)
227206
if err != nil {
228207
return nil, 0, errors.Trace(err)
229208
}
@@ -352,7 +331,7 @@ func (p *BridgePolicy) PopulateContainerLinkLayerDevices(m Machine, containerMac
352331
instance.KVM: network.DefaultKVMBridge,
353332
}
354333
spacesFound := set.NewStrings()
355-
devicesByName := make(map[string]*state.LinkLayerDevice)
334+
devicesByName := make(map[string]LinkLayerDevice)
356335
bridgeDeviceNames := make([]string, 0)
357336

358337
for spaceName, hostDevices := range devicesPerSpace {
@@ -397,7 +376,7 @@ func (p *BridgePolicy) PopulateContainerLinkLayerDevices(m Machine, containerMac
397376

398377
for i, hostBridgeName := range sortedBridgeDeviceNames {
399378
hostBridge := devicesByName[hostBridgeName]
400-
newLLD, err := state.DefineEthernetDeviceOnBridge(fmt.Sprintf("eth%d", i), hostBridge)
379+
newLLD, err := hostBridge.EthernetDeviceForBridge(fmt.Sprintf("eth%d", i))
401380
if err != nil {
402381
return errors.Trace(err)
403382
}

network/containerizer/bridgepolicy_test.go

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ import (
2525
type bridgePolicyStateSuite struct {
2626
statetesting.StateSuite
2727

28-
machine *state.Machine
29-
containerMachine *state.Machine
28+
machine containerizer.Machine
29+
containerMachine containerizer.Container
3030

3131
bridgePolicy *containerizer.BridgePolicy
3232
}
@@ -70,8 +70,9 @@ func (s *bridgePolicyStateSuite) SetUpTest(c *gc.C) {
7070
s.StateSuite.SetUpTest(c)
7171

7272
var err error
73-
s.machine, err = s.State.AddMachine("quantal", state.JobHostUnits)
73+
m, err := s.State.AddMachine("quantal", state.JobHostUnits)
7474
c.Assert(err, jc.ErrorIsNil)
75+
s.machine = &containerizer.MachineShim{m}
7576

7677
s.bridgePolicy = &containerizer.BridgePolicy{
7778
NetBondReconfigureDelay: 13,
@@ -87,14 +88,16 @@ func (s *bridgePolicyStateSuite) addContainerMachine(c *gc.C) {
8788
}
8889
container, err := s.State.AddMachineInsideMachine(containerTemplate, s.machine.Id(), instance.LXD)
8990
c.Assert(err, jc.ErrorIsNil)
90-
s.containerMachine = container
91+
s.containerMachine = &containerizer.MachineShim{container}
9192
}
9293

93-
func (s *bridgePolicyStateSuite) assertNoDevicesOnMachine(c *gc.C, machine *state.Machine) {
94+
func (s *bridgePolicyStateSuite) assertNoDevicesOnMachine(c *gc.C, machine containerizer.Container) {
9495
s.assertAllLinkLayerDevicesOnMachineMatchCount(c, machine, 0)
9596
}
9697

97-
func (s *bridgePolicyStateSuite) assertAllLinkLayerDevicesOnMachineMatchCount(c *gc.C, machine *state.Machine, expectedCount int) {
98+
func (s *bridgePolicyStateSuite) assertAllLinkLayerDevicesOnMachineMatchCount(
99+
c *gc.C, machine containerizer.Container, expectedCount int,
100+
) {
98101
results, err := machine.AllLinkLayerDevices()
99102
c.Assert(err, jc.ErrorIsNil)
100103
c.Check(results, gc.HasLen, expectedCount)
@@ -117,7 +120,7 @@ func (s *bridgePolicyStateSuite) setupTwoSpaces(c *gc.C) {
117120
s.createSpaceAndSubnet(c, "dmz", "10.10.0.0/24")
118121
}
119122

120-
func (s *bridgePolicyStateSuite) createNICWithIP(c *gc.C, machine *state.Machine, deviceName, cidrAddress string) {
123+
func (s *bridgePolicyStateSuite) createNICWithIP(c *gc.C, machine containerizer.Machine, deviceName, cidrAddress string) {
121124
err := machine.SetLinkLayerDevices(
122125
state.LinkLayerDeviceArgs{
123126
Name: deviceName,
@@ -137,7 +140,9 @@ func (s *bridgePolicyStateSuite) createNICWithIP(c *gc.C, machine *state.Machine
137140
c.Assert(err, jc.ErrorIsNil)
138141
}
139142

140-
func (s *bridgePolicyStateSuite) createBridgeWithIP(c *gc.C, machine *state.Machine, bridgeName, cidrAddress string) {
143+
func (s *bridgePolicyStateSuite) createBridgeWithIP(
144+
c *gc.C, machine containerizer.Machine, bridgeName, cidrAddress string,
145+
) {
141146
err := machine.SetLinkLayerDevices(
142147
state.LinkLayerDeviceArgs{
143148
Name: bridgeName,
@@ -159,7 +164,9 @@ func (s *bridgePolicyStateSuite) createBridgeWithIP(c *gc.C, machine *state.Mach
159164

160165
// createNICAndBridgeWithIP creates a network interface and a bridge on the
161166
// machine, and assigns the requested CIDRAddress to the bridge.
162-
func (s *bridgePolicyStateSuite) createNICAndBridgeWithIP(c *gc.C, machine *state.Machine, deviceName, bridgeName, cidrAddress string) {
167+
func (s *bridgePolicyStateSuite) createNICAndBridgeWithIP(
168+
c *gc.C, machine containerizer.Machine, deviceName, bridgeName, cidrAddress string,
169+
) {
163170
s.createBridgeWithIP(c, machine, bridgeName, cidrAddress)
164171
err := machine.SetLinkLayerDevices(
165172
state.LinkLayerDeviceArgs{
@@ -178,7 +185,7 @@ func (s *bridgePolicyStateSuite) setupMachineInTwoSpaces(c *gc.C) {
178185
s.createNICAndBridgeWithIP(c, s.machine, "ens0p10", "br-ens0p10", "10.10.0.20/24")
179186
}
180187

181-
func (s *bridgePolicyStateSuite) createLoopbackNIC(c *gc.C, machine *state.Machine) {
188+
func (s *bridgePolicyStateSuite) createLoopbackNIC(c *gc.C, machine containerizer.Machine) {
182189
err := machine.SetLinkLayerDevices(
183190
state.LinkLayerDeviceArgs{
184191
Name: "lo",
@@ -199,15 +206,15 @@ func (s *bridgePolicyStateSuite) createLoopbackNIC(c *gc.C, machine *state.Machi
199206
}
200207

201208
// createAllDefaultDevices creates the loopback, lxcbr0, lxdbr0, and virbr0 devices
202-
func (s *bridgePolicyStateSuite) createAllDefaultDevices(c *gc.C, machine *state.Machine) {
209+
func (s *bridgePolicyStateSuite) createAllDefaultDevices(c *gc.C, machine containerizer.Machine) {
203210
// loopback
204-
s.createLoopbackNIC(c, s.machine)
211+
s.createLoopbackNIC(c, machine)
205212
// container.DefaultLxcBridge
206-
s.createBridgeWithIP(c, s.machine, "lxcbr0", "10.0.3.1/24")
213+
s.createBridgeWithIP(c, machine, "lxcbr0", "10.0.3.1/24")
207214
// container.DefaultLxdBridge
208-
s.createBridgeWithIP(c, s.machine, "lxdbr0", "10.0.4.1/24")
215+
s.createBridgeWithIP(c, machine, "lxdbr0", "10.0.4.1/24")
209216
// container.DefaultKvmBridge
210-
s.createBridgeWithIP(c, s.machine, "virbr0", "192.168.124.1/24")
217+
s.createBridgeWithIP(c, machine, "virbr0", "192.168.124.1/24")
211218
}
212219

213220
func (s *bridgePolicyStateSuite) TestPopulateContainerLinkLayerDevicesCorrectlyPaired(c *gc.C) {
@@ -345,7 +352,7 @@ func (s *bridgePolicyStateSuite) TestPopulateContainerLinkLayerDevicesUnitBindin
345352
addCharm(c, s.State, "quantal", "mysql"), map[string]string{"server": "default"})
346353
unit, err := app.AddUnit(state.AddUnitParams{})
347354
c.Assert(err, jc.ErrorIsNil)
348-
err = unit.AssignToMachine(s.containerMachine)
355+
err = unit.AssignToMachine(s.containerMachine.Wrapped())
349356
c.Assert(err, jc.ErrorIsNil)
350357
spaces, err := s.containerMachine.DesiredSpaces()
351358
c.Assert(err, jc.ErrorIsNil)

0 commit comments

Comments
 (0)