Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(2741)

Side by Side Diff: state/apiserver/machine_test.go

Issue 9742044: state/api: Split to multiple files (Closed)
Patch Set: state/api: Split to multiple files Created 11 years, 11 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « state/apiserver/machine.go ('k') | state/apiserver/perm_test.go » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2012, 2013 Canonical Ltd.
2 // Licensed under the AGPLv3, see LICENCE file for details.
3
4 package apiserver_test
5
6 import (
7 . "launchpad.net/gocheck"
8 "launchpad.net/juju-core/constraints"
9 "launchpad.net/juju-core/state"
10 "launchpad.net/juju-core/state/api"
11 "launchpad.net/juju-core/state/api/params"
12 "time"
13 )
14
15 func (s *suite) TestMachineLogin(c *C) {
16 stm, err := s.State.AddMachine("series", state.JobHostUnits)
17 c.Assert(err, IsNil)
18 err = stm.SetPassword("machine-password")
19 c.Assert(err, IsNil)
20 err = stm.SetProvisioned("i-foo", "fake_nonce")
21 c.Assert(err, IsNil)
22
23 _, info, err := s.APIConn.Environ.StateInfo()
24 c.Assert(err, IsNil)
25
26 info.Tag = stm.Tag()
27 info.Password = "machine-password"
28
29 st, err := api.Open(info)
30 c.Assert(err, IsNil)
31 defer st.Close()
32
33 m, err := st.Machine(stm.Id())
34 c.Assert(err, IsNil)
35
36 instId, ok := m.InstanceId()
37 c.Assert(ok, Equals, true)
38 c.Assert(instId, Equals, "i-foo")
39 }
40
41 func (s *suite) TestMachineInstanceId(c *C) {
42 stm, err := s.State.AddMachine("series", state.JobHostUnits)
43 c.Assert(err, IsNil)
44 setDefaultPassword(c, stm)
45
46 st := s.openAs(c, stm.Tag())
47 defer st.Close()
48
49 m, err := st.Machine(stm.Id())
50 c.Assert(err, IsNil)
51
52 instId, ok := m.InstanceId()
53 c.Check(instId, Equals, "")
54 c.Check(ok, Equals, false)
55
56 err = stm.SetProvisioned("foo", "fake_nonce")
57 c.Assert(err, IsNil)
58
59 instId, ok = m.InstanceId()
60 c.Check(instId, Equals, "")
61 c.Check(ok, Equals, false)
62
63 err = m.Refresh()
64 c.Assert(err, IsNil)
65
66 instId, ok = m.InstanceId()
67 c.Check(ok, Equals, true)
68 c.Assert(instId, Equals, "foo")
69 }
70
71 func (s *suite) TestMachineSetProvisioned(c *C) {
72 // TODO (dimitern): If we change the permissions for
73 // Machine.SetProvisioned to be laxer, change this test accordingly.
74 stm, err := s.State.AddMachine("series", state.JobManageEnviron)
75 c.Assert(err, IsNil)
76 setDefaultPassword(c, stm)
77
78 st := s.openAs(c, stm.Tag())
79 defer st.Close()
80
81 m, err := st.Machine(stm.Id())
82 c.Assert(err, IsNil)
83
84 instId, ok := stm.InstanceId()
85 c.Assert(instId, Equals, state.InstanceId(""))
86 c.Assert(ok, Equals, false)
87 c.Assert(stm.CheckProvisioned("fake_nonce"), Equals, false)
88
89 err = m.SetProvisioned("foo", "fake_nonce")
90 c.Assert(err, IsNil)
91
92 instId, ok = stm.InstanceId()
93 c.Assert(instId, Equals, state.InstanceId(""))
94 c.Assert(ok, Equals, false)
95
96 err = stm.Refresh()
97 c.Assert(err, IsNil)
98
99 instId, ok = stm.InstanceId()
100 c.Assert(ok, Equals, true)
101 c.Assert(instId, Equals, state.InstanceId("foo"))
102 c.Assert(stm.CheckProvisioned("fake_nonce"), Equals, true)
103 }
104
105 func (s *suite) TestMachineSeries(c *C) {
106 stm, err := s.State.AddMachine("series", state.JobHostUnits)
107 c.Assert(err, IsNil)
108 setDefaultPassword(c, stm)
109
110 st := s.openAs(c, stm.Tag())
111 defer st.Close()
112
113 m, err := st.Machine(stm.Id())
114 c.Assert(err, IsNil)
115
116 c.Assert(m.Series(), Equals, "series")
117 }
118
119 func (s *suite) TestMachineConstraints(c *C) {
120 // NOTE (dimitern): If we change the permissions for
121 // Machine.Constraints to be laxer, change this test accordingly.
122 stm, err := s.State.AddMachine("series", state.JobManageEnviron)
123 c.Assert(err, IsNil)
124 setDefaultPassword(c, stm)
125 machineConstraints := constraints.MustParse("mem=1G")
126
127 err = stm.SetConstraints(machineConstraints)
128 c.Assert(err, IsNil)
129
130 st := s.openAs(c, stm.Tag())
131 defer st.Close()
132
133 m, err := st.Machine(stm.Id())
134 c.Assert(err, IsNil)
135
136 cons, err := m.Constraints()
137 c.Assert(err, IsNil)
138 c.Assert(cons, DeepEquals, machineConstraints)
139 }
140
141 func (s *suite) TestMachineRemove(c *C) {
142 // TODO (dimitern): If we change the permissions for
143 // Machine.Remove to be laxer, change this test accordingly.
144 stm0, err := s.State.AddMachine("series", state.JobManageEnviron)
145 c.Assert(err, IsNil)
146 setDefaultPassword(c, stm0)
147
148 stm1, err := s.State.AddMachine("series", state.JobHostUnits)
149 c.Assert(err, IsNil)
150 setDefaultPassword(c, stm1)
151
152 st := s.openAs(c, stm0.Tag())
153 defer st.Close()
154
155 m0, err := st.Machine(stm0.Id())
156 c.Assert(err, IsNil)
157 m1, err := st.Machine(stm1.Id())
158 c.Assert(err, IsNil)
159
160 c.Assert(stm0.Life(), Equals, state.Alive)
161 c.Assert(stm1.Life(), Equals, state.Alive)
162
163 err = m0.Remove()
164 c.Assert(err, ErrorMatches, "cannot remove machine 0: machine is not dea d")
165 err = m1.Remove()
166 c.Assert(err, ErrorMatches, "cannot remove machine 1: machine is not dea d")
167
168 err = stm0.EnsureDead()
169 c.Assert(err, ErrorMatches, "machine 0 is required by the environment")
170 err = stm1.EnsureDead()
171 c.Assert(err, IsNil)
172
173 err = stm0.Refresh()
174 c.Assert(err, IsNil)
175 err = stm1.Refresh()
176 c.Assert(err, IsNil)
177
178 c.Assert(stm0.Life(), Equals, state.Alive)
179 c.Assert(stm1.Life(), Equals, state.Dead)
180
181 err = m1.Remove()
182 c.Assert(err, IsNil)
183
184 err = stm1.Refresh()
185 c.Assert(state.IsNotFound(err), Equals, true)
186 }
187
188 func (s *suite) TestMachineLife(c *C) {
189 stm, err := s.State.AddMachine("series", state.JobHostUnits)
190 c.Assert(err, IsNil)
191 setDefaultPassword(c, stm)
192
193 st := s.openAs(c, stm.Tag())
194 defer st.Close()
195
196 m, err := st.Machine(stm.Id())
197 c.Assert(err, IsNil)
198
199 life := m.Life()
200 c.Assert(string(life), Equals, "alive")
201
202 err = stm.EnsureDead()
203 c.Assert(err, IsNil)
204
205 life = m.Life()
206 c.Assert(string(life), Equals, "alive")
207
208 err = m.Refresh()
209 c.Assert(err, IsNil)
210
211 life = m.Life()
212 c.Assert(string(life), Equals, "dead")
213 }
214
215 func (s *suite) TestMachineEnsureDead(c *C) {
216 stm, err := s.State.AddMachine("series", state.JobHostUnits)
217 c.Assert(err, IsNil)
218 setDefaultPassword(c, stm)
219
220 st := s.openAs(c, stm.Tag())
221 defer st.Close()
222
223 m, err := st.Machine(stm.Id())
224 c.Assert(err, IsNil)
225
226 c.Assert(stm.Life(), Equals, state.Alive)
227
228 err = m.EnsureDead()
229 c.Assert(err, IsNil)
230
231 err = stm.Refresh()
232 c.Assert(err, IsNil)
233
234 c.Assert(stm.Life(), Equals, state.Dead)
235 }
236
237 func (s *suite) TestMachineEnsureDeadWithAssignedUnit(c *C) {
238 stm, err := s.State.AddMachine("series", state.JobHostUnits)
239 c.Assert(err, IsNil)
240 setDefaultPassword(c, stm)
241
242 svc, err := s.State.AddService("wordpress", s.AddTestingCharm(c, "wordpr ess"))
243 c.Assert(err, IsNil)
244 unit, err := svc.AddUnit()
245 c.Assert(err, IsNil)
246 err = unit.AssignToMachine(stm)
247 c.Assert(err, IsNil)
248
249 st := s.openAs(c, stm.Tag())
250 defer st.Close()
251
252 m, err := st.Machine(stm.Id())
253 c.Assert(err, IsNil)
254
255 c.Assert(stm.Life(), Equals, state.Alive)
256
257 err = m.EnsureDead()
258 c.Assert(api.ErrCode(err), Equals, api.CodeHasAssignedUnits)
259 c.Assert(err, ErrorMatches, `machine 0 has unit "wordpress/0" assigned`)
260
261 err = stm.Refresh()
262 c.Assert(err, IsNil)
263
264 c.Assert(stm.Life(), Equals, state.Alive)
265
266 // Once no unit is assigned, lifecycle can advance.
267 err = unit.UnassignFromMachine()
268 c.Assert(err, IsNil)
269
270 err = m.EnsureDead()
271 c.Assert(err, IsNil)
272
273 c.Assert(stm.Life(), Equals, state.Alive)
274
275 err = stm.Refresh()
276 c.Assert(err, IsNil)
277
278 c.Assert(stm.Life(), Equals, state.Dead)
279 }
280
281 func (s *suite) TestMachineSetAgentAlive(c *C) {
282 stm, err := s.State.AddMachine("series", state.JobHostUnits)
283 c.Assert(err, IsNil)
284 setDefaultPassword(c, stm)
285
286 st := s.openAs(c, stm.Tag())
287 defer st.Close()
288
289 m, err := st.Machine(stm.Id())
290 c.Assert(err, IsNil)
291
292 alive, err := stm.AgentAlive()
293 c.Assert(err, IsNil)
294 c.Assert(alive, Equals, false)
295
296 pinger, err := m.SetAgentAlive()
297 c.Assert(err, IsNil)
298 c.Assert(pinger, NotNil)
299
300 s.State.Sync()
301 alive, err = stm.AgentAlive()
302 c.Assert(err, IsNil)
303 c.Assert(alive, Equals, true)
304
305 err = pinger.Stop()
306 c.Assert(err, IsNil)
307 }
308
309 func (s *suite) TestMachineStatus(c *C) {
310 // TODO (dimitern): If we change the permissions for
311 // Machine.Status to be laxer, change this test accordingly.
312 stm, err := s.State.AddMachine("series", state.JobManageEnviron)
313 c.Assert(err, IsNil)
314 setDefaultPassword(c, stm)
315
316 err = stm.SetStatus(params.StatusStopped, "blah")
317 c.Assert(err, IsNil)
318
319 st := s.openAs(c, stm.Tag())
320 defer st.Close()
321
322 m, err := st.Machine(stm.Id())
323 c.Assert(err, IsNil)
324
325 status, info, err := m.Status()
326 c.Assert(err, IsNil)
327 c.Assert(status, Equals, params.StatusStopped)
328 c.Assert(info, Equals, "blah")
329 }
330
331 func (s *suite) TestMachineSetStatus(c *C) {
332 stm, err := s.State.AddMachine("series", state.JobHostUnits)
333 c.Assert(err, IsNil)
334 setDefaultPassword(c, stm)
335
336 st := s.openAs(c, stm.Tag())
337 defer st.Close()
338
339 m, err := st.Machine(stm.Id())
340 c.Assert(err, IsNil)
341
342 status, info, err := stm.Status()
343 c.Assert(err, IsNil)
344 c.Assert(status, Equals, params.StatusPending)
345 c.Assert(info, Equals, "")
346
347 err = m.SetStatus(params.StatusStarted, "blah")
348 c.Assert(err, IsNil)
349
350 status, info, err = stm.Status()
351 c.Assert(err, IsNil)
352 c.Assert(status, Equals, params.StatusStarted)
353 c.Assert(info, Equals, "blah")
354 }
355
356 func (s *suite) TestMachineRefresh(c *C) {
357 // Add a machine and get its instance id (it's empty at first).
358 stm, err := s.State.AddMachine("series", state.JobHostUnits)
359 c.Assert(err, IsNil)
360 oldId, _ := stm.InstanceId()
361 c.Assert(oldId, Equals, state.InstanceId(""))
362
363 // Now open the state connection for that machine.
364 setDefaultPassword(c, stm)
365 st := s.openAs(c, stm.Tag())
366 defer st.Close()
367
368 // Get the machine through the API.
369 m, err := st.Machine(stm.Id())
370 c.Assert(err, IsNil)
371 // Set the original machine's instance id and nonce.
372 err = stm.SetProvisioned("foo", "fake_nonce")
373 c.Assert(err, IsNil)
374 newId, _ := stm.InstanceId()
375 c.Assert(newId, Equals, state.InstanceId("foo"))
376
377 // Get the instance id of the machine through the API,
378 // it should match the oldId, before the refresh.
379 mId, _ := m.InstanceId()
380 c.Assert(state.InstanceId(mId), Equals, oldId)
381 err = m.Refresh()
382 c.Assert(err, IsNil)
383 // Now the instance id should be the new one.
384 mId, _ = m.InstanceId()
385 c.Assert(state.InstanceId(mId), Equals, newId)
386 }
387
388 func (s *suite) TestMachineSetPassword(c *C) {
389 stm, err := s.State.AddMachine("series", state.JobHostUnits)
390 c.Assert(err, IsNil)
391 setDefaultPassword(c, stm)
392
393 st := s.openAs(c, stm.Tag())
394 defer st.Close()
395 m, err := st.Machine(stm.Id())
396 c.Assert(err, IsNil)
397
398 err = m.SetPassword("foo")
399 c.Assert(err, IsNil)
400
401 err = stm.Refresh()
402 c.Assert(err, IsNil)
403 c.Assert(stm.PasswordValid("foo"), Equals, true)
404 }
405
406 func (s *suite) TestMachineSetPasswordInMongo(c *C) {
407 allowStateAccess := map[state.MachineJob]bool{
408 state.JobManageEnviron: true,
409 state.JobServeAPI: true,
410 state.JobHostUnits: false,
411 }
412
413 for job, canOpenState := range allowStateAccess {
414 stm, err := s.State.AddMachine("series", job)
415 c.Assert(err, IsNil)
416 setDefaultPassword(c, stm)
417
418 st := s.openAs(c, stm.Tag())
419 defer st.Close()
420 m, err := st.Machine(stm.Id())
421 c.Assert(err, IsNil)
422
423 // Sanity check to start with.
424 err = s.tryOpenState(c, m, defaultPassword(stm))
425 c.Assert(state.IsUnauthorizedError(err), Equals, true, Commentf( "%v", err))
426
427 err = m.SetPassword("foo")
428 c.Assert(err, IsNil)
429
430 err = s.tryOpenState(c, m, "foo")
431 if canOpenState {
432 c.Assert(err, IsNil)
433 } else {
434 c.Assert(state.IsUnauthorizedError(err), Equals, true, C ommentf("%v", err))
435 }
436 }
437 }
438
439 func (s *suite) TestMachineTag(c *C) {
440 c.Assert(api.MachineTag("2"), Equals, "machine-2")
441
442 stm, err := s.State.AddMachine("series", state.JobHostUnits)
443 c.Assert(err, IsNil)
444 setDefaultPassword(c, stm)
445 st := s.openAs(c, "machine-0")
446 defer st.Close()
447 m, err := st.Machine("0")
448 c.Assert(err, IsNil)
449 c.Assert(m.Tag(), Equals, "machine-0")
450 }
451
452 func (s *suite) TestMachineWatch(c *C) {
453 stm, err := s.State.AddMachine("series", state.JobHostUnits)
454 c.Assert(err, IsNil)
455 setDefaultPassword(c, stm)
456
457 st := s.openAs(c, stm.Tag())
458 defer st.Close()
459 m, err := st.Machine(stm.Id())
460 c.Assert(err, IsNil)
461 w0 := m.Watch()
462 w1 := m.Watch()
463
464 // Initial event.
465 ok := chanReadEmpty(c, w0.Changes(), "watcher 0")
466 c.Assert(ok, Equals, true)
467
468 ok = chanReadEmpty(c, w1.Changes(), "watcher 1")
469 c.Assert(ok, Equals, true)
470
471 // No subsequent event until something changes.
472 select {
473 case <-w0.Changes():
474 c.Fatalf("unexpected value on watcher 0")
475 case <-w1.Changes():
476 c.Fatalf("unexpected value on watcher 1")
477 case <-time.After(20 * time.Millisecond):
478 }
479
480 err = stm.SetProvisioned("foo", "fake_nonce")
481 c.Assert(err, IsNil)
482
483 // Next event.
484 ok = chanReadEmpty(c, w0.Changes(), "watcher 0")
485 c.Assert(ok, Equals, true)
486 ok = chanReadEmpty(c, w1.Changes(), "watcher 1")
487 c.Assert(ok, Equals, true)
488
489 err = w0.Stop()
490 c.Check(err, IsNil)
491 err = w1.Stop()
492 c.Check(err, IsNil)
493
494 ok = chanReadEmpty(c, w0.Changes(), "watcher 0")
495 c.Assert(ok, Equals, false)
496 ok = chanReadEmpty(c, w1.Changes(), "watcher 1")
497 c.Assert(ok, Equals, false)
498 }
OLDNEW
« no previous file with comments | « state/apiserver/machine.go ('k') | state/apiserver/perm_test.go » ('j') | no next file with comments »

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b