github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/worker/networker/configfiles_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package networker_test
     5  
     6  import (
     7  	"io/ioutil"
     8  	"os"
     9  	"path/filepath"
    10  
    11  	jc "github.com/juju/testing/checkers"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/juju/network"
    15  	"github.com/juju/juju/testing"
    16  	"github.com/juju/juju/worker/networker"
    17  )
    18  
    19  type configFilesSuite struct {
    20  	testing.BaseSuite
    21  }
    22  
    23  var _ = gc.Suite(&configFilesSuite{})
    24  
    25  func (s *configFilesSuite) TestSimpleGetters(c *gc.C) {
    26  	info := network.InterfaceInfo{
    27  		InterfaceName: "blah",
    28  	}
    29  	data := []byte("some data")
    30  	cf := networker.NewConfigFile("ethX", "/some/path", info, data)
    31  	c.Assert(cf.InterfaceName(), gc.Equals, "ethX")
    32  	c.Assert(cf.FileName(), gc.Equals, "/some/path")
    33  	c.Assert(cf.InterfaceInfo(), jc.DeepEquals, info)
    34  	c.Assert(cf.Data(), jc.DeepEquals, data)
    35  	c.Assert(cf.NeedsUpdating(), jc.IsFalse)
    36  	c.Assert(cf.IsPendingRemoval(), jc.IsFalse)
    37  	c.Assert(cf.IsManaged(), jc.IsFalse)
    38  }
    39  
    40  func (s *configFilesSuite) TestRenderManaged(c *gc.C) {
    41  	info := network.InterfaceInfo{
    42  		InterfaceName: "ethX",
    43  		VLANTag:       42,
    44  	}
    45  	cf := networker.NewConfigFile("ethX", "/some/path", info, nil)
    46  	data := cf.RenderManaged()
    47  	expectedVLAN := `
    48  # Managed by Juju, please don't change.
    49  
    50  auto ethX.42
    51  iface ethX.42 inet dhcp
    52  	vlan-raw-device ethX
    53  
    54  `[1:]
    55  	c.Assert(string(data), jc.DeepEquals, expectedVLAN)
    56  
    57  	expectedNormal := `
    58  # Managed by Juju, please don't change.
    59  
    60  auto ethX
    61  iface ethX inet dhcp
    62  
    63  `[1:]
    64  	info.VLANTag = 0
    65  	cf = networker.NewConfigFile("ethX", "/some/path", info, nil)
    66  	data = cf.RenderManaged()
    67  	c.Assert(string(data), jc.DeepEquals, expectedNormal)
    68  }
    69  
    70  func (s *configFilesSuite) TestUpdateData(c *gc.C) {
    71  	cf := networker.NewConfigFile("ethX", "", network.InterfaceInfo{}, nil)
    72  	assertData := func(expectData []byte, expectNeedsUpdating bool) {
    73  		c.Assert(string(cf.Data()), jc.DeepEquals, string(expectData))
    74  		c.Assert(cf.NeedsUpdating(), gc.Equals, expectNeedsUpdating)
    75  		c.Assert(cf.IsPendingRemoval(), jc.IsFalse)
    76  	}
    77  
    78  	assertData(nil, false)
    79  
    80  	result := cf.UpdateData(nil)
    81  	c.Assert(result, jc.IsFalse)
    82  	assertData(nil, false)
    83  
    84  	newData := []byte("new data")
    85  	result = cf.UpdateData(newData)
    86  	c.Assert(result, jc.IsTrue)
    87  	assertData(newData, true)
    88  
    89  	newData = []byte("newer data")
    90  	result = cf.UpdateData(newData)
    91  	c.Assert(result, jc.IsTrue)
    92  	assertData(newData, true)
    93  }
    94  
    95  func (s *configFilesSuite) TestReadData(c *gc.C) {
    96  	data := []byte("some\ndata\nhere")
    97  	testFile := filepath.Join(c.MkDir(), "test")
    98  	defer os.Remove(testFile)
    99  
   100  	err := ioutil.WriteFile(testFile, data, 0644)
   101  	c.Assert(err, jc.ErrorIsNil)
   102  	cf := networker.NewConfigFile("ethX", testFile, network.InterfaceInfo{}, nil)
   103  	err = cf.ReadData()
   104  	c.Assert(err, jc.ErrorIsNil)
   105  	c.Assert(string(cf.Data()), jc.DeepEquals, string(data))
   106  	c.Assert(cf.NeedsUpdating(), jc.IsTrue)
   107  }
   108  
   109  func (s *configFilesSuite) TestMarkForRemoval(c *gc.C) {
   110  	cf := networker.NewConfigFile("ethX", "", network.InterfaceInfo{}, nil)
   111  	c.Assert(cf.IsPendingRemoval(), jc.IsFalse)
   112  	c.Assert(cf.NeedsUpdating(), jc.IsFalse)
   113  	cf.MarkForRemoval()
   114  	c.Assert(cf.IsPendingRemoval(), jc.IsTrue)
   115  	c.Assert(cf.NeedsUpdating(), jc.IsFalse)
   116  }
   117  
   118  func (s *configFilesSuite) TestIsManaged(c *gc.C) {
   119  	info := network.InterfaceInfo{
   120  		InterfaceName: "ethX",
   121  	}
   122  	cf := networker.NewConfigFile("ethX", "", info, nil)
   123  	c.Assert(cf.IsManaged(), jc.IsFalse) // always false when no data
   124  	c.Assert(cf.UpdateData([]byte("blah")), jc.IsTrue)
   125  	c.Assert(cf.IsManaged(), jc.IsFalse) // false if header is missing
   126  	c.Assert(cf.UpdateData(cf.RenderManaged()), jc.IsTrue)
   127  	c.Assert(cf.IsManaged(), jc.IsTrue)
   128  }
   129  
   130  func (s *configFilesSuite) TestApply(c *gc.C) {
   131  	data := []byte("some\ndata\nhere")
   132  	testFile := filepath.Join(c.MkDir(), "test")
   133  	defer os.Remove(testFile)
   134  
   135  	cf := networker.NewConfigFile("ethX", testFile, network.InterfaceInfo{}, data)
   136  	c.Assert(cf.NeedsUpdating(), jc.IsFalse)
   137  	c.Assert(cf.IsPendingRemoval(), jc.IsFalse)
   138  	c.Assert(string(cf.Data()), jc.DeepEquals, string(data))
   139  
   140  	newData := []byte("new\ndata")
   141  	c.Assert(cf.UpdateData(newData), jc.IsTrue)
   142  	c.Assert(cf.NeedsUpdating(), jc.IsTrue)
   143  	c.Assert(cf.IsPendingRemoval(), jc.IsFalse)
   144  
   145  	err := cf.Apply()
   146  	c.Assert(err, jc.ErrorIsNil)
   147  	c.Assert(cf.NeedsUpdating(), jc.IsFalse)
   148  	c.Assert(cf.IsPendingRemoval(), jc.IsFalse)
   149  
   150  	readData, err := ioutil.ReadFile(testFile)
   151  	c.Assert(err, jc.ErrorIsNil)
   152  	c.Assert(string(readData), jc.DeepEquals, string(newData))
   153  
   154  	cf.MarkForRemoval()
   155  	c.Assert(cf.NeedsUpdating(), jc.IsFalse)
   156  	c.Assert(cf.IsPendingRemoval(), jc.IsTrue)
   157  	err = cf.Apply()
   158  	c.Assert(err, jc.ErrorIsNil)
   159  	c.Assert(cf.NeedsUpdating(), jc.IsFalse)
   160  	c.Assert(cf.IsPendingRemoval(), jc.IsFalse)
   161  
   162  	_, err = os.Stat(testFile)
   163  	c.Assert(err, jc.Satisfies, os.IsNotExist)
   164  }
   165  
   166  func (s *configFilesSuite) TestRenderMainConfig(c *gc.C) {
   167  	expect := `
   168  # Managed by Juju, please don't change.
   169  
   170  source /some/path/*.cfg
   171  
   172  `[1:]
   173  	data := networker.RenderMainConfig("/some/path")
   174  	c.Assert(string(data), jc.DeepEquals, expect)
   175  }