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 }