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