Add command for update vnf package API

Added command support for updating vnf package.

Please see results here:-
http://paste.openstack.org/show/788463

Change-Id: I0cd32d531db569b7013332fcfaaaefde403e7aed
Implements: bp enhance-vnf-package-support-part1
This commit is contained in:
Shubham Potale 2019-12-23 19:30:37 +05:30 committed by Tushar Patil
parent 30ec46337b
commit af4d8343ad
6 changed files with 162 additions and 2 deletions

View File

@ -82,6 +82,7 @@ openstack.tackerclient.v1 =
vnf_package_show = tackerclient.osc.v1.vnfpkgm.vnf_package:ShowVnfPackage
vnf_package_upload = tackerclient.osc.v1.vnfpkgm.vnf_package:UploadVnfPackage
vnf_package_delete = tackerclient.osc.v1.vnfpkgm.vnf_package:DeleteVnfPackage
vnf_package_update = tackerclient.osc.v1.vnfpkgm.vnf_package:UpdateVnfPackage
vnflcm_create = tackerclient.osc.v1.vnflcm.vnflcm:CreateVnfLcm
vnflcm_show = tackerclient.osc.v1.vnflcm.vnflcm:ShowVnfLcm
vnflcm_list = tackerclient.osc.v1.vnflcm.vnflcm:ListVnfLcm

View File

@ -10,6 +10,10 @@
# License for the specific language governing permissions and limitations
# under the License.
import sys
from oslo_utils import encodeutils
def get_osc_show_columns_for_sdk_resource(
sdk_resource,
@ -100,3 +104,9 @@ class DictModel(dict):
def __str__(self):
pairs = ['%s=%s' % (k, v) for k, v in self.items()]
return ', '.join(sorted(pairs))
def exit(msg=None, exit_code=1):
if msg:
print(encodeutils.safe_decode(msg))
sys.exit(exit_code)

View File

@ -256,3 +256,64 @@ class DeleteVnfPackage(command.Command):
print((_('All specified %(resource)s(s) deleted successfully')
% {'resource': self.resource}))
return
class UpdateVnfPackage(command.ShowOne):
_description = _("Update information about an individual VNF package")
def get_parser(self, prog_name):
LOG.debug('get_parser(%s)', prog_name)
parser = super(UpdateVnfPackage, self).get_parser(prog_name)
parser.add_argument(
'vnf_package',
metavar="<vnf-package>",
help=_("VNF package ID")
)
parser.add_argument(
'--operational-state',
metavar="<operational-state>",
choices=['ENABLED', 'DISABLED'],
help=_("Change the operational state of VNF Package, Valid values"
" are 'ENABLED' or 'DISABLED'.")
)
parser.add_argument(
'--user-data',
metavar='<key=value>',
action=parseractions.KeyValueAction,
help=_('User defined data for the VNF package '
'(repeat option to set multiple user defined data)'),
)
return parser
def get_columns(self, updated_values):
column_map = {}
if updated_values.get('userDefinedData'):
column_map.update({'userDefinedData': 'User Defined Data'})
if updated_values.get('operationalState'):
column_map.update({'operationalState': 'Operational State'})
return sdk_utils.get_osc_show_columns_for_sdk_resource(updated_values,
column_map)
def args2body(self, parsed_args):
body = {}
if not parsed_args.user_data and not parsed_args.operational_state:
msg = ('Provide at least one of the argument from "--user-data"'
' or "--operational-state"')
sdk_utils.exit(msg)
if parsed_args.user_data:
body["userDefinedData"] = parsed_args.user_data
if parsed_args.operational_state:
body["operationalState"] = parsed_args.operational_state
return body
def take_action(self, parsed_args):
client = self.app.client_manager.tackerclient
updated_values = client.update_vnf_package(
parsed_args.vnf_package, self.args2body(parsed_args))
display_columns, columns = self.get_columns(updated_values)
data = utils.get_item_properties(
sdk_utils.DictModel(updated_values),
columns, mixed_case_fields=_mixed_case_fields)
return (display_columns, data)

View File

@ -39,8 +39,16 @@ def _create_zip():
def _get_columns_vnf_package(action='list', vnf_package_obj=None):
columns = ['ID', 'Onboarding State', 'Operational State', 'Usage State',
'User Defined Data', 'VNF Product Name']
columns = []
if action == 'update':
if vnf_package_obj.get('userDefinedData'):
columns.extend(['User Defined Data'])
if vnf_package_obj.get('operationalState'):
columns.extend(['Operational State'])
return columns
columns.extend(['ID', 'Onboarding State', 'Operational State',
'Usage State', 'User Defined Data', 'VNF Product Name'])
if action in ['show', 'create']:
if vnf_package_obj and vnf_package_obj[
@ -357,3 +365,59 @@ class TestUploadVnfPackage(TestVnfPackage):
self.assertEqual(error_message, exception.message)
# Delete temporary folder
shutil.rmtree(temp_dir)
@ddt.ddt
class TestUpdateVnfPackage(TestVnfPackage):
def setUp(self):
super(TestUpdateVnfPackage, self).setUp()
self.update_vnf_package = vnf_package.UpdateVnfPackage(
self.app, self.app_args, cmd_name='vnf package update')
@ddt.data((["--user-data", 'Test_key=Test_value',
"--operational-state", 'DISABLED'],
[('user_data', {'Test_key': 'Test_value'}),
('operational_state', 'DISABLED')]),
(["--user-data", 'Test_key=Test_value'],
[('user_data', {'Test_key': 'Test_value'})]),
(["--operational-state", 'DISABLED'],
[('operational_state', 'DISABLED')]))
@ddt.unpack
def test_take_action(self, arglist, verifylist):
vnf_package_obj = vnf_package_fakes.vnf_package_obj(
onboarded_state=True)
arglist.append(vnf_package_obj['id'])
verifylist.append(('vnf_package', vnf_package_obj['id']))
parsed_args = self.check_parser(self.update_vnf_package, arglist,
verifylist)
url = os.path.join(self.url, 'vnfpkgm/v1/vnf_packages',
vnf_package_obj['id'])
fake_response = vnf_package_fakes.get_fake_update_vnf_package_obj(
arglist)
self.requests_mock.register_uri('PATCH', url,
json=fake_response,
headers=self.header)
columns, data = self.update_vnf_package.take_action(parsed_args)
self.assertItemsEqual(_get_columns_vnf_package(
vnf_package_obj=fake_response, action='update'), columns)
self.assertItemsEqual(
vnf_package_fakes.get_vnf_package_data(fake_response), data)
def test_update_no_options(self):
self.assertRaises(base.ParserException, self.check_parser,
self.update_vnf_package, [], [])
def test_update_without_user_data_and_operational_state(self):
vnf_package_obj = vnf_package_fakes.vnf_package_obj(
onboarded_state=True)
arglist = [vnf_package_obj['id']]
verifylist = [('vnf_package', vnf_package_obj['id'])]
parsed_args = self.check_parser(self.update_vnf_package, arglist,
verifylist)
self.assertRaises(SystemExit, self.update_vnf_package.take_action,
parsed_args)

View File

@ -126,3 +126,16 @@ def create_vnf_packages(count=2):
unique_id = uuidutils.generate_uuid()
vnf_packages.append(vnf_package_obj(attrs={'id': unique_id}))
return {'vnf_packages': vnf_packages}
def get_fake_update_vnf_package_obj(arglist):
fake_update_vnf_package_dict = {}
if '--user-data' in arglist:
fake_update_vnf_package_dict.update(
{"userDefinedData": {'Test_key': 'Test_value'}})
if '--operational-state' in arglist:
fake_update_vnf_package_dict.update({
"operationalState": "DISABLED",
})
return fake_update_vnf_package_dict

View File

@ -313,6 +313,10 @@ class ClientBase(object):
return self.retry_request("PUT", action, body=body,
headers=headers, params=params)
def patch(self, action, body=None, headers=None, params=None):
return self.retry_request("PATCH", action, body=body,
headers=headers, params=params)
def list(self, collection, path, retrieve_all=True, **params):
if retrieve_all:
res = []
@ -781,6 +785,10 @@ class VnfPackageClient(ClientBase):
base_path=self.vnfpackages_path),
body=file_data)
@APIParamsCall
def update_vnf_package(self, vnf_package, body):
return self.patch(self.vnfpackage_path % vnf_package, body=body)
class VnfLCMClient(ClientBase):
"""Client for vnflcm APIs.
@ -1099,3 +1107,6 @@ class Client(object):
def delete_vnf_instance(self, vnf_id):
return self.vnf_lcm_client.delete_vnf_instance(vnf_id)
def update_vnf_package(self, vnf_package, body):
return self.vnf_package_client.update_vnf_package(vnf_package, body)