baremetal-introspection: add manage_boot argument to start_introspection

Change-Id: Ia4240db1aacd658c3ad42eca2391fec880b4efd9
This commit is contained in:
Dmitry Tantsur
2019-09-10 13:33:24 +02:00
parent 4a6b5beb77
commit bf4a9c1e12
6 changed files with 77 additions and 27 deletions

View File

@@ -56,16 +56,23 @@ class Proxy(proxy.Proxy):
"""
return _introspect.Introspection.list(self, **query)
def start_introspection(self, node):
def start_introspection(self, node, manage_boot=None):
"""Create a new introspection from attributes.
:param node: The value can be either the name or ID of a node or
a :class:`~openstack.baremetal.v1.node.Node` instance.
:param bool manage_boot: Whether to manage boot parameters for the
node. Defaults to the server default (which is `True`).
:returns: :class:`~.introspection.Introspection` instance.
"""
node = self._get_resource(_node.Node, node)
return self._create(_introspect.Introspection, id=node.id)
res = _introspect.Introspection.new(connection=self._get_connection(),
id=node.id)
kwargs = {}
if manage_boot is not None:
kwargs['manage_boot'] = manage_boot
return res.create(self, **kwargs)
def get_introspection(self, introspection):
"""Get a specific introspection.

View File

@@ -1217,7 +1217,7 @@ class Resource(dict):
return actual
def create(self, session, prepend_key=True, base_path=None):
def create(self, session, prepend_key=True, base_path=None, **params):
"""Create a remote resource based on this instance.
:param session: The session to use for making this request.
@@ -1228,6 +1228,7 @@ class Resource(dict):
:param str base_path: Base part of the URI for creating resources, if
different from
:data:`~openstack.resource.Resource.base_path`.
:param dict params: Additional params to pass.
:return: This :class:`Resource` instance.
:raises: :exc:`~openstack.exceptions.MethodNotSupported` if
:data:`Resource.allow_create` is not set to ``True``.
@@ -1246,14 +1247,14 @@ class Resource(dict):
base_path=base_path)
response = session.put(request.url,
json=request.body, headers=request.headers,
microversion=microversion)
microversion=microversion, params=params)
elif self.create_method == 'POST':
request = self._prepare_request(requires_id=requires_id,
prepend_key=prepend_key,
base_path=base_path)
response = session.post(request.url,
json=request.body, headers=request.headers,
microversion=microversion)
microversion=microversion, params=params)
else:
raise exceptions.ResourceFailure(
msg="Invalid create method: %s" % self.create_method)

View File

@@ -297,7 +297,8 @@ class TestNodeCreate(base.TestCase):
self.assertIs(result, self.node)
self.session.post.assert_called_once_with(
mock.ANY, json={'driver': FAKE['driver']},
headers=mock.ANY, microversion=self.session.default_microversion)
headers=mock.ANY, microversion=self.session.default_microversion,
params={})
self.assertFalse(mock_prov.called)
def test_available_new_version(self, mock_prov):
@@ -313,7 +314,8 @@ class TestNodeCreate(base.TestCase):
self.assertIs(result, self.node)
self.session.post.assert_called_once_with(
mock.ANY, json={'driver': FAKE['driver']},
headers=mock.ANY, microversion=self.session.default_microversion)
headers=mock.ANY, microversion=self.session.default_microversion,
params={})
mock_prov.assert_has_calls([
mock.call(self.node, self.session, 'manage', wait=True),
mock.call(self.node, self.session, 'provide', wait=True)
@@ -335,7 +337,8 @@ class TestNodeCreate(base.TestCase):
self.assertIs(result, self.node)
self.session.post.assert_called_once_with(
mock.ANY, json={'driver': FAKE['driver']},
headers=mock.ANY, microversion=self.session.default_microversion)
headers=mock.ANY, microversion=self.session.default_microversion,
params={})
self.assertFalse(mock_prov.called)
def test_no_manageable_in_old_version(self, mock_prov):
@@ -354,7 +357,8 @@ class TestNodeCreate(base.TestCase):
self.assertIs(result, self.node)
self.session.post.assert_called_once_with(
mock.ANY, json={'driver': FAKE['driver']},
headers=mock.ANY, microversion=self.session.default_microversion)
headers=mock.ANY, microversion=self.session.default_microversion,
params={})
mock_prov.assert_called_once_with(self.node, self.session, 'manage',
wait=True)
@@ -367,7 +371,8 @@ class TestNodeCreate(base.TestCase):
self.assertIs(result, self.node)
self.session.post.assert_called_once_with(
mock.ANY, json={'driver': FAKE['driver']},
headers=mock.ANY, microversion=self.session.default_microversion)
headers=mock.ANY, microversion=self.session.default_microversion,
params={})
mock_prov.assert_called_once_with(self.node, self.session, 'manage',
wait=True)

View File

@@ -22,24 +22,40 @@ from openstack.tests.unit import base
from openstack.tests.unit import test_proxy_base
@mock.patch.object(introspection.Introspection, 'create', autospec=True)
class TestStartIntrospection(base.TestCase):
def setUp(self):
super(TestStartIntrospection, self).setUp()
self.session = mock.Mock(spec=adapter.Adapter)
self.proxy = _proxy.Proxy(self.session)
def test_create_introspection(self, mock_create):
self.proxy.start_introspection('abcd')
mock_create.assert_called_once_with(mock.ANY, self.proxy)
introspect = mock_create.call_args[0][0]
self.assertEqual('abcd', introspect.id)
def test_create_introspection_with_node(self, mock_create):
self.proxy.start_introspection(_node.Node(id='abcd'))
mock_create.assert_called_once_with(mock.ANY, self.proxy)
introspect = mock_create.call_args[0][0]
self.assertEqual('abcd', introspect.id)
def test_create_introspection_manage_boot(self, mock_create):
self.proxy.start_introspection('abcd', manage_boot=False)
mock_create.assert_called_once_with(mock.ANY, self.proxy,
manage_boot=False)
introspect = mock_create.call_args[0][0]
self.assertEqual('abcd', introspect.id)
class TestBaremetalIntrospectionProxy(test_proxy_base.TestProxyBase):
def setUp(self):
super(TestBaremetalIntrospectionProxy, self).setUp()
self.proxy = _proxy.Proxy(self.session)
def test_create_introspection(self):
self.verify_create(self.proxy.start_introspection,
introspection.Introspection,
method_kwargs={'node': 'abcd'},
expected_kwargs={'id': 'abcd'})
def test_create_introspection_with_node(self):
self.verify_create(self.proxy.start_introspection,
introspection.Introspection,
method_kwargs={'node': _node.Node(id='abcd')},
expected_kwargs={'id': 'abcd'})
def test_get_introspection(self):
self.verify_get(self.proxy.get_introspection,
introspection.Introspection)

View File

@@ -96,7 +96,7 @@ class TestProxyBase(base.TestCase):
expected_result="result", **kwargs):
the_kwargs = {"x": 1, "y": 2, "z": 3}
method_kwargs = kwargs.pop("method_kwargs", the_kwargs)
expected_args = [resource_type]
expected_args = kwargs.pop('expected_args', [resource_type])
# Default the_kwargs should be copied, since we might need to extend it
expected_kwargs = kwargs.pop("expected_kwargs", the_kwargs.copy())
expected_kwargs["base_path"] = kwargs.pop("base_path", None)

View File

@@ -1372,14 +1372,15 @@ class TestResourceActions(base.TestCase):
self.session.get_endpoint_data.return_value = self.endpoint_data
def _test_create(self, cls, requires_id=False, prepend_key=False,
microversion=None, base_path=None):
microversion=None, base_path=None, params=None):
id = "id" if requires_id else None
sot = cls(id=id)
sot._prepare_request = mock.Mock(return_value=self.request)
sot._translate_response = mock.Mock()
params = params or {}
result = sot.create(self.session, prepend_key=prepend_key,
base_path=base_path)
base_path=base_path, **params)
sot._prepare_request.assert_called_once_with(
requires_id=requires_id, prepend_key=prepend_key,
@@ -1388,12 +1389,12 @@ class TestResourceActions(base.TestCase):
self.session.put.assert_called_once_with(
self.request.url,
json=self.request.body, headers=self.request.headers,
microversion=microversion)
microversion=microversion, params=params)
else:
self.session.post.assert_called_once_with(
self.request.url,
json=self.request.body, headers=self.request.headers,
microversion=microversion)
microversion=microversion, params=params)
self.assertEqual(sot.microversion, microversion)
sot._translate_response.assert_called_once_with(self.response,
@@ -1420,6 +1421,16 @@ class TestResourceActions(base.TestCase):
self._test_create(Test, requires_id=True, prepend_key=True,
microversion='1.42')
def test_put_create_with_params(self):
class Test(resource.Resource):
service = self.service_name
base_path = self.base_path
allow_create = True
create_method = 'PUT'
self._test_create(Test, requires_id=True, prepend_key=True,
params={'answer': 42})
def test_post_create(self):
class Test(resource.Resource):
service = self.service_name
@@ -1439,6 +1450,16 @@ class TestResourceActions(base.TestCase):
self._test_create(Test, requires_id=False, prepend_key=True,
base_path='dummy')
def test_post_create_with_params(self):
class Test(resource.Resource):
service = self.service_name
base_path = self.base_path
allow_create = True
create_method = 'POST'
self._test_create(Test, requires_id=False, prepend_key=True,
params={'answer': 42})
def test_fetch(self):
result = self.sot.fetch(self.session)