~ubuntu-branches/ubuntu/utopic/maas/utopic-security

« back to all changes in this revision

Viewing changes to src/maasserver/views/tests/test_settings.py

  • Committer: Package Import Robot
  • Author(s): Andres Rodriguez, Jeroen Vermeulen, Andres Rodriguez, Jason Hobbs, Raphaël Badin, Louis Bouchard, Gavin Panella
  • Date: 2014-08-21 19:36:30 UTC
  • mfrom: (1.3.1)
  • Revision ID: package-import@ubuntu.com-20140821193630-kertpu5hd8yyss8h
Tags: 1.7.0~beta7+bzr3266-0ubuntu1
* New Upstream Snapshot, Beta 7 bzr3266

[ Jeroen Vermeulen ]
* debian/extras/99-maas-sudoers
  debian/maas-dhcp.postinst
  debian/rules
  - Add second DHCP server instance for IPv6.
* debian/maas-region-controller-min.install
  debian/maas-region-controller-min.lintian-overrides
  - Install deployment user-data: maas_configure_interfaces.py script.
* debian/maas-cluster-controller.links
  debian/maas-cluster-controller.install
  debian/maas-cluster-controller.postinst
  - Reflect Celery removal changes made in trunk r3067.
  - Don't install celeryconfig_cluster.py any longer. 
  - Don't install maas_local_celeryconfig_cluster.py any longer.
  - Don't symlink maas_local_celeryconfig_cluster.py from /etc to /usr.
  - Don't insert UUID into maas_local_celeryconfig_cluster.py.

[ Andres Rodriguez ]
* debian/maas-region-controller-min.postrm: Cleanup lefover files.
* debian/maas-dhcp.postrm: Clean leftover configs.
* Provide new maas-proxy package that replaces the usage of
  squid-deb-proxy:
  - debian/control: New maas-proxy package that replaces the usage
    of squid-deb-proxy; Drop depends on squid-deb-proxy.
  - Add upstrart job.
  - Ensure squid3 is stopped as maas-proxy uses a caching proxy.
* Remove Celery references to cluster controller:
  - Rename upstart job from maas-pserv to maas-cluster; rename
    maas-cluster-celery to maas-cluster-register. Ensure services
    are stopped on upgrade.
  - debian/maintscript: Cleanup config files.
  - Remove all references to the MAAS celery daemon and config
    files as we don't use it like that anymore
* Move some entries in debian/maintscript to
  debian/maas-cluster-controller.maintscript
* Remove usage of txlongpoll and rabbitmq-server. Handle upgrades
  to ensure these are removed correctly.

[ Jason Hobbs ]
* debian/maas-region-controller-min.install: Install
  maas-generate-winrm-cert script.

[ Raphaël Badin ]
* debian/extras/maas-region-admin: Bypass django-admin as it prints
  spurious messages to stdout (LP: #1365130).

[Louis Bouchard]
* debian/maas-cluster-controller.postinst:
  - Exclude /var/log/maas/rsyslog when changing ownership
    (LP: #1346703)

[Gavin Panella]
* debian/maas-cluster-controller.maas-clusterd.upstart:
  - Don't start-up the cluster controller unless a shared-secret has
    been installed.
* debian/maas-cluster-controller.maas-cluster-register.upstart: Drop.

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
from django.contrib.auth.models import User
21
21
from django.core.urlresolvers import reverse
22
22
from lxml.html import fromstring
 
23
from maasserver.clusterrpc.testing.osystems import (
 
24
    make_rpc_osystem,
 
25
    make_rpc_release,
 
26
    )
23
27
from maasserver.models import (
 
28
    BootSource,
24
29
    Config,
25
30
    UserProfile,
26
31
    )
27
 
from maasserver.models.config import DEFAULT_OS
28
32
from maasserver.testing import (
29
33
    extract_redirect,
30
34
    get_prefixed_form_data,
31
35
    )
32
36
from maasserver.testing.factory import factory
33
37
from maasserver.testing.orm import reload_object
34
 
from maasserver.testing.osystems import make_usable_osystem
 
38
from maasserver.testing.osystems import (
 
39
    make_usable_osystem,
 
40
    patch_usable_osystems,
 
41
    )
35
42
from maasserver.testing.testcase import MAASServerTestCase
 
43
from maasserver.views import settings as settings_view
36
44
 
37
45
 
38
46
class SettingsTest(MAASServerTestCase):
42
50
        # delete or edit each user. Note that the link to delete the the
43
51
        # logged-in user is not display.
44
52
        self.client_log_in(as_admin=True)
45
 
        [factory.make_user() for i in range(3)]
 
53
        [factory.make_User() for _ in range(3)]
46
54
        users = UserProfile.objects.all_users()
47
55
        response = self.client.get(reverse('settings'))
48
56
        doc = fromstring(response.content)
109
117
 
110
118
    def test_settings_commissioning_POST(self):
111
119
        self.client_log_in(as_admin=True)
 
120
        release = make_rpc_release(can_commission=True)
 
121
        osystem = make_rpc_osystem('ubuntu', releases=[release])
 
122
        patch_usable_osystems(self, [osystem])
 
123
 
112
124
        new_check_compatibility = factory.pick_bool()
113
 
        new_commissioning = factory.pick_commissioning_release(DEFAULT_OS)
 
125
        new_commissioning = release['name']
114
126
        response = self.client.post(
115
127
            reverse('settings'),
116
128
            get_prefixed_form_data(
132
144
                Config.objects.get_config('commissioning_distro_series'),
133
145
            ))
134
146
 
 
147
    def test_settings_hides_license_keys_if_no_OS_supporting_keys(self):
 
148
        self.client_log_in(as_admin=True)
 
149
        response = self.client.get(reverse('settings'))
 
150
        doc = fromstring(response.content)
 
151
        license_keys = doc.cssselect('#license_keys')
 
152
        self.assertEqual(
 
153
            0, len(license_keys), "Didn't hide the license key section.")
 
154
 
 
155
    def test_settings_shows_license_keys_if_OS_supporting_keys(self):
 
156
        self.client_log_in(as_admin=True)
 
157
        release = make_rpc_release(requires_license_key=True)
 
158
        osystem = make_rpc_osystem(releases=[release])
 
159
        self.patch(
 
160
            settings_view,
 
161
            'gen_all_known_operating_systems').return_value = [osystem]
 
162
        response = self.client.get(reverse('settings'))
 
163
        doc = fromstring(response.content)
 
164
        license_keys = doc.cssselect('#license_keys')
 
165
        self.assertEqual(
 
166
            1, len(license_keys), "Didn't show the license key section.")
 
167
 
135
168
    def test_settings_third_party_drivers_POST(self):
136
169
        self.client_log_in(as_admin=True)
137
170
        new_enable_third_party_drivers = factory.pick_bool()
153
186
                Config.objects.get_config('enable_third_party_drivers'),
154
187
            ))
155
188
 
 
189
    def test_settings_disk_erasing_on_release_POST(self):
 
190
        self.client_log_in(as_admin=True)
 
191
        new_enable_disk_erasing_on_release = factory.pick_bool()
 
192
        response = self.client.post(
 
193
            reverse('settings'),
 
194
            get_prefixed_form_data(
 
195
                prefix='disk_erasing_on_release',
 
196
                data={
 
197
                    'enable_disk_erasing_on_release': (
 
198
                        new_enable_disk_erasing_on_release),
 
199
                }))
 
200
 
 
201
        self.assertEqual(httplib.FOUND, response.status_code)
 
202
        self.assertEqual(
 
203
            (
 
204
                new_enable_disk_erasing_on_release,
 
205
            ),
 
206
            (
 
207
                Config.objects.get_config('enable_disk_erasing_on_release'),
 
208
            ))
 
209
 
156
210
    def test_settings_deploy_POST(self):
157
211
        self.client_log_in(as_admin=True)
158
212
        osystem = make_usable_osystem(self)
159
 
        osystem_name = osystem.name
160
 
        release_name = factory.pick_release(osystem)
 
213
        osystem_name = osystem['name']
 
214
        release_name = osystem['default_release']
161
215
        response = self.client.post(
162
216
            reverse('settings'),
163
217
            get_prefixed_form_data(
221
275
            new_kernel_opts,
222
276
            Config.objects.get_config('kernel_opts'))
223
277
 
 
278
    def test_settings_boot_source_is_shown(self):
 
279
        self.client_log_in(as_admin=True)
 
280
        response = self.client.get(reverse('settings'))
 
281
        doc = fromstring(response.content)
 
282
        boot_source = doc.cssselect('#boot_source')
 
283
        self.assertEqual(
 
284
            1, len(boot_source), "Didn't show boot image settings section.")
 
285
 
 
286
    def test_settings_boot_source_is_not_shown(self):
 
287
        self.client_log_in(as_admin=True)
 
288
        for _ in range(2):
 
289
            factory.make_BootSource()
 
290
        response = self.client.get(reverse('settings'))
 
291
        doc = fromstring(response.content)
 
292
        boot_source = doc.cssselect('#boot_source')
 
293
        self.assertEqual(
 
294
            0, len(boot_source), "Didn't hide boot image settings section.")
 
295
 
 
296
    def test_settings_boot_source_POST_creates_new_source(self):
 
297
        self.client_log_in(as_admin=True)
 
298
        url = "http://test.example.com/archive"
 
299
        keyring = "/usr/local/testing/path.gpg"
 
300
        response = self.client.post(
 
301
            reverse('settings'),
 
302
            get_prefixed_form_data(
 
303
                prefix='boot_source',
 
304
                data={
 
305
                    'boot_source_url': url,
 
306
                    'boot_source_keyring': keyring,
 
307
                }))
 
308
 
 
309
        self.assertEqual(httplib.FOUND, response.status_code, response.content)
 
310
 
 
311
        boot_source = BootSource.objects.first()
 
312
        self.assertIsNotNone(boot_source)
 
313
        self.assertEqual(
 
314
            (url, keyring),
 
315
            (boot_source.url, boot_source.keyring_filename))
 
316
 
 
317
    def test_settings_boot_source_POST_updates_source(self):
 
318
        self.client_log_in(as_admin=True)
 
319
        boot_source = factory.make_BootSource()
 
320
        url = "http://test.example.com/archive"
 
321
        keyring = "/usr/local/testing/path.gpg"
 
322
        response = self.client.post(
 
323
            reverse('settings'),
 
324
            get_prefixed_form_data(
 
325
                prefix='boot_source',
 
326
                data={
 
327
                    'boot_source_url': url,
 
328
                    'boot_source_keyring': keyring,
 
329
                }))
 
330
 
 
331
        self.assertEqual(httplib.FOUND, response.status_code, response.content)
 
332
        boot_source = reload_object(boot_source)
 
333
        self.assertEqual(
 
334
            (url, keyring),
 
335
            (boot_source.url, boot_source.keyring_filename))
 
336
 
224
337
 
225
338
class NonAdminSettingsTest(MAASServerTestCase):
226
339
 
289
402
 
290
403
    def test_edit_user_POST_profile_updates_attributes(self):
291
404
        self.client_log_in(as_admin=True)
292
 
        user = factory.make_user()
 
405
        user = factory.make_User()
293
406
        params = make_user_attribute_params(user)
294
407
        params.update({
295
408
            'last_name': factory.make_name('Newname'),
308
421
 
309
422
    def test_edit_user_POST_updates_password(self):
310
423
        self.client_log_in(as_admin=True)
311
 
        user = factory.make_user()
 
424
        user = factory.make_User()
312
425
        new_password = factory.make_string()
313
426
        params = make_password_params(new_password)
314
427
        response = self.client.post(
320
433
    def test_delete_user_GET(self):
321
434
        # The user delete page displays a confirmation page with a form.
322
435
        self.client_log_in(as_admin=True)
323
 
        user = factory.make_user()
 
436
        user = factory.make_User()
324
437
        del_link = reverse('accounts-del', args=[user.username])
325
438
        response = self.client.get(del_link)
326
439
        doc = fromstring(response.content)
339
452
    def test_delete_user_POST(self):
340
453
        # A POST request to the user delete finally deletes the user.
341
454
        self.client_log_in(as_admin=True)
342
 
        user = factory.make_user()
 
455
        user = factory.make_User()
343
456
        user_id = user.id
344
457
        del_link = reverse('accounts-del', args=[user.username])
345
458
        response = self.client.post(del_link, {'post': 'yes'})
349
462
    def test_view_user(self):
350
463
        # The user page feature the basic information about the user.
351
464
        self.client_log_in(as_admin=True)
352
 
        user = factory.make_user()
 
465
        user = factory.make_User()
353
466
        del_link = reverse('accounts-view', args=[user.username])
354
467
        response = self.client.get(del_link)
355
468
        doc = fromstring(response.content)
360
473
    def test_account_views_are_routable_for_full_range_of_usernames(self):
361
474
        # Usernames can include characters in the regex [\w.@+-].
362
475
        self.client_log_in(as_admin=True)
363
 
        user = factory.make_user(username="abc-123@example.com")
 
476
        user = factory.make_User(username="abc-123@example.com")
364
477
        for view in "edit", "view", "del":
365
478
            path = reverse("accounts-%s" % view, args=[user.username])
366
479
            self.assertIsInstance(path, (bytes, unicode))