tackerclient: api for vnfd, vnd

Change-Id: I5c8c1f768471ead9c09c0cac8e90241a702c63b4
This commit is contained in:
Isaku Yamahata
2015-05-01 14:52:42 -07:00
parent 480a86f605
commit 34c5f67338
3 changed files with 108 additions and 82 deletions

View File

@@ -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='<key>=<value>',
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

View File

@@ -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

View File

@@ -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]}