Merge ~ltrager/maas:lp1822173 into maas:master

Proposed by Lee Trager
Status: Merged
Approved by: Lee Trager
Approved revision: 5cf138a9538bcba384684b6940cacdaa526481c4
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~ltrager/maas:lp1822173
Merge into: maas:master
Diff against target: 179 lines (+51/-50)
2 files modified
src/maasserver/node_action.py (+8/-1)
src/maasserver/tests/test_node_action.py (+43/-49)
Reviewer Review Type Date Requested Status
Andres Rodriguez (community) Needs Fixing
Alberto Donato (community) Approve
Review via email: mp+366158@code.launchpad.net

Commit message

LP: #1822173 - Set osystem and distro series to default when none given over the websocket.

To post a comment you must log in.
Revision history for this message
Alberto Donato (ack) wrote :

LGTM, +1

review: Approve
Revision history for this message
Andres Rodriguez (andreserl) wrote :

lgtm!

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :
Revision history for this message
Andres Rodriguez (andreserl) wrote :
Download full text (6.4 KiB)

======================================================================
ERROR: maasserver.tests.test_node_action.TestDeployAction.test_Deploy_starts_node
----------------------------------------------------------------------
Traceback (most recent call last):
testtools.testresult.real._StringException: Empty attachments:
  Twisted logs

Traceback (most recent call last):
  File "/run/build/maas/src/maasserver/node_action.py", line 490, in _execute
    self.node.distro_series)
  File "/run/build/maas/src/maasserver/utils/osystems.py", line 565, in validate_hwe_kernel
    raise ValidationError('%s has no kernels available.' % distro_series)
django.core.exceptions.ValidationError: ['bionic has no kernels available.']

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/run/build/maas/src/maastesting/runtest.py", line 138, in _run_user
    result = function(*args, **kwargs)
  File "/home/ubuntu/.buildout/eggs/testtools-2.2.0-py3.6.egg/testtools/testcase.py", line 719, in _run_test_method
    return self._get_test_method()()
  File "/run/build/maas/src/maasserver/tests/test_node_action.py", line 602, in test_Deploy_starts_node
    Deploy(node, user, request).execute()
  File "/run/build/maas/src/maasserver/node_action.py", line 172, in execute
    self._execute(*args, **kwargs)
  File "/run/build/maas/src/maasserver/node_action.py", line 493, in _execute
    raise NodeActionError(e)
maasserver.exceptions.NodeActionError: bionic has no kernels available.
======================================================================
ERROR: maasserver.tests.test_node_action.TestDeployAction.test_Deploy_allocates_node_if_node_not_already_allocated
----------------------------------------------------------------------
Traceback (most recent call last):
testtools.testresult.real._StringException: Empty attachments:
  Twisted logs

Traceback (most recent call last):
  File "/run/build/maas/src/maasserver/node_action.py", line 490, in _execute
    self.node.distro_series)
  File "/run/build/maas/src/maasserver/utils/osystems.py", line 565, in validate_hwe_kernel
    raise ValidationError('%s has no kernels available.' % distro_series)
django.core.exceptions.ValidationError: ['bionic has no kernels available.']

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/run/build/maas/src/maastesting/runtest.py", line 138, in _run_user
    result = function(*args, **kwargs)
  File "/home/ubuntu/.buildout/eggs/testtools-2.2.0-py3.6.egg/testtools/testcase.py", line 719, in _run_test_method
    return self._get_test_method()()
  File "/run/build/maas/src/maasserver/tests/test_node_action.py", line 836, in test_Deploy_allocates_node_if_node_not_already_allocated
    action.execute()
  File "/run/build/maas/src/maasserver/node_action.py", line 172, in execute
    self._execute(*args, **kwargs)
  File "/run/build/maas/src/maasserver/node_action.py", line 493, in _execute
    raise NodeActionError(e)
maasserver.exceptions.NodeActionError: bionic has no kernels available.

-------------------- >> begin captured logging << --------------------
maas.node: info: ...

Read more...

review: Needs Fixing
Revision history for this message
MAAS Lander (maas-lander) wrote :
~ltrager/maas:lp1822173 updated
5cf138a... by Lee Trager

Fix broken tests

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/node_action.py b/src/maasserver/node_action.py
2index 5402ea2..e969138 100644
3--- a/src/maasserver/node_action.py
4+++ b/src/maasserver/node_action.py
5@@ -1,4 +1,4 @@
6-# Copyright 2012-2018 Canonical Ltd. This software is licensed under the
7+# Copyright 2012-2019 Canonical Ltd. This software is licensed under the
8 # GNU Affero General Public License version 3 (see the file LICENSE).
9
10 """Node actions.
11@@ -44,6 +44,7 @@ from maasserver.exceptions import (
12 StaticIPAddressExhaustion,
13 )
14 from maasserver.models import (
15+ Config,
16 ResourcePool,
17 Tag,
18 Zone,
19@@ -476,6 +477,12 @@ class Deploy(NodeAction):
20 self.node.save()
21 except ValidationError as e:
22 raise NodeActionError(e)
23+ else:
24+ configs = Config.objects.get_configs(
25+ ['default_osystem', 'default_distro_series'])
26+ self.node.osystem = configs['default_osystem']
27+ self.node.distro_series = configs['default_distro_series']
28+ self.node.save()
29 try:
30 self.node.hwe_kernel = validate_hwe_kernel(
31 hwe_kernel, self.node.min_hwe_kernel,
32diff --git a/src/maasserver/tests/test_node_action.py b/src/maasserver/tests/test_node_action.py
33index 56ace53..8365260 100644
34--- a/src/maasserver/tests/test_node_action.py
35+++ b/src/maasserver/tests/test_node_action.py
36@@ -1,4 +1,4 @@
37-# Copyright 2012-2018 Canonical Ltd. This software is licensed under the
38+# Copyright 2012-2019 Canonical Ltd. This software is licensed under the
39 # GNU Affero General Public License version 3 (see the file LICENSE).
40
41 """Tests for node actions."""
42@@ -26,6 +26,7 @@ from maasserver.enum import (
43 )
44 from maasserver.exceptions import NodeActionError
45 from maasserver.models import (
46+ Config,
47 Event,
48 signals,
49 StaticIPAddress,
50@@ -65,10 +66,7 @@ from maasserver.node_status import (
51 )
52 from maasserver.permissions import NodePermission
53 from maasserver.testing.factory import factory
54-from maasserver.testing.osystems import (
55- make_osystem_with_releases,
56- make_usable_osystem,
57-)
58+from maasserver.testing.osystems import make_usable_osystem
59 from maasserver.testing.testcase import (
60 MAASServerTestCase,
61 MAASTransactionServerTestCase,
62@@ -598,6 +596,11 @@ class TestDeployAction(MAASServerTestCase):
63 mock_get_curtin_config = self.patch(
64 node_action_module, 'get_curtin_config')
65 mock_node_start = self.patch(node, 'start')
66+ osystem = make_usable_osystem(self)
67+ os_name = osystem["name"]
68+ release_name = osystem["releases"][0]["name"]
69+ Config.objects.set_config('default_osystem', os_name)
70+ Config.objects.set_config('default_distro_series', release_name)
71 Deploy(node, user, request).execute()
72 self.expectThat(
73 mock_get_curtin_config, MockCalledOnceWith(ANY, node))
74@@ -617,6 +620,11 @@ class TestDeployAction(MAASServerTestCase):
75 mock_get_curtin_config = self.patch(
76 node_action_module, 'get_curtin_config')
77 mock_get_curtin_config.side_effect = NodeActionError('error')
78+ osystem = make_usable_osystem(self)
79+ os_name = osystem["name"]
80+ release_name = osystem["releases"][0]["name"]
81+ Config.objects.set_config('default_osystem', os_name)
82+ Config.objects.set_config('default_distro_series', release_name)
83 error = self.assertRaises(
84 NodeActionError, Deploy(node, user, request).execute)
85 self.assertEqual(
86@@ -668,6 +676,31 @@ class TestDeployAction(MAASServerTestCase):
87 self.expectThat(
88 node.distro_series, Equals(release_name))
89
90+ def test_Deploy_sets_osystem_and_series_to_default(self):
91+ # Regression test for LP:1822173
92+ user = factory.make_User()
93+ request = factory.make_fake_request('/')
94+ request.user = user
95+ node = factory.make_Node(
96+ interface=True, status=NODE_STATUS.ALLOCATED,
97+ power_type='manual', owner=user)
98+ mock_get_curtin_config = self.patch(
99+ node_action_module, 'get_curtin_config')
100+ mock_node_start = self.patch(node, 'start')
101+ osystem = make_usable_osystem(self)
102+ os_name = osystem["name"]
103+ release_name = osystem["releases"][0]["name"]
104+ Config.objects.set_config('default_osystem', os_name)
105+ Config.objects.set_config('default_distro_series', release_name)
106+ Deploy(node, user, request).execute()
107+ self.expectThat(
108+ mock_get_curtin_config, MockCalledOnceWith(ANY, node))
109+ self.expectThat(
110+ mock_node_start, MockCalledOnceWith(user))
111+ self.expectThat(node.osystem, Equals(os_name))
112+ self.expectThat(
113+ node.distro_series, Equals(release_name))
114+
115 def test_Deploy_sets_install_kvm_and_osystem_series_if_specified(self):
116 user = factory.make_admin()
117 request = factory.make_fake_request('/')
118@@ -754,50 +787,6 @@ class TestDeployAction(MAASServerTestCase):
119 self.expectThat(
120 node.distro_series, Equals(release_name))
121
122- def test_Deploy_doesnt_set_osystem_and_series_if_os_missing(self):
123- user = factory.make_User()
124- request = factory.make_fake_request('/')
125- request.user = user
126- node = factory.make_Node(
127- interface=True, status=NODE_STATUS.ALLOCATED,
128- power_type='manual', owner=user)
129- mock_get_curtin_config = self.patch(
130- node_action_module, 'get_curtin_config')
131- mock_node_start = self.patch(node, 'start')
132- osystem = make_osystem_with_releases(self)
133- extra = {
134- "distro_series": osystem["releases"][0]["name"],
135- }
136- Deploy(node, user, request).execute(**extra)
137- self.expectThat(
138- mock_get_curtin_config, MockCalledOnceWith(ANY, node))
139- self.expectThat(
140- mock_node_start, MockCalledOnceWith(user))
141- self.expectThat(node.osystem, Equals(""))
142- self.expectThat(node.distro_series, Equals(""))
143-
144- def test_Deploy_doesnt_set_osystem_and_series_if_series_missing(self):
145- user = factory.make_User()
146- request = factory.make_fake_request('/')
147- request.user = user
148- node = factory.make_Node(
149- interface=True, status=NODE_STATUS.ALLOCATED,
150- power_type='manual', owner=user)
151- mock_get_curtin_config = self.patch(
152- node_action_module, 'get_curtin_config')
153- mock_node_start = self.patch(node, 'start')
154- osystem = make_osystem_with_releases(self)
155- extra = {
156- "osystem": osystem["name"],
157- }
158- Deploy(node, user, request).execute(**extra)
159- self.expectThat(
160- mock_get_curtin_config, MockCalledOnceWith(ANY, node))
161- self.expectThat(
162- mock_node_start, MockCalledOnceWith(user))
163- self.expectThat(node.osystem, Equals(""))
164- self.expectThat(node.distro_series, Equals(""))
165-
166 def test_Deploy_allocates_node_if_node_not_already_allocated(self):
167 user = factory.make_User()
168 request = factory.make_fake_request('/')
169@@ -806,6 +795,11 @@ class TestDeployAction(MAASServerTestCase):
170 mock_get_curtin_config = self.patch(
171 node_action_module, 'get_curtin_config')
172 mock_node_start = self.patch(node, 'start')
173+ osystem = make_usable_osystem(self)
174+ os_name = osystem["name"]
175+ release_name = osystem["releases"][0]["name"]
176+ Config.objects.set_config('default_osystem', os_name)
177+ Config.objects.set_config('default_distro_series', release_name)
178 action = Deploy(node, user, request)
179 action.execute()
180

Subscribers

People subscribed via source and target branches