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 }