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  }