Merge ~ltrager/maas:preserve_other_param_value_on_regeneration into maas:master

Proposed by Lee Trager
Status: Merged
Approved by: Lee Trager
Approved revision: 0533dd2938065f6629d2182c53654f152280fff4
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~ltrager/maas:preserve_other_param_value_on_regeneration
Merge into: maas:master
Diff against target: 113 lines (+70/-5)
3 files modified
src/maasserver/forms/ephemeral.py (+3/-3)
src/metadataserver/models/scriptset.py (+6/-2)
src/metadataserver/models/tests/test_scriptset.py (+61/-0)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Blake Rouse (community) Approve
Review via email: mp+371280@code.launchpad.net

Commit message

On regeneration preserve only the value of non interface or storage parameters.

To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b preserve_other_param_value_on_regeneration lp:~ltrager/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 2fb21f536a0085278f1ce1c385f04b04583e26be

review: Approve
Revision history for this message
Blake Rouse (blake-rouse) :
review: Approve
4ed6a84... by Lee Trager

Add comment

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

UNIT TESTS
-b preserve_other_param_value_on_regeneration lp:~ltrager/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 4ed6a846bfcd040a62348f3ee0b741f54aaa5f9b

review: Approve
0533dd2... by Lee Trager

Drive by fix

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/forms/ephemeral.py b/src/maasserver/forms/ephemeral.py
2index 17aaae5..dc1ffce 100644
3--- a/src/maasserver/forms/ephemeral.py
4+++ b/src/maasserver/forms/ephemeral.py
5@@ -163,14 +163,14 @@ class TestForm(Form):
6 def _get_script_param_dict(self, scripts):
7 params = {}
8 script_names = []
9- script_ids = []
10+ ids = []
11 for script in scripts:
12 if script.isdigit():
13- script_ids.append(int(script))
14+ ids.append(int(script))
15 else:
16 script_names.append(script)
17 qs = Script.objects.filter(
18- Q(id__in=script_ids) | Q(name__in=script_names))
19+ Q(name__in=scripts) | Q(tags__overlap=scripts) | Q(id__in=ids))
20 for name, value in self.cleaned_data.items():
21 if name in [
22 "enable_ssh", "testing_scripts", "commissioning_scripts",
23diff --git a/src/metadataserver/models/scriptset.py b/src/metadataserver/models/scriptset.py
24index 32df7ba..ced57d2 100644
25--- a/src/metadataserver/models/scriptset.py
26+++ b/src/metadataserver/models/scriptset.py
27@@ -532,8 +532,12 @@ class ScriptSet(CleanSave, Model):
28 # device or interface may no longer exist. The
29 # ParametersForm will set the default value(all).
30 script_result.parameters.pop(param_name)
31- regenerate_scripts[
32- script_result.script] = script_result.parameters
33+ # Only preserve the value of the parameter as that is what
34+ # the form will validate.
35+ regenerate_scripts[script_result.script] = {
36+ key: value['value']
37+ for key, value in script_result.parameters.items()
38+ }
39 script_result.delete()
40 break
41
42diff --git a/src/metadataserver/models/tests/test_scriptset.py b/src/metadataserver/models/tests/test_scriptset.py
43index a622a22..873a1ac 100644
44--- a/src/metadataserver/models/tests/test_scriptset.py
45+++ b/src/metadataserver/models/tests/test_scriptset.py
46@@ -1199,6 +1199,67 @@ class TestScriptSet(MAASServerTestCase):
47 'value': 'all',
48 }}, new_storage_script_result.parameters)
49
50+ def test_regenerate_network_with_url_param(self):
51+ node = factory.make_Node()
52+ interface = factory.make_Interface(node=node)
53+ interface.ip_addresses.all().delete()
54+ interface.ip_addresses.add(factory.make_StaticIPAddress())
55+ url = factory.make_url(scheme='http')
56+ default_url = factory.make_url(scheme='http')
57+ script_set = factory.make_ScriptSet(node=node)
58+
59+ pending_network_script = factory.make_Script(parameters={
60+ 'interface': {
61+ 'type': 'interface',
62+ },
63+ 'url': {
64+ 'type': 'url',
65+ 'required': True,
66+ 'default': default_url,
67+ },
68+ })
69+ factory.make_ScriptResult(
70+ script_set=script_set, status=SCRIPT_STATUS.PENDING,
71+ script=pending_network_script, parameters={
72+ 'interface': {
73+ 'type': 'interface',
74+ 'value': {
75+ 'name': factory.make_name('name'),
76+ 'mac_address': factory.make_mac_address(),
77+ 'vendor': factory.make_name('vendor'),
78+ 'product': factory.make_name('product'),
79+ },
80+ },
81+ 'url': {
82+ 'type': 'url',
83+ 'required': True,
84+ 'default': default_url,
85+ 'value': url,
86+ },
87+ })
88+
89+ script_set.regenerate(storage=False, network=True)
90+
91+ new_network_script_result = script_set.scriptresult_set.get(
92+ script=pending_network_script)
93+ self.assertDictEqual({
94+ 'interface': {
95+ 'type': 'interface',
96+ 'value': {
97+ 'name': interface.name,
98+ 'mac_address': str(interface.mac_address),
99+ 'vendor': interface.vendor,
100+ 'product': interface.product,
101+ 'interface_id': interface.id,
102+ },
103+ },
104+ 'url': {
105+ 'type': 'url',
106+ 'required': True,
107+ 'default': default_url,
108+ 'value': url,
109+ }}, new_network_script_result.parameters)
110+
111 def test_regenerate_logs_failure(self):
112 mock_logger = self.patch(scriptset_module.logger, 'error')
113 node = factory.make_Node()

Subscribers

People subscribed via source and target branches