Add support for multi delete

Currently Tacker client support single resource(i.e VNFD, VNF or
VIM) deletion per call. With this fix, multiple VNFs, VNFDs or
VIMs can be deleted in a single client call.

Change-Id: I0819d94e14637d8e9d8a7b2afb5f948587e00ce0
This commit is contained in:
dharmendra 2016-08-02 14:24:17 +09:00
parent d8a6fa279a
commit 495ccbd2aa
9 changed files with 72 additions and 18 deletions

View File

@ -0,0 +1,3 @@
---
features:
- Add support for multi delete feature for resources.

View File

@ -500,7 +500,7 @@ class UpdateCommand(TackerCommand):
class DeleteCommand(TackerCommand):
"""Delete a given resource
"""Delete given resource(s)
"""
@ -508,34 +508,61 @@ class DeleteCommand(TackerCommand):
resource = None
log = None
allow_names = True
deleted_msg = {}
def get_parser(self, prog_name):
parser = super(DeleteCommand, self).get_parser(prog_name)
if self.allow_names:
help_str = _('ID or name of %s to delete')
help_str = _('IDs or names of %s to delete')
else:
help_str = _('ID of %s to delete')
help_str = _('IDs of %s to delete')
parser.add_argument(
'id', metavar=self.resource.upper(),
'ids', nargs='+',
metavar=self.resource.upper(),
help=help_str % self.resource)
return parser
def run(self, parsed_args):
self.log.debug('run(%s)', parsed_args)
failure = False
deleted_ids = []
failed_items = {}
tacker_client = self.get_client()
tacker_client.format = parsed_args.request_format
obj_deleter = getattr(tacker_client,
"delete_%s" % self.resource)
if self.allow_names:
_id = find_resourceid_by_name_or_id(tacker_client, self.resource,
parsed_args.id)
for resource_id in parsed_args.ids:
try:
if self.allow_names:
_id = find_resourceid_by_name_or_id(
tacker_client, self.resource, resource_id)
else:
_id = resource_id
obj_deleter(_id)
deleted_ids.append(resource_id)
except Exception as e:
failure = True
failed_items[resource_id] = e
if failure:
msg = ''
if deleted_ids:
status_msg = self.deleted_msg.get(self.resource, 'deleted')
msg = (_('Successfully %(status_msg)s %(resource)s(s):'
' %(deleted_list)s') % {'status_msg': status_msg,
'deleted_list':
', '.join(deleted_ids),
'resource': self.resource})
err_msg = _("\n\nUnable to delete the below"
" %s(s):") % self.resource
for failed_id, error in failed_items.iteritems():
err_msg += (_('\n Cannot delete %(failed_id)s: %(error)s')
% {'failed_id': failed_id,
'error': error})
msg += err_msg
raise exceptions.CommandError(msg)
else:
_id = parsed_args.id
obj_deleter(_id)
print((_('Deleted %(resource)s: %(id)s')
% {'id': parsed_args.id,
'resource': self.resource}),
file=self.app.stdout)
print((_('All %(resource)s(s) %(msg)s successfully')
% {'msg': self.deleted_msg.get(self.resource, 'deleted'),
'resource': self.resource}))
return

View File

@ -115,5 +115,5 @@ class UpdateVIM(tackerV10.UpdateCommand):
class DeleteVIM(tackerV10.DeleteCommand):
"""Delete a given VIM."""
"""Delete given VIM(s)."""
resource = _VIM

View File

@ -165,9 +165,10 @@ class UpdateVNF(tackerV10.UpdateCommand):
class DeleteVNF(tackerV10.DeleteCommand):
"""Delete a given VNF."""
"""Delete given VNF(s)."""
resource = _VNF
deleted_msg = {'vnf': 'delete initiated'}
class ListVNFResources(tackerV10.ListCommand):

View File

@ -80,7 +80,7 @@ class CreateVNFD(tackerV10.CreateCommand):
class DeleteVNFD(tackerV10.DeleteCommand):
"""Delete a given VNFD."""
"""Delete given VNFD(s)."""
resource = _VNFD

View File

@ -601,6 +601,7 @@ class CLITestV10Base(testtools.TestCase):
self.assertIn('myname', _str)
def _test_delete_resource(self, resource, cmd, myid, args):
deleted_msg = {'vnf': 'delete initiated'}
self.mox.StubOutWithMock(cmd, "get_client")
self.mox.StubOutWithMock(self.client.httpclient, "request")
cmd.get_client().MultipleTimes().AndReturn(self.client)
@ -617,7 +618,10 @@ class CLITestV10Base(testtools.TestCase):
self.mox.VerifyAll()
self.mox.UnsetStubs()
_str = self.fake_stdout.make_string()
self.assertIn(myid, _str)
msg = 'All %(resource)s(s) %(msg)s successfully\n' % {
'msg': deleted_msg.get(resource, 'deleted'),
'resource': resource}
self.assertEqual(msg, _str)
def _test_update_resource_action(self, resource, cmd, myid, action, args,
body, retval=None):

View File

@ -143,3 +143,9 @@ class CLITestV10VIMJSON(test_cli10.CLITestV10Base):
my_id = 'my-id'
args = [my_id]
self._test_delete_resource(self._RESOURCE, cmd, my_id, args)
def test_multi_delete_vim(self):
cmd = vim.DeleteVIM(test_cli10.MyApp(sys.stdout), None)
vim_ids = 'my-id1 my-id2 my-id3'
args = [vim_ids]
self._test_delete_resource(self._RESOURCE, cmd, vim_ids, args)

View File

@ -207,3 +207,9 @@ class CLITestV10VmVNFJSON(test_cli10.CLITestV10Base):
self.assertIn('id1', val)
self.assertIn('NeutronPort', val)
self.assertIn('CP11', val)
def test_multi_delete_vnf(self):
cmd = vnf.DeleteVNF(test_cli10.MyApp(sys.stdout), None)
vnf_ids = 'vnf1 vnf2 vnf3'
args = [vnf_ids]
self._test_delete_resource(self._RESOURCE, cmd, vnf_ids, args)

View File

@ -95,3 +95,10 @@ class CLITestV10VmVNFDJSON(test_cli10.CLITestV10Base):
my_id = 'my-id'
args = [my_id]
self._test_delete_resource(self._RESOURCE, cmd, my_id, args)
def test_multi_delete_vnfd(self):
cmd = vnfd.DeleteVNFD(
test_cli10.MyApp(sys.stdout), None)
vnfd_ids = 'my-id1 my-id2 my-id3'
args = [vnfd_ids]
self._test_delete_resource(self._RESOURCE, cmd, vnfd_ids, args)