move physical_id check from engine object to profile layer

this patch revise node deletion process to move physical_id check
to profile layer, so that users could have more change to customize
this process.

for some cases we may not have the physical_id, but the server is
running in nova, or somewhere. In this cases, we may need to delete
server by server_name or metadata.

Change-Id: If0759561cca32aa39efa3245960d03a70219b963
This commit is contained in:
ruijie 2017-11-10 17:02:10 +08:00
parent 437ed4dfa5
commit c5a1eb1570
6 changed files with 42 additions and 19 deletions

View File

@ -229,14 +229,13 @@ class Node(object):
def do_delete(self, context):
self.set_status(context, consts.NS_DELETING, _('Deletion in progress'))
if self.physical_id:
try:
# The following operation always return True unless exception
# is thrown
pb.Profile.delete_object(context, self)
except exc.EResourceDeletion as ex:
self.set_status(context, consts.NS_ERROR, six.text_type(ex))
return False
try:
# The following operation always return True unless exception
# is thrown
pb.Profile.delete_object(context, self)
except exc.EResourceDeletion as ex:
self.set_status(context, consts.NS_ERROR, six.text_type(ex))
return False
no.Node.delete(context, self.id)
return True

View File

@ -189,6 +189,8 @@ class StackProfile(base.Profile):
:raises: `EResourceDeletion` if interaction with heat fails.
"""
stack_id = obj.physical_id
if not stack_id:
return True
ignore_missing = params.get('ignore_missing', True)
try:

View File

@ -873,10 +873,10 @@ class ServerProfile(base.Profile):
caught.
:raises: `EResourceDeletion` if interaction with compute service fails.
"""
if not obj.physical_id:
server_id = obj.physical_id
if not server_id:
return True
server_id = obj.physical_id
ignore_missing = params.get('ignore_missing', True)
internal_ports = obj.data.get('internal_ports', [])
force = params.get('force', False)

View File

@ -306,7 +306,7 @@ class TestNode(base.SenlinTestCase):
self.assertTrue(res)
mock_status.assert_called_once_with(self.context, consts.NS_DELETING,
"Deletion in progress")
self.assertFalse(mock_delete.called)
self.assertTrue(mock_delete.called)
mock_db_delete.assert_called_once_with(self.context, node.id)
@mock.patch.object(nodem.Node, 'set_status')

View File

@ -290,6 +290,20 @@ class TestHeatStackProfile(base.SenlinTestCase):
oc.stack_delete.assert_called_once_with('FAKE_ID', True)
oc.wait_for_stack_delete.assert_called_once_with('FAKE_ID')
def test_do_delete_no_physical_id(self):
profile = stack.StackProfile('t', self.spec)
oc = mock.Mock()
test_stack = mock.Mock(physical_id=None)
profile._orchestrationclient = oc
# do it
res = profile.do_delete(test_stack, ignore_missing=False)
# assertions
self.assertTrue(res)
self.assertFalse(oc.stack_delete.called)
self.assertFalse(oc.wait_for_stack_delete.called)
def test_do_delete_ignore_missing(self):
profile = stack.StackProfile('t', self.spec)
oc = mock.Mock()

View File

@ -542,6 +542,22 @@ class TestNovaServerBasic(base.SenlinTestCase):
cc.server_delete.assert_called_once_with('FAKE_ID', True)
cc.wait_for_server_delete.assert_called_once_with('FAKE_ID')
def test_do_delete_no_physical_id(self):
profile = server.ServerProfile('t', self.spec)
cc = mock.Mock()
profile._computeclient = cc
test_server = mock.Mock(physical_id=None)
# do it
res = profile.do_delete(test_server)
# assertions
self.assertTrue(res)
self.assertFalse(cc.server_delete.called)
self.assertFalse(cc.wait_for_server_delete.called)
@mock.patch.object(node_ob.Node, 'update')
def test_do_delete_ports_ok(self, mock_node_obj):
profile = server.ServerProfile('t', self.spec)
@ -590,14 +606,6 @@ class TestNovaServerBasic(base.SenlinTestCase):
cc.server_force_delete.assert_called_once_with('FAKE_ID', False)
cc.wait_for_server_delete.assert_called_once_with('FAKE_ID')
def test_do_delete_no_physical_id(self):
profile = server.ServerProfile('t', self.spec)
test_server = mock.Mock(physical_id=None)
res = profile.do_delete(test_server)
self.assertTrue(res)
def test_do_delete_with_delete_failure(self):
cc = mock.Mock()
profile = server.ServerProfile('t', self.spec)