~ubuntu-branches/ubuntu/precise/maas/precise-security

« back to all changes in this revision

Viewing changes to src/maasserver/tests/test_provisioning.py

  • Committer: Package Import Robot
  • Author(s): Andres Rodriguez, Dave Walker (Daviey), Andres Rodriguez
  • Date: 2012-03-27 14:49:56 UTC
  • mfrom: (1.1.7)
  • Revision ID: package-import@ubuntu.com-20120327144956-zezstgry6t61438x
Tags: 0.1+bzr363+dfsg-0ubuntu1
[ Dave Walker (Daviey) ]
* debian/control: Add openssh-server as a Recommends, and wrap-and-sort. 

[ Andres Rodriguez ]
* debian/maas.postinst:
  - Do not start apache with apache2ctl. Use invoke-rc.d instead to not
    fail in the installer.
  - For start of postgresql before creating the DB, otherwise it will
    fail in the installer.
  - Add check of invoke-rc.d for syslog.
  - Add check of invoke-rc.d for rabbitmq-server; Add check for rabbitmqctl
  - Add db_stop, in case invoke-rc.d fails.
* debian/control: Tight python-django-maas dependency.
* debian/postrm: Add check for rabbitmqctl.
* debian/maas.maas-txlongpoll.upstart: Create rabbitmq longpoll user/vhost
  and set permissions if they don't exist. Start on rabbitmq-server-running.

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
from urlparse import parse_qs
15
15
from xmlrpclib import Fault
16
16
 
 
17
from django.conf import settings
17
18
from maasserver import provisioning
18
 
from maasserver.exceptions import MissingProfileException
 
19
from maasserver.exceptions import MAASAPIException
19
20
from maasserver.models import (
20
21
    ARCHITECTURE,
21
22
    Config,
27
28
    compose_metadata,
28
29
    get_metadata_server_url,
29
30
    name_arch_in_cobbler_style,
 
31
    present_user_friendly_fault,
 
32
    PRESENTATIONS,
30
33
    select_profile_for_node,
31
34
    )
32
35
from maasserver.testing.enum import map_enum
125
128
        def raise_missing_profile(*args, **kwargs):
126
129
            raise Fault(PSERV_FAULT.NO_SUCH_PROFILE, "Unknown profile.")
127
130
 
128
 
        self.papi.add_node = raise_missing_profile
129
 
        expectation = ExpectedException(
130
 
            MissingProfileException, value_re='.*maas-import-isos.*')
131
 
        with expectation:
 
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)
135
136
 
136
137
    def test_provision_post_save_Node_returns_other_pserv_faults(self):
137
 
        error_text = factory.getRandomString()
138
138
 
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())
141
141
 
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)
218
218
            % Config.objects.get_config('maas_url').rstrip('/'),
219
219
            get_metadata_server_url())
220
220
 
 
221
    def test_metadata_server_url_includes_script_name(self):
 
222
        self.patch(settings, "FORCE_SCRIPT_NAME", "/MAAS")
 
223
        self.assertEqual(
 
224
            "%s/MAAS/metadata/"
 
225
            % Config.objects.get_config('maas_url').rstrip('/'),
 
226
            get_metadata_server_url())
 
227
 
221
228
    def test_compose_metadata_includes_metadata_url(self):
222
229
        node = factory.make_node()
223
230
        self.assertEqual(
235
242
            },
236
243
            parse_qs(metadata['maas-metadata-credentials']))
237
244
 
 
245
    def test_papi_xmlrpc_faults_are_reported_helpfully(self):
 
246
 
 
247
        def raise_fault(*args, **kwargs):
 
248
            raise Fault(8002, factory.getRandomString())
 
249
 
 
250
        self.papi.patch('add_node', raise_fault)
 
251
 
 
252
        with ExpectedException(MAASAPIException, ".*provisioning server.*"):
 
253
            self.papi.add_node('node', 'profile', 'power', {})
 
254
 
 
255
    def test_provisioning_errors_are_reported_helpfully(self):
 
256
 
 
257
        def raise_provisioning_error(*args, **kwargs):
 
258
            raise Fault(PSERV_FAULT.NO_COBBLER, factory.getRandomString())
 
259
 
 
260
        self.papi.patch('add_node', raise_provisioning_error)
 
261
 
 
262
        with ExpectedException(MAASAPIException, ".*Cobbler.*"):
 
263
            self.papi.add_node('node', 'profile', 'power', {})
 
264
 
 
265
    def test_present_user_friendly_fault_describes_pserv_fault(self):
 
266
        self.assertIn(
 
267
            "provisioning server",
 
268
            present_user_friendly_fault(Fault(8002, 'error')).message)
 
269
 
 
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)
 
274
 
 
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)
 
281
 
 
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)
 
288
 
 
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)
 
295
 
 
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)
 
302
 
 
303
    def test_present_user_friendly_fault_describes_missing_profile(self):
 
304
        profile = factory.getRandomString()
 
305
        friendly_fault = present_user_friendly_fault(
 
306
            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)
 
312
 
 
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)
 
320
 
 
321
    def test_present_user_friendly_fault_returns_None_for_other_fault(self):
 
322
        self.assertIsNone(present_user_friendly_fault(Fault(9999, "!!!")))
 
323
 
238
324
 
239
325
class TestProvisioningWithFake(ProvisioningTests, TestCase):
240
326
    """Tests for the Provisioning API using a fake."""