github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/state/api/networker/networker_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  	jc "github.com/juju/testing/checkers"
     8  	"github.com/juju/utils"
     9  	gc "launchpad.net/gocheck"
    10  
    11  	"github.com/juju/juju/environs/network"
    12  	"github.com/juju/juju/instance"
    13  	"github.com/juju/juju/juju/testing"
    14  	"github.com/juju/juju/state"
    15  	"github.com/juju/juju/state/api"
    16  	"github.com/juju/juju/state/api/networker"
    17  	"github.com/juju/juju/state/api/params"
    18  )
    19  
    20  type networkerSuite struct {
    21  	testing.JujuConnSuite
    22  
    23  	networks []state.NetworkInfo
    24  
    25  	machine         *state.Machine
    26  	container       *state.Machine
    27  	nestedContainer *state.Machine
    28  
    29  	machineIfaces         []state.NetworkInterfaceInfo
    30  	containerIfaces       []state.NetworkInterfaceInfo
    31  	nestedContainerIfaces []state.NetworkInterfaceInfo
    32  
    33  	st        *api.State
    34  	networker *networker.State
    35  }
    36  
    37  var _ = gc.Suite(&networkerSuite{})
    38  
    39  // Create several networks.
    40  func (s *networkerSuite) setUpNetworks(c *gc.C) {
    41  	s.networks = []state.NetworkInfo{{
    42  		Name:       "net1",
    43  		ProviderId: "net1",
    44  		CIDR:       "0.1.2.0/24",
    45  		VLANTag:    0,
    46  	}, {
    47  		Name:       "vlan42",
    48  		ProviderId: "vlan42",
    49  		CIDR:       "0.2.2.0/24",
    50  		VLANTag:    42,
    51  	}, {
    52  		Name:       "vlan69",
    53  		ProviderId: "vlan69",
    54  		CIDR:       "0.3.2.0/24",
    55  		VLANTag:    69,
    56  	}, {
    57  		Name:       "vlan123",
    58  		ProviderId: "vlan123",
    59  		CIDR:       "0.4.2.0/24",
    60  		VLANTag:    123,
    61  	}, {
    62  		Name:       "net2",
    63  		ProviderId: "net2",
    64  		CIDR:       "0.5.2.0/24",
    65  		VLANTag:    0,
    66  	}}
    67  }
    68  
    69  // Create a machine and login to it.
    70  func (s *networkerSuite) setUpMachine(c *gc.C) {
    71  	var err error
    72  	s.machine, err = s.State.AddMachine("quantal", state.JobHostUnits)
    73  	c.Assert(err, gc.IsNil)
    74  	password, err := utils.RandomPassword()
    75  	c.Assert(err, gc.IsNil)
    76  	err = s.machine.SetPassword(password)
    77  	c.Assert(err, gc.IsNil)
    78  	hwChars := instance.MustParseHardware("cpu-cores=123", "mem=4G")
    79  	s.machineIfaces = []state.NetworkInterfaceInfo{{
    80  		MACAddress:    "aa:bb:cc:dd:ee:f0",
    81  		InterfaceName: "eth0",
    82  		NetworkName:   "net1",
    83  		IsVirtual:     false,
    84  	}, {
    85  		MACAddress:    "aa:bb:cc:dd:ee:f1",
    86  		InterfaceName: "eth1",
    87  		NetworkName:   "net1",
    88  		IsVirtual:     false,
    89  	}, {
    90  		MACAddress:    "aa:bb:cc:dd:ee:f1",
    91  		InterfaceName: "eth1.42",
    92  		NetworkName:   "vlan42",
    93  		IsVirtual:     true,
    94  	}, {
    95  		MACAddress:    "aa:bb:cc:dd:ee:f0",
    96  		InterfaceName: "eth0.69",
    97  		NetworkName:   "vlan69",
    98  		IsVirtual:     true,
    99  	}, {
   100  		MACAddress:    "aa:bb:cc:dd:ee:f2",
   101  		InterfaceName: "eth2",
   102  		NetworkName:   "net2",
   103  		IsVirtual:     false,
   104  	}}
   105  	err = s.machine.SetInstanceInfo("i-am", "fake_nonce", &hwChars, s.networks, s.machineIfaces)
   106  	c.Assert(err, gc.IsNil)
   107  	s.st = s.OpenAPIAsMachine(c, s.machine.Tag(), password, "fake_nonce")
   108  	c.Assert(s.st, gc.NotNil)
   109  }
   110  
   111  // Create and provision a container and a nested container.
   112  func (s *networkerSuite) setUpContainers(c *gc.C) {
   113  	template := state.MachineTemplate{
   114  		Series: "quantal",
   115  		Jobs:   []state.MachineJob{state.JobHostUnits},
   116  	}
   117  	var err error
   118  	s.container, err = s.State.AddMachineInsideMachine(template, s.machine.Id(), instance.LXC)
   119  	c.Assert(err, gc.IsNil)
   120  	s.containerIfaces = []state.NetworkInterfaceInfo{{
   121  		MACAddress:    "aa:bb:cc:dd:ee:e0",
   122  		InterfaceName: "eth0",
   123  		NetworkName:   "net1",
   124  		IsVirtual:     false,
   125  	}, {
   126  		MACAddress:    "aa:bb:cc:dd:ee:e1",
   127  		InterfaceName: "eth1",
   128  		NetworkName:   "net1",
   129  		IsVirtual:     false,
   130  	}, {
   131  		MACAddress:    "aa:bb:cc:dd:ee:e1",
   132  		InterfaceName: "eth1.42",
   133  		NetworkName:   "vlan42",
   134  		IsVirtual:     true,
   135  	}}
   136  	hwChars := instance.MustParseHardware("arch=i386", "mem=4G")
   137  	err = s.container.SetInstanceInfo("i-container", "fake_nonce", &hwChars, s.networks[:2],
   138  		s.containerIfaces)
   139  	c.Assert(err, gc.IsNil)
   140  
   141  	s.nestedContainer, err = s.State.AddMachineInsideMachine(template, s.container.Id(), instance.LXC)
   142  	c.Assert(err, gc.IsNil)
   143  	s.nestedContainerIfaces = []state.NetworkInterfaceInfo{{
   144  		MACAddress:    "aa:bb:cc:dd:ee:d0",
   145  		InterfaceName: "eth0",
   146  		NetworkName:   "net1",
   147  		IsVirtual:     false,
   148  	}}
   149  	err = s.nestedContainer.SetInstanceInfo("i-too", "fake_nonce", &hwChars, s.networks[:1],
   150  		s.nestedContainerIfaces)
   151  	c.Assert(err, gc.IsNil)
   152  }
   153  
   154  func (s *networkerSuite) SetUpTest(c *gc.C) {
   155  	s.JujuConnSuite.SetUpTest(c)
   156  
   157  	s.setUpNetworks(c)
   158  	s.setUpMachine(c)
   159  	s.setUpContainers(c)
   160  
   161  	// Create the networker API facade.
   162  	s.networker = s.st.Networker()
   163  	c.Assert(s.networker, gc.NotNil)
   164  }
   165  
   166  func (s *networkerSuite) TestMachineNetworkInfoPermissionDenied(c *gc.C) {
   167  	tags := []string{"foo-42", "unit-mysql-0", "service-mysql", "user-foo", "machine-1"}
   168  	for _, tag := range tags {
   169  		info, err := s.networker.MachineNetworkInfo(tag)
   170  		c.Assert(err, gc.ErrorMatches, "permission denied")
   171  		c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized)
   172  		c.Assert(info, gc.IsNil)
   173  	}
   174  }
   175  
   176  func (s *networkerSuite) TestMachineNetworkInfo(c *gc.C) {
   177  	// Expected results of MachineNetworkInfo for a machine and containers
   178  	expectedMachineInfo := []network.Info{{
   179  		MACAddress:    "aa:bb:cc:dd:ee:f0",
   180  		CIDR:          "0.1.2.0/24",
   181  		NetworkName:   "net1",
   182  		ProviderId:    "net1",
   183  		VLANTag:       0,
   184  		InterfaceName: "eth0",
   185  		IsVirtual:     false,
   186  	}, {
   187  		MACAddress:    "aa:bb:cc:dd:ee:f1",
   188  		CIDR:          "0.1.2.0/24",
   189  		NetworkName:   "net1",
   190  		ProviderId:    "net1",
   191  		VLANTag:       0,
   192  		InterfaceName: "eth1",
   193  		IsVirtual:     false,
   194  	}, {
   195  		MACAddress:    "aa:bb:cc:dd:ee:f1",
   196  		CIDR:          "0.2.2.0/24",
   197  		NetworkName:   "vlan42",
   198  		ProviderId:    "vlan42",
   199  		VLANTag:       42,
   200  		InterfaceName: "eth1",
   201  		IsVirtual:     true,
   202  	}, {
   203  		MACAddress:    "aa:bb:cc:dd:ee:f0",
   204  		CIDR:          "0.3.2.0/24",
   205  		NetworkName:   "vlan69",
   206  		ProviderId:    "vlan69",
   207  		VLANTag:       69,
   208  		InterfaceName: "eth0",
   209  		IsVirtual:     true,
   210  	}, {
   211  		MACAddress:    "aa:bb:cc:dd:ee:f2",
   212  		CIDR:          "0.5.2.0/24",
   213  		NetworkName:   "net2",
   214  		ProviderId:    "net2",
   215  		VLANTag:       0,
   216  		InterfaceName: "eth2",
   217  		IsVirtual:     false,
   218  	}}
   219  	expectedContainerInfo := []network.Info{{
   220  		MACAddress:    "aa:bb:cc:dd:ee:e0",
   221  		CIDR:          "0.1.2.0/24",
   222  		NetworkName:   "net1",
   223  		ProviderId:    "net1",
   224  		VLANTag:       0,
   225  		InterfaceName: "eth0",
   226  		IsVirtual:     false,
   227  	}, {
   228  		MACAddress:    "aa:bb:cc:dd:ee:e1",
   229  		CIDR:          "0.1.2.0/24",
   230  		NetworkName:   "net1",
   231  		ProviderId:    "net1",
   232  		VLANTag:       0,
   233  		InterfaceName: "eth1",
   234  		IsVirtual:     false,
   235  	}, {
   236  		MACAddress:    "aa:bb:cc:dd:ee:e1",
   237  		CIDR:          "0.2.2.0/24",
   238  		NetworkName:   "vlan42",
   239  		ProviderId:    "vlan42",
   240  		VLANTag:       42,
   241  		InterfaceName: "eth1",
   242  		IsVirtual:     true,
   243  	}}
   244  	expectedNestedContainerInfo := []network.Info{{
   245  		MACAddress:    "aa:bb:cc:dd:ee:d0",
   246  		CIDR:          "0.1.2.0/24",
   247  		NetworkName:   "net1",
   248  		ProviderId:    "net1",
   249  		VLANTag:       0,
   250  		InterfaceName: "eth0",
   251  		IsVirtual:     false,
   252  	}}
   253  
   254  	results, err := s.networker.MachineNetworkInfo("machine-0")
   255  	c.Assert(err, gc.IsNil)
   256  	c.Assert(results, gc.DeepEquals, expectedMachineInfo)
   257  
   258  	results, err = s.networker.MachineNetworkInfo("machine-0-lxc-0")
   259  	c.Assert(err, gc.IsNil)
   260  	c.Assert(results, gc.DeepEquals, expectedContainerInfo)
   261  
   262  	results, err = s.networker.MachineNetworkInfo("machine-0-lxc-0-lxc-0")
   263  	c.Assert(err, gc.IsNil)
   264  	c.Assert(results, gc.DeepEquals, expectedNestedContainerInfo)
   265  }