From fc27717eb1a7fc4de63f04f14631f97cabc5095b Mon Sep 17 00:00:00 2001 From: Isaku Yamahata <isaku.yamahata@intel.com> Date: Fri, 1 May 2015 04:04:34 -0700 Subject: [PATCH] add vnf related command Change-Id: I781814432e4fc5fd57e54c75310cf6522a1c647d --- tackerclient/shell.py | 8 ++ tackerclient/tacker/v1_0/vm/vnf.py | 159 +++++++++++++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 tackerclient/tacker/v1_0/vm/vnf.py diff --git a/tackerclient/shell.py b/tackerclient/shell.py index 09611240..bd4d5ed6 100644 --- a/tackerclient/shell.py +++ b/tackerclient/shell.py @@ -48,6 +48,7 @@ from tackerclient.i18n import _ from tackerclient.tacker.v1_0 import extension from tackerclient.tacker.v1_0.vm import device from tackerclient.tacker.v1_0.vm import device_template +from tackerclient.tacker.v1_0.vm import vnf from tackerclient.tacker.v1_0.vm import vnfd from tackerclient.version import __version__ @@ -120,6 +121,13 @@ COMMAND_V1 = { 'vnfd-delete': vnfd.DeleteVNFD, 'vnfd-list': vnfd.ListVNFD, 'vnfd-show': vnfd.ShowVNFD, + + 'vnf-create': vnf.CreateVNF, + 'vnf-delete': vnf.DeleteVNF, + 'vnf-list': vnf.ListVNF, + 'vnf-show': vnf.ShowVNF, + # 'vnf-config-create' + # 'vnf-config-push' } COMMANDS = {'1.0': COMMAND_V1} diff --git a/tackerclient/tacker/v1_0/vm/vnf.py b/tackerclient/tacker/v1_0/vm/vnf.py new file mode 100644 index 00000000..390e0737 --- /dev/null +++ b/tackerclient/tacker/v1_0/vm/vnf.py @@ -0,0 +1,159 @@ +# +# Copyright 2013 Intel +# Copyright 2013 Isaku Yamahata <isaku.yamahata at intel com> +# <isaku.yamahata at gmail com> +# All Rights Reserved. +# +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +# @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' + + +class ListVNF(tackerV10.ListCommand): + """List device that belong to a given tenant.""" + + resource = _DEVICE + + +class ShowVNF(tackerV10.ShowCommand): + """show information of a given VNF.""" + + resource = _DEVICE + + +class CreateVNF(tackerV10.CreateCommand): + """create a VNF.""" + + resource = _DEVICE + + def add_known_arguments(self, parser): + parser.add_argument( + '--vnfd-id', + required=True, + help='vnfd id to instantiate vnf based on') + parser.add_argument( + '--attributes', + metavar='<key>=<value>', + action='append', + dest='attributes', + default=[], + help='instance specific argument') + + def args2body(self, parsed_args): + body = { + self.resource: { + 'template_id': parsed_args.vnfd_id, + } + } + if parsed_args.attributes: + try: + attributes = dict(key_value.split('=', 1) + for key_value in parsed_args.attributes) + except ValueError: + msg = (_('invalid argument for --attributes %s') % + parsed_args.attributes) + raise exceptions.TackerCLIError(msg) + if attributes: + body[self.resource]['attributes'] = attributes + + tackerV10.update_dict(parsed_args, body[self.resource], ['tenant_id']) + return body + + +class UpdateVNF(tackerV10.UpdateCommand): + """Update a given VNF.""" + + resource = _DEVICE + + def add_known_arguments(self, parser): + parser.add_argument( + '--attributes', + metavar='<key>=<value>', + action='append', + dest='attributes', + default=[], + help='instance specific argument') + + def args2body(self, parsed_args): + body = {self.resource: {}} + if parsed_args.attributes: + try: + attributes = dict(key_value.split('=', 1) + for key_value in parsed_args.attributes) + except ValueError: + msg = (_('invalid argument for --attributes %s') % + parsed_args.attributes) + raise exceptions.TackerCLIError(msg) + if attributes: + body[self.resource]['attributes'] = attributes + tackerV10.update_dict(parsed_args, body[self.resource], ['tenant_id']) + return body + + +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)