baremetal-introspection: add manage_boot argument to start_introspection
Change-Id: Ia4240db1aacd658c3ad42eca2391fec880b4efd9
This commit is contained in:
@@ -56,16 +56,23 @@ class Proxy(proxy.Proxy):
|
|||||||
"""
|
"""
|
||||||
return _introspect.Introspection.list(self, **query)
|
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.
|
"""Create a new introspection from attributes.
|
||||||
|
|
||||||
:param node: The value can be either the name or ID of a node or
|
:param node: The value can be either the name or ID of a node or
|
||||||
a :class:`~openstack.baremetal.v1.node.Node` instance.
|
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.
|
:returns: :class:`~.introspection.Introspection` instance.
|
||||||
"""
|
"""
|
||||||
node = self._get_resource(_node.Node, node)
|
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):
|
def get_introspection(self, introspection):
|
||||||
"""Get a specific introspection.
|
"""Get a specific introspection.
|
||||||
|
@@ -1217,7 +1217,7 @@ class Resource(dict):
|
|||||||
|
|
||||||
return actual
|
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.
|
"""Create a remote resource based on this instance.
|
||||||
|
|
||||||
:param session: The session to use for making this request.
|
: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
|
:param str base_path: Base part of the URI for creating resources, if
|
||||||
different from
|
different from
|
||||||
:data:`~openstack.resource.Resource.base_path`.
|
:data:`~openstack.resource.Resource.base_path`.
|
||||||
|
:param dict params: Additional params to pass.
|
||||||
:return: This :class:`Resource` instance.
|
:return: This :class:`Resource` instance.
|
||||||
:raises: :exc:`~openstack.exceptions.MethodNotSupported` if
|
:raises: :exc:`~openstack.exceptions.MethodNotSupported` if
|
||||||
:data:`Resource.allow_create` is not set to ``True``.
|
:data:`Resource.allow_create` is not set to ``True``.
|
||||||
@@ -1246,14 +1247,14 @@ class Resource(dict):
|
|||||||
base_path=base_path)
|
base_path=base_path)
|
||||||
response = session.put(request.url,
|
response = session.put(request.url,
|
||||||
json=request.body, headers=request.headers,
|
json=request.body, headers=request.headers,
|
||||||
microversion=microversion)
|
microversion=microversion, params=params)
|
||||||
elif self.create_method == 'POST':
|
elif self.create_method == 'POST':
|
||||||
request = self._prepare_request(requires_id=requires_id,
|
request = self._prepare_request(requires_id=requires_id,
|
||||||
prepend_key=prepend_key,
|
prepend_key=prepend_key,
|
||||||
base_path=base_path)
|
base_path=base_path)
|
||||||
response = session.post(request.url,
|
response = session.post(request.url,
|
||||||
json=request.body, headers=request.headers,
|
json=request.body, headers=request.headers,
|
||||||
microversion=microversion)
|
microversion=microversion, params=params)
|
||||||
else:
|
else:
|
||||||
raise exceptions.ResourceFailure(
|
raise exceptions.ResourceFailure(
|
||||||
msg="Invalid create method: %s" % self.create_method)
|
msg="Invalid create method: %s" % self.create_method)
|
||||||
|
@@ -297,7 +297,8 @@ class TestNodeCreate(base.TestCase):
|
|||||||
self.assertIs(result, self.node)
|
self.assertIs(result, self.node)
|
||||||
self.session.post.assert_called_once_with(
|
self.session.post.assert_called_once_with(
|
||||||
mock.ANY, json={'driver': FAKE['driver']},
|
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)
|
self.assertFalse(mock_prov.called)
|
||||||
|
|
||||||
def test_available_new_version(self, mock_prov):
|
def test_available_new_version(self, mock_prov):
|
||||||
@@ -313,7 +314,8 @@ class TestNodeCreate(base.TestCase):
|
|||||||
self.assertIs(result, self.node)
|
self.assertIs(result, self.node)
|
||||||
self.session.post.assert_called_once_with(
|
self.session.post.assert_called_once_with(
|
||||||
mock.ANY, json={'driver': FAKE['driver']},
|
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_prov.assert_has_calls([
|
||||||
mock.call(self.node, self.session, 'manage', wait=True),
|
mock.call(self.node, self.session, 'manage', wait=True),
|
||||||
mock.call(self.node, self.session, 'provide', 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.assertIs(result, self.node)
|
||||||
self.session.post.assert_called_once_with(
|
self.session.post.assert_called_once_with(
|
||||||
mock.ANY, json={'driver': FAKE['driver']},
|
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)
|
self.assertFalse(mock_prov.called)
|
||||||
|
|
||||||
def test_no_manageable_in_old_version(self, mock_prov):
|
def test_no_manageable_in_old_version(self, mock_prov):
|
||||||
@@ -354,7 +357,8 @@ class TestNodeCreate(base.TestCase):
|
|||||||
self.assertIs(result, self.node)
|
self.assertIs(result, self.node)
|
||||||
self.session.post.assert_called_once_with(
|
self.session.post.assert_called_once_with(
|
||||||
mock.ANY, json={'driver': FAKE['driver']},
|
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',
|
mock_prov.assert_called_once_with(self.node, self.session, 'manage',
|
||||||
wait=True)
|
wait=True)
|
||||||
|
|
||||||
@@ -367,7 +371,8 @@ class TestNodeCreate(base.TestCase):
|
|||||||
self.assertIs(result, self.node)
|
self.assertIs(result, self.node)
|
||||||
self.session.post.assert_called_once_with(
|
self.session.post.assert_called_once_with(
|
||||||
mock.ANY, json={'driver': FAKE['driver']},
|
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',
|
mock_prov.assert_called_once_with(self.node, self.session, 'manage',
|
||||||
wait=True)
|
wait=True)
|
||||||
|
|
||||||
|
@@ -22,24 +22,40 @@ from openstack.tests.unit import base
|
|||||||
from openstack.tests.unit import test_proxy_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):
|
class TestBaremetalIntrospectionProxy(test_proxy_base.TestProxyBase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestBaremetalIntrospectionProxy, self).setUp()
|
super(TestBaremetalIntrospectionProxy, self).setUp()
|
||||||
self.proxy = _proxy.Proxy(self.session)
|
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):
|
def test_get_introspection(self):
|
||||||
self.verify_get(self.proxy.get_introspection,
|
self.verify_get(self.proxy.get_introspection,
|
||||||
introspection.Introspection)
|
introspection.Introspection)
|
||||||
|
@@ -96,7 +96,7 @@ class TestProxyBase(base.TestCase):
|
|||||||
expected_result="result", **kwargs):
|
expected_result="result", **kwargs):
|
||||||
the_kwargs = {"x": 1, "y": 2, "z": 3}
|
the_kwargs = {"x": 1, "y": 2, "z": 3}
|
||||||
method_kwargs = kwargs.pop("method_kwargs", the_kwargs)
|
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
|
# Default the_kwargs should be copied, since we might need to extend it
|
||||||
expected_kwargs = kwargs.pop("expected_kwargs", the_kwargs.copy())
|
expected_kwargs = kwargs.pop("expected_kwargs", the_kwargs.copy())
|
||||||
expected_kwargs["base_path"] = kwargs.pop("base_path", None)
|
expected_kwargs["base_path"] = kwargs.pop("base_path", None)
|
||||||
|
@@ -1372,14 +1372,15 @@ class TestResourceActions(base.TestCase):
|
|||||||
self.session.get_endpoint_data.return_value = self.endpoint_data
|
self.session.get_endpoint_data.return_value = self.endpoint_data
|
||||||
|
|
||||||
def _test_create(self, cls, requires_id=False, prepend_key=False,
|
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
|
id = "id" if requires_id else None
|
||||||
sot = cls(id=id)
|
sot = cls(id=id)
|
||||||
sot._prepare_request = mock.Mock(return_value=self.request)
|
sot._prepare_request = mock.Mock(return_value=self.request)
|
||||||
sot._translate_response = mock.Mock()
|
sot._translate_response = mock.Mock()
|
||||||
|
|
||||||
|
params = params or {}
|
||||||
result = sot.create(self.session, prepend_key=prepend_key,
|
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(
|
sot._prepare_request.assert_called_once_with(
|
||||||
requires_id=requires_id, prepend_key=prepend_key,
|
requires_id=requires_id, prepend_key=prepend_key,
|
||||||
@@ -1388,12 +1389,12 @@ class TestResourceActions(base.TestCase):
|
|||||||
self.session.put.assert_called_once_with(
|
self.session.put.assert_called_once_with(
|
||||||
self.request.url,
|
self.request.url,
|
||||||
json=self.request.body, headers=self.request.headers,
|
json=self.request.body, headers=self.request.headers,
|
||||||
microversion=microversion)
|
microversion=microversion, params=params)
|
||||||
else:
|
else:
|
||||||
self.session.post.assert_called_once_with(
|
self.session.post.assert_called_once_with(
|
||||||
self.request.url,
|
self.request.url,
|
||||||
json=self.request.body, headers=self.request.headers,
|
json=self.request.body, headers=self.request.headers,
|
||||||
microversion=microversion)
|
microversion=microversion, params=params)
|
||||||
|
|
||||||
self.assertEqual(sot.microversion, microversion)
|
self.assertEqual(sot.microversion, microversion)
|
||||||
sot._translate_response.assert_called_once_with(self.response,
|
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,
|
self._test_create(Test, requires_id=True, prepend_key=True,
|
||||||
microversion='1.42')
|
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):
|
def test_post_create(self):
|
||||||
class Test(resource.Resource):
|
class Test(resource.Resource):
|
||||||
service = self.service_name
|
service = self.service_name
|
||||||
@@ -1439,6 +1450,16 @@ class TestResourceActions(base.TestCase):
|
|||||||
self._test_create(Test, requires_id=False, prepend_key=True,
|
self._test_create(Test, requires_id=False, prepend_key=True,
|
||||||
base_path='dummy')
|
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):
|
def test_fetch(self):
|
||||||
result = self.sot.fetch(self.session)
|
result = self.sot.fetch(self.session)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user