Merge lp:~dimitern/maas/1.2-node-view-shows-kernel-params into lp:~maas-committers/maas/trunk

Proposed by Dimiter Naydenov
Status: Merged
Approved by: John A Meinel
Approved revision: no longer in the source branch.
Merged at revision: 1338
Proposed branch: lp:~dimitern/maas/1.2-node-view-shows-kernel-params
Merge into: lp:~maas-committers/maas/trunk
Prerequisite: lp:~jameinel/maas/land-kernel-opts-in-trunk
Diff against target: 267 lines (+124/-1)
11 files modified
src/maasserver/forms.py (+7/-0)
src/maasserver/static/css/components/blocks.css (+3/-0)
src/maasserver/templates/maasserver/form_field.html (+1/-1)
src/maasserver/templates/maasserver/node_view.html (+14/-0)
src/maasserver/templates/maasserver/settings.html (+15/-0)
src/maasserver/templates/maasserver/tag_view.html (+6/-0)
src/maasserver/tests/test_views_nodes.py (+35/-0)
src/maasserver/tests/test_views_settings.py (+15/-0)
src/maasserver/tests/test_views_tags.py (+11/-0)
src/maasserver/views/nodes.py (+8/-0)
src/maasserver/views/settings.py (+9/-0)
To merge this branch: bzr merge lp:~dimitern/maas/1.2-node-view-shows-kernel-params
Reviewer Review Type Date Requested Status
Martin Packman (community) Approve
Review via email: mp+133449@code.launchpad.net

This proposal supersedes a proposal from 2012-11-07.

Commit message

Related to bug #1044503: UI changes in node, tag and settings pages to show effective kernel parameters.

Description of the change

Adding UI for kernel parameters in node and tag views, as well as the settings page.

Resubmitted after merging lp:~jameinel/maas/land-kernel-opts-in-trunk and now is targeting trunk, instead of 1.2.

To post a comment you must log in.
Revision history for this message
Martin Packman (gz) wrote : Posted in a previous version of this proposal

Will want a little followup as the other branches land, but the view and template stuff looks good to me.

Revision history for this message
Dimiter Naydenov (dimitern) wrote : Posted in a previous version of this proposal

I'm ready with the changes and tests - everything works with one exception - test_view_node_shows_tag_kernel_params still fails, because it assumes Node.get_effective_kernel_options() returns (Tag, kernel_opts) tuple when a tag has kernel_opts and is applied to a node. So, once https://code.launchpad.net/~jameinel/maas/1.2-kernel-option-tags lands, the failing test should pass.

Revision history for this message
Martin Packman (gz) wrote :

Looks good, go for it!

review: Approve
Revision history for this message
Dimiter Naydenov (dimitern) wrote :

Thanks for the review!

Revision history for this message
MAAS Lander (maas-lander) wrote :

The prerequisite lp:~jameinel/maas/land-kernel-opts-in-trunk has not yet been merged into lp:maas.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/maasserver/forms.py'
--- src/maasserver/forms.py 2012-11-08 11:00:29 +0000
+++ src/maasserver/forms.py 2012-11-08 11:00:30 +0000
@@ -655,6 +655,13 @@
655 self._load_initials()655 self._load_initials()
656656
657657
658class GlobalKernelOptsForm(ConfigForm):
659 """Settings page, Global Kernel Parameters section."""
660 kernel_opts = forms.CharField(
661 label="Boot parameters to pass to the kernel by default",
662 required=False)
663
664
658hostname_error_msg = "Enter a valid hostname (e.g. host.example.com)."665hostname_error_msg = "Enter a valid hostname (e.g. host.example.com)."
659666
660667
661668
=== modified file 'src/maasserver/static/css/components/blocks.css'
--- src/maasserver/static/css/components/blocks.css 2012-10-03 03:59:53 +0000
+++ src/maasserver/static/css/components/blocks.css 2012-11-08 11:00:30 +0000
@@ -82,3 +82,6 @@
82.size12 {82.size12 {
83 width: 720px;83 width: 720px;
84 }84 }
85.size12 input {
86 width: 100%;
87 }
8588
=== modified file 'src/maasserver/templates/maasserver/form_field.html'
--- src/maasserver/templates/maasserver/form_field.html 2012-08-03 16:36:26 +0000
+++ src/maasserver/templates/maasserver/form_field.html 2012-11-08 11:00:30 +0000
@@ -1,5 +1,5 @@
1{% load field_type %}1{% load field_type %}
2<li class="{{ field.html_name }}{% if field.errors %} error{% endif %}">2<li class="{{ field.html_name }}{% if css_class %} {{ css_class }}{% endif %}{% if field.errors %} error{% endif %}">
3 <label for="id_{{ field.html_name }}">3 <label for="id_{{ field.html_name }}">
4 {% ifequal field|field_type "CheckboxInput" %}4 {% ifequal field|field_type "CheckboxInput" %}
5 {{ field }}5 {{ field }}
66
=== modified file 'src/maasserver/templates/maasserver/node_view.html'
--- src/maasserver/templates/maasserver/node_view.html 2012-11-07 14:43:58 +0000
+++ src/maasserver/templates/maasserver/node_view.html 2012-11-08 11:00:30 +0000
@@ -85,6 +85,20 @@
85 {% endif %}85 {% endif %}
86 </span>86 </span>
87 </li>87 </li>
88 {% if kernel_opts.value %}
89 <li class="block size10 first">
90 <h4>Kernel Parameters
91 {% if kernel_opts.is_global %}
92 - from: <a class="kernelopts-global-link" href="{% url 'settings' %}">Global Kernel Parameters</a>
93 {% elif kernel_opts.is_tag %}
94 - from tag: <span><a class="kernelopts-tag-link" href="{% url 'tag-view' kernel_opts.tag.name %}">{{ kernel_opts.tag.name }}</a></span>
95 {% endif %}
96 </h4>
97 <span id="node_kernel_opts">
98 {{ kernel_opts.value }}
99 </span>
100 </li>
101 {% endif %}
88 {% if error_text %}102 {% if error_text %}
89 <li class="block first">103 <li class="block first">
90 <h4>Error output</h4>104 <h4>Error output</h4>
91105
=== modified file 'src/maasserver/templates/maasserver/settings.html'
--- src/maasserver/templates/maasserver/settings.html 2012-11-06 16:47:23 +0000
+++ src/maasserver/templates/maasserver/settings.html 2012-11-08 11:00:30 +0000
@@ -125,6 +125,21 @@
125 <div class="clear"></div>125 <div class="clear"></div>
126 </div>126 </div>
127 <div class="divider"></div>127 <div class="divider"></div>
128 <div id="global_kernel_opts" class="block size7 first">
129 <h2>Global Kernel Parameters</h2>
130 <form action="{% url "settings" %}" method="post">
131 {% csrf_token %}
132 <ul>
133 {% with field=kernelopts_form.kernel_opts %}
134 {% include "maasserver/form_field.html" with css_class="size12" %}
135 {% endwith %}
136 </ul>
137 <input type="hidden" name="kernelopts_submit" value="1" />
138 <input type="submit" class="button right" value="Save" />
139 </form>
140 <div class="clear"></div>
141 </div>
142 <div class="divider"></div>
128 <div id="maas_and_network" class="block size7 first">143 <div id="maas_and_network" class="block size7 first">
129 <h2>Network Configuration</h2>144 <h2>Network Configuration</h2>
130 <form action="{% url "settings" %}" method="post">145 <form action="{% url "settings" %}" method="post">
131146
=== modified file 'src/maasserver/templates/maasserver/tag_view.html'
--- src/maasserver/templates/maasserver/tag_view.html 2012-10-24 12:51:10 +0000
+++ src/maasserver/templates/maasserver/tag_view.html 2012-11-08 11:00:30 +0000
@@ -19,6 +19,12 @@
19 <h4>Definition</h4>19 <h4>Definition</h4>
20 <span>{{ tag.definition }}</span>20 <span>{{ tag.definition }}</span>
21 </li>21 </li>
22 {% if tag.kernel_opts %}
23 <li class="kernel-opts-tag block size10">
24 <h4>Kernel Parameters</h4>
25 <span>{{ tag.kernel_opts }}</span>
26 </li>
27 {% endif %}
22 {% if error_text %}28 {% if error_text %}
23 <li class="block first">29 <li class="block first">
24 <h4>Error output</h4>30 <h4>Error output</h4>
2531
=== modified file 'src/maasserver/tests/test_views_nodes.py'
--- src/maasserver/tests/test_views_nodes.py 2012-11-08 10:11:03 +0000
+++ src/maasserver/tests/test_views_nodes.py 2012-11-08 11:00:30 +0000
@@ -39,6 +39,7 @@
39 )39 )
40from maasserver.forms import NodeActionForm40from maasserver.forms import NodeActionForm
41from maasserver.models import (41from maasserver.models import (
42 Config,
42 MACAddress,43 MACAddress,
43 Node,44 Node,
44 )45 )
@@ -440,6 +441,40 @@
440 self.assertIn(441 self.assertIn(
441 reverse('mac-add', args=[node.system_id]), response.content)442 reverse('mac-add', args=[node.system_id]), response.content)
442443
444 def test_view_node_shows_global_kernel_params(self):
445 Config.objects.create(name='kernel_opts', value='--test param')
446 node = factory.make_node()
447 self.assertEqual(
448 node.get_effective_kernel_options(),
449 (None, "--test param", )
450 )
451
452 node_link = reverse('node-view', args=[node.system_id])
453 response = self.client.get(node_link)
454 doc = fromstring(response.content)
455 kernel_params = doc.cssselect('#node_kernel_opts')[0]
456 self.assertEqual('--test param', kernel_params.text.strip())
457
458 details_link = doc.cssselect('a.kernelopts-global-link')[0].get('href')
459 self.assertEqual(reverse('settings'), details_link)
460
461 def test_view_node_shows_tag_kernel_params(self):
462 tag = factory.make_tag(name='shiny', kernel_opts="--test params")
463 node = factory.make_node()
464 node.tags = [tag]
465 self.assertEqual(
466 (tag, '--test params',),
467 node.get_effective_kernel_options())
468
469 node_link = reverse('node-view', args=[node.system_id])
470 response = self.client.get(node_link)
471 doc = fromstring(response.content)
472 kernel_params = doc.cssselect('#node_kernel_opts')[0]
473 self.assertEqual('--test params', kernel_params.text.strip())
474
475 details_link = doc.cssselect('a.kernelopts-tag-link')[0].get('href')
476 self.assertEqual(reverse('tag-view', args=[tag.name]), details_link)
477
443 def test_view_node_has_button_to_accept_enlistment_for_user(self):478 def test_view_node_has_button_to_accept_enlistment_for_user(self):
444 # A simple user can't see the button to enlist a declared node.479 # A simple user can't see the button to enlist a declared node.
445 node = factory.make_node(status=NODE_STATUS.DECLARED)480 node = factory.make_node(status=NODE_STATUS.DECLARED)
446481
=== modified file 'src/maasserver/tests/test_views_settings.py'
--- src/maasserver/tests/test_views_settings.py 2012-11-08 06:34:48 +0000
+++ src/maasserver/tests/test_views_settings.py 2012-11-08 11:00:30 +0000
@@ -185,6 +185,21 @@
185 choices + [['my.hostname.com', 'my.hostname.com']],185 choices + [['my.hostname.com', 'my.hostname.com']],
186 new_choices)186 new_choices)
187187
188 def test_settings_kernelopts_POST(self):
189 new_kernel_opts = "--new='arg' --flag=1 other"
190 response = self.client.post(
191 reverse('settings'),
192 get_prefixed_form_data(
193 prefix='kernelopts',
194 data={
195 'kernel_opts': new_kernel_opts,
196 }))
197
198 self.assertEqual(httplib.FOUND, response.status_code)
199 self.assertEqual(
200 new_kernel_opts,
201 Config.objects.get_config('kernel_opts'))
202
188 def test_settings_contains_form_to_accept_all_nodegroups(self):203 def test_settings_contains_form_to_accept_all_nodegroups(self):
189 factory.make_node_group(status=NODEGROUP_STATUS.PENDING),204 factory.make_node_group(status=NODEGROUP_STATUS.PENDING),
190 response = self.client.get(reverse('settings'))205 response = self.client.get(reverse('settings'))
191206
=== modified file 'src/maasserver/tests/test_views_tags.py'
--- src/maasserver/tests/test_views_tags.py 2012-11-08 07:38:39 +0000
+++ src/maasserver/tests/test_views_tags.py 2012-11-08 11:00:30 +0000
@@ -89,6 +89,17 @@
89 self.assertIn(node.hostname, content_text)89 self.assertIn(node.hostname, content_text)
90 self.assertNotIn(node2.hostname, content_text)90 self.assertNotIn(node2.hostname, content_text)
9191
92 def test_view_tag_shows_kernel_params(self):
93 tag = factory.make_tag(kernel_opts='--test tag params')
94 node = factory.make_node()
95 node.tags = [tag]
96 tag_link = reverse('tag-view', args=[tag.name])
97 response = self.client.get(tag_link)
98 doc = fromstring(response.content)
99 kernel_opts = doc.cssselect('.kernel-opts-tag')[0].text_content()
100 self.assertIn('Kernel Parameters', kernel_opts)
101 self.assertIn(tag.kernel_opts, kernel_opts)
102
92 def test_view_tag_paginates_nodes(self):103 def test_view_tag_paginates_nodes(self):
93 """Listing of nodes with tag is split across multiple pages104 """Listing of nodes with tag is split across multiple pages
94105
95106
=== modified file 'src/maasserver/views/nodes.py'
--- src/maasserver/views/nodes.py 2012-11-08 10:11:03 +0000
+++ src/maasserver/views/nodes.py 2012-11-08 11:00:30 +0000
@@ -56,6 +56,7 @@
56from maasserver.models import (56from maasserver.models import (
57 MACAddress,57 MACAddress,
58 Node,58 Node,
59 Tag,
59 )60 )
60from maasserver.models.node import CONSTRAINTS_JUJU_MAP61from maasserver.models.node import CONSTRAINTS_JUJU_MAP
61from maasserver.models.node_constraint_filter import constrain_nodes62from maasserver.models.node_constraint_filter import constrain_nodes
@@ -247,6 +248,13 @@
247 node.error if node.status == NODE_STATUS.FAILED_TESTS else None)248 node.error if node.status == NODE_STATUS.FAILED_TESTS else None)
248 context['status_text'] = (249 context['status_text'] = (
249 node.error if node.status != NODE_STATUS.FAILED_TESTS else None)250 node.error if node.status != NODE_STATUS.FAILED_TESTS else None)
251 kernel_opts = node.get_effective_kernel_options()
252 context['kernel_opts'] = {
253 'is_global': kernel_opts[0] is None,
254 'is_tag': isinstance(kernel_opts[0], Tag),
255 'tag': kernel_opts[0],
256 'value': kernel_opts[1]
257 }
250 return context258 return context
251259
252 def dispatch(self, *args, **kwargs):260 def dispatch(self, *args, **kwargs):
253261
=== modified file 'src/maasserver/views/settings.py'
--- src/maasserver/views/settings.py 2012-11-07 10:39:19 +0000
+++ src/maasserver/views/settings.py 2012-11-08 11:00:30 +0000
@@ -46,6 +46,7 @@
46 MAASAndNetworkForm,46 MAASAndNetworkForm,
47 NewUserCreationForm,47 NewUserCreationForm,
48 UbuntuForm,48 UbuntuForm,
49 GlobalKernelOptsForm,
49 )50 )
50from maasserver.models import (51from maasserver.models import (
51 NodeGroup,52 NodeGroup,
@@ -177,6 +178,13 @@
177 if response is not None:178 if response is not None:
178 return response179 return response
179180
181 # Process the Global Kernel Opts form.
182 kernelopts_form, response = process_form(
183 request, GlobalKernelOptsForm, reverse('settings'), 'kernelopts',
184 "Configuration updated.")
185 if response is not None:
186 return response
187
180 # Process accept clusters en masse.188 # Process accept clusters en masse.
181 if 'mass_accept_submit' in request.POST:189 if 'mass_accept_submit' in request.POST:
182 number = NodeGroup.objects.accept_all_pending()190 number = NodeGroup.objects.accept_all_pending()
@@ -217,6 +225,7 @@
217 'maas_and_network_form': maas_and_network_form,225 'maas_and_network_form': maas_and_network_form,
218 'commissioning_form': commissioning_form,226 'commissioning_form': commissioning_form,
219 'ubuntu_form': ubuntu_form,227 'ubuntu_form': ubuntu_form,
228 'kernelopts_form': kernelopts_form,
220 },229 },
221 context_instance=RequestContext(request))230 context_instance=RequestContext(request))
222231