Support of UpdateVNF command in openstackclient

Supported UpdateVNF command in OpenStack Tacker Client.

Change-Id: I20435547e6072c4ca14a5d2cccd7ab77bfea08f8
This commit is contained in:
Koichi Edagawa
2020-08-21 17:31:53 +09:00
parent 55ea58fea8
commit 60c268f04d
5 changed files with 172 additions and 3 deletions

View File

@@ -91,3 +91,4 @@ openstack.tackerclient.v1 =
vnflcm_terminate = tackerclient.osc.v1.vnflcm.vnflcm:TerminateVnfLcm
vnflcm_delete = tackerclient.osc.v1.vnflcm.vnflcm:DeleteVnfLcm
vnflcm_heal = tackerclient.osc.v1.vnflcm.vnflcm:HealVnfLcm
vnflcm_update = tackerclient.osc.v1.vnflcm.vnflcm:UpdateVnfLcm

View File

@@ -0,0 +1,5 @@
{
"vnfInstanceName": "sample",
"vnfInstanceDescription" : "sample_description",
"vnfdId" : "sample_id"
}

View File

@@ -111,7 +111,7 @@ class CreateVnfLcm(command.ShowOne):
body = {}
if file_path:
return instantiate_vnf_args2body(file_path)
return jsonfile2body(file_path)
body['vnfdId'] = parsed_args.vnfd_id
@@ -182,7 +182,7 @@ class ListVnfLcm(command.Lister):
) for s in vnf_instances))
def instantiate_vnf_args2body(file_path):
def jsonfile2body(file_path):
if file_path is not None and os.access(file_path, os.R_OK) is False:
msg = _("File %s does not exist or user does not have read "
@@ -224,7 +224,7 @@ class InstantiateVnfLcm(command.Command):
def take_action(self, parsed_args):
client = self.app.client_manager.tackerclient
result = client.instantiate_vnf_instance(
parsed_args.vnf_instance, instantiate_vnf_args2body(
parsed_args.vnf_instance, jsonfile2body(
parsed_args.instantiation_request_file))
if not result:
print((_('Instantiate request for VNF Instance %(id)s has been'
@@ -407,3 +407,61 @@ class DeleteVnfLcm(command.Command):
else:
print(_("Vnf instance '%s' deleted "
"successfully") % vnf_instances[0])
class UpdateVnfLcm(command.Command):
_description = _("Update VNF Instance")
def get_parser(self, prog_name):
"""Add arguments to parser.
Args:
prog_name ([string]): program name
Returns:
parser([ArgumentParser]): [description]
"""
parser = super(UpdateVnfLcm, self).get_parser(prog_name)
parser.add_argument(
_VNF_INSTANCE,
metavar="<vnf-instance>",
help=_('VNF instance ID to update.'))
parser.add_argument(
'--I',
metavar="<param-file>",
help=_("Specify update request parameters in a json file."))
return parser
def args2body(self, file_path=None):
"""Call jsonfile2body to store request body to body(dict)
Args:
file_path ([string], optional): file path of param file(json).
Defaults to None.
Returns:
body ([dict]): Request body is stored
"""
body = {}
if file_path:
return jsonfile2body(file_path)
return body
def take_action(self, parsed_args):
"""Execute update_vnf_instance and output result comment
Args:
parsed_args ([Namespace]): [description]
"""
client = self.app.client_manager.tackerclient
if parsed_args.I:
# Update VNF instance.
result = client.update_vnf_instance(
parsed_args.vnf_instance,
self.args2body(file_path=parsed_args.I))
if not result:
print((_('Update vnf:%(id)s ') %
{'id': parsed_args.vnf_instance}))

View File

@@ -554,3 +554,101 @@ class TestDeleteVnfLcm(TestVnfLcm):
self.assertEqual('Failed to delete 1 of 3 vnf instances.',
exception.message)
class TestUpdateVnfLcm(TestVnfLcm):
def setUp(self):
super(TestUpdateVnfLcm, self).setUp()
self.update_vnf_lcm = vnflcm.UpdateVnfLcm(
self.app, self.app_args, cmd_name='vnflcm modify')
def test_take_action(self):
vnf_instance = vnflcm_fakes.vnf_instance_response()
sample_param_file = ("./tackerclient/osc/v1/vnflcm/samples/"
"update_vnf_instance_param_sample.json")
arglist = [vnf_instance['id'], '--I', sample_param_file]
verifylist = [('vnf_instance', vnf_instance['id']),
('I', sample_param_file)]
# command param
parsed_args = self.check_parser(
self.update_vnf_lcm, arglist, verifylist)
url = os.path.join(
self.url,
'vnflcm/v1/vnf_instances',
vnf_instance['id'])
self.requests_mock.register_uri(
'PATCH', url, headers=self.header, json={})
sys.stdout = buffer = StringIO()
self.update_vnf_lcm.take_action(parsed_args)
actual_message = buffer.getvalue().strip()
expected_message = ('Update vnf:' + vnf_instance['id'])
self.assertEqual(expected_message, actual_message)
def test_take_action_param_file_not_exists(self):
vnf_instance = vnflcm_fakes.vnf_instance_response()
sample_param_file = "./not_exists.json"
arglist = [vnf_instance['id'], '--I', sample_param_file]
verifylist = [('vnf_instance', vnf_instance['id']),
('I', sample_param_file)]
# command param
parsed_args = self.check_parser(self.update_vnf_lcm, arglist,
verifylist)
ex = self.assertRaises(exceptions.InvalidInput,
self.update_vnf_lcm.take_action, parsed_args)
expected_msg = ("Invalid input: File %s does not exist "
"or user does not have read privileges to it")
self.assertEqual(expected_msg % sample_param_file, str(ex))
def test_take_action_vnf_instance_not_found(self):
vnf_instance = vnflcm_fakes.vnf_instance_response()
sample_param_file = ("./tackerclient/osc/v1/vnflcm/samples/"
"update_vnf_instance_param_sample.json")
arglist = [vnf_instance['id'], '--I', sample_param_file]
verifylist = [('vnf_instance', vnf_instance['id']),
('I', sample_param_file)]
# command param
parsed_args = self.check_parser(
self.update_vnf_lcm, arglist, verifylist)
url = os.path.join(
self.url,
'vnflcm/v1/vnf_instances',
vnf_instance['id'])
self.requests_mock.register_uri(
'PATCH', url, headers=self.header, status_code=404, json={})
self.assertRaises(exceptions.TackerClientException,
self.update_vnf_lcm.take_action,
parsed_args)
@mock.patch("os.open")
@mock.patch("os.access")
def test_take_action_invalid_format_param_file(self, mock_open,
mock_access):
vnf_instance = vnflcm_fakes.vnf_instance_response()
sample_param_file = "./invalid_param_file.json"
arglist = [vnf_instance['id'], '--I', sample_param_file]
verifylist = [('vnf_instance', vnf_instance['id']),
('I', sample_param_file)]
mock_open.return_value = "invalid_json_data"
# command param
parsed_args = self.check_parser(self.update_vnf_lcm, arglist,
verifylist)
ex = self.assertRaises(exceptions.InvalidInput,
self.update_vnf_lcm.take_action,
parsed_args)
expected_msg = "Failed to load parameter file."
self.assertIn(expected_msg, str(ex))

View File

@@ -896,6 +896,10 @@ class VnfLCMClient(ClientBase):
def delete_vnf_instance(self, vnf_id):
return self.delete(self.vnf_instance_path % vnf_id)
@APIParamsCall
def update_vnf_instance(self, vnf_id, body):
return self.patch(self.vnf_instance_path % vnf_id, body=body)
class Client(object):
"""Unified interface to interact with multiple applications of tacker service.
@@ -1169,6 +1173,9 @@ class Client(object):
def delete_vnf_instance(self, vnf_id):
return self.vnf_lcm_client.delete_vnf_instance(vnf_id)
def update_vnf_instance(self, vnf_id, body):
return self.vnf_lcm_client.update_vnf_instance(vnf_id, body)
def update_vnf_package(self, vnf_package, body):
return self.vnf_package_client.update_vnf_package(vnf_package, body)