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
1diff --git a/src/maasserver/api/machines.py b/src/maasserver/api/machines.py
2index 3f3a214..36ab7e8 100644
3--- a/src/maasserver/api/machines.py
4+++ b/src/maasserver/api/machines.py
5@@ -798,6 +798,10 @@ class MachineHandler(NodeHandler, OwnerDataMixin, PowerMixin):
6 and at the end of the drive to make data recovery inconvenient and
7 unlikely to happen by accident. This is not secure.
8
9+ @param (boolean) "force" [required=false] Will force the release of a
10+ machine. If the machine was deployed as a KVM host, this will be
11+ deleted as well as all machines inside the KVM host. USE WITH CAUTION.
12+
13 @success (http-status-code) "200" 200
14 @success (json) "success-json" A JSON object containing information
15 about the released machine.
16@@ -826,6 +830,8 @@ class MachineHandler(NodeHandler, OwnerDataMixin, PowerMixin):
17 request.POST, 'quick_erase', default=None, validator=StringBool)
18 machine = self.model.objects.get_node_or_404(
19 system_id=system_id, user=request.user, perm=NodePermission.edit)
20+ force = get_optional_param(
21+ request.POST, 'force', default=None, validator=StringBool)
22 if machine.status in (NODE_STATUS.RELEASING, NODE_STATUS.READY):
23 # Nothing to do if this machine is already releasing, otherwise
24 # this may be a redundant retry, and the
25@@ -835,7 +841,8 @@ class MachineHandler(NodeHandler, OwnerDataMixin, PowerMixin):
26 machine.release_or_erase(
27 request.user, comment,
28 erase=erase, secure_erase=secure_erase,
29- quick_erase=quick_erase)
30+ quick_erase=quick_erase,
31+ force=force)
32 else:
33 raise NodeStateViolation(
34 "Machine cannot be released in its current state ('%s')."
35diff --git a/src/maasserver/api/tests/test_machine.py b/src/maasserver/api/tests/test_machine.py
36index 2d9bc85..d4a218e 100644
37--- a/src/maasserver/api/tests/test_machine.py
38+++ b/src/maasserver/api/tests/test_machine.py
39@@ -1192,7 +1192,8 @@ class TestMachineAPI(APITestCase.ForUser):
40 machine_release,
41 MockCalledOnceWith(
42 self.user, comment,
43- erase=False, quick_erase=None, secure_erase=None))
44+ erase=False, quick_erase=None, secure_erase=None,
45+ force=None))
46
47 def test_POST_release_passes_erase_options(self):
48 machine = factory.make_Node(
49@@ -1214,7 +1215,28 @@ class TestMachineAPI(APITestCase.ForUser):
50 MockCalledOnceWith(
51 self.user, None,
52 erase=True, quick_erase=quick_erase,
53- secure_erase=secure_erase))
54+ secure_erase=secure_erase,
55+ force=None))
56+
57+ def test_POST_release_passes_force_option(self):
58+ machine = factory.make_Node(
59+ status=NODE_STATUS.ALLOCATED, owner=factory.make_User(),
60+ power_type='ipmi', power_state=POWER_STATE.OFF)
61+ self.become_admin()
62+ force = factory.pick_bool()
63+ machine_release = self.patch(node_module.Machine, 'release_or_erase')
64+ self.client.post(
65+ self.get_machine_uri(machine), {
66+ 'op': 'release',
67+ 'force': force,
68+ })
69+ self.assertThat(
70+ machine_release,
71+ MockCalledOnceWith(
72+ self.user, None,
73+ erase=False, quick_erase=None,
74+ secure_erase=None,
75+ force=force))
76
77 def test_POST_release_handles_missing_comment(self):
78 machine = factory.make_Node(
79@@ -1228,7 +1250,8 @@ class TestMachineAPI(APITestCase.ForUser):
80 machine_release,
81 MockCalledOnceWith(
82 self.user, None,
83- erase=False, quick_erase=None, secure_erase=None))
84+ erase=False, quick_erase=None, secure_erase=None,
85+ force=None))
86
87 def test_POST_commission_commissions_machine(self):
88 self.patch(

Subscribers

People subscribed via source and target branches