github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/container/lxd/initialisation_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
     7  
     8  import (
     9  	"os/exec"
    10  	"strconv"
    11  
    12  	jc "github.com/juju/testing/checkers"
    13  	"github.com/juju/utils/packaging/commands"
    14  	"github.com/juju/utils/packaging/manager"
    15  	"github.com/juju/utils/series"
    16  	gc "gopkg.in/check.v1"
    17  
    18  	"github.com/juju/juju/testing"
    19  )
    20  
    21  type InitialiserSuite struct {
    22  	testing.BaseSuite
    23  	calledCmds []string
    24  }
    25  
    26  var _ = gc.Suite(&InitialiserSuite{})
    27  
    28  // getMockRunCommandWithRetry is a helper function which returns a function
    29  // with an identical signature to manager.RunCommandWithRetry which saves each
    30  // command it recieves in a slice and always returns no output, error code 0
    31  // and a nil error.
    32  func getMockRunCommandWithRetry(calledCmds *[]string) func(string, func(string) error) (string, int, error) {
    33  	return func(cmd string, fatalError func(string) error) (string, int, error) {
    34  		*calledCmds = append(*calledCmds, cmd)
    35  		return "", 0, nil
    36  	}
    37  }
    38  
    39  func (s *InitialiserSuite) SetUpTest(c *gc.C) {
    40  	s.BaseSuite.SetUpTest(c)
    41  	s.calledCmds = []string{}
    42  	s.PatchValue(&manager.RunCommandWithRetry, getMockRunCommandWithRetry(&s.calledCmds))
    43  	s.PatchValue(&configureZFS, func() {})
    44  	s.PatchValue(&configureLXDBridge, func() error { return nil })
    45  }
    46  
    47  func (s *InitialiserSuite) TestLTSSeriesPackages(c *gc.C) {
    48  	// Momentarily, the only series with a dedicated cloud archive is precise,
    49  	// which we will use for the following test:
    50  	paccmder, err := commands.NewPackageCommander("trusty")
    51  	c.Assert(err, jc.ErrorIsNil)
    52  
    53  	s.PatchValue(&series.HostSeries, func() string { return "trusty" })
    54  	container := NewContainerInitialiser("trusty")
    55  
    56  	err = container.Initialise()
    57  	c.Assert(err, jc.ErrorIsNil)
    58  
    59  	c.Assert(s.calledCmds, gc.DeepEquals, []string{
    60  		paccmder.InstallCmd("--target-release", "trusty-backports", "lxd"),
    61  	})
    62  }
    63  
    64  func (s *InitialiserSuite) TestNoSeriesPackages(c *gc.C) {
    65  	// Here we want to test for any other series whilst avoiding the
    66  	// possibility of hitting a cloud archive-requiring release.
    67  	// As such, we simply pass an empty series.
    68  	paccmder, err := commands.NewPackageCommander("xenial")
    69  	c.Assert(err, jc.ErrorIsNil)
    70  
    71  	container := NewContainerInitialiser("")
    72  
    73  	err = container.Initialise()
    74  	c.Assert(err, jc.ErrorIsNil)
    75  
    76  	c.Assert(s.calledCmds, gc.DeepEquals, []string{
    77  		paccmder.InstallCmd("lxd"),
    78  	})
    79  }
    80  
    81  func (s *InitialiserSuite) TestEditLXDBridgeFile(c *gc.C) {
    82  	input := `# WARNING: Don't modify this file by hand, it is generated by debconf!
    83  # To update those values, please run "dpkg-reconfigure lxd"
    84  
    85  # Whether to setup a new bridge
    86  USE_LXD_BRIDGE="true"
    87  EXISTING_BRIDGE=""
    88  
    89  # Bridge name
    90  LXD_BRIDGE="lxdbr0"
    91  
    92  # dnsmasq configuration path
    93  LXD_CONFILE=""
    94  
    95  # dnsmasq domain
    96  LXD_DOMAIN="lxd"
    97  
    98  # IPv4
    99  LXD_IPV4_ADDR="10.0.4.1"
   100  LXD_IPV4_NETMASK="255.255.255.0"
   101  LXD_IPV4_NETWORK="10.0.4.1/24"
   102  LXD_IPV4_DHCP_RANGE="10.0.4.2,10.0.4.100"
   103  LXD_IPV4_DHCP_MAX="50"
   104  LXD_IPV4_NAT="true"
   105  
   106  # IPv6
   107  LXD_IPV6_ADDR="2001:470:b2b5:9999::1"
   108  LXD_IPV6_MASK="64"
   109  LXD_IPV6_NETWORK="2001:470:b2b5:9999::1/64"
   110  LXD_IPV6_NAT="true"
   111  
   112  # Proxy server
   113  LXD_IPV6_PROXY="true"
   114  `
   115  	expected := `# WARNING: Don't modify this file by hand, it is generated by debconf!
   116  # To update those values, please run "dpkg-reconfigure lxd"
   117  
   118  # Whether to setup a new bridge
   119  USE_LXD_BRIDGE="true"
   120  EXISTING_BRIDGE=""
   121  
   122  # Bridge name
   123  LXD_BRIDGE="lxdbr0"
   124  
   125  # dnsmasq configuration path
   126  LXD_CONFILE=""
   127  
   128  # dnsmasq domain
   129  LXD_DOMAIN="lxd"
   130  
   131  # IPv4
   132  LXD_IPV4_ADDR="10.0.19.1"
   133  LXD_IPV4_NETMASK="255.255.255.0"
   134  LXD_IPV4_NETWORK="10.0.19.1/24"
   135  LXD_IPV4_DHCP_RANGE="10.0.19.2,10.0.19.254"
   136  LXD_IPV4_DHCP_MAX="253"
   137  LXD_IPV4_NAT="true"
   138  
   139  # IPv6
   140  LXD_IPV6_ADDR="2001:470:b2b5:9999::1"
   141  LXD_IPV6_MASK="64"
   142  LXD_IPV6_NETWORK="2001:470:b2b5:9999::1/64"
   143  LXD_IPV6_NAT="true"
   144  
   145  # Proxy server
   146  LXD_IPV6_PROXY="false"
   147  
   148  `
   149  	result := editLXDBridgeFile(input, "19")
   150  	c.Assert(result, jc.DeepEquals, expected)
   151  }
   152  
   153  func (s *InitialiserSuite) TestDetectSubnet(c *gc.C) {
   154  	input := `1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
   155      link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   156      inet 127.0.0.1/8 scope host lo
   157         valid_lft forever preferred_lft forever
   158      inet6 ::1/128 scope host 
   159         valid_lft forever preferred_lft forever
   160  2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
   161      link/ether 1c:6f:65:d5:56:98 brd ff:ff:ff:ff:ff:ff
   162      inet 192.168.0.69/24 brd 192.168.0.255 scope global eth0
   163         valid_lft forever preferred_lft forever
   164      inet6 fd5d:e5bb:c5f9::c0c/128 scope global dynamic 
   165         valid_lft 83178sec preferred_lft 83178sec
   166      inet6 fd5d:e5bb:c5f9:0:1e6f:65ff:fed5:5698/64 scope global noprefixroute dynamic 
   167         valid_lft 6967sec preferred_lft 1567sec
   168      inet6 fe80::1e6f:65ff:fed5:5698/64 scope link 
   169         valid_lft forever preferred_lft forever
   170  3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
   171      link/ether 52:54:00:e4:70:2f brd ff:ff:ff:ff:ff:ff
   172      inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
   173         valid_lft forever preferred_lft forever
   174  4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 500
   175      link/ether 52:54:00:e4:70:2f brd ff:ff:ff:ff:ff:ff
   176  5: virbr1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
   177      link/ether 52:54:00:fe:04:e6 brd ff:ff:ff:ff:ff:ff
   178      inet 192.168.100.1/24 brd 192.168.100.255 scope global virbr1
   179         valid_lft forever preferred_lft forever
   180  6: virbr1-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr1 state DOWN group default qlen 500
   181      link/ether 52:54:00:fe:04:e6 brd ff:ff:ff:ff:ff:ff
   182  7: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
   183      link/ether fe:d3:9d:e4:ba:90 brd ff:ff:ff:ff:ff:ff
   184      inet 10.0.3.1/24 scope global lxcbr0
   185         valid_lft forever preferred_lft forever
   186      inet6 fe80::a00f:35ff:fe81:f7ed/64 scope link 
   187         valid_lft forever preferred_lft forever
   188  25: vethOG10XO@if24: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master lxcbr0 state UP group default qlen 1000
   189      link/ether fe:d3:9d:e4:ba:90 brd ff:ff:ff:ff:ff:ff link-netnsid 0
   190      inet6 fe80::fcd3:9dff:fee4:ba90/64 scope link 
   191         valid_lft forever preferred_lft forever
   192  37: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN group default qlen 500
   193      link/ether fe:54:00:6e:2d:7d brd ff:ff:ff:ff:ff:ff
   194      inet6 fe80::fc54:ff:fe6e:2d7d/64 scope link 
   195         valid_lft forever preferred_lft forever
   196  38: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN group default qlen 500
   197      link/ether fe:54:00:3e:80:18 brd ff:ff:ff:ff:ff:ff
   198      inet6 fe80::fc54:ff:fe3e:8018/64 scope link 
   199         valid_lft forever preferred_lft forever
   200  39: vnet2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN group default qlen 500
   201      link/ether fe:54:00:ee:c7:95 brd ff:ff:ff:ff:ff:ff
   202      inet6 fe80::fc54:ff:feee:c795/64 scope link 
   203         valid_lft forever preferred_lft forever
   204  40: vnet3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN group default qlen 500
   205      link/ether fe:54:00:30:92:16 brd ff:ff:ff:ff:ff:ff
   206      inet6 fe80::fc54:ff:fe30:9216/64 scope link 
   207         valid_lft forever preferred_lft forever
   208  `
   209  
   210  	result, err := detectSubnet(input)
   211  	c.Assert(err, jc.ErrorIsNil)
   212  	c.Assert(result, jc.DeepEquals, "4")
   213  }
   214  
   215  func (s *InitialiserSuite) TestDetectSubnetLocal(c *gc.C) {
   216  	_, err := exec.LookPath("ip")
   217  	if err != nil {
   218  		c.Skip("skipping local detect subnet test, ip tool not found")
   219  	}
   220  
   221  	output, err := exec.Command("ip", "addr", "show").CombinedOutput()
   222  	c.Assert(err, jc.ErrorIsNil)
   223  
   224  	subnet, err := detectSubnet(string(output))
   225  	c.Assert(err, jc.ErrorIsNil)
   226  
   227  	subnetInt, err := strconv.Atoi(subnet)
   228  	c.Assert(err, jc.ErrorIsNil)
   229  
   230  	c.Assert(subnetInt, jc.GreaterThan, 0)
   231  	c.Assert(subnetInt, jc.LessThan, 255)
   232  
   233  }