Merge lp:~gmb/maas/test-poweroff-problem into lp:~maas-committers/maas/trunk

Proposed by Graham Binns
Status: Merged
Approved by: Graham Binns
Approved revision: no longer in the source branch.
Merged at revision: 2651
Proposed branch: lp:~gmb/maas/test-poweroff-problem
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 92 lines (+36/-2)
4 files modified
src/maasserver/api.py (+6/-1)
src/maasserver/models/node.py (+7/-1)
src/maasserver/models/tests/test_node.py (+10/-0)
src/maasserver/tests/test_api_node.py (+13/-0)
To merge this branch: bzr merge lp:~gmb/maas/test-poweroff-problem
Reviewer Review Type Date Requested Status
Julian Edwards (community) Approve
Review via email: mp+229282@code.launchpad.net

Commit message

Make the API's release() method allow users to call release() on a node that's marked broken. Also, make sure that Node.release() won't move a BROKEN node back to READY.

To post a comment you must log in.
Revision history for this message
Julian Edwards (julian-edwards) wrote :

On Friday 01 Aug 2014 20:23:23 you wrote:
> === modified file 'Makefile'
> --- Makefile 2014-06-10 14:45:14 +0000
> +++ Makefile 2014-08-01 20:23:08 +0000
> @@ -344,7 +344,7 @@
> # has a bug and always considers apt-source tarballs before the specified
> # branch. So instead, export to a local tarball which is always found.
> # Make sure debhelper and dh-apport packages are installed before using
> this. -PACKAGING := $(CURDIR)/../packaging.trunk
> +PACKAGING := $(CURDIR)/../packaging
> PACKAGING_BRANCH := lp:~maas-maintainers/maas/packaging

You know how I said that you needed to revert that "temporary" change ... ;)

Revision history for this message
Graham Binns (gmb) wrote :

On 2 August 2014 00:27, Julian Edwards <email address hidden> wrote:
> You know how I said that you needed to revert that "temporary" change ... ;)

I did revert it… just not until after I'd pushed the branch, that's all ;)

Revision history for this message
Julian Edwards (julian-edwards) wrote :

Looks good. I have a couple of things to fix and a small remark but nothing to block it.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/maasserver/api.py'
2--- src/maasserver/api.py 2014-08-04 15:55:13 +0000
3+++ src/maasserver/api.py 2014-08-05 09:45:38 +0000
4@@ -486,11 +486,16 @@
5 """Release a node. Opposite of `NodesHandler.acquire`."""
6 node = Node.objects.get_node_or_404(
7 system_id=system_id, user=request.user, perm=NODE_PERMISSION.EDIT)
8+ releasable_statuses = [
9+ NODE_STATUS.ALLOCATED,
10+ NODE_STATUS.RESERVED,
11+ NODE_STATUS.BROKEN,
12+ ]
13 if node.status == NODE_STATUS.READY:
14 # Nothing to do. This may be a redundant retry, and the
15 # postcondition is achieved, so call this success.
16 pass
17- elif node.status in [NODE_STATUS.ALLOCATED, NODE_STATUS.RESERVED]:
18+ elif node.status in releasable_statuses:
19 node.release()
20 else:
21 raise NodeStateViolation(
22
23=== modified file 'src/maasserver/models/node.py'
24--- src/maasserver/models/node.py 2014-08-04 14:29:05 +0000
25+++ src/maasserver/models/node.py 2014-08-05 09:45:38 +0000
26@@ -1207,7 +1207,13 @@
27 self.delete_static_host_maps(deallocated_ips)
28 from maasserver.dns import change_dns_zones
29 change_dns_zones([self.nodegroup])
30- self.status = NODE_STATUS.READY
31+ # Belt-and-braces: we should never reach a point where the node
32+ # is BROKEN and still allocated, since mark_broken() releases
33+ # the node anyway, but bug 1351451 seemed to suggest that it was
34+ # possible. This can be removed if that proves not to be the
35+ # case.
36+ if self.status != NODE_STATUS.BROKEN:
37+ self.status = NODE_STATUS.READY
38 self.owner = None
39 self.token = None
40 self.agent_name = ''
41
42=== modified file 'src/maasserver/models/tests/test_node.py'
43--- src/maasserver/models/tests/test_node.py 2014-07-31 15:32:52 +0000
44+++ src/maasserver/models/tests/test_node.py 2014-08-05 09:45:38 +0000
45@@ -620,6 +620,16 @@
46 (NODE_STATUS.READY, None, node.agent_name),
47 (node.status, node.owner, ''))
48
49+ def test_release_does_not_mark_broken_node_ready(self):
50+ agent_name = factory.make_name('agent-name')
51+ node = factory.make_node(
52+ status=NODE_STATUS.BROKEN, owner=factory.make_user(),
53+ agent_name=agent_name)
54+ node.release()
55+ self.assertEqual(
56+ (NODE_STATUS.BROKEN, None, node.agent_name),
57+ (node.status, node.owner, ''))
58+
59 def test_release_deletes_static_ip_host_maps(self):
60 user = factory.make_user()
61 node = factory.make_node_with_mac_attached_to_nodegroupinterface(
62
63=== modified file 'src/maasserver/tests/test_api_node.py'
64--- src/maasserver/tests/test_api_node.py 2014-08-04 13:38:09 +0000
65+++ src/maasserver/tests/test_api_node.py 2014-08-05 09:45:38 +0000
66@@ -381,6 +381,18 @@
67 [NODE_STATUS.READY] * len(owned_nodes),
68 [node.status for node in reload_objects(Node, owned_nodes)])
69
70+ def test_POST_release_releases_broken_node(self):
71+ owned_node = factory.make_node(
72+ owner=self.logged_in_user, status=NODE_STATUS.BROKEN)
73+ response = self.client.post(
74+ self.get_node_uri(owned_node), {'op': 'release'})
75+ self.assertEqual(
76+ httplib.OK, response.status_code, response.content)
77+ owned_node = Node.objects.get(id=owned_node.id)
78+ self.assertEqual(
79+ (NODE_STATUS.BROKEN, None),
80+ (owned_node.status, owned_node.owner))
81+
82 def test_POST_release_turns_on_netboot(self):
83 node = factory.make_node(
84 status=NODE_STATUS.ALLOCATED, owner=self.logged_in_user)
85@@ -448,6 +460,7 @@
86
87 def test_POST_release_fails_for_other_node_states(self):
88 releasable_statuses = [
89+ NODE_STATUS.BROKEN,
90 NODE_STATUS.RESERVED,
91 NODE_STATUS.ALLOCATED,
92 NODE_STATUS.READY,