github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/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 }