1
from twisted.internet.defer import succeed
3
from juju.errors import MachinesNotFound
4
from juju.lib.testing import TestCase
5
from juju.providers.orchestra.machine import OrchestraMachine
7
from .common import OrchestraTestMixin
10
class SomeError(Exception):
14
class ShutdownTest(OrchestraTestMixin, TestCase):
16
def assert_machine(self, machine, uid, name):
17
self.assertTrue(isinstance(machine, OrchestraMachine))
18
self.assertEquals(machine.instance_id, uid)
19
self.assertEquals(machine.dns_name, name)
21
def assert_missing(self, d, instance_ids):
22
self.assertFailure(d, MachinesNotFound)
25
self.assertEquals(error.instance_ids, instance_ids)
29
def mock_get_systems(self, *systems):
30
self.proxy_m.callRemote("get_systems")
31
# skip an expected ks_meta key, to verify we can handle situations
32
# where we never managed to start it properly in the first place
33
self.mocker.result(succeed([
34
{"uid": uid, "name": name, "mgmt_classes": ["keep", cls],
35
"netboot_enabled": True,
36
"ks_meta": {"MACHINE_ID": "123", "PRESERVE": "blob"}}
37
for (uid, name, cls) in systems]))
39
def mock_shutdown_release(self, uid, name):
40
self.mock_get_systems((uid, name, "acquired"))
41
self.proxy_m.callRemote("find_system", {"uid": uid})
42
self.mocker.result(succeed([name]))
43
self.proxy_m.callRemote("get_system_handle", name, "")
44
self.mocker.result(succeed("some-handle"))
45
self.proxy_m.callRemote(
46
"modify_system", "some-handle", "ks_meta", {"PRESERVE": "blob"},
48
self.mocker.result(succeed(True))
49
self.proxy_m.callRemote(
50
"modify_system", "some-handle",
51
"mgmt_classes", ["keep", "available"], "")
52
self.mocker.result(succeed(True))
53
self.proxy_m.callRemote(
54
"modify_system", "some-handle", "netboot_enabled", True, "")
55
self.mocker.result(succeed(True))
56
self.proxy_m.callRemote("save_system", "some-handle", "")
57
self.mocker.result(succeed(True))
58
self.proxy_m.callRemote(
59
"background_power_system", {"power": "off", "systems": [name]}, "")
60
self.mocker.result(succeed("ignored"))
62
def check_shutdown_all(self, method_name):
63
self.mock_get_systems(
64
("i-amok", "ok", "acquired"),
65
("i-amalien", "alien", "available"),
66
("i-amoktoo", "oktoo", "acquired"))
67
self.mock_get_systems(
68
("i-amok", "ok", "acquired"),
69
("i-amalien", "alien", "available"),
70
("i-amoktoo", "oktoo", "acquired"))
71
self.mock_shutdown_release("i-amok", "ok")
72
self.mock_shutdown_release("i-amoktoo", "oktoo")
75
provider = self.get_provider()
76
method = getattr(provider, method_name)
80
(ok, oktoo) = machines
81
self.assert_machine(ok, "i-amok", "ok")
82
self.assert_machine(oktoo, "i-amoktoo", "oktoo")
86
def test_shutdown_machine(self):
88
self.mock_get_systems(("i-amhere", "blah", "acquired"))
89
self.mock_shutdown_release("i-amhere", "blah")
92
provider = self.get_provider()
93
d = provider.shutdown_machine(OrchestraMachine("i-amhere"))
94
d.addCallback(self.assert_machine, "i-amhere", "blah")
97
def test_shutdown_machine_missing(self):
99
self.mock_get_systems(("i-amirrelevant", "blah", "acquired"))
102
provider = self.get_provider()
103
d = provider.shutdown_machine(OrchestraMachine("i-ammissing"))
104
return self.assert_missing(d, ["i-ammissing"])
106
def test_shutdown_machine_unowned(self):
108
self.mock_get_systems(("i-amalien", "blah", "available"))
111
provider = self.get_provider()
112
d = provider.shutdown_machine(OrchestraMachine("i-amalien"))
113
return self.assert_missing(d, ["i-amalien"])
115
def test_shutdown_machines_none(self):
117
provider = self.get_provider()
118
d = provider.shutdown_machines([])
119
d.addCallback(self.assertEquals, [])
122
def test_shutdown_machines_some_good(self):
124
self.mock_get_systems(
125
("i-amok", "ok", "acquired"),
126
("i-amalien", "alien", "available"),
127
("i-amoktoo", "oktoo", "acquired"))
128
self.mock_shutdown_release("i-amok", "ok")
129
self.mock_shutdown_release("i-amoktoo", "oktoo")
132
provider = self.get_provider()
133
d = provider.shutdown_machines([
134
OrchestraMachine("i-amok"),
135
OrchestraMachine("i-amoktoo")])
137
def verify(machines):
138
(ok, oktoo) = machines
139
self.assert_machine(ok, "i-amok", "ok")
140
self.assert_machine(oktoo, "i-amoktoo", "oktoo")
141
d.addCallback(verify)
144
def test_shutdown_machines_some_missing(self):
146
self.mock_get_systems(
147
("i-amok", "ok", "acquired"),
148
("i-amalien", "alien", "available"),
149
("i-amoktoo", "oktoo", "acquired"))
152
provider = self.get_provider()
153
d = provider.shutdown_machines([
154
OrchestraMachine("i-amok"),
155
OrchestraMachine("i-ammissing")])
156
return self.assert_missing(d, ["i-ammissing"])
158
def test_shutdown_machines_some_unowned(self):
160
self.mock_get_systems(
161
("i-amok", "ok", "acquired"),
162
("i-amalien", "alien", "available"),
163
("i-amoktoo", "oktoo", "acquired"))
166
provider = self.get_provider()
167
d = provider.shutdown_machines([
168
OrchestraMachine("i-amok"),
169
OrchestraMachine("i-amalien")])
170
return self.assert_missing(d, ["i-amalien"])
172
def test_destroy_environment(self):
174
self.mock_fs_put("http://somewhe.re/webdav/provider-state", "{}\n")
175
return self.check_shutdown_all("destroy_environment")
177
def test_destroy_environment_no_machines(self):
179
self.mock_fs_put("http://somewhe.re/webdav/provider-state", "{}\n")
180
self.mock_get_systems()
183
provider = self.get_provider()
184
d = provider.destroy_environment()
185
d.addCallback(self.assertEquals, [])
188
def test_destroy_environment_unwritable(self):
191
"http://somewhe.re/webdav/provider-state", "{}\n", 500)
192
return self.check_shutdown_all("destroy_environment")