Merge lp:~jtv/maas/bug-1379816 into lp:~maas-committers/maas/trunk

Proposed by Jeroen T. Vermeulen
Status: Merged
Approved by: Jeroen T. Vermeulen
Approved revision: no longer in the source branch.
Merged at revision: 3248
Proposed branch: lp:~jtv/maas/bug-1379816
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 135 lines (+51/-3)
5 files modified
src/maasserver/api/tests/test_nodegroup.py (+17/-1)
src/maasserver/forms.py (+11/-0)
src/maasserver/models/nodegroup.py (+2/-2)
src/maasserver/views/clusters.py (+9/-0)
src/maasserver/views/tests/test_clusters.py (+12/-0)
To merge this branch: bzr merge lp:~jtv/maas/bug-1379816
Reviewer Review Type Date Requested Status
Raphaël Badin (community) Approve
Christian Reis (community) Needs Fixing
Review via email: mp+238001@code.launchpad.net

Commit message

Make the “disable IPv4 by default” checkbox visible in the cluster UI.

This includes the UI trick we needed to get the “disable IPv4” checkbox working in the node UI, which Raphaël generalised into a reusable pattern. Without it, once checked, the box can never be unchecked.

Description of the change

That should explain why the tests may seem to have an unhealthy obsession with changing the setting from True to False, instead of just trying it either way. I hope the comments make the situation clear throughout.

In a next step we could hide this button if the cluster does not have any IPv6 configured, like we do in the node UI.

Jeroen

To post a comment you must log in.
Revision history for this message
Christian Reis (kiko) wrote :

Let's hide the button if there's no IPv6 configured -- and in fact, what happens if it is selected and there is no IPv6 on the cluster?

Pending that change and review, approved for 1.7.

review: Needs Fixing
Revision history for this message
Jeroen T. Vermeulen (jtv) wrote :
Revision history for this message
Raphaël Badin (rvb) wrote :

Looks good to me, with the additional lp:~jtv/maas/hide-cluster-default-disable-ipv4-if-no-ipv6/ branch.

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/tests/test_nodegroup.py'
2--- src/maasserver/api/tests/test_nodegroup.py 2014-10-03 14:49:13 +0000
3+++ src/maasserver/api/tests/test_nodegroup.py 2014-10-10 15:15:47 +0000
4@@ -128,7 +128,9 @@
5
6 def test_PUT_updates_nodegroup(self):
7 # The api allows the updating of a NodeGroup.
8- nodegroup = factory.make_NodeGroup()
9+ old_disable_ipv4 = factory.pick_bool()
10+ nodegroup = factory.make_NodeGroup(
11+ default_disable_ipv4=old_disable_ipv4)
12 self.become_admin()
13 new_name = factory.make_name("new-name")
14 new_cluster_name = factory.make_name("new-cluster-name")
15@@ -140,6 +142,7 @@
16 'name': new_name,
17 'cluster_name': new_cluster_name,
18 'status': new_status,
19+ 'default_disable_ipv4': not old_disable_ipv4,
20 })
21
22 self.assertEqual(httplib.OK, response.status_code, response.content)
23@@ -147,6 +150,7 @@
24 self.assertEqual(
25 (new_name, new_cluster_name, new_status),
26 (nodegroup.name, nodegroup.cluster_name, nodegroup.status))
27+ self.assertEqual(not old_disable_ipv4, nodegroup.default_disable_ipv4)
28
29 def test_PUT_updates_nodegroup_validates_data(self):
30 nodegroup, _ = factory.make_unrenamable_NodeGroup_with_Node()
31@@ -163,6 +167,18 @@
32 "Can't rename DNS zone",
33 parsed_result['name'][0])
34
35+ def test_PUT_without_default_disable_ipv4_leaves_field_unchanged(self):
36+ old_value = factory.pick_bool()
37+ nodegroup = factory.make_NodeGroup(default_disable_ipv4=old_value)
38+ self.become_admin()
39+ response = self.client_put(
40+ reverse('nodegroup_handler', args=[nodegroup.uuid]),
41+ {'name': nodegroup.name})
42+ self.assertEqual(httplib.OK, response.status_code, response.content)
43+ self.assertEqual(
44+ old_value,
45+ reload_object(nodegroup).default_disable_ipv4)
46+
47 def test_accept_accepts_nodegroup(self):
48 nodegroups = [factory.make_NodeGroup() for _ in range(3)]
49 uuids = [nodegroup.uuid for nodegroup in nodegroups]
50
51=== modified file 'src/maasserver/forms.py'
52--- src/maasserver/forms.py 2014-10-10 04:55:03 +0000
53+++ src/maasserver/forms.py 2014-10-10 15:15:47 +0000
54@@ -1710,6 +1710,7 @@
55 'cluster_name',
56 'status',
57 'name',
58+ 'default_disable_ipv4',
59 )
60
61 def clean_name(self):
62@@ -1732,6 +1733,16 @@
63
64 return new_name
65
66+ def clean_default_disable_ipv4(self):
67+ data = self.submitted_data
68+ if 'ui_submission' in data and 'default_disable_ipv4' not in data:
69+ # In the UI, where all fields are submitted except checkboxes in
70+ # the "off" state, a missing boolean field means False.
71+ # (In the API, as enforced by MAASModelForm, a missing boolean
72+ # field means "unchanged").
73+ self.cleaned_data['default_disable_ipv4'] = False
74+ return self.cleaned_data['default_disable_ipv4']
75+
76
77 class TagForm(MAASModelForm):
78
79
80=== modified file 'src/maasserver/models/nodegroup.py'
81--- src/maasserver/models/nodegroup.py 2014-09-30 18:13:21 +0000
82+++ src/maasserver/models/nodegroup.py 2014-10-10 15:15:47 +0000
83@@ -183,8 +183,8 @@
84 default=False,
85 verbose_name="Disable IPv4 by default when deploying nodes",
86 help_text=(
87- "Default setting for setting on new nodes: disable IPv4 when "
88- "deploying, on operating systems where this is supported."))
89+ "Default setting for new nodes: disable IPv4 when deploying, on "
90+ "operating systems where this is supported."))
91
92 @property
93 def api_credentials(self):
94
95=== modified file 'src/maasserver/views/clusters.py'
96--- src/maasserver/views/clusters.py 2014-10-07 21:18:44 +0000
97+++ src/maasserver/views/clusters.py 2014-10-10 15:15:47 +0000
98@@ -143,6 +143,15 @@
99 form_class = NodeGroupEdit
100 context_object_name = 'cluster'
101
102+ def get_form_kwargs(self):
103+ kwargs = super(ClusterEdit, self).get_form_kwargs()
104+ # The cluster form has a boolean checkbox. For those we need to know
105+ # whether a submission came in from the UI (where omitting the field
106+ # means "set to False") or from the API (where it means "leave
107+ # unchanged").
108+ kwargs['ui_submission'] = True
109+ return kwargs
110+
111 def get_context_data(self, **kwargs):
112 context = super(ClusterEdit, self).get_context_data(**kwargs)
113 context['interfaces'] = (
114
115=== modified file 'src/maasserver/views/tests/test_clusters.py'
116--- src/maasserver/views/tests/test_clusters.py 2014-10-08 08:34:46 +0000
117+++ src/maasserver/views/tests/test_clusters.py 2014-10-10 15:15:47 +0000
118@@ -397,6 +397,18 @@
119 self.assertIn(
120 reverse('cluster-interface-create', args=[nodegroup.uuid]), links)
121
122+ def test_admin_can_disable_default_disable_ipv4_flag(self):
123+ self.client_log_in(as_admin=True)
124+ nodegroup = factory.make_NodeGroup(default_disable_ipv4=True)
125+ edit_link = reverse('cluster-edit', args=[nodegroup.uuid])
126+ # In a UI submission, omitting a boolean means setting it to False.
127+ data = {
128+ 'ui_submission': True,
129+ }
130+ response = self.client.post(edit_link, data)
131+ self.assertEqual(httplib.FOUND, response.status_code)
132+ self.assertFalse(reload_object(nodegroup).default_disable_ipv4)
133+
134
135 class ClusterInterfaceDeleteTest(MAASServerTestCase):
136