diff --git a/openstack/baremetal_introspection/v1/_proxy.py b/openstack/baremetal_introspection/v1/_proxy.py index 05b00964f..f3db88ade 100644 --- a/openstack/baremetal_introspection/v1/_proxy.py +++ b/openstack/baremetal_introspection/v1/_proxy.py @@ -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. diff --git a/openstack/resource.py b/openstack/resource.py index 3eb2da725..64d6a197e 100644 --- a/openstack/resource.py +++ b/openstack/resource.py @@ -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) diff --git a/openstack/tests/unit/baremetal/v1/test_node.py b/openstack/tests/unit/baremetal/v1/test_node.py index 234a7b25d..72335d670 100644 --- a/openstack/tests/unit/baremetal/v1/test_node.py +++ b/openstack/tests/unit/baremetal/v1/test_node.py @@ -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) diff --git a/openstack/tests/unit/baremetal_introspection/v1/test_proxy.py b/openstack/tests/unit/baremetal_introspection/v1/test_proxy.py index 272afad22..43a6b8311 100644 --- a/openstack/tests/unit/baremetal_introspection/v1/test_proxy.py +++ b/openstack/tests/unit/baremetal_introspection/v1/test_proxy.py @@ -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) diff --git a/openstack/tests/unit/test_proxy_base.py b/openstack/tests/unit/test_proxy_base.py index 4c293294f..f4f520dd2 100644 --- a/openstack/tests/unit/test_proxy_base.py +++ b/openstack/tests/unit/test_proxy_base.py @@ -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) diff --git a/openstack/tests/unit/test_resource.py b/openstack/tests/unit/test_resource.py index 1f59cf7e8..3b6581fcf 100644 --- a/openstack/tests/unit/test_resource.py +++ b/openstack/tests/unit/test_resource.py @@ -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)