github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/state/apiserver/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  	gc "launchpad.net/gocheck"
     8  
     9  	"github.com/juju/juju/environs/network"
    10  	"github.com/juju/juju/instance"
    11  	"github.com/juju/juju/juju/testing"
    12  	"github.com/juju/juju/state"
    13  	"github.com/juju/juju/state/api/params"
    14  	"github.com/juju/juju/state/apiserver/common"
    15  	"github.com/juju/juju/state/apiserver/networker"
    16  	apiservertesting "github.com/juju/juju/state/apiserver/testing"
    17  )
    18  
    19  type networkerSuite struct {
    20  	testing.JujuConnSuite
    21  
    22  	networks []state.NetworkInfo
    23  
    24  	machine         *state.Machine
    25  	container       *state.Machine
    26  	nestedContainer *state.Machine
    27  
    28  	machineIfaces         []state.NetworkInterfaceInfo
    29  	containerIfaces       []state.NetworkInterfaceInfo
    30  	nestedContainerIfaces []state.NetworkInterfaceInfo
    31  
    32  	authorizer apiservertesting.FakeAuthorizer
    33  	resources  *common.Resources
    34  	networker  *networker.NetworkerAPI
    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 to use.
    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  	hwChars := instance.MustParseHardware("arch=i386", "mem=4G")
    75  	s.machineIfaces = []state.NetworkInterfaceInfo{{
    76  		MACAddress:    "aa:bb:cc:dd:ee:f0",
    77  		InterfaceName: "eth0",
    78  		NetworkName:   "net1",
    79  		IsVirtual:     false,
    80  	}, {
    81  		MACAddress:    "aa:bb:cc:dd:ee:f1",
    82  		InterfaceName: "eth1",
    83  		NetworkName:   "net1",
    84  		IsVirtual:     false,
    85  	}, {
    86  		MACAddress:    "aa:bb:cc:dd:ee:f1",
    87  		InterfaceName: "eth1.42",
    88  		NetworkName:   "vlan42",
    89  		IsVirtual:     true,
    90  	}, {
    91  		MACAddress:    "aa:bb:cc:dd:ee:f0",
    92  		InterfaceName: "eth0.69",
    93  		NetworkName:   "vlan69",
    94  		IsVirtual:     true,
    95  	}, {
    96  		MACAddress:    "aa:bb:cc:dd:ee:f2",
    97  		InterfaceName: "eth2",
    98  		NetworkName:   "net2",
    99  		IsVirtual:     false,
   100  	}}
   101  	err = s.machine.SetInstanceInfo("i-am", "fake_nonce", &hwChars, s.networks, s.machineIfaces)
   102  	c.Assert(err, gc.IsNil)
   103  }
   104  
   105  // Create and provision a container and a nested container.
   106  func (s *networkerSuite) setUpContainers(c *gc.C) {
   107  	template := state.MachineTemplate{
   108  		Series: "quantal",
   109  		Jobs:   []state.MachineJob{state.JobHostUnits},
   110  	}
   111  	var err error
   112  	s.container, err = s.State.AddMachineInsideMachine(template, s.machine.Id(), instance.LXC)
   113  	c.Assert(err, gc.IsNil)
   114  	s.containerIfaces = []state.NetworkInterfaceInfo{{
   115  		MACAddress:    "aa:bb:cc:dd:ee:e0",
   116  		InterfaceName: "eth0",
   117  		NetworkName:   "net1",
   118  		IsVirtual:     false,
   119  	}, {
   120  		MACAddress:    "aa:bb:cc:dd:ee:e1",
   121  		InterfaceName: "eth1",
   122  		NetworkName:   "net1",
   123  		IsVirtual:     false,
   124  	}, {
   125  		MACAddress:    "aa:bb:cc:dd:ee:e1",
   126  		InterfaceName: "eth1.42",
   127  		NetworkName:   "vlan42",
   128  		IsVirtual:     true,
   129  	}}
   130  	hwChars := instance.MustParseHardware("arch=i386", "mem=4G")
   131  	err = s.container.SetInstanceInfo("i-container", "fake_nonce", &hwChars, s.networks[:2],
   132  		s.containerIfaces)
   133  	c.Assert(err, gc.IsNil)
   134  
   135  	s.nestedContainer, err = s.State.AddMachineInsideMachine(template, s.container.Id(), instance.LXC)
   136  	c.Assert(err, gc.IsNil)
   137  	s.nestedContainerIfaces = []state.NetworkInterfaceInfo{{
   138  		MACAddress:    "aa:bb:cc:dd:ee:d0",
   139  		InterfaceName: "eth0",
   140  		NetworkName:   "net1",
   141  		IsVirtual:     false,
   142  	}}
   143  	err = s.nestedContainer.SetInstanceInfo("i-too", "fake_nonce", &hwChars, s.networks[:1],
   144  		s.nestedContainerIfaces)
   145  	c.Assert(err, gc.IsNil)
   146  }
   147  
   148  func (s *networkerSuite) SetUpTest(c *gc.C) {
   149  	s.JujuConnSuite.SetUpTest(c)
   150  
   151  	s.setUpNetworks(c)
   152  	s.setUpMachine(c)
   153  	s.setUpContainers(c)
   154  
   155  	// Create a FakeAuthorizer so we can check permissions,
   156  	// set up assuming we logged in as a machine agent.
   157  	s.authorizer = apiservertesting.FakeAuthorizer{
   158  		LoggedIn:     true,
   159  		MachineAgent: true,
   160  		Tag:          s.machine.Tag(),
   161  	}
   162  
   163  	// Create a networker API for the machine.
   164  	var err error
   165  	s.networker, err = networker.NewNetworkerAPI(
   166  		s.State,
   167  		nil,
   168  		s.authorizer,
   169  	)
   170  	c.Assert(err, gc.IsNil)
   171  }
   172  
   173  func (s *networkerSuite) TestNetworkerNonMachineAgent(c *gc.C) {
   174  	// Fails with not a machine agent
   175  	anAuthorizer := s.authorizer
   176  	anAuthorizer.MachineAgent = false
   177  	aNetworker, err := networker.NewNetworkerAPI(s.State, s.resources, anAuthorizer)
   178  	c.Assert(err, gc.ErrorMatches, "permission denied")
   179  	c.Assert(aNetworker, gc.IsNil)
   180  }
   181  
   182  func (s *networkerSuite) TestMachineNetworkInfoPermissions(c *gc.C) {
   183  	args := params.Entities{Entities: []params.Entity{
   184  		{Tag: "service-bar"},
   185  		{Tag: "foo-42"},
   186  		{Tag: "unit-mysql-0"},
   187  		{Tag: "service-mysql"},
   188  		{Tag: "user-foo"},
   189  		{Tag: "machine-1"},
   190  		{Tag: "machine-0-lxc-42"},
   191  	}}
   192  	results, err := s.networker.MachineNetworkInfo(args)
   193  	c.Assert(err, gc.IsNil)
   194  	c.Assert(results, gc.DeepEquals, params.MachineNetworkInfoResults{
   195  		Results: []params.MachineNetworkInfoResult{
   196  			{Error: apiservertesting.ErrUnauthorized},
   197  			{Error: apiservertesting.ErrUnauthorized},
   198  			{Error: apiservertesting.ErrUnauthorized},
   199  			{Error: apiservertesting.ErrUnauthorized},
   200  			{Error: apiservertesting.ErrUnauthorized},
   201  			{Error: apiservertesting.ErrUnauthorized},
   202  			{Error: apiservertesting.NotFoundError("machine 0/lxc/42")},
   203  		},
   204  	})
   205  }
   206  
   207  func (s *networkerSuite) TestMachineNetworkInfo(c *gc.C) {
   208  	// Expected results of MachineNetworkInfo for a machine and containers
   209  	expectedMachineInfo := []network.Info{{
   210  		MACAddress:    "aa:bb:cc:dd:ee:f0",
   211  		CIDR:          "0.1.2.0/24",
   212  		NetworkName:   "net1",
   213  		ProviderId:    "net1",
   214  		VLANTag:       0,
   215  		InterfaceName: "eth0",
   216  		IsVirtual:     false,
   217  	}, {
   218  		MACAddress:    "aa:bb:cc:dd:ee:f1",
   219  		CIDR:          "0.1.2.0/24",
   220  		NetworkName:   "net1",
   221  		ProviderId:    "net1",
   222  		VLANTag:       0,
   223  		InterfaceName: "eth1",
   224  		IsVirtual:     false,
   225  	}, {
   226  		MACAddress:    "aa:bb:cc:dd:ee:f1",
   227  		CIDR:          "0.2.2.0/24",
   228  		NetworkName:   "vlan42",
   229  		ProviderId:    "vlan42",
   230  		VLANTag:       42,
   231  		InterfaceName: "eth1",
   232  		IsVirtual:     true,
   233  	}, {
   234  		MACAddress:    "aa:bb:cc:dd:ee:f0",
   235  		CIDR:          "0.3.2.0/24",
   236  		NetworkName:   "vlan69",
   237  		ProviderId:    "vlan69",
   238  		VLANTag:       69,
   239  		InterfaceName: "eth0",
   240  		IsVirtual:     true,
   241  	}, {
   242  		MACAddress:    "aa:bb:cc:dd:ee:f2",
   243  		CIDR:          "0.5.2.0/24",
   244  		NetworkName:   "net2",
   245  		ProviderId:    "net2",
   246  		VLANTag:       0,
   247  		InterfaceName: "eth2",
   248  		IsVirtual:     false,
   249  	}}
   250  	expectedContainerInfo := []network.Info{{
   251  		MACAddress:    "aa:bb:cc:dd:ee:e0",
   252  		CIDR:          "0.1.2.0/24",
   253  		NetworkName:   "net1",
   254  		ProviderId:    "net1",
   255  		VLANTag:       0,
   256  		InterfaceName: "eth0",
   257  		IsVirtual:     false,
   258  	}, {
   259  		MACAddress:    "aa:bb:cc:dd:ee:e1",
   260  		CIDR:          "0.1.2.0/24",
   261  		NetworkName:   "net1",
   262  		ProviderId:    "net1",
   263  		VLANTag:       0,
   264  		InterfaceName: "eth1",
   265  		IsVirtual:     false,
   266  	}, {
   267  		MACAddress:    "aa:bb:cc:dd:ee:e1",
   268  		CIDR:          "0.2.2.0/24",
   269  		NetworkName:   "vlan42",
   270  		ProviderId:    "vlan42",
   271  		VLANTag:       42,
   272  		InterfaceName: "eth1",
   273  		IsVirtual:     true,
   274  	}}
   275  	expectedNestedContainerInfo := []network.Info{{
   276  		MACAddress:    "aa:bb:cc:dd:ee:d0",
   277  		CIDR:          "0.1.2.0/24",
   278  		NetworkName:   "net1",
   279  		ProviderId:    "net1",
   280  		VLANTag:       0,
   281  		InterfaceName: "eth0",
   282  		IsVirtual:     false,
   283  	}}
   284  
   285  	args := params.Entities{Entities: []params.Entity{
   286  		{Tag: "machine-0"},
   287  		{Tag: "machine-0-lxc-0"},
   288  		{Tag: "machine-0-lxc-0-lxc-0"},
   289  	}}
   290  	results, err := s.networker.MachineNetworkInfo(args)
   291  	c.Assert(err, gc.IsNil)
   292  	c.Assert(results, gc.DeepEquals, params.MachineNetworkInfoResults{
   293  		Results: []params.MachineNetworkInfoResult{
   294  			{Error: nil, Info: expectedMachineInfo},
   295  			{Error: nil, Info: expectedContainerInfo},
   296  			{Error: nil, Info: expectedNestedContainerInfo},
   297  		},
   298  	})
   299  }