125
128
def raise_missing_profile(*args, **kwargs):
126
129
raise Fault(PSERV_FAULT.NO_SUCH_PROFILE, "Unknown profile.")
128
self.papi.add_node = raise_missing_profile
129
expectation = ExpectedException(
130
MissingProfileException, value_re='.*maas-import-isos.*')
131
self.papi.patch('add_node', raise_missing_profile)
132
with ExpectedException(MAASAPIException):
132
133
node = factory.make_node(architecture='amd32k')
133
134
provisioning.provision_post_save_Node(
134
135
sender=Node, instance=node, created=True)
136
137
def test_provision_post_save_Node_returns_other_pserv_faults(self):
137
error_text = factory.getRandomString()
139
139
def raise_fault(*args, **kwargs):
140
raise Fault(PSERV_FAULT.NO_COBBLER, error_text)
140
raise Fault(PSERV_FAULT.NO_COBBLER, factory.getRandomString())
142
self.papi.add_node = raise_fault
143
with ExpectedException(Fault, ".*%s.*" % error_text):
142
self.papi.patch('add_node', raise_fault)
143
with ExpectedException(MAASAPIException):
144
144
node = factory.make_node(architecture='amd32k')
145
145
provisioning.provision_post_save_Node(
146
146
sender=Node, instance=node, created=True)
236
243
parse_qs(metadata['maas-metadata-credentials']))
245
def test_papi_xmlrpc_faults_are_reported_helpfully(self):
247
def raise_fault(*args, **kwargs):
248
raise Fault(8002, factory.getRandomString())
250
self.papi.patch('add_node', raise_fault)
252
with ExpectedException(MAASAPIException, ".*provisioning server.*"):
253
self.papi.add_node('node', 'profile', 'power', {})
255
def test_provisioning_errors_are_reported_helpfully(self):
257
def raise_provisioning_error(*args, **kwargs):
258
raise Fault(PSERV_FAULT.NO_COBBLER, factory.getRandomString())
260
self.papi.patch('add_node', raise_provisioning_error)
262
with ExpectedException(MAASAPIException, ".*Cobbler.*"):
263
self.papi.add_node('node', 'profile', 'power', {})
265
def test_present_user_friendly_fault_describes_pserv_fault(self):
267
"provisioning server",
268
present_user_friendly_fault(Fault(8002, 'error')).message)
270
def test_present_user_friendly_fault_covers_all_pserv_faults(self):
271
all_pserv_faults = set(map_enum(PSERV_FAULT).values())
272
presentable_pserv_faults = set(PRESENTATIONS.keys())
273
self.assertItemsEqual([], all_pserv_faults - presentable_pserv_faults)
275
def test_present_user_friendly_fault_rerepresents_all_pserv_faults(self):
276
fault_string = factory.getRandomString()
277
for fault_code in map_enum(PSERV_FAULT).values():
278
original_fault = Fault(fault_code, fault_string)
279
new_fault = present_user_friendly_fault(original_fault)
280
self.assertNotEqual(fault_string, new_fault.message)
282
def test_present_user_friendly_fault_describes_cobbler_fault(self):
283
friendly_fault = present_user_friendly_fault(
284
Fault(PSERV_FAULT.NO_COBBLER, factory.getRandomString()))
285
friendly_text = friendly_fault.message
286
self.assertIn("unable to reach", friendly_text)
287
self.assertIn("Cobbler", friendly_text)
289
def test_present_user_friendly_fault_describes_cobbler_auth_fail(self):
290
friendly_fault = present_user_friendly_fault(
291
Fault(PSERV_FAULT.COBBLER_AUTH_FAILED, factory.getRandomString()))
292
friendly_text = friendly_fault.message
293
self.assertIn("failed to authenticate", friendly_text)
294
self.assertIn("Cobbler", friendly_text)
296
def test_present_user_friendly_fault_describes_cobbler_auth_error(self):
297
friendly_fault = present_user_friendly_fault(
298
Fault(PSERV_FAULT.COBBLER_AUTH_ERROR, factory.getRandomString()))
299
friendly_text = friendly_fault.message
300
self.assertIn("authentication token", friendly_text)
301
self.assertIn("Cobbler", friendly_text)
303
def test_present_user_friendly_fault_describes_missing_profile(self):
304
profile = factory.getRandomString()
305
friendly_fault = present_user_friendly_fault(
307
PSERV_FAULT.NO_SUCH_PROFILE,
308
"invalid profile name: %s" % profile))
309
friendly_text = friendly_fault.message
310
self.assertIn(profile, friendly_text)
311
self.assertIn("maas-import-isos", friendly_text)
313
def test_present_user_friendly_fault_describes_generic_cobbler_fail(self):
314
error_text = factory.getRandomString()
315
friendly_fault = present_user_friendly_fault(
316
Fault(PSERV_FAULT.GENERIC_COBBLER_ERROR, error_text))
317
friendly_text = friendly_fault.message
318
self.assertIn("Cobbler", friendly_text)
319
self.assertIn(error_text, friendly_text)
321
def test_present_user_friendly_fault_returns_None_for_other_fault(self):
322
self.assertIsNone(present_user_friendly_fault(Fault(9999, "!!!")))
239
325
class TestProvisioningWithFake(ProvisioningTests, TestCase):
240
326
"""Tests for the Provisioning API using a fake."""