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  }