Merge ~adam-collard/maas:rsd-ws-handler into maas:master

Proposed by Adam Collard
Status: Merged
Approved by: Adam Collard
Approved revision: 1e1fa647423dc3ba1ad08077c5196a00ee34cbfa
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~adam-collard/maas:rsd-ws-handler
Merge into: maas:master
Diff against target: 117 lines (+55/-3)
4 files modified
src/maasserver/models/bmc.py (+16/-2)
src/maasserver/models/tests/test_bmc.py (+22/-0)
src/maasserver/websockets/handlers/general.py (+12/-1)
src/maasserver/websockets/handlers/tests/test_general.py (+5/-0)
Reviewer Review Type Date Requested Status
Blake Rouse (community) Approve
Review via email: mp+370656@code.launchpad.net

Commit message

Add websocket handler for navigation_options

Front-end can quickly determine if any RSD hosts are present.

To post a comment you must log in.
Revision history for this message
Blake Rouse (blake-rouse) wrote :

Looks good to me!

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :
Revision history for this message
MAAS Lander (maas-lander) wrote :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/models/bmc.py b/src/maasserver/models/bmc.py
2index 711e756..dbbd1cc 100644
3--- a/src/maasserver/models/bmc.py
4+++ b/src/maasserver/models/bmc.py
5@@ -522,8 +522,8 @@ class PodManager(BaseBMCManager):
6
7 :param user: The user that should be used in the permission check.
8 :type user: User_
9- :param user: Type of access requested.
10- :type user: `PodPermission`
11+ :param perm: Type of access requested.
12+ :type perm: `PodPermission`
13
14 .. _User: https://
15 docs.djangoproject.com/en/dev/topics/auth/
16@@ -576,6 +576,20 @@ class PodManager(BaseBMCManager):
17 else:
18 raise PermissionDenied()
19
20+ def have_rsd(self, user, perm):
21+ """Are there any RSD hosts?
22+
23+ :param user: The user that should be used in the permission check.
24+ :type user: User_
25+ :param perm: Type of access requested.
26+ :type perm: `PodPermission`
27+
28+ .. _User: https://
29+ docs.djangoproject.com/en/dev/topics/auth/
30+ #django.contrib.auth.models.User
31+ """
32+ return self.get_pods(user, perm).filter(power_type='rsd').exists()
33+
34
35 class Pod(BMC):
36 """A `Pod` represents a `BMC` that controls multiple machines."""
37diff --git a/src/maasserver/models/tests/test_bmc.py b/src/maasserver/models/tests/test_bmc.py
38index 41ff534..c9e6c79 100644
39--- a/src/maasserver/models/tests/test_bmc.py
40+++ b/src/maasserver/models/tests/test_bmc.py
41@@ -713,6 +713,28 @@ class TestPodManager(MAASServerTestCase):
42 self.assertEqual(
43 pod, Pod.objects.get_pod_or_404(pod.id, user, PodPermission.view))
44
45+ def test_have_rsd_with_no_rsd(self):
46+ factory.make_Pod()
47+ user = factory.make_User()
48+ self.patch(user, 'has_perm').return_value = True
49+ self.assertFalse(
50+ Pod.objects.have_rsd(user, PodPermission.view))
51+
52+ def test_have_rsd_with_rsd(self):
53+ factory.make_Pod(pod_type='rsd')
54+ user = factory.make_User()
55+ self.patch(user, 'has_perm').return_value = True
56+ self.assertTrue(
57+ Pod.objects.have_rsd(user, PodPermission.view))
58+
59+ def test_have_rsd_with_forbidden_rsd(self):
60+ self.enable_rbac()
61+ factory.make_Pod(pod_type='rsd')
62+ user = factory.make_User()
63+ self.patch(user, 'has_perm').return_value = False
64+ self.assertFalse(
65+ Pod.objects.have_rsd(user, PodPermission.view))
66+
67
68 class TestPod(MAASServerTestCase):
69
70diff --git a/src/maasserver/websockets/handlers/general.py b/src/maasserver/websockets/handlers/general.py
71index b85960d..1a5bee7 100644
72--- a/src/maasserver/websockets/handlers/general.py
73+++ b/src/maasserver/websockets/handlers/general.py
74@@ -21,7 +21,10 @@ from maasserver.models.config import Config
75 from maasserver.models.node import Node
76 from maasserver.models.packagerepository import PackageRepository
77 from maasserver.node_action import ACTIONS_DICT
78-from maasserver.permissions import NodePermission
79+from maasserver.permissions import (
80+ NodePermission,
81+ PodPermission,
82+)
83 from maasserver.utils.osystems import (
84 list_all_usable_hwe_kernels,
85 list_all_usable_osystems,
86@@ -58,6 +61,7 @@ class GeneralHandler(Handler):
87 'version',
88 'power_types',
89 'release_options',
90+ 'navigation_options',
91 ]
92
93 def architectures(self, params):
94@@ -197,3 +201,10 @@ class GeneralHandler(Handler):
95 "quick_erase": Config.objects.get_config(
96 "disk_erase_with_quick_erase"),
97 }
98+
99+ def navigation_options(self, params):
100+ """Return the options for navigation."""
101+ from maasserver.models.bmc import Pod # circular import
102+ return {
103+ "rsd": Pod.objects.have_rsd(self.user, PodPermission.view)
104+ }
105diff --git a/src/maasserver/websockets/handlers/tests/test_general.py b/src/maasserver/websockets/handlers/tests/test_general.py
106index 2ee572e..e269890 100644
107--- a/src/maasserver/websockets/handlers/tests/test_general.py
108+++ b/src/maasserver/websockets/handlers/tests/test_general.py
109@@ -257,3 +257,8 @@ class TestGeneralHandler(MAASServerTestCase):
110 "secure_erase": secure_erase,
111 "quick_erase": quick_erase,
112 }, handler.release_options({}))
113+
114+ def test_navigation_options(self):
115+ handler = GeneralHandler(factory.make_User(), {}, None)
116+ self.assertEqual(
117+ {"rsd": False}, handler.navigation_options({}))

Subscribers

People subscribed via source and target branches