From 6d04b0c3ced433f57a6a44158d975b143c03afc1 Mon Sep 17 00:00:00 2001 From: Rafael Castillo Date: Thu, 15 Sep 2022 11:25:52 -0700 Subject: [PATCH] compute: Adds shelve-offload support Change-Id: I74979ded4ded26382629611b5990229c9936e247 --- openstack/compute/v2/_proxy.py | 19 +++++++++++++++++++ openstack/compute/v2/server.py | 4 ++++ openstack/tests/unit/compute/v2/test_proxy.py | 8 ++++++++ .../tests/unit/compute/v2/test_server.py | 15 +++++++++++++++ .../add-shelve_offload-427f6550fc55e622.yaml | 4 ++++ 5 files changed, 50 insertions(+) create mode 100644 releasenotes/notes/add-shelve_offload-427f6550fc55e622.yaml diff --git a/openstack/compute/v2/_proxy.py b/openstack/compute/v2/_proxy.py index 7d4eb1095..8eb7c5ec3 100644 --- a/openstack/compute/v2/_proxy.py +++ b/openstack/compute/v2/_proxy.py @@ -1135,6 +1135,25 @@ class Proxy(proxy.Proxy): server = self._get_resource(_server.Server, server) server.shelve(self) + def shelve_offload_server(self, server): + """Shelve-offloads, or removes, a server + + Data and resource associations are deleted. + + Policy defaults enable only users with administrative role or the owner + of the server to perform this operation. Cloud provides could change + this permission though. + + Note that in some clouds, shelved servers are automatically offloaded, + sometimes after a certain time period. + + :param server: Either the ID of a server or a + :class:`~openstack.compute.v2.server.Server` instance. + :returns: None + """ + server = self._get_resource(_server.Server, server) + server.shelve_offload(self) + def unshelve_server(self, server): """Unshelves or restores a shelved server. diff --git a/openstack/compute/v2/server.py b/openstack/compute/v2/server.py index ddbc163e5..fb501e8eb 100644 --- a/openstack/compute/v2/server.py +++ b/openstack/compute/v2/server.py @@ -537,6 +537,10 @@ class Server(resource.Resource, metadata.MetadataMixin, tag.TagMixin): body = {"shelve": None} self._action(session, body) + def shelve_offload(self, session): + body = {"shelveOffload": None} + self._action(session, body) + def unshelve(self, session, availability_zone=_sentinel, host=None): """ Unshelve -- Unshelve the server. diff --git a/openstack/tests/unit/compute/v2/test_proxy.py b/openstack/tests/unit/compute/v2/test_proxy.py index b0afd8dd9..7bbb11cf3 100644 --- a/openstack/tests/unit/compute/v2/test_proxy.py +++ b/openstack/tests/unit/compute/v2/test_proxy.py @@ -1224,6 +1224,14 @@ class TestCompute(TestComputeProxy): expected_args=[self.proxy], ) + def test_server_shelve_offload(self): + self._verify( + "openstack.compute.v2.server.Server.shelve_offload", + self.proxy.shelve_offload_server, + method_args=["value"], + expected_args=[self.proxy], + ) + def test_server_unshelve(self): self._verify( "openstack.compute.v2.server.Server.unshelve", diff --git a/openstack/tests/unit/compute/v2/test_server.py b/openstack/tests/unit/compute/v2/test_server.py index 33ca69d96..88a545579 100644 --- a/openstack/tests/unit/compute/v2/test_server.py +++ b/openstack/tests/unit/compute/v2/test_server.py @@ -461,6 +461,21 @@ class TestServer(base.TestCase): microversion=self.sess.default_microversion, ) + def test_shelve_offload(self): + sot = server.Server(**EXAMPLE) + + self.assertIsNone(sot.shelve_offload(self.sess)) + + url = 'servers/IDENTIFIER/action' + body = {"shelveOffload": None} + headers = {'Accept': ''} + self.sess.post.assert_called_with( + url, + json=body, + headers=headers, + microversion=self.sess.default_microversion, + ) + def test_create_image_header(self): sot = server.Server(**EXAMPLE) name = 'noo' diff --git a/releasenotes/notes/add-shelve_offload-427f6550fc55e622.yaml b/releasenotes/notes/add-shelve_offload-427f6550fc55e622.yaml new file mode 100644 index 000000000..0162c0e55 --- /dev/null +++ b/releasenotes/notes/add-shelve_offload-427f6550fc55e622.yaml @@ -0,0 +1,4 @@ +--- +features: + - | + Adds shelve_offload_server method to the compute proxy