github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/container/lxd/lxd_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 // +build go1.3 5 6 package lxd_test 7 8 import ( 9 "runtime" 10 stdtesting "testing" 11 12 jc "github.com/juju/testing/checkers" 13 gc "gopkg.in/check.v1" 14 15 "github.com/juju/juju/constraints" 16 "github.com/juju/juju/container" 17 "github.com/juju/juju/container/lxd" 18 containertesting "github.com/juju/juju/container/testing" 19 "github.com/juju/juju/network" 20 "github.com/juju/juju/status" 21 "github.com/juju/juju/testing" 22 "github.com/juju/juju/tools/lxdclient" 23 ) 24 25 func Test(t *stdtesting.T) { 26 if runtime.GOOS == "windows" { 27 t.Skip("LXC is not supported on windows") 28 } 29 30 /* if there's not a lxd available, don't run the tests */ 31 /* 32 _, err := lxd.ConnectLocal("") 33 if err != nil { 34 t.Skip("LXD is not avalilable %s", err) 35 } 36 */ 37 gc.TestingT(t) 38 } 39 40 type LxdSuite struct{} 41 42 var _ = gc.Suite(&LxdSuite{}) 43 44 func (t *LxdSuite) makeManager(c *gc.C, name string) container.Manager { 45 config := container.ManagerConfig{ 46 container.ConfigModelUUID: testing.ModelTag.Id(), 47 } 48 49 manager, err := lxd.NewContainerManager(config) 50 c.Assert(err, jc.ErrorIsNil) 51 52 return manager 53 } 54 55 func (t *LxdSuite) TestNotAllContainersAreDeleted(c *gc.C) { 56 c.Skip("Test skipped because it talks directly to LXD agent.") 57 lxdClient, err := lxd.ConnectLocal() 58 c.Assert(err, jc.ErrorIsNil) 59 60 /* create a container to make sure isn't deleted */ 61 instanceSpec := lxdclient.InstanceSpec{ 62 Name: "juju-lxd-tests", 63 Image: "ubuntu-xenial", 64 } 65 66 _, err = lxdClient.AddInstance(instanceSpec) 67 c.Assert(err, jc.ErrorIsNil) 68 defer lxdClient.RemoveInstances("", "juju-lxd-tests") 69 70 instanceConfig, err := containertesting.MockMachineConfig("1/lxd/0") 71 c.Assert(err, jc.ErrorIsNil) 72 storageConfig := &container.StorageConfig{} 73 networkConfig := container.BridgeNetworkConfig("nic42", 4321, nil) 74 75 manager := t.makeManager(c, "manager") 76 callback := func(settableStatus status.Status, info string, data map[string]interface{}) error { return nil } 77 _, _, err = manager.CreateContainer( 78 instanceConfig, 79 constraints.Value{}, 80 "xenial", 81 networkConfig, 82 storageConfig, 83 callback, 84 ) 85 c.Assert(err, jc.ErrorIsNil) 86 87 instances, err := manager.ListContainers() 88 c.Assert(err, jc.ErrorIsNil) 89 90 for _, inst := range instances { 91 err = manager.DestroyContainer(inst.Id()) 92 c.Assert(err, jc.ErrorIsNil) 93 } 94 } 95 96 func (t *LxdSuite) TestNICDeviceWithInvalidDeviceName(c *gc.C) { 97 device, err := lxd.NICDevice("", "br-eth1", "", 0) 98 c.Assert(device, gc.IsNil) 99 c.Assert(err.Error(), gc.Equals, "invalid device name") 100 } 101 102 func (t *LxdSuite) TestNICDeviceWithInvalidParentDeviceName(c *gc.C) { 103 device, err := lxd.NICDevice("eth0", "", "", 0) 104 c.Assert(device, gc.IsNil) 105 c.Assert(err.Error(), gc.Equals, "invalid parent device name") 106 } 107 108 func (t *LxdSuite) TestNICDeviceWithoutMACAddressOrMTUGreaterThanZero(c *gc.C) { 109 device, err := lxd.NICDevice("eth1", "br-eth1", "", 0) 110 c.Assert(err, gc.IsNil) 111 expected := lxdclient.Device{ 112 "name": "eth1", 113 "nictype": "bridged", 114 "parent": "br-eth1", 115 "type": "nic", 116 } 117 c.Assert(device, gc.DeepEquals, expected) 118 } 119 120 func (t *LxdSuite) TestNICDeviceWithMACAddressButNoMTU(c *gc.C) { 121 device, err := lxd.NICDevice("eth1", "br-eth1", "aa:bb:cc:dd:ee:f0", 0) 122 c.Assert(err, gc.IsNil) 123 expected := lxdclient.Device{ 124 "hwaddr": "aa:bb:cc:dd:ee:f0", 125 "name": "eth1", 126 "nictype": "bridged", 127 "parent": "br-eth1", 128 "type": "nic", 129 } 130 c.Assert(device, gc.DeepEquals, expected) 131 } 132 133 func (t *LxdSuite) TestNICDeviceWithoutMACAddressButMTUGreaterThanZero(c *gc.C) { 134 device, err := lxd.NICDevice("eth1", "br-eth1", "", 1492) 135 c.Assert(err, gc.IsNil) 136 expected := lxdclient.Device{ 137 "mtu": "1492", 138 "name": "eth1", 139 "nictype": "bridged", 140 "parent": "br-eth1", 141 "type": "nic", 142 } 143 c.Assert(device, gc.DeepEquals, expected) 144 } 145 146 func (t *LxdSuite) TestNICDeviceWithMACAddressAndMTUGreaterThanZero(c *gc.C) { 147 device, err := lxd.NICDevice("eth1", "br-eth1", "aa:bb:cc:dd:ee:f0", 9000) 148 c.Assert(err, gc.IsNil) 149 expected := lxdclient.Device{ 150 "hwaddr": "aa:bb:cc:dd:ee:f0", 151 "mtu": "9000", 152 "name": "eth1", 153 "nictype": "bridged", 154 "parent": "br-eth1", 155 "type": "nic", 156 } 157 c.Assert(device, gc.DeepEquals, expected) 158 } 159 160 func (t *LxdSuite) TestNetworkDevicesWithEmptyParentDevice(c *gc.C) { 161 interfaces := []network.InterfaceInfo{{ 162 InterfaceName: "eth1", 163 InterfaceType: "ethernet", 164 Address: network.NewAddress("0.10.0.21"), 165 MACAddress: "aa:bb:cc:dd:ee:f1", 166 MTU: 9000, 167 }} 168 169 result, err := lxd.NetworkDevices(&container.NetworkConfig{ 170 Interfaces: interfaces, 171 }) 172 173 c.Assert(err, gc.ErrorMatches, "invalid parent device name") 174 c.Assert(result, gc.IsNil) 175 } 176 177 func (t *LxdSuite) TestNetworkDevicesWithParentDevice(c *gc.C) { 178 interfaces := []network.InterfaceInfo{{ 179 ParentInterfaceName: "br-eth0", 180 InterfaceName: "eth0", 181 InterfaceType: "ethernet", 182 Address: network.NewAddress("0.10.0.20"), 183 MACAddress: "aa:bb:cc:dd:ee:f0", 184 }} 185 186 expected := lxdclient.Devices{ 187 "eth0": lxdclient.Device{ 188 "hwaddr": "aa:bb:cc:dd:ee:f0", 189 "name": "eth0", 190 "nictype": "bridged", 191 "parent": "br-eth0", 192 "type": "nic", 193 }, 194 } 195 196 result, err := lxd.NetworkDevices(&container.NetworkConfig{ 197 Device: "lxdbr0", 198 Interfaces: interfaces, 199 }) 200 201 c.Assert(err, jc.ErrorIsNil) 202 c.Assert(result, jc.DeepEquals, expected) 203 }