github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/network/netplan/activate_test.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package netplan_test 5 6 import ( 7 "io/ioutil" 8 "path" 9 "strings" 10 11 "github.com/juju/clock" 12 "github.com/juju/testing" 13 jc "github.com/juju/testing/checkers" 14 gc "gopkg.in/check.v1" 15 16 "github.com/juju/juju/network/netplan" 17 coretesting "github.com/juju/juju/testing" 18 ) 19 20 type ActivateSuite struct { 21 testing.IsolationSuite 22 } 23 24 var _ = gc.Suite(&ActivateSuite{}) 25 26 func (s *ActivateSuite) TestNoDevices(c *gc.C) { 27 params := netplan.ActivationParams{} 28 result, err := netplan.BridgeAndActivate(params) 29 c.Check(result, gc.IsNil) 30 c.Check(err, gc.ErrorMatches, "no devices specified") 31 } 32 33 func (s *ActivateSuite) TestNoDirectory(c *gc.C) { 34 params := netplan.ActivationParams{ 35 Devices: []netplan.DeviceToBridge{ 36 {}, 37 }, 38 Directory: "/quite/for/sure/this/doesnotexists", 39 } 40 result, err := netplan.BridgeAndActivate(params) 41 c.Check(result, gc.IsNil) 42 c.Check(err, gc.ErrorMatches, "open /quite/for/sure/this/doesnotexists.*") 43 } 44 45 func (s *ActivateSuite) TestActivateSuccess(c *gc.C) { 46 coretesting.SkipIfWindowsBug(c, "lp:1771077") 47 tempDir := c.MkDir() 48 params := netplan.ActivationParams{ 49 Devices: []netplan.DeviceToBridge{ 50 { 51 DeviceName: "eno1", 52 MACAddress: "00:11:22:33:44:99", // That's a wrong MAC, we should fall back to name 53 BridgeName: "br-eno1", 54 }, 55 { 56 DeviceName: "eno2", 57 MACAddress: "00:11:22:33:44:66", 58 BridgeName: "br-eno2", 59 }, 60 }, 61 Directory: tempDir, 62 RunPrefix: "exit 0 &&", 63 } 64 files := []string{"00.yaml", "01.yaml"} 65 contents := make([][]byte, len(files)) 66 for i, file := range files { 67 var err error 68 contents[i], err = ioutil.ReadFile(path.Join("testdata/TestReadWriteBackup", file)) 69 c.Assert(err, jc.ErrorIsNil) 70 err = ioutil.WriteFile(path.Join(tempDir, file), contents[i], 0644) 71 c.Assert(err, jc.ErrorIsNil) 72 } 73 result, err := netplan.BridgeAndActivate(params) 74 c.Check(result, gc.IsNil) 75 c.Check(err, jc.ErrorIsNil) 76 } 77 78 func (s *ActivateSuite) TestActivateDeviceAndVLAN(c *gc.C) { 79 coretesting.SkipIfWindowsBug(c, "lp:1771077") 80 tempDir := c.MkDir() 81 params := netplan.ActivationParams{ 82 Devices: []netplan.DeviceToBridge{ 83 { 84 DeviceName: "eno1", 85 MACAddress: "00:11:22:33:44:99", // That's a wrong MAC, we should fall back to name 86 BridgeName: "br-eno1", 87 }, 88 { 89 DeviceName: "eno1.123", 90 MACAddress: "00:11:22:33:44:99", 91 BridgeName: "br-eno1.123", 92 }, 93 }, 94 Directory: tempDir, 95 RunPrefix: "exit 0 &&", 96 } 97 files := []string{"00.yaml", "01.yaml"} 98 contents := make([][]byte, len(files)) 99 for i, file := range files { 100 var err error 101 contents[i], err = ioutil.ReadFile(path.Join("testdata/TestReadWriteBackup", file)) 102 c.Assert(err, jc.ErrorIsNil) 103 err = ioutil.WriteFile(path.Join(tempDir, file), contents[i], 0644) 104 c.Assert(err, jc.ErrorIsNil) 105 } 106 result, err := netplan.BridgeAndActivate(params) 107 c.Check(result, gc.IsNil) 108 c.Check(err, jc.ErrorIsNil) 109 } 110 111 func (s *ActivateSuite) TestActivateFailure(c *gc.C) { 112 coretesting.SkipIfWindowsBug(c, "lp:1771077") 113 tempDir := c.MkDir() 114 params := netplan.ActivationParams{ 115 Devices: []netplan.DeviceToBridge{ 116 { 117 DeviceName: "eno1", 118 MACAddress: "00:11:22:33:44:55", 119 BridgeName: "br-eno1", 120 }, 121 { 122 DeviceName: "eno2", 123 MACAddress: "00:11:22:33:44:66", 124 BridgeName: "br-eno2", 125 }, 126 }, 127 Directory: tempDir, 128 RunPrefix: `echo -n "This is stdout" && echo -n "This is stderr" >&2 && exit 1 && `, 129 } 130 files := []string{"00.yaml", "01.yaml"} 131 contents := make([][]byte, len(files)) 132 for i, file := range files { 133 var err error 134 contents[i], err = ioutil.ReadFile(path.Join("testdata/TestReadWriteBackup", file)) 135 c.Assert(err, jc.ErrorIsNil) 136 err = ioutil.WriteFile(path.Join(tempDir, file), contents[i], 0644) 137 c.Assert(err, jc.ErrorIsNil) 138 } 139 result, err := netplan.BridgeAndActivate(params) 140 c.Assert(result, gc.NotNil) 141 c.Check(string(result.Stdout), gc.DeepEquals, "This is stdout") 142 c.Check(string(result.Stderr), gc.DeepEquals, "This is stderr") 143 c.Check(result.Code, gc.Equals, 1) 144 c.Check(err, gc.ErrorMatches, "bridge activation error code 1") 145 146 // old files are in place and unchanged 147 for i, file := range files { 148 content, err := ioutil.ReadFile(path.Join(tempDir, file)) 149 c.Assert(err, jc.ErrorIsNil) 150 c.Check(string(content), gc.Equals, string(contents[i])) 151 } 152 // there are no other YAML files in this directory 153 fileInfos, err := ioutil.ReadDir(tempDir) 154 c.Assert(err, jc.ErrorIsNil) 155 156 yamlCount := 0 157 for _, fileInfo := range fileInfos { 158 if !fileInfo.IsDir() && strings.HasSuffix(fileInfo.Name(), ".yaml") { 159 yamlCount++ 160 } 161 } 162 c.Check(yamlCount, gc.Equals, len(files)) 163 } 164 165 func (s *ActivateSuite) TestActivateTimeout(c *gc.C) { 166 // coretesting.SkipIfWindowsBug(c, "lp:1771077") 167 tempDir := c.MkDir() 168 params := netplan.ActivationParams{ 169 Devices: []netplan.DeviceToBridge{ 170 { 171 DeviceName: "eno1", 172 MACAddress: "00:11:22:33:44:55", 173 BridgeName: "br-eno1", 174 }, 175 { 176 DeviceName: "eno2", 177 MACAddress: "00:11:22:33:44:66", 178 BridgeName: "br-eno2", 179 }, 180 }, 181 Directory: tempDir, 182 RunPrefix: "sleep 10000 && ", 183 Timeout: 1000, 184 Clock: clock.WallClock, 185 } 186 files := []string{"00.yaml", "01.yaml"} 187 contents := make([][]byte, len(files)) 188 for i, file := range files { 189 var err error 190 contents[i], err = ioutil.ReadFile(path.Join("testdata/TestReadWriteBackup", file)) 191 c.Assert(err, jc.ErrorIsNil) 192 err = ioutil.WriteFile(path.Join(tempDir, file), contents[i], 0644) 193 c.Assert(err, jc.ErrorIsNil) 194 } 195 result, err := netplan.BridgeAndActivate(params) 196 c.Check(result, gc.NotNil) 197 c.Check(err, gc.ErrorMatches, "bridge activation error: command cancelled") 198 }