Add force-delete into compute service

The exposed server delete is a soft action, which will cause unexpected
result if admin wants to delete the instance immediately. This patch
is to add interfaces for this purpose.

Change-Id: Ibfc4887e4bc367739b8945251e26d6d62117e3f2
This commit is contained in:
Cindia-blue 2016-08-09 14:05:07 +08:00
parent 64562c19d4
commit bd5d304d09
4 changed files with 30 additions and 3 deletions

View File

@ -322,7 +322,7 @@ class Proxy(proxy2.BaseProxy):
"""
return self._create(_server.Server, **attrs)
def delete_server(self, server, ignore_missing=True):
def delete_server(self, server, ignore_missing=True, force=False):
"""Delete a server
:param server: The value can be either the ID of a server or a
@ -331,11 +331,17 @@ class Proxy(proxy2.BaseProxy):
:class:`~openstack.exceptions.ResourceNotFound` will be
raised when the server does not exist.
When set to ``True``, no exception will be set when
attempting to delete a nonexistent server.
attempting to delete a nonexistent server
:param bool force: When set to ``True``, the server deletion will be
forced immediatly.
:returns: ``None``
"""
self._delete(_server.Server, server, ignore_missing=ignore_missing)
if force:
server = self._get_resource(_server.Server, server)
server.force_delete(self.session)
else:
self._delete(_server.Server, server, ignore_missing=ignore_missing)
def find_server(self, name_or_id, ignore_missing=True):
"""Find a single server

View File

@ -136,6 +136,11 @@ class Server(resource2.Resource, metadata.MetadataMixin):
body = {'reboot': {'type': reboot_type}}
self._action(session, body)
def force_delete(self, session):
"""Force delete a server."""
body = {'forceDelete': None}
self._action(session, body)
def rebuild(self, session, name, admin_password,
preserve_ephemeral=False, image=None,
access_ipv4=None, access_ipv6=None,

View File

@ -207,6 +207,11 @@ class TestComputeProxy(test_proxy_base2.TestProxyBase):
def test_server_delete_ignore(self):
self.verify_delete(self.proxy.delete_server, server.Server, True)
def test_server_force_delete(self):
self._verify("openstack.compute.v2.server.Server.force_delete",
self.proxy.delete_server,
method_args=["value", False, True])
def test_server_find(self):
self.verify_find(self.proxy.find_server, server.Server)

View File

@ -153,6 +153,17 @@ class TestServer(testtools.TestCase):
self.sess.post.assert_called_with(
url, endpoint_filter=sot.service, json=body, headers=headers)
def test_force_delete(self):
sot = server.Server(**EXAMPLE)
self.assertIsNone(sot.force_delete(self.sess))
url = 'servers/IDENTIFIER/action'
body = {'forceDelete': None}
headers = {'Accept': ''}
self.sess.post.assert_called_with(
url, endpoint_filter=sot.service, json=body, headers=headers)
def test_rebuild(self):
sot = server.Server(**EXAMPLE)
# Let the translate pass through, that portion is tested elsewhere