Merge ~andreserl/maas:lp1826600_force_release_master into maas:master

Proposed by Andres Rodriguez
Status: Merged
Approved by: Andres Rodriguez
Approved revision: 756cc0b8ca83a0a6cdcd2d7b859a1903b374caf1
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~andreserl/maas:lp1826600_force_release_master
Merge into: maas:master
Diff against target: 88 lines (+34/-4)
2 files modified
src/maasserver/api/machines.py (+8/-1)
src/maasserver/api/tests/test_machine.py (+26/-3)
Reviewer Review Type Date Requested Status
Newell Jensen (community) Approve
Review via email: mp+366597@code.launchpad.net

Commit message

LP: #1826600 - Correctly capture and pass the force param when releasing a machine

To post a comment you must log in.
Revision history for this message
Newell Jensen (newell-jensen) wrote :

+1

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :
Revision history for this message
MAAS Lander (maas-lander) wrote :
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
diff --git a/src/maasserver/api/machines.py b/src/maasserver/api/machines.py
index 3f3a214..36ab7e8 100644
--- a/src/maasserver/api/machines.py
+++ b/src/maasserver/api/machines.py
@@ -798,6 +798,10 @@ class MachineHandler(NodeHandler, OwnerDataMixin, PowerMixin):
798 and at the end of the drive to make data recovery inconvenient and798 and at the end of the drive to make data recovery inconvenient and
799 unlikely to happen by accident. This is not secure.799 unlikely to happen by accident. This is not secure.
800800
801 @param (boolean) "force" [required=false] Will force the release of a
802 machine. If the machine was deployed as a KVM host, this will be
803 deleted as well as all machines inside the KVM host. USE WITH CAUTION.
804
801 @success (http-status-code) "200" 200805 @success (http-status-code) "200" 200
802 @success (json) "success-json" A JSON object containing information806 @success (json) "success-json" A JSON object containing information
803 about the released machine.807 about the released machine.
@@ -826,6 +830,8 @@ class MachineHandler(NodeHandler, OwnerDataMixin, PowerMixin):
826 request.POST, 'quick_erase', default=None, validator=StringBool)830 request.POST, 'quick_erase', default=None, validator=StringBool)
827 machine = self.model.objects.get_node_or_404(831 machine = self.model.objects.get_node_or_404(
828 system_id=system_id, user=request.user, perm=NodePermission.edit)832 system_id=system_id, user=request.user, perm=NodePermission.edit)
833 force = get_optional_param(
834 request.POST, 'force', default=None, validator=StringBool)
829 if machine.status in (NODE_STATUS.RELEASING, NODE_STATUS.READY):835 if machine.status in (NODE_STATUS.RELEASING, NODE_STATUS.READY):
830 # Nothing to do if this machine is already releasing, otherwise836 # Nothing to do if this machine is already releasing, otherwise
831 # this may be a redundant retry, and the837 # this may be a redundant retry, and the
@@ -835,7 +841,8 @@ class MachineHandler(NodeHandler, OwnerDataMixin, PowerMixin):
835 machine.release_or_erase(841 machine.release_or_erase(
836 request.user, comment,842 request.user, comment,
837 erase=erase, secure_erase=secure_erase,843 erase=erase, secure_erase=secure_erase,
838 quick_erase=quick_erase)844 quick_erase=quick_erase,
845 force=force)
839 else:846 else:
840 raise NodeStateViolation(847 raise NodeStateViolation(
841 "Machine cannot be released in its current state ('%s')."848 "Machine cannot be released in its current state ('%s')."
diff --git a/src/maasserver/api/tests/test_machine.py b/src/maasserver/api/tests/test_machine.py
index 2d9bc85..d4a218e 100644
--- a/src/maasserver/api/tests/test_machine.py
+++ b/src/maasserver/api/tests/test_machine.py
@@ -1192,7 +1192,8 @@ class TestMachineAPI(APITestCase.ForUser):
1192 machine_release,1192 machine_release,
1193 MockCalledOnceWith(1193 MockCalledOnceWith(
1194 self.user, comment,1194 self.user, comment,
1195 erase=False, quick_erase=None, secure_erase=None))1195 erase=False, quick_erase=None, secure_erase=None,
1196 force=None))
11961197
1197 def test_POST_release_passes_erase_options(self):1198 def test_POST_release_passes_erase_options(self):
1198 machine = factory.make_Node(1199 machine = factory.make_Node(
@@ -1214,7 +1215,28 @@ class TestMachineAPI(APITestCase.ForUser):
1214 MockCalledOnceWith(1215 MockCalledOnceWith(
1215 self.user, None,1216 self.user, None,
1216 erase=True, quick_erase=quick_erase,1217 erase=True, quick_erase=quick_erase,
1217 secure_erase=secure_erase))1218 secure_erase=secure_erase,
1219 force=None))
1220
1221 def test_POST_release_passes_force_option(self):
1222 machine = factory.make_Node(
1223 status=NODE_STATUS.ALLOCATED, owner=factory.make_User(),
1224 power_type='ipmi', power_state=POWER_STATE.OFF)
1225 self.become_admin()
1226 force = factory.pick_bool()
1227 machine_release = self.patch(node_module.Machine, 'release_or_erase')
1228 self.client.post(
1229 self.get_machine_uri(machine), {
1230 'op': 'release',
1231 'force': force,
1232 })
1233 self.assertThat(
1234 machine_release,
1235 MockCalledOnceWith(
1236 self.user, None,
1237 erase=False, quick_erase=None,
1238 secure_erase=None,
1239 force=force))
12181240
1219 def test_POST_release_handles_missing_comment(self):1241 def test_POST_release_handles_missing_comment(self):
1220 machine = factory.make_Node(1242 machine = factory.make_Node(
@@ -1228,7 +1250,8 @@ class TestMachineAPI(APITestCase.ForUser):
1228 machine_release,1250 machine_release,
1229 MockCalledOnceWith(1251 MockCalledOnceWith(
1230 self.user, None,1252 self.user, None,
1231 erase=False, quick_erase=None, secure_erase=None))1253 erase=False, quick_erase=None, secure_erase=None,
1254 force=None))
12321255
1233 def test_POST_commission_commissions_machine(self):1256 def test_POST_commission_commissions_machine(self):
1234 self.patch(1257 self.patch(

Subscribers

People subscribed via source and target branches