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

     1  // Copyright 2014-2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package apiaddressupdater_test
     5  
     6  import (
     7  	"io/ioutil"
     8  	"net"
     9  	"path/filepath"
    10  	"time"
    11  
    12  	jc "github.com/juju/testing/checkers"
    13  	gc "gopkg.in/check.v1"
    14  
    15  	jujutesting "github.com/juju/juju/juju/testing"
    16  	"github.com/juju/juju/network"
    17  	"github.com/juju/juju/state"
    18  	coretesting "github.com/juju/juju/testing"
    19  	"github.com/juju/juju/worker/apiaddressupdater"
    20  )
    21  
    22  type APIAddressUpdaterSuite struct {
    23  	jujutesting.JujuConnSuite
    24  }
    25  
    26  var _ = gc.Suite(&APIAddressUpdaterSuite{})
    27  
    28  func (s *APIAddressUpdaterSuite) SetUpTest(c *gc.C) {
    29  	s.JujuConnSuite.SetUpTest(c)
    30  	err := s.State.SetAPIHostPorts(nil)
    31  	c.Assert(err, jc.ErrorIsNil)
    32  	// By default mock these to better isolate the test from the real machine.
    33  	s.PatchValue(&network.InterfaceByNameAddrs, func(string) ([]net.Addr, error) {
    34  		return nil, nil
    35  	})
    36  	s.PatchValue(&network.LXCNetDefaultConfig, "")
    37  }
    38  
    39  type apiAddressSetter struct {
    40  	servers chan [][]network.HostPort
    41  	err     error
    42  }
    43  
    44  func (s *apiAddressSetter) SetAPIHostPorts(servers [][]network.HostPort) error {
    45  	s.servers <- servers
    46  	return s.err
    47  }
    48  
    49  func (s *APIAddressUpdaterSuite) TestStartStop(c *gc.C) {
    50  	st, _ := s.OpenAPIAsNewMachine(c, state.JobHostUnits)
    51  	worker := apiaddressupdater.NewAPIAddressUpdater(st.Machiner(), &apiAddressSetter{})
    52  	worker.Kill()
    53  	c.Assert(worker.Wait(), gc.IsNil)
    54  }
    55  
    56  func (s *APIAddressUpdaterSuite) TestAddressInitialUpdate(c *gc.C) {
    57  	updatedServers := [][]network.HostPort{
    58  		network.NewHostPorts(1234, "localhost", "127.0.0.1"),
    59  	}
    60  	err := s.State.SetAPIHostPorts(updatedServers)
    61  	c.Assert(err, jc.ErrorIsNil)
    62  
    63  	setter := &apiAddressSetter{servers: make(chan [][]network.HostPort, 1)}
    64  	st, _ := s.OpenAPIAsNewMachine(c, state.JobHostUnits)
    65  	worker := apiaddressupdater.NewAPIAddressUpdater(st.Machiner(), setter)
    66  	defer func() { c.Assert(worker.Wait(), gc.IsNil) }()
    67  	defer worker.Kill()
    68  
    69  	// SetAPIHostPorts should be called with the initial value.
    70  	select {
    71  	case <-time.After(coretesting.LongWait):
    72  		c.Fatalf("timed out waiting for SetAPIHostPorts to be called")
    73  	case servers := <-setter.servers:
    74  		c.Assert(servers, gc.DeepEquals, updatedServers)
    75  	}
    76  }
    77  
    78  func (s *APIAddressUpdaterSuite) TestAddressChange(c *gc.C) {
    79  	setter := &apiAddressSetter{servers: make(chan [][]network.HostPort, 1)}
    80  	st, _ := s.OpenAPIAsNewMachine(c, state.JobHostUnits)
    81  	worker := apiaddressupdater.NewAPIAddressUpdater(st.Machiner(), setter)
    82  	defer func() { c.Assert(worker.Wait(), gc.IsNil) }()
    83  	defer worker.Kill()
    84  	s.BackingState.StartSync()
    85  	updatedServers := [][]network.HostPort{
    86  		network.NewHostPorts(1234, "localhost", "127.0.0.1"),
    87  	}
    88  	// SetAPIHostPorts should be called with the initial value (empty),
    89  	// and then the updated value.
    90  	select {
    91  	case <-time.After(coretesting.LongWait):
    92  		c.Fatalf("timed out waiting for SetAPIHostPorts to be called initially")
    93  	case servers := <-setter.servers:
    94  		c.Assert(servers, gc.HasLen, 0)
    95  	}
    96  	err := s.State.SetAPIHostPorts(updatedServers)
    97  	c.Assert(err, jc.ErrorIsNil)
    98  	s.BackingState.StartSync()
    99  	select {
   100  	case <-time.After(coretesting.LongWait):
   101  		c.Fatalf("timed out waiting for SetAPIHostPorts to be called after update")
   102  	case servers := <-setter.servers:
   103  		c.Assert(servers, gc.DeepEquals, updatedServers)
   104  	}
   105  }
   106  
   107  func (s *APIAddressUpdaterSuite) TestLXCBridgeAddressesFiltering(c *gc.C) {
   108  	lxcFakeNetConfig := filepath.Join(c.MkDir(), "lxc-net")
   109  	netConf := []byte(`
   110    # comments ignored
   111  LXC_BR= ignored
   112  LXC_ADDR = "fooo"
   113  LXC_BRIDGE="foobar" # detected
   114  anything else ignored
   115  LXC_BRIDGE="ignored"`[1:])
   116  	err := ioutil.WriteFile(lxcFakeNetConfig, netConf, 0644)
   117  	c.Assert(err, jc.ErrorIsNil)
   118  	s.PatchValue(&network.InterfaceByNameAddrs, func(name string) ([]net.Addr, error) {
   119  		c.Assert(name, gc.Equals, "foobar")
   120  		return []net.Addr{
   121  			&net.IPAddr{IP: net.IPv4(10, 0, 3, 1)},
   122  			&net.IPAddr{IP: net.IPv4(10, 0, 3, 4)},
   123  		}, nil
   124  	})
   125  	s.PatchValue(&network.LXCNetDefaultConfig, lxcFakeNetConfig)
   126  
   127  	initialServers := [][]network.HostPort{
   128  		network.NewHostPorts(1234, "localhost", "127.0.0.1"),
   129  		network.NewHostPorts(
   130  			4321,
   131  			"10.0.3.1", // filtered
   132  			"10.0.3.3", // not filtered (not a lxc bridge address)
   133  		),
   134  		network.NewHostPorts(4242, "10.0.3.4"), // filtered
   135  	}
   136  	err = s.State.SetAPIHostPorts(initialServers)
   137  	c.Assert(err, jc.ErrorIsNil)
   138  
   139  	setter := &apiAddressSetter{servers: make(chan [][]network.HostPort, 1)}
   140  	st, _ := s.OpenAPIAsNewMachine(c, state.JobHostUnits)
   141  	worker := apiaddressupdater.NewAPIAddressUpdater(st.Machiner(), setter)
   142  	defer func() { c.Assert(worker.Wait(), gc.IsNil) }()
   143  	defer worker.Kill()
   144  	s.BackingState.StartSync()
   145  	updatedServers := [][]network.HostPort{
   146  		network.NewHostPorts(1234, "localhost", "127.0.0.1"),
   147  		network.NewHostPorts(
   148  			4001,
   149  			"10.0.3.1", // filtered
   150  			"10.0.3.3", // not filtered (not a lxc bridge address)
   151  		),
   152  		network.NewHostPorts(4200, "10.0.3.4"), // filtered
   153  	}
   154  	// SetAPIHostPorts should be called with the initial value, and
   155  	// then the updated value, but filtering occurs in both cases.
   156  	select {
   157  	case <-time.After(coretesting.LongWait):
   158  		c.Fatalf("timed out waiting for SetAPIHostPorts to be called initially")
   159  	case servers := <-setter.servers:
   160  		c.Assert(servers, gc.HasLen, 2)
   161  		c.Assert(servers, jc.DeepEquals, [][]network.HostPort{
   162  			network.NewHostPorts(1234, "localhost", "127.0.0.1"),
   163  			network.NewHostPorts(4321, "10.0.3.3"),
   164  		})
   165  	}
   166  	err = s.State.SetAPIHostPorts(updatedServers)
   167  	c.Assert(err, gc.IsNil)
   168  	s.BackingState.StartSync()
   169  	select {
   170  	case <-time.After(coretesting.LongWait):
   171  		c.Fatalf("timed out waiting for SetAPIHostPorts to be called after update")
   172  	case servers := <-setter.servers:
   173  		c.Assert(servers, gc.HasLen, 2)
   174  		c.Assert(servers, jc.DeepEquals, [][]network.HostPort{
   175  			network.NewHostPorts(1234, "localhost", "127.0.0.1"),
   176  			network.NewHostPorts(4001, "10.0.3.3"),
   177  		})
   178  	}
   179  }