8
from unittest import TestCase
14
SAMPLE_YAML_OUTPUT = """environment: bogusec2
18
agent-version: 1.25-alpha1
20
instance-id: i-c0dadd10
21
instance-state: running
23
hardware: arch=amd64 cpu-cores=1 cpu-power=100 mem=1740M """ \
24
"""root-disk=8192M availability-zone=us-east-1c
25
state-server-member-status: has-vote
28
agent-version: 1.25-alpha1
29
dns-name: 54.162.95.230
30
instance-id: i-39280ac6
31
instance-state: running
33
hardware: arch=amd64 cpu-cores=1 cpu-power=100 mem=1740M """\
34
"""root-disk=8192M availability-zone=us-east-1d
37
charm: local:trusty/statusstresser-1
41
message: called in config-changed hook
42
since: 12 Jun 2015 13:15:25-03:00
47
message: called in config-changed hook
48
since: 12 Jun 2015 13:15:25-03:00
51
since: 12 Jun 2015 14:33:08-03:00
54
agent-version: 1.25-alpha1
56
public-address: 54.162.95.230
58
# This could be replaced by a json.dumps({}) but the text is kept to
59
# make this test about status output as accurate as possible.
60
SAMPLE_JSON_OUTPUT = \
61
"""{"environment":"perritoec2","machines":{"0":{"agent-state":"""\
62
""""started","agent-version":"1.25-alpha1","dns-name":"54.82.51.4","""\
63
""""instance-id":"i-c0dadd10","instance-state":"running","""\
64
""""series":"trusty","hardware":"arch=amd64 cpu-cores=1 cpu-power=100 """\
65
"""mem=1740M root-disk=8192M availability-zone=us-east-1c","""\
66
""""state-server-member-status":"has-vote"},"1":{"agent-state":"""\
67
""""started","agent-version":"1.25-alpha1","dns-name":"54.162.95.230","""\
68
""""instance-id":"i-a7a2b377","instance-state":"running","""\
69
""""series":"trusty","hardware":"arch=amd64 cpu-cores=1 cpu-power=300 """\
70
"""mem=3840M root-disk=8192M availability-zone=us-east-1c"}},"""\
71
""""services":{"statusstresser":{"charm": """\
72
""""local:trusty/statusstresser-1","exposed":false,"service-status":"""\
73
"""{"current":"active","message":"called in config-changed hook","""\
74
""""since":"15 Jun 2015 20:56:29-03:00"},"""\
75
""""units":{"statusstresser/0":{"workload-status":"""\
76
"""{"current":"active","message":"called in config-changed hook","""\
77
""""since":"15 Jun 2015 20:56:29-03:00"},"agent-status":"""\
78
"""{"current":"idle","since":"15 Jun 2015 20:56:41-03:00","""\
79
""""version":"1.25-alpha1"},"agent-state":"started","agent-version":"""\
80
""""1.25-alpha1","machine":"1","public-address":"54.162.95.230"}}}}}"""
82
SAMPLE_TABULAR_OUTPUT = """[Services]
83
NAME STATUS EXPOSED CHARM
84
statusstresser active false local:trusty/statusstresser-1
87
ID WORKLOAD-STATE AGENT-STATE VERSION MACHINE PORTS """\
88
"""PUBLIC-ADDRESS MESSAGE
89
statusstresser/0 active idle 1.25-alpha1 1 """\
90
"""54.162.95.230 called in config-changed hook
93
ID STATE VERSION DNS INS-ID SERIES HARDWARE
94
0 started 1.25-alpha1 54.82.51.4 i-c0dadd10 trusty arch=amd64 """\
95
"""cpu-cores=1 cpu-power=100 mem=1740M root-disk=8192M """\
96
"""availability-zone=us-east-1c
97
1 started 1.25-alpha1 54.162.95.230 i-39280ac6 trusty arch=amd64 """\
98
"""cpu-cores=1 cpu-power=100 mem=1740M root-disk=8192M """\
99
"""availability-zone=us-east-1d"""
102
class ReducedTestStatus:
104
def test_assert_machine_ids(self):
105
self.parser.assert_machines_ids(["0", "1"])
107
def test_assert_machine_ids_failed(self):
108
with self.assertRaises(AssertionError):
109
self.parser.assert_machines_ids(["0", "1", "2"])
111
def test_assert_machine_len(self):
112
self.parser.assert_machines_len(2)
114
def test_assert_machine_len_failed(self):
115
with self.assertRaises(AssertionError):
116
self.parser.assert_machines_len(3)
118
def test_machine_agent_state_valid(self):
119
self.parser.assert_machine_agent_state("0", "started")
121
def test_machine_agent_state_failed(self):
122
with self.assertRaises(AssertionError):
123
self.parser.assert_machine_agent_state("0", "stopped")
125
def test_machine_agent_state_error(self):
126
with self.assertRaises(AssertionError):
127
self.parser.assert_machine_agent_state("3", "stopped")
129
def test_assert_machine_agent_version(self):
130
self.parser.assert_machine_agent_version("0", "1.25-alpha1")
132
def test_assert_machine_agent_version_failed(self):
133
with self.assertRaises(AssertionError):
134
self.parser.assert_machine_agent_version("0", "1.25-alpha2")
136
def test_assert_machine_agent_version_error(self):
137
with self.assertRaises(AssertionError):
138
self.parser.assert_machine_agent_version("5", "1.25-alpha1")
140
def test_assert_machine_dns_name(self):
141
self.parser.assert_machine_dns_name("0", "54.82.51.4")
143
def test_assert_machine_dns_name_failed(self):
144
with self.assertRaises(AssertionError):
145
self.parser.assert_machine_dns_name("0", "54.82.51.5")
147
def test_assert_machine_dns_name_error(self):
148
with self.assertRaises(AssertionError):
149
self.parser.assert_machine_dns_name("3", "54.82.51.4")
151
def test_assert_machine_instance_id(self):
152
self.parser.assert_machine_instance_id("0", "i-c0dadd10")
154
def test_assert_machine_instance_id_failed(self):
155
with self.assertRaises(AssertionError):
156
self.parser.assert_machine_instance_id("0", "i-c0dadd11")
158
def test_assert_machine_instance_id_error(self):
159
with self.assertRaises(AssertionError):
160
self.parser.assert_machine_instance_id("3", "i-c0dadd10")
162
def test_assert_machine_series(self):
163
self.parser.assert_machine_series("0", "trusty")
165
def test_assert_machine_series_failed(self):
166
with self.assertRaises(AssertionError):
167
self.parser.assert_machine_series("0", "utopic")
169
def test_assert_machine_series_error(self):
170
with self.assertRaises(AssertionError):
171
self.parser.assert_machine_series("3", "trusty")
173
def test_assert_machine_hardware(self):
174
self.parser.assert_machine_hardware("0", "arch=amd64 cpu-cores=1 "
175
"cpu-power=100 mem=1740M "
180
def test_assert_machine_hardware_failed(self):
181
with self.assertRaises(AssertionError):
182
self.parser.assert_machine_hardware("0", "arch=arm cpu-cores=1 "
183
"cpu-power=100 mem=1740M "
188
def test_assert_machine_hardware_error(self):
189
with self.assertRaises(AssertionError):
190
self.parser.assert_machine_hardware("3", "arch=amd64 cpu-cores=1 "
191
"cpu-power=100 mem=1740M "
196
def test_assert_service_charm(self):
197
self.parser.assert_service_charm("statusstresser",
198
"local:trusty/statusstresser-1")
200
def test_assert_service_charm_failed(self):
201
with self.assertRaises(AssertionError):
202
self.parser.assert_service_charm("statusstresser",
203
"local:trusty/statusstresser-2")
205
def test_assert_service_charm_error(self):
206
with self.assertRaises(AssertionError):
207
self.parser.assert_service_charm("statusrelaxer",
208
"local:trusty/statusstresser-1")
210
def test_assert_service_exposed(self):
211
self.parser.assert_service_exposed("statusstresser", False)
213
def test_assert_service_exposed_failed(self):
214
with self.assertRaises(AssertionError):
215
self.parser.assert_service_exposed("statusstresser", True)
217
def test_assert_service_exposed_error(self):
218
with self.assertRaises(AssertionError):
219
self.parser.assert_service_exposed("statusrelaxer", False)
221
def test_assert_unit_public_address(self):
222
self.parser.assert_unit_public_address("statusstresser/0",
225
def test_assert_unit_public_address_failed(self):
226
with self.assertRaises(AssertionError):
227
self.parser.assert_unit_public_address("statusstresser/0",
230
def test_assert_unit_public_address_error(self):
231
with self.assertRaises(AssertionError):
232
self.parser.assert_unit_public_address("statusrelaxer/0",
236
class BaseTestStatus(ReducedTestStatus):
238
def test_assert_machine_member_status(self):
239
self.parser.assert_machine_member_status("0", "has-vote")
241
def test_assert_machine_member_status_failed(self):
242
with self.assertRaises(AssertionError):
243
self.parser.assert_machine_member_status("0", "not-voting")
245
def test_assert_machine_member_status_error(self):
246
with self.assertRaises(AssertionError):
247
self.parser.assert_machine_member_status("3", "has-vote")
249
def test_assert_service_service_status(self):
250
self.parser.assert_service_service_status("statusstresser",
251
{"current": "active",
252
"message": "called in "
253
"config-changed hook"})
255
def test_assert_service_service_status_failed(self):
256
with self.assertRaises(AssertionError):
257
self.parser.assert_service_service_status("statusstresser",
258
{"current": "active",
259
"message": "another "
262
def test_assert_service_service_status_error(self):
263
with self.assertRaises(AssertionError):
264
self.parser.assert_service_service_status("statusrelaxer",
265
{"current": "active",
266
"message": "called in "
267
"config-changed hook"})
269
def test_assert_unit_workload_status(self):
270
self.parser.assert_unit_workload_status("statusstresser/0",
271
{"current": "active",
272
"message": "called in "
273
"config-changed hook"})
275
def test_assert_unit_workload_status_failed(self):
276
with self.assertRaises(AssertionError):
277
self.parser.assert_unit_workload_status("statusstresser/0",
278
{"current": "active",
279
"message": "another "
282
def test_assert_unit_workload_status_error(self):
283
with self.assertRaises(AssertionError):
284
self.parser.assert_unit_workload_status("statusrelaxer/0",
285
{"current": "active",
286
"message": "called in "
287
"config-changed hook"})
289
def test_assert_unit_agent_status(self):
290
self.parser.assert_unit_agent_status("statusstresser/0",
294
def test_assert_unit_agent_status_failed(self):
295
with self.assertRaises(AssertionError):
296
self.parser.assert_unit_agent_status("statusstresser/0",
298
"message": "an unexpected "
301
def test_assert_unit_agent_status_error(self):
302
with self.assertRaises(AssertionError):
303
self.parser.assert_unit_agent_status("statusrelaxer/0",
307
def test_assert_unit_agent_state(self):
308
self.parser.assert_unit_agent_state("statusstresser/0", "started")
310
def test_assert_unit_agent_state_failed(self):
311
with self.assertRaises(AssertionError):
312
self.parser.assert_unit_agent_state("statusstresser/0", "stopped")
314
def test_assert_unit_agent_state_error(self):
315
with self.assertRaises(AssertionError):
316
self.parser.assert_unit_agent_state("statusrelaxer/0", "started")
318
def test_assert_unit_agent_version(self):
319
self.parser.assert_unit_agent_version("statusstresser/0",
322
def test_assert_unit_agent_version_failed(self):
323
with self.assertRaises(AssertionError):
324
self.parser.assert_unit_agent_version("statusstresser/0",
327
def test_assert_unit_agent_version_error(self):
328
with self.assertRaises(AssertionError):
329
self.parser.assert_unit_agent_version("statusrelaxer/0",
332
def test_assert_unit_machine(self):
333
self.parser.assert_unit_machine("statusstresser/0", "1")
335
def test_assert_unit_machine_failed(self):
336
with self.assertRaises(AssertionError):
337
self.parser.assert_unit_machine("statusstresser/0", "2")
339
def test_assert_unit_machine_error(self):
340
with self.assertRaises(AssertionError):
341
self.parser.assert_unit_machine("statusrelaxer/0", "1")
344
class TestStatusForYaml(TestCase, BaseTestStatus):
346
def test_empty_yaml_fails(self):
347
with self.assertRaises(ErrNoStatus):
348
StatusYamlParser(yaml="")
351
self.parser = StatusYamlParser(yaml=SAMPLE_YAML_OUTPUT)
354
class TestStatusForJson(TestCase, BaseTestStatus):
356
def test_empty_json_fails(self):
357
with self.assertRaises(ErrNoStatus):
358
StatusJsonParser(json_text="")
361
self.parser = StatusJsonParser(json_text=SAMPLE_JSON_OUTPUT)
364
class TestStatusTabular(TestCase, ReducedTestStatus):
366
def test_empty_tabular_fails(self):
367
with self.assertRaises(ErrNoStatus):
368
StatusTabularParser("")
371
self.parser = StatusTabularParser(tabular_text=SAMPLE_TABULAR_OUTPUT)
373
def test_assert_service_service_status(self):
374
self.parser.assert_service_service_status("statusstresser",
375
{"current": "active",
378
def test_assert_service_service_status_failed(self):
379
with self.assertRaises(AssertionError):
380
self.parser.assert_service_service_status("statusstresser",
381
{"current": "active",
382
"message": "another "
385
def test_assert_service_service_status_error(self):
386
with self.assertRaises(AssertionError):
387
self.parser.assert_service_service_status("statusrelaxer",
388
{"current": "active",
389
"message": "called in "
390
"config-changed hook"})
392
def test_assert_unit_workload_status(self):
393
self.parser.assert_unit_workload_status("statusstresser/0",
394
{"current": "active",
395
"message": "called in "
396
"config-changed hook"})
398
def test_assert_unit_workload_status_failed(self):
399
with self.assertRaises(AssertionError):
400
self.parser.assert_unit_workload_status("statusstresser/0",
401
{"current": "active",
402
"message": "another "
405
def test_assert_unit_workload_status_error(self):
406
with self.assertRaises(AssertionError):
407
self.parser.assert_unit_workload_status("statusrelaxer/0",
408
{"current": "active",
409
"message": "called in "
410
"config-changed hook"})
412
def test_assert_unit_agent_status(self):
413
self.parser.assert_unit_agent_status("statusstresser/0",
417
def test_assert_unit_agent_status_failed(self):
418
with self.assertRaises(AssertionError):
419
self.parser.assert_unit_agent_status("statusstresser/0",
421
"message": "an unexpected "
424
def test_assert_unit_agent_status_error(self):
425
with self.assertRaises(AssertionError):
426
self.parser.assert_unit_agent_status("statusrelaxer/0",