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
=== modified file 'src/maasserver/api/tests/test_nodegroup.py'
--- src/maasserver/api/tests/test_nodegroup.py 2014-10-03 14:49:13 +0000
+++ src/maasserver/api/tests/test_nodegroup.py 2014-10-10 15:15:47 +0000
@@ -128,7 +128,9 @@
128128
129 def test_PUT_updates_nodegroup(self):129 def test_PUT_updates_nodegroup(self):
130 # The api allows the updating of a NodeGroup.130 # The api allows the updating of a NodeGroup.
131 nodegroup = factory.make_NodeGroup()131 old_disable_ipv4 = factory.pick_bool()
132 nodegroup = factory.make_NodeGroup(
133 default_disable_ipv4=old_disable_ipv4)
132 self.become_admin()134 self.become_admin()
133 new_name = factory.make_name("new-name")135 new_name = factory.make_name("new-name")
134 new_cluster_name = factory.make_name("new-cluster-name")136 new_cluster_name = factory.make_name("new-cluster-name")
@@ -140,6 +142,7 @@
140 'name': new_name,142 'name': new_name,
141 'cluster_name': new_cluster_name,143 'cluster_name': new_cluster_name,
142 'status': new_status,144 'status': new_status,
145 'default_disable_ipv4': not old_disable_ipv4,
143 })146 })
144147
145 self.assertEqual(httplib.OK, response.status_code, response.content)148 self.assertEqual(httplib.OK, response.status_code, response.content)
@@ -147,6 +150,7 @@
147 self.assertEqual(150 self.assertEqual(
148 (new_name, new_cluster_name, new_status),151 (new_name, new_cluster_name, new_status),
149 (nodegroup.name, nodegroup.cluster_name, nodegroup.status))152 (nodegroup.name, nodegroup.cluster_name, nodegroup.status))
153 self.assertEqual(not old_disable_ipv4, nodegroup.default_disable_ipv4)
150154
151 def test_PUT_updates_nodegroup_validates_data(self):155 def test_PUT_updates_nodegroup_validates_data(self):
152 nodegroup, _ = factory.make_unrenamable_NodeGroup_with_Node()156 nodegroup, _ = factory.make_unrenamable_NodeGroup_with_Node()
@@ -163,6 +167,18 @@
163 "Can't rename DNS zone",167 "Can't rename DNS zone",
164 parsed_result['name'][0])168 parsed_result['name'][0])
165169
170 def test_PUT_without_default_disable_ipv4_leaves_field_unchanged(self):
171 old_value = factory.pick_bool()
172 nodegroup = factory.make_NodeGroup(default_disable_ipv4=old_value)
173 self.become_admin()
174 response = self.client_put(
175 reverse('nodegroup_handler', args=[nodegroup.uuid]),
176 {'name': nodegroup.name})
177 self.assertEqual(httplib.OK, response.status_code, response.content)
178 self.assertEqual(
179 old_value,
180 reload_object(nodegroup).default_disable_ipv4)
181
166 def test_accept_accepts_nodegroup(self):182 def test_accept_accepts_nodegroup(self):
167 nodegroups = [factory.make_NodeGroup() for _ in range(3)]183 nodegroups = [factory.make_NodeGroup() for _ in range(3)]
168 uuids = [nodegroup.uuid for nodegroup in nodegroups]184 uuids = [nodegroup.uuid for nodegroup in nodegroups]
169185
=== modified file 'src/maasserver/forms.py'
--- src/maasserver/forms.py 2014-10-10 04:55:03 +0000
+++ src/maasserver/forms.py 2014-10-10 15:15:47 +0000
@@ -1710,6 +1710,7 @@
1710 'cluster_name',1710 'cluster_name',
1711 'status',1711 'status',
1712 'name',1712 'name',
1713 'default_disable_ipv4',
1713 )1714 )
17141715
1715 def clean_name(self):1716 def clean_name(self):
@@ -1732,6 +1733,16 @@
17321733
1733 return new_name1734 return new_name
17341735
1736 def clean_default_disable_ipv4(self):
1737 data = self.submitted_data
1738 if 'ui_submission' in data and 'default_disable_ipv4' not in data:
1739 # In the UI, where all fields are submitted except checkboxes in
1740 # the "off" state, a missing boolean field means False.
1741 # (In the API, as enforced by MAASModelForm, a missing boolean
1742 # field means "unchanged").
1743 self.cleaned_data['default_disable_ipv4'] = False
1744 return self.cleaned_data['default_disable_ipv4']
1745
17351746
1736class TagForm(MAASModelForm):1747class TagForm(MAASModelForm):
17371748
17381749
=== modified file 'src/maasserver/models/nodegroup.py'
--- src/maasserver/models/nodegroup.py 2014-09-30 18:13:21 +0000
+++ src/maasserver/models/nodegroup.py 2014-10-10 15:15:47 +0000
@@ -183,8 +183,8 @@
183 default=False,183 default=False,
184 verbose_name="Disable IPv4 by default when deploying nodes",184 verbose_name="Disable IPv4 by default when deploying nodes",
185 help_text=(185 help_text=(
186 "Default setting for setting on new nodes: disable IPv4 when "186 "Default setting for new nodes: disable IPv4 when deploying, on "
187 "deploying, on operating systems where this is supported."))187 "operating systems where this is supported."))
188188
189 @property189 @property
190 def api_credentials(self):190 def api_credentials(self):
191191
=== modified file 'src/maasserver/views/clusters.py'
--- src/maasserver/views/clusters.py 2014-10-07 21:18:44 +0000
+++ src/maasserver/views/clusters.py 2014-10-10 15:15:47 +0000
@@ -143,6 +143,15 @@
143 form_class = NodeGroupEdit143 form_class = NodeGroupEdit
144 context_object_name = 'cluster'144 context_object_name = 'cluster'
145145
146 def get_form_kwargs(self):
147 kwargs = super(ClusterEdit, self).get_form_kwargs()
148 # The cluster form has a boolean checkbox. For those we need to know
149 # whether a submission came in from the UI (where omitting the field
150 # means "set to False") or from the API (where it means "leave
151 # unchanged").
152 kwargs['ui_submission'] = True
153 return kwargs
154
146 def get_context_data(self, **kwargs):155 def get_context_data(self, **kwargs):
147 context = super(ClusterEdit, self).get_context_data(**kwargs)156 context = super(ClusterEdit, self).get_context_data(**kwargs)
148 context['interfaces'] = (157 context['interfaces'] = (
149158
=== modified file 'src/maasserver/views/tests/test_clusters.py'
--- src/maasserver/views/tests/test_clusters.py 2014-10-08 08:34:46 +0000
+++ src/maasserver/views/tests/test_clusters.py 2014-10-10 15:15:47 +0000
@@ -397,6 +397,18 @@
397 self.assertIn(397 self.assertIn(
398 reverse('cluster-interface-create', args=[nodegroup.uuid]), links)398 reverse('cluster-interface-create', args=[nodegroup.uuid]), links)
399399
400 def test_admin_can_disable_default_disable_ipv4_flag(self):
401 self.client_log_in(as_admin=True)
402 nodegroup = factory.make_NodeGroup(default_disable_ipv4=True)
403 edit_link = reverse('cluster-edit', args=[nodegroup.uuid])
404 # In a UI submission, omitting a boolean means setting it to False.
405 data = {
406 'ui_submission': True,
407 }
408 response = self.client.post(edit_link, data)
409 self.assertEqual(httplib.FOUND, response.status_code)
410 self.assertFalse(reload_object(nodegroup).default_disable_ipv4)
411
400412
401class ClusterInterfaceDeleteTest(MAASServerTestCase):413class ClusterInterfaceDeleteTest(MAASServerTestCase):
402414