github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/worker/machineenvironmentworker/machineenvironmentworker_test.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package machineenvironmentworker_test 5 6 import ( 7 "io/ioutil" 8 "os" 9 "path" 10 "time" 11 12 gc "launchpad.net/gocheck" 13 14 "launchpad.net/juju-core/agent" 15 "launchpad.net/juju-core/environs/config" 16 "launchpad.net/juju-core/juju/osenv" 17 jujutesting "launchpad.net/juju-core/juju/testing" 18 "launchpad.net/juju-core/names" 19 "launchpad.net/juju-core/provider" 20 "launchpad.net/juju-core/state" 21 "launchpad.net/juju-core/state/api" 22 "launchpad.net/juju-core/state/api/environment" 23 "launchpad.net/juju-core/testing" 24 jc "launchpad.net/juju-core/testing/checkers" 25 "launchpad.net/juju-core/utils" 26 "launchpad.net/juju-core/worker" 27 "launchpad.net/juju-core/worker/machineenvironmentworker" 28 ) 29 30 type MachineEnvironmentWatcherSuite struct { 31 jujutesting.JujuConnSuite 32 33 apiRoot *api.State 34 environmentAPI *environment.Facade 35 machine *state.Machine 36 37 proxyFile string 38 started bool 39 } 40 41 var _ = gc.Suite(&MachineEnvironmentWatcherSuite{}) 42 43 func (s *MachineEnvironmentWatcherSuite) setStarted() { 44 s.started = true 45 } 46 47 func (s *MachineEnvironmentWatcherSuite) SetUpTest(c *gc.C) { 48 s.JujuConnSuite.SetUpTest(c) 49 s.apiRoot, s.machine = s.OpenAPIAsNewMachine(c) 50 // Create the machiner API facade. 51 s.environmentAPI = s.apiRoot.Environment() 52 c.Assert(s.environmentAPI, gc.NotNil) 53 54 proxyDir := c.MkDir() 55 s.PatchValue(&machineenvironmentworker.ProxyDirectory, proxyDir) 56 s.started = false 57 s.PatchValue(&machineenvironmentworker.Started, s.setStarted) 58 s.PatchValue(&utils.AptConfFile, path.Join(proxyDir, "juju-apt-proxy")) 59 s.proxyFile = path.Join(proxyDir, machineenvironmentworker.ProxyFile) 60 } 61 62 func (s *MachineEnvironmentWatcherSuite) waitForPostSetup(c *gc.C) { 63 for { 64 select { 65 case <-time.After(testing.LongWait): 66 c.Fatalf("timeout while waiting for setup") 67 case <-time.After(10 * time.Millisecond): 68 if s.started { 69 return 70 } 71 } 72 } 73 } 74 75 func (s *MachineEnvironmentWatcherSuite) waitProxySettings(c *gc.C, expected osenv.ProxySettings) { 76 for { 77 select { 78 case <-time.After(testing.LongWait): 79 c.Fatalf("timeout while waiting for proxy settings to change") 80 case <-time.After(10 * time.Millisecond): 81 obtained := osenv.DetectProxies() 82 if obtained != expected { 83 c.Logf("proxy settings are %#v, still waiting", obtained) 84 continue 85 } 86 return 87 } 88 } 89 } 90 91 func (s *MachineEnvironmentWatcherSuite) waitForFile(c *gc.C, filename, expected string) { 92 for { 93 select { 94 case <-time.After(testing.LongWait): 95 c.Fatalf("timeout while waiting for proxy settings to change") 96 case <-time.After(10 * time.Millisecond): 97 fileContent, err := ioutil.ReadFile(filename) 98 if os.IsNotExist(err) { 99 continue 100 } 101 c.Assert(err, gc.IsNil) 102 if string(fileContent) != expected { 103 c.Logf("file content not matching, still waiting") 104 continue 105 } 106 return 107 } 108 } 109 } 110 111 func (s *MachineEnvironmentWatcherSuite) makeWorker(c *gc.C, agentConfig agent.Config) worker.Worker { 112 return machineenvironmentworker.NewMachineEnvironmentWorker(s.environmentAPI, agentConfig) 113 } 114 115 func (s *MachineEnvironmentWatcherSuite) TestRunStop(c *gc.C) { 116 agentConfig := agentConfig("0", "ec2") 117 envWorker := s.makeWorker(c, agentConfig) 118 c.Assert(worker.Stop(envWorker), gc.IsNil) 119 } 120 121 func (s *MachineEnvironmentWatcherSuite) updateConfig(c *gc.C) (osenv.ProxySettings, osenv.ProxySettings) { 122 oldConfig, err := s.State.EnvironConfig() 123 c.Assert(err, gc.IsNil) 124 125 proxySettings := osenv.ProxySettings{ 126 Http: "http proxy", 127 Https: "https proxy", 128 Ftp: "ftp proxy", 129 NoProxy: "no proxy", 130 } 131 132 envConfig, err := oldConfig.Apply(config.ProxyConfigMap(proxySettings)) 133 c.Assert(err, gc.IsNil) 134 135 // We explicitly set apt proxy settings as well to show that it is the apt 136 // settings that are used for the apt config, and not just the normal 137 // proxy settings which is what we would get if we don't explicitly set 138 // apt values. 139 aptProxySettings := osenv.ProxySettings{ 140 Http: "apt http proxy", 141 Https: "apt https proxy", 142 Ftp: "apt ftp proxy", 143 } 144 envConfig, err = envConfig.Apply(config.AptProxyConfigMap(aptProxySettings)) 145 c.Assert(err, gc.IsNil) 146 147 err = s.State.SetEnvironConfig(envConfig, oldConfig) 148 c.Assert(err, gc.IsNil) 149 150 return proxySettings, aptProxySettings 151 } 152 153 func (s *MachineEnvironmentWatcherSuite) TestInitialState(c *gc.C) { 154 proxySettings, aptProxySettings := s.updateConfig(c) 155 156 agentConfig := agentConfig("0", "ec2") 157 envWorker := s.makeWorker(c, agentConfig) 158 defer worker.Stop(envWorker) 159 160 s.waitProxySettings(c, proxySettings) 161 s.waitForFile(c, s.proxyFile, proxySettings.AsScriptEnvironment()+"\n") 162 s.waitForFile(c, utils.AptConfFile, utils.AptProxyContent(aptProxySettings)+"\n") 163 } 164 165 func (s *MachineEnvironmentWatcherSuite) TestRespondsToEvents(c *gc.C) { 166 agentConfig := agentConfig("0", "ec2") 167 envWorker := s.makeWorker(c, agentConfig) 168 defer worker.Stop(envWorker) 169 s.waitForPostSetup(c) 170 171 proxySettings, aptProxySettings := s.updateConfig(c) 172 173 s.waitProxySettings(c, proxySettings) 174 s.waitForFile(c, s.proxyFile, proxySettings.AsScriptEnvironment()+"\n") 175 s.waitForFile(c, utils.AptConfFile, utils.AptProxyContent(aptProxySettings)+"\n") 176 } 177 178 func (s *MachineEnvironmentWatcherSuite) TestInitialStateLocalMachine1(c *gc.C) { 179 proxySettings, aptProxySettings := s.updateConfig(c) 180 181 agentConfig := agentConfig("1", provider.Local) 182 envWorker := s.makeWorker(c, agentConfig) 183 defer worker.Stop(envWorker) 184 185 s.waitProxySettings(c, proxySettings) 186 s.waitForFile(c, s.proxyFile, proxySettings.AsScriptEnvironment()+"\n") 187 s.waitForFile(c, utils.AptConfFile, utils.AptProxyContent(aptProxySettings)+"\n") 188 } 189 190 func (s *MachineEnvironmentWatcherSuite) TestInitialStateLocalMachine0(c *gc.C) { 191 proxySettings, _ := s.updateConfig(c) 192 193 agentConfig := agentConfig("0", provider.Local) 194 envWorker := s.makeWorker(c, agentConfig) 195 defer worker.Stop(envWorker) 196 s.waitForPostSetup(c) 197 198 s.waitProxySettings(c, proxySettings) 199 200 c.Assert(utils.AptConfFile, jc.DoesNotExist) 201 c.Assert(s.proxyFile, jc.DoesNotExist) 202 } 203 204 type mockConfig struct { 205 agent.Config 206 tag string 207 provider string 208 } 209 210 func (mock *mockConfig) Tag() string { 211 return mock.tag 212 } 213 214 func (mock *mockConfig) Value(key string) string { 215 if key == agent.ProviderType { 216 return mock.provider 217 } 218 return "" 219 } 220 221 func agentConfig(machineId, provider string) *mockConfig { 222 return &mockConfig{tag: names.MachineTag(machineId), provider: provider} 223 }