From d64e020fd05c9c6c89f11b636a05f1ba675cb4d6 Mon Sep 17 00:00:00 2001 From: Dmitry Tantsur Date: Fri, 1 Mar 2019 15:38:24 +0100 Subject: [PATCH] Make resource class required Allocation API requires a resource class, so we have to require it now. Change-Id: Ic3729fb8aa02c82379eceb2a2555fc9c0ba9bc57 --- metalsmith/_cmd.py | 2 +- metalsmith/_provisioner.py | 6 +--- metalsmith/test/test_provisioner.py | 33 ++++++++----------- .../resource-class-1957e83fa8235641.yaml | 5 +++ roles/metalsmith_deployment/README.rst | 2 +- 5 files changed, 22 insertions(+), 26 deletions(-) create mode 100644 releasenotes/notes/resource-class-1957e83fa8235641.yaml diff --git a/metalsmith/_cmd.py b/metalsmith/_cmd.py index 752a417..7a81471 100644 --- a/metalsmith/_cmd.py +++ b/metalsmith/_cmd.py @@ -164,7 +164,7 @@ def _parse_args(args, config): deploy.add_argument('--ssh-public-key', help='SSH public key to load') deploy.add_argument('--hostname', help='Host name to use, defaults to ' 'Node\'s name or UUID') - deploy.add_argument('--resource-class', + deploy.add_argument('--resource-class', required=True, help='node resource class to deploy') deploy.add_argument('--conductor-group', help='conductor group to pick the node from') diff --git a/metalsmith/_provisioner.py b/metalsmith/_provisioner.py index 9f2c3be..d6f103c 100644 --- a/metalsmith/_provisioner.py +++ b/metalsmith/_provisioner.py @@ -64,7 +64,7 @@ class Provisioner(_utils.GetNodeMixin): self._dry_run = dry_run - def reserve_node(self, resource_class=None, conductor_group=None, + def reserve_node(self, resource_class, conductor_group=None, capabilities=None, traits=None, candidates=None, predicate=None): """Find and reserve a suitable node. @@ -91,10 +91,6 @@ class Provisioner(_utils.GetNodeMixin): :raises: :py:class:`metalsmith.exceptions.ReservationFailed` """ capabilities = capabilities or {} - if resource_class is None: - warnings.warn("Not providing resource_class is deprecated as it's " - "not compatible with the proposed allocation API", - DeprecationWarning) if candidates: nodes = [self._get_node(node) for node in candidates] diff --git a/metalsmith/test/test_provisioner.py b/metalsmith/test/test_provisioner.py index 46bde89..db1aef5 100644 --- a/metalsmith/test/test_provisioner.py +++ b/metalsmith/test/test_provisioner.py @@ -94,36 +94,29 @@ class Base(testtools.TestCase): class TestReserveNode(Base): + RSC = 'baremetal' + def _node(self, **kwargs): kwargs.setdefault('id', '000') kwargs.setdefault('properties', {'local_gb': 100}) kwargs.setdefault('instance_info', {}) kwargs.setdefault('instance_id', None) kwargs.setdefault('is_maintenance', False) + kwargs.setdefault('resource_class', self.RSC) return mock.Mock(spec=NODE_FIELDS, **kwargs) def test_no_nodes(self): self.api.baremetal.nodes.return_value = [] self.assertRaises(exceptions.NodesNotFound, - self.pr.reserve_node, resource_class='control') + self.pr.reserve_node, self.RSC) self.assertFalse(self.api.baremetal.update_node.called) def test_simple_ok(self): - nodes = [self._node(resource_class='control')] - self.api.baremetal.nodes.return_value = nodes - - node = self.pr.reserve_node('control') - - self.assertIn(node, nodes) - self.api.baremetal.update_node.assert_called_once_with( - node, instance_id=node.id, instance_info={}) - - def test_any_resource_class(self): nodes = [self._node()] self.api.baremetal.nodes.return_value = nodes - node = self.pr.reserve_node() + node = self.pr.reserve_node(self.RSC) self.assertIn(node, nodes) self.api.baremetal.update_node.assert_called_once_with( @@ -131,14 +124,13 @@ class TestReserveNode(Base): def test_with_capabilities(self): nodes = [ - self._node(properties={'local_gb': 100, 'capabilities': caps}, - resource_class='control') + self._node(properties={'local_gb': 100, 'capabilities': caps}) for caps in ['answer:1', 'answer:42', None] ] expected = nodes[1] self.api.baremetal.nodes.return_value = nodes - node = self.pr.reserve_node('control', capabilities={'answer': '42'}) + node = self.pr.reserve_node(self.RSC, capabilities={'answer': '42'}) self.assertIs(node, expected) self.api.baremetal.update_node.assert_called_once_with( @@ -152,7 +144,7 @@ class TestReserveNode(Base): expected = nodes[1] self.api.baremetal.nodes.return_value = nodes - node = self.pr.reserve_node(traits=['foo', 'answer:42']) + node = self.pr.reserve_node(self.RSC, traits=['foo', 'answer:42']) self.assertIs(node, expected) self.api.baremetal.update_node.assert_called_once_with( @@ -165,6 +157,7 @@ class TestReserveNode(Base): self.api.baremetal.nodes.return_value = nodes[:] node = self.pr.reserve_node( + self.RSC, predicate=lambda node: 100 < node.properties['local_gb'] < 200) self.assertEqual(node, nodes[1]) @@ -178,6 +171,7 @@ class TestReserveNode(Base): self.assertRaisesRegex(exceptions.CustomPredicateFailed, 'custom predicate', self.pr.reserve_node, + self.RSC, predicate=lambda node: False) self.assertFalse(self.api.baremetal.update_node.called) @@ -185,7 +179,7 @@ class TestReserveNode(Base): def test_provided_node(self): nodes = [self._node()] - node = self.pr.reserve_node(candidates=nodes) + node = self.pr.reserve_node(self.RSC, candidates=nodes) self.assertEqual(node, nodes[0]) self.assertFalse(self.api.baremetal.nodes.called) @@ -195,7 +189,7 @@ class TestReserveNode(Base): def test_provided_nodes(self): nodes = [self._node(), self._node()] - node = self.pr.reserve_node(candidates=nodes) + node = self.pr.reserve_node(self.RSC, candidates=nodes) self.assertEqual(node, nodes[0]) self.assertFalse(self.api.baremetal.nodes.called) @@ -227,7 +221,8 @@ class TestReserveNode(Base): 'capabilities': 'cat:meow'}, conductor_group='loc1')] - node = self.pr.reserve_node(conductor_group='loc1', + node = self.pr.reserve_node(self.RSC, + conductor_group='loc1', candidates=nodes, capabilities={'cat': 'meow'}) diff --git a/releasenotes/notes/resource-class-1957e83fa8235641.yaml b/releasenotes/notes/resource-class-1957e83fa8235641.yaml new file mode 100644 index 0000000..e77714e --- /dev/null +++ b/releasenotes/notes/resource-class-1957e83fa8235641.yaml @@ -0,0 +1,5 @@ +--- +upgrade: + - | + The ``resource_class`` argument to ``reserve_node``, as well as the + ``--resource-class`` CLI argument, are now required. diff --git a/roles/metalsmith_deployment/README.rst b/roles/metalsmith_deployment/README.rst index cee7810..2f20ca3 100644 --- a/roles/metalsmith_deployment/README.rst +++ b/roles/metalsmith_deployment/README.rst @@ -115,7 +115,7 @@ Each instances has the following attributes: - subnet: private-subnet1 ``resource_class`` (defaults to ``metalsmith_resource_class``) - requested node's resource class. + requested node's resource class. Mandatory. ``root_size`` (defaults to ``metalsmith_root_size``) size of the root partition (in GiB), if partition images are used.