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
diff --git a/src/maasserver/node_action.py b/src/maasserver/node_action.py
index 5402ea2..e969138 100644
--- a/src/maasserver/node_action.py
+++ b/src/maasserver/node_action.py
@@ -1,4 +1,4 @@
1# Copyright 2012-2018 Canonical Ltd. This software is licensed under the1# Copyright 2012-2019 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4"""Node actions.4"""Node actions.
@@ -44,6 +44,7 @@ from maasserver.exceptions import (
44 StaticIPAddressExhaustion,44 StaticIPAddressExhaustion,
45)45)
46from maasserver.models import (46from maasserver.models import (
47 Config,
47 ResourcePool,48 ResourcePool,
48 Tag,49 Tag,
49 Zone,50 Zone,
@@ -476,6 +477,12 @@ class Deploy(NodeAction):
476 self.node.save()477 self.node.save()
477 except ValidationError as e:478 except ValidationError as e:
478 raise NodeActionError(e)479 raise NodeActionError(e)
480 else:
481 configs = Config.objects.get_configs(
482 ['default_osystem', 'default_distro_series'])
483 self.node.osystem = configs['default_osystem']
484 self.node.distro_series = configs['default_distro_series']
485 self.node.save()
479 try:486 try:
480 self.node.hwe_kernel = validate_hwe_kernel(487 self.node.hwe_kernel = validate_hwe_kernel(
481 hwe_kernel, self.node.min_hwe_kernel,488 hwe_kernel, self.node.min_hwe_kernel,
diff --git a/src/maasserver/tests/test_node_action.py b/src/maasserver/tests/test_node_action.py
index 56ace53..8365260 100644
--- a/src/maasserver/tests/test_node_action.py
+++ b/src/maasserver/tests/test_node_action.py
@@ -1,4 +1,4 @@
1# Copyright 2012-2018 Canonical Ltd. This software is licensed under the1# Copyright 2012-2019 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4"""Tests for node actions."""4"""Tests for node actions."""
@@ -26,6 +26,7 @@ from maasserver.enum import (
26)26)
27from maasserver.exceptions import NodeActionError27from maasserver.exceptions import NodeActionError
28from maasserver.models import (28from maasserver.models import (
29 Config,
29 Event,30 Event,
30 signals,31 signals,
31 StaticIPAddress,32 StaticIPAddress,
@@ -65,10 +66,7 @@ from maasserver.node_status import (
65)66)
66from maasserver.permissions import NodePermission67from maasserver.permissions import NodePermission
67from maasserver.testing.factory import factory68from maasserver.testing.factory import factory
68from maasserver.testing.osystems import (69from maasserver.testing.osystems import make_usable_osystem
69 make_osystem_with_releases,
70 make_usable_osystem,
71)
72from maasserver.testing.testcase import (70from maasserver.testing.testcase import (
73 MAASServerTestCase,71 MAASServerTestCase,
74 MAASTransactionServerTestCase,72 MAASTransactionServerTestCase,
@@ -598,6 +596,11 @@ class TestDeployAction(MAASServerTestCase):
598 mock_get_curtin_config = self.patch(596 mock_get_curtin_config = self.patch(
599 node_action_module, 'get_curtin_config')597 node_action_module, 'get_curtin_config')
600 mock_node_start = self.patch(node, 'start')598 mock_node_start = self.patch(node, 'start')
599 osystem = make_usable_osystem(self)
600 os_name = osystem["name"]
601 release_name = osystem["releases"][0]["name"]
602 Config.objects.set_config('default_osystem', os_name)
603 Config.objects.set_config('default_distro_series', release_name)
601 Deploy(node, user, request).execute()604 Deploy(node, user, request).execute()
602 self.expectThat(605 self.expectThat(
603 mock_get_curtin_config, MockCalledOnceWith(ANY, node))606 mock_get_curtin_config, MockCalledOnceWith(ANY, node))
@@ -617,6 +620,11 @@ class TestDeployAction(MAASServerTestCase):
617 mock_get_curtin_config = self.patch(620 mock_get_curtin_config = self.patch(
618 node_action_module, 'get_curtin_config')621 node_action_module, 'get_curtin_config')
619 mock_get_curtin_config.side_effect = NodeActionError('error')622 mock_get_curtin_config.side_effect = NodeActionError('error')
623 osystem = make_usable_osystem(self)
624 os_name = osystem["name"]
625 release_name = osystem["releases"][0]["name"]
626 Config.objects.set_config('default_osystem', os_name)
627 Config.objects.set_config('default_distro_series', release_name)
620 error = self.assertRaises(628 error = self.assertRaises(
621 NodeActionError, Deploy(node, user, request).execute)629 NodeActionError, Deploy(node, user, request).execute)
622 self.assertEqual(630 self.assertEqual(
@@ -668,6 +676,31 @@ class TestDeployAction(MAASServerTestCase):
668 self.expectThat(676 self.expectThat(
669 node.distro_series, Equals(release_name))677 node.distro_series, Equals(release_name))
670678
679 def test_Deploy_sets_osystem_and_series_to_default(self):
680 # Regression test for LP:1822173
681 user = factory.make_User()
682 request = factory.make_fake_request('/')
683 request.user = user
684 node = factory.make_Node(
685 interface=True, status=NODE_STATUS.ALLOCATED,
686 power_type='manual', owner=user)
687 mock_get_curtin_config = self.patch(
688 node_action_module, 'get_curtin_config')
689 mock_node_start = self.patch(node, 'start')
690 osystem = make_usable_osystem(self)
691 os_name = osystem["name"]
692 release_name = osystem["releases"][0]["name"]
693 Config.objects.set_config('default_osystem', os_name)
694 Config.objects.set_config('default_distro_series', release_name)
695 Deploy(node, user, request).execute()
696 self.expectThat(
697 mock_get_curtin_config, MockCalledOnceWith(ANY, node))
698 self.expectThat(
699 mock_node_start, MockCalledOnceWith(user))
700 self.expectThat(node.osystem, Equals(os_name))
701 self.expectThat(
702 node.distro_series, Equals(release_name))
703
671 def test_Deploy_sets_install_kvm_and_osystem_series_if_specified(self):704 def test_Deploy_sets_install_kvm_and_osystem_series_if_specified(self):
672 user = factory.make_admin()705 user = factory.make_admin()
673 request = factory.make_fake_request('/')706 request = factory.make_fake_request('/')
@@ -754,50 +787,6 @@ class TestDeployAction(MAASServerTestCase):
754 self.expectThat(787 self.expectThat(
755 node.distro_series, Equals(release_name))788 node.distro_series, Equals(release_name))
756789
757 def test_Deploy_doesnt_set_osystem_and_series_if_os_missing(self):
758 user = factory.make_User()
759 request = factory.make_fake_request('/')
760 request.user = user
761 node = factory.make_Node(
762 interface=True, status=NODE_STATUS.ALLOCATED,
763 power_type='manual', owner=user)
764 mock_get_curtin_config = self.patch(
765 node_action_module, 'get_curtin_config')
766 mock_node_start = self.patch(node, 'start')
767 osystem = make_osystem_with_releases(self)
768 extra = {
769 "distro_series": osystem["releases"][0]["name"],
770 }
771 Deploy(node, user, request).execute(**extra)
772 self.expectThat(
773 mock_get_curtin_config, MockCalledOnceWith(ANY, node))
774 self.expectThat(
775 mock_node_start, MockCalledOnceWith(user))
776 self.expectThat(node.osystem, Equals(""))
777 self.expectThat(node.distro_series, Equals(""))
778
779 def test_Deploy_doesnt_set_osystem_and_series_if_series_missing(self):
780 user = factory.make_User()
781 request = factory.make_fake_request('/')
782 request.user = user
783 node = factory.make_Node(
784 interface=True, status=NODE_STATUS.ALLOCATED,
785 power_type='manual', owner=user)
786 mock_get_curtin_config = self.patch(
787 node_action_module, 'get_curtin_config')
788 mock_node_start = self.patch(node, 'start')
789 osystem = make_osystem_with_releases(self)
790 extra = {
791 "osystem": osystem["name"],
792 }
793 Deploy(node, user, request).execute(**extra)
794 self.expectThat(
795 mock_get_curtin_config, MockCalledOnceWith(ANY, node))
796 self.expectThat(
797 mock_node_start, MockCalledOnceWith(user))
798 self.expectThat(node.osystem, Equals(""))
799 self.expectThat(node.distro_series, Equals(""))
800
801 def test_Deploy_allocates_node_if_node_not_already_allocated(self):790 def test_Deploy_allocates_node_if_node_not_already_allocated(self):
802 user = factory.make_User()791 user = factory.make_User()
803 request = factory.make_fake_request('/')792 request = factory.make_fake_request('/')
@@ -806,6 +795,11 @@ class TestDeployAction(MAASServerTestCase):
806 mock_get_curtin_config = self.patch(795 mock_get_curtin_config = self.patch(
807 node_action_module, 'get_curtin_config')796 node_action_module, 'get_curtin_config')
808 mock_node_start = self.patch(node, 'start')797 mock_node_start = self.patch(node, 'start')
798 osystem = make_usable_osystem(self)
799 os_name = osystem["name"]
800 release_name = osystem["releases"][0]["name"]
801 Config.objects.set_config('default_osystem', os_name)
802 Config.objects.set_config('default_distro_series', release_name)
809 action = Deploy(node, user, request)803 action = Deploy(node, user, request)
810 action.execute()804 action.execute()
811805

Subscribers

People subscribed via source and target branches