OLD | NEW |
| (Empty) |
1 from xmlrpclib import Fault | |
2 | |
3 from twisted.internet.defer import succeed, inlineCallbacks | |
4 | |
5 from juju.errors import ProviderError | |
6 from juju.lib.serializer import dump | |
7 from juju.lib.testing import TestCase | |
8 from juju.providers.orchestra.machine import OrchestraMachine | |
9 from juju.providers.orchestra.tests.common import OrchestraTestMixin | |
10 | |
11 | |
12 class OrchestraBootstrapTest(TestCase, OrchestraTestMixin): | |
13 | |
14 def mock_verify(self): | |
15 self.mock_fs_put("http://somewhe.re/webdav/bootstrap-verify", | |
16 "storage is writable") | |
17 | |
18 def mock_save_state(self): | |
19 data = dump({"zookeeper-instances": ["winston-uid"]}) | |
20 self.mock_fs_put("http://somewhe.re/webdav/provider-state", data) | |
21 | |
22 def mock_surprise_shutdown(self): | |
23 self.proxy_m.callRemote("get_systems") | |
24 self.mocker.result(succeed([{ | |
25 "uid": "winston-uid", | |
26 "ks_meta": { | |
27 "MACHINE_ID": "blah", | |
28 "USER_DATA_BASE64": "userdata", | |
29 "KEEP": "keep"}, | |
30 "mgmt_classes": ["acquired", "PRESERVE"]}])) | |
31 self.proxy_m.callRemote("find_system", {"uid": "winston-uid"}) | |
32 self.mocker.result(succeed(["winston"])) | |
33 self.proxy_m.callRemote("get_system_handle", "winston", "TOKEN") | |
34 self.mocker.result(succeed("some-handle")) | |
35 self.proxy_m.callRemote( | |
36 "modify_system", "some-handle", "ks_meta", {"KEEP": "keep"}, | |
37 "TOKEN") | |
38 self.mocker.result(succeed(True)) | |
39 self.proxy_m.callRemote( | |
40 "modify_system", "some-handle", | |
41 "mgmt_classes", ["available", "PRESERVE"], "TOKEN") | |
42 self.mocker.result(succeed(True)) | |
43 self.proxy_m.callRemote( | |
44 "modify_system", "some-handle", "netboot_enabled", True, "TOKEN") | |
45 self.mocker.result(succeed(True)) | |
46 self.proxy_m.callRemote("save_system", "some-handle", "TOKEN") | |
47 self.mocker.result(succeed(True)) | |
48 self.proxy_m.callRemote( | |
49 "background_power_system", | |
50 {"power": "off", "systems": ["winston"]}, "TOKEN") | |
51 self.mocker.result(succeed("ignored")) | |
52 | |
53 def test_already_bootstrapped(self): | |
54 self.setup_mocks() | |
55 self.mock_find_zookeepers(("winston-uid", "winston")) | |
56 self.mocker.replay() | |
57 | |
58 def verify_machines(machines): | |
59 (machine,) = machines | |
60 self.assertTrue(isinstance(machine, OrchestraMachine)) | |
61 self.assertEquals(machine.instance_id, "winston-uid") | |
62 d = self.get_provider().bootstrap({}) | |
63 d.addCallback(verify_machines) | |
64 return d | |
65 | |
66 @inlineCallbacks | |
67 def test_no_machines_available(self): | |
68 self.setup_mocks() | |
69 self.mock_find_zookeepers() | |
70 self.mock_verify() | |
71 self.mock_get_systems(acceptable=False) | |
72 self.mocker.replay() | |
73 provider = self.get_provider() | |
74 cs = yield provider.get_constraint_set() | |
75 d = provider.bootstrap(cs.parse([]).with_series("splendid")) | |
76 self.assertFailure(d, ProviderError) | |
77 | |
78 @inlineCallbacks | |
79 def verify_auth_error(self, error): | |
80 self.setup_mocks() | |
81 self.mock_find_zookeepers() | |
82 self.mock_verify() | |
83 self.mock_get_systems() | |
84 self.mock_acquire_system(error) | |
85 self.mocker.replay() | |
86 provider = self.get_provider() | |
87 cs = yield provider.get_constraint_set() | |
88 d = provider.bootstrap(cs.parse([]).with_series("splendid")) | |
89 self.assertFailure(d, type(error)) | |
90 | |
91 def test_non_auth_fault(self): | |
92 return self.verify_auth_error(Fault("blah", "some random error")) | |
93 | |
94 def test_non_auth_error(self): | |
95 return self.verify_auth_error(Exception("fiddlesticks")) | |
96 | |
97 @inlineCallbacks | |
98 def verify_change_failures(self, **kwargs): | |
99 log = self.capture_logging("juju.orchestra") | |
100 self.setup_mocks() | |
101 self.mock_find_zookeepers() | |
102 self.mock_verify() | |
103 self.mock_get_systems(mgmt_classes="available foo bar") | |
104 self.mock_acquire_system() | |
105 self.mock_start_system( | |
106 self.get_verify_ks_meta(0, "bootstrap_user_data"), | |
107 expect_series="bizarre", **kwargs) | |
108 self.mock_surprise_shutdown() | |
109 self.mocker.replay() | |
110 provider = self.get_provider() | |
111 cs = yield provider.get_constraint_set() | |
112 d = provider.bootstrap( | |
113 cs.parse(["orchestra-classes=foo,bar"]).with_series("bizarre")) | |
114 yield self.assertFailure(d, ProviderError) | |
115 self.assertIn( | |
116 "Failed to launch machine winston-uid; attempting to revert.", | |
117 log.getvalue()) | |
118 | |
119 def test_cannot_modify_machine(self): | |
120 """ | |
121 Check that failures when launching the machine cause an (attempt to) | |
122 roll back to an unacquired state. | |
123 """ | |
124 return self.verify_change_failures(fail_modify=True) | |
125 | |
126 def test_cannot_save_machine(self): | |
127 """ | |
128 Check that failures when launching the machine cause an (attempt to) | |
129 roll back to an unacquired state. | |
130 """ | |
131 return self.verify_change_failures(fail_save=True) | |
132 | |
133 @inlineCallbacks | |
134 def test_launch_available_machine(self): | |
135 self.setup_mocks() | |
136 self.mock_find_zookeepers() | |
137 self.mock_verify() | |
138 self.mock_get_systems(mgmt_classes="available foo bar") | |
139 self.mock_acquire_system() | |
140 self.mock_start_system( | |
141 self.get_verify_ks_meta(0, "bootstrap_user_data"), | |
142 expect_series="bizarre") | |
143 self.mock_describe_systems(succeed([{ | |
144 "uid": "winston-uid", | |
145 "name": "winston", | |
146 "mgmt_classes": ["acquired"], | |
147 "netboot_enabled": True}])) | |
148 self.mock_save_state() | |
149 self.mocker.replay() | |
150 | |
151 provider = self.get_provider() | |
152 cs = yield provider.get_constraint_set() | |
153 machines = yield provider.bootstrap( | |
154 cs.parse(["orchestra-classes=foo,bar"]).with_series("bizarre")) | |
155 (machine,) = machines | |
156 self.assertTrue(isinstance(machine, OrchestraMachine)) | |
157 self.assertEquals(machine.instance_id, "winston-uid") | |
158 self.assertEquals(machine.dns_name, "winston") | |
OLD | NEW |