From caa4e135e275ce6b453557d701a78701690d57b4 Mon Sep 17 00:00:00 2001 From: Sahid Orentino Ferdjaoui Date: Fri, 21 Oct 2022 10:03:58 +0200 Subject: [PATCH] compute/server: add support of target state for evacuate API Related-To: bp/allowing-target-state-for-evacuate Signed-off-by: Sahid Orentino Ferdjaoui Change-Id: Ieb8681bb4fd4834666b7bdb31d0ea6339c396400 --- openstack/compute/v2/_proxy.py | 7 +++++-- openstack/compute/v2/server.py | 5 ++++- openstack/tests/unit/compute/v2/test_proxy.py | 8 +++++--- openstack/tests/unit/compute/v2/test_server.py | 4 ++-- .../add-target-state-for-evacuate-52be85c5c08f4109.yaml | 3 +++ 5 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 releasenotes/notes/add-target-state-for-evacuate-52be85c5c08f4109.yaml diff --git a/openstack/compute/v2/_proxy.py b/openstack/compute/v2/_proxy.py index 3f0373d1f..cab935ea9 100644 --- a/openstack/compute/v2/_proxy.py +++ b/openstack/compute/v2/_proxy.py @@ -944,7 +944,8 @@ class Proxy(proxy.Proxy): server = self._get_resource(_server.Server, server) server.unrescue(self) - def evacuate_server(self, server, host=None, admin_pass=None, force=None): + def evacuate_server(self, server, host=None, admin_pass=None, force=None, + target_state=None): """Evacuates a server from a failed host to a new host. :param server: Either the ID of a server or a @@ -956,11 +957,13 @@ class Proxy(proxy.Proxy): :param force: Force an evacuation by not verifying the provided destination host by the scheduler. (New in API version 2.29). + :param target_state: Set target state for the evacuated instance (New + in API version 2.94). :returns: None """ server = self._get_resource(_server.Server, server) server.evacuate(self, host=host, admin_pass=admin_pass, - force=force) + force=force, target_state=target_state) def start_server(self, server): """Starts a stopped server and changes its state to ``ACTIVE``. diff --git a/openstack/compute/v2/server.py b/openstack/compute/v2/server.py index b8fb906f5..c7ca510db 100644 --- a/openstack/compute/v2/server.py +++ b/openstack/compute/v2/server.py @@ -459,7 +459,8 @@ class Server(resource.Resource, metadata.MetadataMixin, tag.TagMixin): body = {"unrescue": None} self._action(session, body) - def evacuate(self, session, host=None, admin_pass=None, force=None): + def evacuate(self, session, host=None, admin_pass=None, force=None, + target_state=None): body = {"evacuate": {}} if host is not None: body["evacuate"]["host"] = host @@ -467,6 +468,8 @@ class Server(resource.Resource, metadata.MetadataMixin, tag.TagMixin): body["evacuate"]["adminPass"] = admin_pass if force is not None: body["evacuate"]["force"] = force + if target_state is not None: + body["evacuate"]["targetState"] = target_state self._action(session, body) def start(self, session): diff --git a/openstack/tests/unit/compute/v2/test_proxy.py b/openstack/tests/unit/compute/v2/test_proxy.py index 4f6a4f60c..8255b7108 100644 --- a/openstack/tests/unit/compute/v2/test_proxy.py +++ b/openstack/tests/unit/compute/v2/test_proxy.py @@ -882,16 +882,18 @@ class TestCompute(TestComputeProxy): self.proxy.evacuate_server, method_args=["value"], expected_args=[self.proxy], - expected_kwargs={"host": None, "admin_pass": None, "force": None}) + expected_kwargs={"host": None, "admin_pass": None, "force": None, + "target_state": None}) def test_server_evacuate_with_options(self): self._verify( "openstack.compute.v2.server.Server.evacuate", self.proxy.evacuate_server, - method_args=["value", 'HOST2', 'NEW_PASS', True], + method_args=["value", 'HOST2', 'NEW_PASS', True, 'stopped'], expected_args=[self.proxy], expected_kwargs={ - "host": "HOST2", "admin_pass": 'NEW_PASS', "force": True}) + "host": "HOST2", "admin_pass": 'NEW_PASS', "force": True, + "target_state": 'stopped'}) def test_server_start(self): self._verify( diff --git a/openstack/tests/unit/compute/v2/test_server.py b/openstack/tests/unit/compute/v2/test_server.py index f677e21d5..174fbb6e4 100644 --- a/openstack/tests/unit/compute/v2/test_server.py +++ b/openstack/tests/unit/compute/v2/test_server.py @@ -735,12 +735,12 @@ class TestServer(base.TestCase): sot = server.Server(**EXAMPLE) res = sot.evacuate(self.sess, host='HOST2', admin_pass='NEW_PASS', - force=True) + force=True, target_state='stopped') self.assertIsNone(res) url = 'servers/IDENTIFIER/action' body = {"evacuate": {'host': 'HOST2', 'adminPass': 'NEW_PASS', - 'force': True}} + 'force': True, 'targetState': 'stopped'}} headers = {'Accept': ''} self.sess.post.assert_called_with( url, json=body, headers=headers, microversion=None) diff --git a/releasenotes/notes/add-target-state-for-evacuate-52be85c5c08f4109.yaml b/releasenotes/notes/add-target-state-for-evacuate-52be85c5c08f4109.yaml new file mode 100644 index 000000000..4580f378f --- /dev/null +++ b/releasenotes/notes/add-target-state-for-evacuate-52be85c5c08f4109.yaml @@ -0,0 +1,3 @@ +--- +features: + - Add support of setting target state for evacuate API.