github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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) TestLXCBridgeAddressesFiltering(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 c.Assert(name, gc.Equals, "foobar") 124 return []net.Addr{ 125 &net.IPAddr{IP: net.IPv4(10, 0, 3, 1)}, 126 &net.IPAddr{IP: net.IPv4(10, 0, 3, 4)}, 127 }, nil 128 }) 129 s.PatchValue(&network.LXCNetDefaultConfig, lxcFakeNetConfig) 130 131 initialServers := [][]network.HostPort{ 132 network.NewHostPorts(1234, "localhost", "127.0.0.1"), 133 network.NewHostPorts( 134 4321, 135 "10.0.3.1", // filtered 136 "10.0.3.3", // not filtered (not a lxc bridge address) 137 ), 138 network.NewHostPorts(4242, "10.0.3.4"), // filtered 139 } 140 err = s.State.SetAPIHostPorts(initialServers) 141 c.Assert(err, jc.ErrorIsNil) 142 143 setter := &apiAddressSetter{servers: make(chan [][]network.HostPort, 1)} 144 st, _ := s.OpenAPIAsNewMachine(c, state.JobHostUnits) 145 worker, err := apiaddressupdater.NewAPIAddressUpdater(apimachiner.NewState(st), setter) 146 c.Assert(err, jc.ErrorIsNil) 147 defer func() { c.Assert(worker.Wait(), gc.IsNil) }() 148 defer worker.Kill() 149 s.BackingState.StartSync() 150 updatedServers := [][]network.HostPort{ 151 network.NewHostPorts(1234, "localhost", "127.0.0.1"), 152 network.NewHostPorts( 153 4001, 154 "10.0.3.1", // filtered 155 "10.0.3.3", // not filtered (not a lxc bridge address) 156 ), 157 network.NewHostPorts(4200, "10.0.3.4"), // filtered 158 } 159 // SetAPIHostPorts should be called with the initial value, and 160 // then the updated value, but filtering occurs in both cases. 161 select { 162 case <-time.After(coretesting.LongWait): 163 c.Fatalf("timed out waiting for SetAPIHostPorts to be called initially") 164 case servers := <-setter.servers: 165 c.Assert(servers, gc.HasLen, 2) 166 c.Assert(servers, jc.DeepEquals, [][]network.HostPort{ 167 network.NewHostPorts(1234, "localhost", "127.0.0.1"), 168 network.NewHostPorts(4321, "10.0.3.3"), 169 }) 170 } 171 err = s.State.SetAPIHostPorts(updatedServers) 172 c.Assert(err, gc.IsNil) 173 s.BackingState.StartSync() 174 select { 175 case <-time.After(coretesting.LongWait): 176 c.Fatalf("timed out waiting for SetAPIHostPorts to be called after update") 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(4001, "10.0.3.3"), 182 }) 183 } 184 }