Merge ~ltrager/maas:lp1904398_2.8 into maas:2.8

Proposed by Lee Trager
Status: Merged
Approved by: Lee Trager
Approved revision: 21ab297d560c9cb8056c47fdda69bfcaffd36969
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~ltrager/maas:lp1904398_2.8
Merge into: maas:2.8
Diff against target: 148 lines (+59/-14)
4 files modified
src/maasserver/api/machines.py (+8/-2)
src/maasserver/api/tests/test_machines.py (+33/-0)
src/maasserver/forms/__init__.py (+13/-11)
src/maasserver/forms/tests/test_machinewithmacaddresses.py (+5/-1)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Lee Trager (community) Approve
Review via email: mp+394499@code.launchpad.net

Commit message

LP: #1904398 - Only set machines to commissioning in form when anonymous

Backport of 9f03422

To post a comment you must log in.
Revision history for this message
Lee Trager (ltrager) wrote :
review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b lp1904398_2.8 lp:~ltrager/maas/+git/maas into -b 2.8 lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 21ab297d560c9cb8056c47fdda69bfcaffd36969

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/api/machines.py b/src/maasserver/api/machines.py
2index 72281b4..9a18d34 100644
3--- a/src/maasserver/api/machines.py
4+++ b/src/maasserver/api/machines.py
5@@ -1923,7 +1923,8 @@ class MachinesHandler(NodesHandler, PowersMixin):
6 @param (boolean) "commission" [required=false,formatting=true] Request
7 the newly created machine to be created with status set to
8 COMMISSIONING. Machines will wait for COMMISSIONING results and not
9- time out.
10+ time out. Machines created by administrators will be commissioned
11+ unless set to false.
12
13 @param (int) "enable_ssh" [required=false] Whether to enable SSH for
14 the commissioning environment using the user's SSH key(s). '1' == True,
15@@ -1959,8 +1960,13 @@ class MachinesHandler(NodesHandler, PowersMixin):
16 @success-example "success-json" [exkey=machines-create]
17 placeholder text
18 """
19+ # Only admins are allowed to commission, store the value but remove it
20+ # from the form.
21+ commission = get_optional_param(
22+ request.data, "commission", default=True, validator=StringBool
23+ )
24 machine = create_machine(request)
25- if request.user.is_superuser:
26+ if request.user.is_superuser and commission:
27 form = CommissionForm(
28 instance=machine, user=request.user, data=request.data
29 )
30diff --git a/src/maasserver/api/tests/test_machines.py b/src/maasserver/api/tests/test_machines.py
31index 98c4485..070bb68 100644
32--- a/src/maasserver/api/tests/test_machines.py
33+++ b/src/maasserver/api/tests/test_machines.py
34@@ -334,6 +334,39 @@ class TestMachinesAPI(APITestCase.ForUser):
35 [script_result.name for script_result in script_set],
36 )
37
38+ def test_POST_commission_true(self):
39+ # Regression test for LP:1904398
40+ self.become_admin()
41+ self.patch(Machine, "_start").return_value = None
42+ make_usable_osystem(self)
43+ response = self.client.post(
44+ reverse("machines_handler"),
45+ {
46+ "architecture": make_usable_architecture(self),
47+ "mac_addresses": ["aa:bb:cc:dd:ee:ff"],
48+ "power_type": "manual",
49+ "commission": True,
50+ },
51+ )
52+ parsed_result = json.loads(response.content.decode())
53+ self.assertEquals(NODE_STATUS.COMMISSIONING, parsed_result["status"])
54+
55+ def test_POST_commission_false(self):
56+ # Regression test for LP:1904398
57+ self.become_admin()
58+ make_usable_osystem(self)
59+ response = self.client.post(
60+ reverse("machines_handler"),
61+ {
62+ "architecture": make_usable_architecture(self),
63+ "mac_addresses": ["aa:bb:cc:dd:ee:ff"],
64+ "power_type": "manual",
65+ "commission": False,
66+ },
67+ )
68+ parsed_result = json.loads(response.content.decode())
69+ self.assertEquals(NODE_STATUS.NEW, parsed_result["status"])
70+
71 def test_GET_lists_machines(self):
72 # The api allows for fetching the list of Machines.
73 machine1 = factory.make_Node()
74diff --git a/src/maasserver/forms/__init__.py b/src/maasserver/forms/__init__.py
75index 62e1ecd..40be585 100644
76--- a/src/maasserver/forms/__init__.py
77+++ b/src/maasserver/forms/__init__.py
78@@ -713,13 +713,8 @@ class MachineForm(NodeForm):
79 def __init__(self, request=None, requires_arch=False, *args, **kwargs):
80 super(MachineForm, self).__init__(*args, **kwargs)
81
82- # Even though it doesn't need it and doesn't use it, this form accepts
83- # a parameter named 'request' because it is used interchangingly
84- # with AdminMachineForm which actually uses this parameter.
85- request = kwargs.get("request")
86- if request is not None:
87- self.data = request.data
88 instance = kwargs.get("instance")
89+ self.request = request
90
91 self.set_up_architecture_field(requires_arch=requires_arch)
92 # We only want the license key field to render in the UI if the `OS`
93@@ -919,7 +914,16 @@ class MachineForm(NodeForm):
94
95 # LP:1807991 - If requested when creating a new Machine, set the status
96 # to COMMISSIONING when the object is created.
97- commission = not self.instance.id and self.cleaned_data["commission"]
98+ is_anonymous = (
99+ self.request
100+ and self.request.user
101+ and self.request.user.is_anonymous
102+ )
103+ commission = (
104+ is_anonymous
105+ and not self.instance.id
106+ and self.cleaned_data["commission"]
107+ )
108 if commission:
109 self.instance.status = NODE_STATUS.COMMISSIONING
110 machine = super(MachineForm, self).save(*args, **kwargs)
111@@ -1144,10 +1148,8 @@ class AdminMachineForm(MachineForm, AdminNodeForm, WithPowerTypeMixin):
112 "memory",
113 )
114
115- def __init__(self, data=None, instance=None, request=None, **kwargs):
116- super(AdminMachineForm, self).__init__(
117- data=data, instance=instance, **kwargs
118- )
119+ def __init__(self, data=None, instance=None, **kwargs):
120+ super().__init__(data=data, instance=instance, **kwargs)
121 WithPowerTypeMixin.set_up_power_fields(self, data, instance)
122
123 def clean(self):
124diff --git a/src/maasserver/forms/tests/test_machinewithmacaddresses.py b/src/maasserver/forms/tests/test_machinewithmacaddresses.py
125index 6e78321..6afcd94 100644
126--- a/src/maasserver/forms/tests/test_machinewithmacaddresses.py
127+++ b/src/maasserver/forms/tests/test_machinewithmacaddresses.py
128@@ -5,6 +5,8 @@
129
130 __all__ = []
131
132+from unittest.mock import MagicMock
133+
134 from django.http import QueryDict
135 from testtools.matchers import Contains
136
137@@ -218,8 +220,10 @@ class MachineWithMACAddressesFormTest(MAASServerTestCase):
138 self.assertEqual("192-168-12-10-extra", node.hostname)
139
140 def test_form_with_commissioning(self):
141+ request = MagicMock()
142+ request.user.is_anonymous = True
143 form = MachineWithMACAddressesForm(
144- data={"commission": True, **self.make_params()}
145+ request, data={"commission": True, **self.make_params()}
146 )
147 self.assertTrue(form.is_valid())
148 machine = form.save()

Subscribers

People subscribed via source and target branches