From 34c5f673386c8a50c0940081b1cac2244f51d82f Mon Sep 17 00:00:00 2001 From: Isaku Yamahata Date: Fri, 1 May 2015 14:52:42 -0700 Subject: [PATCH] tackerclient: api for vnfd, vnd Change-Id: I5c8c1f768471ead9c09c0cac8e90241a702c63b4 --- tackerclient/tacker/v1_0/vm/vnf.py | 90 +++++++---------------------- tackerclient/tacker/v1_0/vm/vnfd.py | 20 +++---- tackerclient/v1_0/client.py | 80 +++++++++++++++++++++++++ 3 files changed, 108 insertions(+), 82 deletions(-) diff --git a/tackerclient/tacker/v1_0/vm/vnf.py b/tackerclient/tacker/v1_0/vm/vnf.py index 32bb7377..79022cc3 100644 --- a/tackerclient/tacker/v1_0/vm/vnf.py +++ b/tackerclient/tacker/v1_0/vm/vnf.py @@ -19,33 +19,30 @@ # # @author: Isaku Yamahata, Intel -import abc -import six - from tackerclient.common import exceptions from tackerclient.openstack.common.gettextutils import _ from tackerclient.tacker import v1_0 as tackerV10 -_DEVICE = 'device' +_VNF = 'vnf' class ListVNF(tackerV10.ListCommand): """List device that belong to a given tenant.""" - resource = _DEVICE + resource = _VNF class ShowVNF(tackerV10.ShowCommand): """show information of a given VNF.""" - resource = _DEVICE + resource = _VNF class CreateVNF(tackerV10.CreateCommand): """create a VNF.""" - resource = _DEVICE + resource = _VNF def add_known_arguments(self, parser): parser.add_argument( @@ -60,48 +57,45 @@ class CreateVNF(tackerV10.CreateCommand): help='specify config yaml file') def args2body(self, parsed_args): - body = { - self.resource: { - 'template_id': parsed_args.vnfd_id, - } - } + body = {self.resource: {}} if parsed_args.config_file: with open(parsed_args.config_file) as f: config_yaml = f.read() - body[self.resource]['attributes'] = {'config': config_yaml} + body[self.resource]['config'] = config_yaml if parsed_args.config: - body[self.resource]['attributes'] = {'config': parsed_args.config} + body[self.resource]['config'] = parsed_args.config - tackerV10.update_dict(parsed_args, body[self.resource], ['tenant_id']) + tackerV10.update_dict(parsed_args, body[self.resource], + ['tenant_id', 'vnfd_id']) return body class UpdateVNF(tackerV10.UpdateCommand): """Update a given VNF.""" - resource = _DEVICE + resource = _VNF def add_known_arguments(self, parser): parser.add_argument( - '--attributes', + '--configs', metavar='=', action='append', - dest='attributes', + dest='configs', default=[], - help='instance specific argument') + help='vnf specific config') def args2body(self, parsed_args): body = {self.resource: {}} - if parsed_args.attributes: + if parsed_args.configs: try: - attributes = dict(key_value.split('=', 1) - for key_value in parsed_args.attributes) + configs = dict(key_value.split('=', 1) + for key_value in parsed_args.attributes) except ValueError: - msg = (_('invalid argument for --attributes %s') % - parsed_args.attributes) + msg = (_('invalid argument for --configs %s') % + parsed_args.configs) raise exceptions.TackerCLIError(msg) - if attributes: - body[self.resource]['attributes'] = attributes + if configs: + body[self.resource]['configs'] = configs tackerV10.update_dict(parsed_args, body[self.resource], ['tenant_id']) return body @@ -109,46 +103,4 @@ class UpdateVNF(tackerV10.UpdateCommand): class DeleteVNF(tackerV10.DeleteCommand): """Delete a given VNF.""" - resource = _DEVICE - - -@six.add_metaclass(abc.ABCMeta) -class _XtachInterface(tackerV10.UpdateCommand): - resource = _DEVICE - - @abc.abstractmethod - def call_api(self, tacker_client, device_id, body): - pass - - def args2body(self, parsed_args): - body = { - 'port_id': parsed_args.port_id, - } - tackerV10.update_dict(parsed_args, body, []) - return body - - def get_parser(self, prog_name): - parser = super(AttachInterface, self).get_parser(prog_name) - parser.add_argument('port_id', metavar='PORT', - help=_('port to attach/detach')) - self.add_known_arguments(parser) - return parser - - def run(self, parsed_args): - tacker_client = self.get_client() - tacker_client.format = parsed_args.request_format - body = self.args2body(parsed_args) - _id = tackerV10.find_resourceid_by_name_or_id(tacker_client, - self.resource, - parsed_args.id) - self.call_api(tacker_client, _id, body) - - -class AttachInterface(_XtachInterface): - def call_api(self, tacker_client, device_id, body): - return tacker_client.attach_interface(device_id, body) - - -class DetachInterface(_XtachInterface): - def call_api(self, tacker_client, device_id, body): - return tacker_client.detach_interface(device_id, body) + resource = _VNF diff --git a/tackerclient/tacker/v1_0/vm/vnfd.py b/tackerclient/tacker/v1_0/vm/vnfd.py index d500e35b..38a9d69a 100644 --- a/tackerclient/tacker/v1_0/vm/vnfd.py +++ b/tackerclient/tacker/v1_0/vm/vnfd.py @@ -22,25 +22,25 @@ from tackerclient.tacker import v1_0 as tackerV10 -_DEVICE_TEMPLATE = "device_template" +_VNFD = "vnfd" class ListVNFD(tackerV10.ListCommand): """List VNFD that belong to a given tenant.""" - resource = _DEVICE_TEMPLATE + resource = _VNFD class ShowVNFD(tackerV10.ShowCommand): """show information of a given VNFD.""" - resource = _DEVICE_TEMPLATE + resource = _VNFD class CreateVNFD(tackerV10.CreateCommand): """create a VNFD.""" - resource = _DEVICE_TEMPLATE + resource = _VNFD def add_known_arguments(self, parser): parser.add_argument( @@ -57,19 +57,13 @@ class CreateVNFD(tackerV10.CreateCommand): help='specify vnfd') def args2body(self, parsed_args): - body = { - self.resource: { - 'service_types': [{'service_type': 'vnfd'}], - 'infra_driver': 'heat', - 'mgmt_driver': 'noop', - } - } + body = {self.resource: {}} if parsed_args.vnfd_file: with open(parsed_args.vnfd_file) as f: vnfd = f.read() if parsed_args.vnfd: vnfd = parsed_args.vnfd - body[self.resource]['attributes'] = {'vnfd': vnfd} + body[self.resource]['vnfd'] = vnfd tackerV10.update_dict(parsed_args, body[self.resource], ['tenant_id', 'name', 'description']) return body @@ -77,4 +71,4 @@ class CreateVNFD(tackerV10.CreateCommand): class DeleteVNFD(tackerV10.DeleteCommand): """Delete a given VNFD.""" - resource = _DEVICE_TEMPLATE + resource = _VNFD diff --git a/tackerclient/v1_0/client.py b/tackerclient/v1_0/client.py index ff0c4a8a..0202ee42 100644 --- a/tackerclient/v1_0/client.py +++ b/tackerclient/v1_0/client.py @@ -401,3 +401,83 @@ class Client(ClientBase): @APIParamsCall def detach_interface(self, device, body=None): return self.put(self.detach_interface_path % device, body) + + # VNFD + _DEVICE_TEMPLATE = "device_template" + _VNFD = "vnfd" + + @APIParamsCall + def list_vnfds(self, retrieve_all=True, **_params): + ret = self.list_device_templates(retrieve_all, **_params) + return {self._VNFD + 's': ret[self._DEVICE_TEMPLATE + 's']} + + @APIParamsCall + def show_vnfd(self, vnfd, **_params): + ret = self.show_device_template(vnfd, **_params) + return {self._VNFD: ret[self._DEVICE_TEMPLATE]} + + @APIParamsCall + def create_vnfd(self, body=None): + # e.g. + # body = {'vnfd': {'vnfd': 'yaml vnfd definition strings...'}} + if body is not None: + args = body[self._VNFD] + + args_ = { + 'service_types': [{'service_type': 'vnfd'}], + 'infra_driver': 'heat', + 'mgmt_driver': 'noop', + } + body_ = {self._DEVICE_TEMPLATE: args_} + if 'vnfd' in args: + args_['attributes'] = {'vnfd': args['vnfd']} + else: + body_ = None + + ret = self.create_device_template(body_) + return {self._VNFD: ret[self._DEVICE_TEMPLATE]} + + @APIParamsCall + def delete_vnfd(self, vnfd): + return self.delete_device_template(vnfd) + + # vnf + _DEVICE = "device" + _VNF = "vnf" + + @APIParamsCall + def list_vnfs(self, retrieve_all=True, **_params): + ret = self.list_devices(retrieve_all, **_params) + return {self._VNF + 's': ret[self._DEVICE + 's']} + + @APIParamsCall + def show_vnf(self, vnf, **_params): + ret = self.show_device(vnf, **_params) + return {self._VNF: ret[self._DEVICE]} + + @APIParamsCall + def create_vnf(self, body=None): + arg = body[self._VNF] + arg_ = { + 'tenant_id': arg['tenant_id'], + 'template_id': arg['vnfd_id'], + } + if 'config' in arg: + arg_['attributes'] = {'config': arg['config']} + body_ = {self._DEVICE: arg_} + ret = self.create_device(body_) + return {self._VNF: ret[self._DEVICE]} + + @APIParamsCall + def delete_vnf(self, vnf): + return self.delete_device(vnf) + + @APIParamsCall + def update_vnf(self, vnf, body=None): + args = body[self._VNF] + args_ = {'tenant_id': args['tenant_id']} + if 'configs' in args: + args_['attributes'] = args['configs'] + body_ = {self._DEVICE: body[self._VNF]} + ret = self.update_device(vnf, body_) + return {self._VNF: ret[self._DEVICE]}