453 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			453 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# Copyright 2012 OpenStack Foundation.
 | 
						|
# 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.
 | 
						|
#
 | 
						|
 | 
						|
import json
 | 
						|
import logging
 | 
						|
import os
 | 
						|
 | 
						|
from heatclient.common import template_utils
 | 
						|
 | 
						|
from neutronclient._i18n import _
 | 
						|
from neutronclient.common import exceptions as exc
 | 
						|
from neutronclient.common import utils as n_utils
 | 
						|
from neutronclient.neutron import v2_0 as neutronV20
 | 
						|
 | 
						|
from gbpclient.common import utils
 | 
						|
 | 
						|
 | 
						|
class ListServiceChainInstance(neutronV20.ListCommand):
 | 
						|
    """List service chain instances that belong to a given tenant."""
 | 
						|
 | 
						|
    resource = 'servicechain_instance'
 | 
						|
    log = logging.getLogger(__name__ + '.ListServiceChainInstance')
 | 
						|
    _formatters = {}
 | 
						|
    list_columns = ['id', 'name', 'description', 'servicechain_spec', 'port']
 | 
						|
    pagination_support = True
 | 
						|
    sorting_support = True
 | 
						|
 | 
						|
 | 
						|
class ShowServiceChainInstance(neutronV20.ShowCommand):
 | 
						|
    """Show information of a given service chain instance."""
 | 
						|
 | 
						|
    resource = 'servicechain_instance'
 | 
						|
    log = logging.getLogger(__name__ + '.ShowServiceChainInstance')
 | 
						|
 | 
						|
 | 
						|
class CreateServiceChainInstance(neutronV20.CreateCommand):
 | 
						|
    """Create a service chain instance."""
 | 
						|
 | 
						|
    resource = 'servicechain_instance'
 | 
						|
    log = logging.getLogger(__name__ + '.CreateServiceChainInstance')
 | 
						|
 | 
						|
    def add_known_arguments(self, parser):
 | 
						|
        parser.add_argument(
 | 
						|
            'name',
 | 
						|
            help=_('Name for the Service Chain Instance.'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--description',
 | 
						|
            help=_('Description of the Service Chain Instance.'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--service-chain-spec', dest='servicechain_spec',
 | 
						|
            help=_('Service Chain Spec ID or the Service Chain Spec name'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--provider-ptg', dest='provider_ptg',
 | 
						|
            help=_('Destination Policy Target Group ID of the Provider.'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--consumer-ptg', dest='consumer_ptg',
 | 
						|
            help=_('Source Policy Target Group ID of the Consumer.'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--param-values', dest='param_values',
 | 
						|
            help=_('Name,Value pairs of Service Configuration Parameters for '
 | 
						|
                   'Service Chain Node.'))
 | 
						|
 | 
						|
    def args2body(self, parsed_args):
 | 
						|
        body = {self.resource: {}, }
 | 
						|
        if parsed_args.servicechain_spec:
 | 
						|
            body[self.resource]['servicechain_spec'] = \
 | 
						|
                neutronV20.find_resourceid_by_name_or_id(
 | 
						|
                    self.get_client(), 'servicechain_spec',
 | 
						|
                    parsed_args.servicechain_spec)
 | 
						|
        if parsed_args.provider_ptg:
 | 
						|
            body[self.resource]['provider_ptg'] = \
 | 
						|
                neutronV20.find_resourceid_by_name_or_id(
 | 
						|
                    self.get_client(), 'policy_target_group',
 | 
						|
                    parsed_args.provider_ptg)
 | 
						|
        if parsed_args.consumer_ptg:
 | 
						|
            body[self.resource]['consumer_ptg'] = \
 | 
						|
                neutronV20.find_resourceid_by_name_or_id(
 | 
						|
                    self.get_client(), 'policy_target_group',
 | 
						|
                    parsed_args.consumer_ptg)
 | 
						|
        neutronV20.update_dict(parsed_args, body[self.resource],
 | 
						|
                               ['name', 'tenant_id', 'description',
 | 
						|
                                'param_values'])
 | 
						|
        return body
 | 
						|
 | 
						|
 | 
						|
class UpdateServiceChainInstance(neutronV20.UpdateCommand):
 | 
						|
    """Update a given service chain instance."""
 | 
						|
 | 
						|
    resource = 'servicechain_instance'
 | 
						|
    log = logging.getLogger(__name__ + '.UpdateServiceChainInstance')
 | 
						|
 | 
						|
    def add_known_arguments(self, parser):
 | 
						|
        parser.add_argument(
 | 
						|
            '--service-chain-spec', dest='servicechain_spec',
 | 
						|
            help=_('Service Chain Spec ID or the Service Chain Spec name'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--provider-ptg', dest='provider_ptg',
 | 
						|
            help=_('Destination Policy Target Group ID of the Provider.'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--consumer-ptg', dest='consumer_ptg',
 | 
						|
            help=_('Source Policy Target Group ID of the Consumer.'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--param-values', dest='param_values',
 | 
						|
            help=_('Name,Value pairs of Service Configuration Parameters for '
 | 
						|
                   'Service Chain Node.'))
 | 
						|
 | 
						|
    def args2body(self, parsed_args):
 | 
						|
        body = {self.resource: {}, }
 | 
						|
        if parsed_args.servicechain_spec:
 | 
						|
            body[self.resource]['servicechain_spec'] = \
 | 
						|
                neutronV20.find_resourceid_by_name_or_id(
 | 
						|
                    self.get_client(), 'servicechain_spec',
 | 
						|
                    parsed_args.servicechain_spec)
 | 
						|
        if parsed_args.provider_ptg:
 | 
						|
            body[self.resource]['provider_ptg'] = \
 | 
						|
                neutronV20.find_resourceid_by_name_or_id(
 | 
						|
                    self.get_client(), 'policy_target_group',
 | 
						|
                    parsed_args.provider_ptg)
 | 
						|
        if parsed_args.consumer_ptg:
 | 
						|
            body[self.resource]['consumer_ptg'] = \
 | 
						|
                neutronV20.find_resourceid_by_name_or_id(
 | 
						|
                    self.get_client(), 'policy_target_group',
 | 
						|
                    parsed_args.consumer_ptg)
 | 
						|
        neutronV20.update_dict(parsed_args, body[self.resource],
 | 
						|
                               ['name', 'description', 'param_values'])
 | 
						|
        return body
 | 
						|
 | 
						|
 | 
						|
class DeleteServiceChainInstance(neutronV20.DeleteCommand):
 | 
						|
    """Delete a given service chain instance."""
 | 
						|
 | 
						|
    resource = 'servicechain_instance'
 | 
						|
    log = logging.getLogger(__name__ + '.DeleteServiceChainInstance')
 | 
						|
 | 
						|
 | 
						|
class ListServiceProfile(neutronV20.ListCommand):
 | 
						|
    """List service profiles that belong to a given tenant."""
 | 
						|
 | 
						|
    resource = 'service_profile'
 | 
						|
    log = logging.getLogger(__name__ + '.ListServiceProfile')
 | 
						|
    _formatters = {}
 | 
						|
    list_columns = ['id', 'name', 'description', 'service_type']
 | 
						|
    pagination_support = True
 | 
						|
    sorting_support = True
 | 
						|
 | 
						|
 | 
						|
class ShowServiceProfile(neutronV20.ShowCommand):
 | 
						|
    """Show information of a given service profile."""
 | 
						|
 | 
						|
    resource = 'service_profile'
 | 
						|
    log = logging.getLogger(__name__ + '.ShowServiceProfile')
 | 
						|
 | 
						|
 | 
						|
class CreateServiceProfile(neutronV20.CreateCommand):
 | 
						|
    """Create a service profile."""
 | 
						|
 | 
						|
    resource = 'service_profile'
 | 
						|
    log = logging.getLogger(__name__ + '.CreateServiceProfile')
 | 
						|
 | 
						|
    def add_known_arguments(self, parser):
 | 
						|
        parser.add_argument(
 | 
						|
            'name',
 | 
						|
            help=_('Name for the Service Profile.'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--description',
 | 
						|
            help=_('Description of the Service Profile.'))
 | 
						|
        n_utils.add_boolean_argument(
 | 
						|
            parser, '--shared', dest='shared',
 | 
						|
            help=_('Shared flag'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--vendor',
 | 
						|
            help=_('Vendor providing the service node'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--insertion-mode',
 | 
						|
            help=_('Insertion mode of the service'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--servicetype', dest='service_type',
 | 
						|
            help=_('Type of the service'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--service-flavor',
 | 
						|
            help=_('Flavor of the service'))
 | 
						|
 | 
						|
    def args2body(self, parsed_args):
 | 
						|
        body = {self.resource: {}, }
 | 
						|
        neutronV20.update_dict(parsed_args, body[self.resource],
 | 
						|
                               ['name', 'description', 'tenant_id', 'shared',
 | 
						|
                                'vendor', 'insertion_mode', 'service_type',
 | 
						|
                                'service_flavor'])
 | 
						|
        return body
 | 
						|
 | 
						|
 | 
						|
class UpdateServiceProfile(neutronV20.UpdateCommand):
 | 
						|
    """Update a given service profile."""
 | 
						|
 | 
						|
    resource = 'service_profile'
 | 
						|
    log = logging.getLogger(__name__ + '.UpdateServiceProfile')
 | 
						|
 | 
						|
    def add_known_arguments(self, parser):
 | 
						|
        parser.add_argument(
 | 
						|
            '--name',
 | 
						|
            help=_('Name for the Service Profile.'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--description',
 | 
						|
            help=_('Description of the Service Profile.'))
 | 
						|
        n_utils.add_boolean_argument(
 | 
						|
            parser, '--shared', dest='shared',
 | 
						|
            help=_('Shared flag'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--vendor',
 | 
						|
            help=_('Vendor providing the service node'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--insertion-mode',
 | 
						|
            help=_('Insertion mode of the service'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--servicetype', dest='service_type',
 | 
						|
            help=_('Type of the service'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--service-flavor',
 | 
						|
            help=_('Flavor of the service'))
 | 
						|
 | 
						|
    def args2body(self, parsed_args):
 | 
						|
        body = {self.resource: {}, }
 | 
						|
        neutronV20.update_dict(parsed_args, body[self.resource],
 | 
						|
                               ['name', 'description', 'shared', 'vendor',
 | 
						|
                                'insertion_mode', 'service_type',
 | 
						|
                                'service_flavor'])
 | 
						|
        return body
 | 
						|
 | 
						|
 | 
						|
class DeleteServiceProfile(neutronV20.DeleteCommand):
 | 
						|
    """Delete a given service profile."""
 | 
						|
 | 
						|
    resource = 'service_profile'
 | 
						|
    log = logging.getLogger(__name__ + '.DeleteServiceProfile')
 | 
						|
 | 
						|
 | 
						|
class ListServiceChainNode(neutronV20.ListCommand):
 | 
						|
    """List service chain nodes that belong to a given tenant."""
 | 
						|
 | 
						|
    resource = 'servicechain_node'
 | 
						|
    log = logging.getLogger(__name__ + '.ListServiceChainNode')
 | 
						|
    _formatters = {}
 | 
						|
    list_columns = ['id', 'name', 'description', 'service_type']
 | 
						|
    pagination_support = True
 | 
						|
    sorting_support = True
 | 
						|
 | 
						|
 | 
						|
class ShowServiceChainNode(neutronV20.ShowCommand):
 | 
						|
    """Show information of a given service chain node."""
 | 
						|
 | 
						|
    resource = 'servicechain_node'
 | 
						|
    log = logging.getLogger(__name__ + '.ShowServiceChainNode')
 | 
						|
 | 
						|
 | 
						|
class CreateServiceChainNode(neutronV20.CreateCommand):
 | 
						|
    """Create a service chain node."""
 | 
						|
 | 
						|
    resource = 'servicechain_node'
 | 
						|
    log = logging.getLogger(__name__ + '.CreateServiceChainNode')
 | 
						|
 | 
						|
    def add_known_arguments(self, parser):
 | 
						|
        parser.add_argument(
 | 
						|
            'name',
 | 
						|
            help=_('Name for the Service Chain Node.'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--description',
 | 
						|
            help=_('Description of the Service Chain Node.'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--servicetype', dest='service_type',
 | 
						|
            help=_('Service type ID or the Service Type name'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--service-profile',
 | 
						|
            help=_('Service Profile name or UUID'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--config',
 | 
						|
            help=_('Service Configuration for the Service Chain Node.'))
 | 
						|
        n_utils.add_boolean_argument(
 | 
						|
            parser, '--shared', dest='shared',
 | 
						|
            help=_('Shared flag'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--template-file',
 | 
						|
            help=_('Service Configuration Template for the Service Chain '
 | 
						|
                   'Node.'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--param-names', dest='param_names',
 | 
						|
            help=_('List of Configuration Parameter Names for Service '
 | 
						|
                   'Chain Node.'))
 | 
						|
 | 
						|
    def args2body(self, parsed_args):
 | 
						|
        body = {self.resource: {}, }
 | 
						|
        if parsed_args.service_profile:
 | 
						|
            body[self.resource]['service_profile_id'] = \
 | 
						|
                neutronV20.find_resourceid_by_name_or_id(
 | 
						|
                    self.get_client(), 'service_profile',
 | 
						|
                    parsed_args.service_profile)
 | 
						|
        if parsed_args.template_file:
 | 
						|
            if os.path.isfile(parsed_args.template_file):
 | 
						|
                tpl_files, template = template_utils.get_template_contents(
 | 
						|
                    parsed_args.template_file)
 | 
						|
                parsed_args.config = json.dumps(template)
 | 
						|
            else:
 | 
						|
                raise exc.NeutronClientException("File %s does not exist. "
 | 
						|
                                                 "Please check the path"
 | 
						|
                                                 % parsed_args.template_file)
 | 
						|
        neutronV20.update_dict(parsed_args, body[self.resource],
 | 
						|
                               ['name', 'service_type', 'config', 'shared',
 | 
						|
                                'tenant_id', 'param_names', 'description'])
 | 
						|
        return body
 | 
						|
 | 
						|
 | 
						|
class UpdateServiceChainNode(neutronV20.UpdateCommand):
 | 
						|
    """Update a given service chain node."""
 | 
						|
 | 
						|
    resource = 'servicechain_node'
 | 
						|
    log = logging.getLogger(__name__ + '.UpdateServiceChainNode')
 | 
						|
 | 
						|
    def add_known_arguments(self, parser):
 | 
						|
        parser.add_argument(
 | 
						|
            '--servicetype', dest='service_type',
 | 
						|
            help=_('Service type ID or the Service Type name'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--service-profile',
 | 
						|
            help=_('Service Profile name or UUID'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--config',
 | 
						|
            help=_('Service Configuration for the Service Chain Node.'))
 | 
						|
        n_utils.add_boolean_argument(
 | 
						|
            parser, '--shared', dest='shared',
 | 
						|
            help=_('Shared flag'))
 | 
						|
 | 
						|
    def args2body(self, parsed_args):
 | 
						|
        body = {self.resource: {}, }
 | 
						|
        if parsed_args.service_profile:
 | 
						|
            body[self.resource]['service_profile_id'] = \
 | 
						|
                neutronV20.find_resourceid_by_name_or_id(
 | 
						|
                    self.get_client(), 'service_profile',
 | 
						|
                    parsed_args.service_profile)
 | 
						|
        neutronV20.update_dict(parsed_args, body[self.resource],
 | 
						|
                               ['name', 'service_type', 'config', 'shared',
 | 
						|
                                'description'])
 | 
						|
        return body
 | 
						|
 | 
						|
 | 
						|
class DeleteServiceChainNode(neutronV20.DeleteCommand):
 | 
						|
    """Delete a given service chain node."""
 | 
						|
 | 
						|
    resource = 'servicechain_node'
 | 
						|
    log = logging.getLogger(__name__ + '.DeleteServiceChainNode')
 | 
						|
 | 
						|
 | 
						|
class ListServiceChainSpec(neutronV20.ListCommand):
 | 
						|
    """List service chain specs that belong to a given tenant."""
 | 
						|
 | 
						|
    resource = 'servicechain_spec'
 | 
						|
    log = logging.getLogger(__name__ + '.ListServiceChainSpec')
 | 
						|
    _formatters = {}
 | 
						|
    list_columns = ['id', 'name', 'description', 'nodes']
 | 
						|
    pagination_support = True
 | 
						|
    sorting_support = True
 | 
						|
 | 
						|
 | 
						|
class ShowServiceChainSpec(neutronV20.ShowCommand):
 | 
						|
    """Show information of a given service chain spec."""
 | 
						|
 | 
						|
    resource = 'servicechain_spec'
 | 
						|
    log = logging.getLogger(__name__ + '.ShowServiceChainSpec')
 | 
						|
 | 
						|
 | 
						|
class CreateServiceChainSpec(neutronV20.CreateCommand):
 | 
						|
    """Create a service chain spec."""
 | 
						|
 | 
						|
    resource = 'servicechain_spec'
 | 
						|
    log = logging.getLogger(__name__ + '.CreateServiceChainSpec')
 | 
						|
 | 
						|
    def add_known_arguments(self, parser):
 | 
						|
        parser.add_argument(
 | 
						|
            'name',
 | 
						|
            help=_('Name for the Service Chain Spec.'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--description',
 | 
						|
            help=_('Description of the Service Chain Specification.'))
 | 
						|
        parser.add_argument(
 | 
						|
            '--nodes', metavar='NODES', type=utils.str2list,
 | 
						|
            help=_('Comma separated list of Service Chain Nodes'))
 | 
						|
        n_utils.add_boolean_argument(
 | 
						|
            parser, '--shared', dest='shared',
 | 
						|
            help=_('Shared flag'))
 | 
						|
 | 
						|
    def args2body(self, parsed_args):
 | 
						|
        body = {self.resource: {}, }
 | 
						|
 | 
						|
        if parsed_args.nodes:
 | 
						|
            body[self.resource]['nodes'] = [
 | 
						|
                neutronV20.find_resourceid_by_name_or_id(
 | 
						|
                    self.get_client(),
 | 
						|
                    'servicechain_node',
 | 
						|
                    elem) for elem in parsed_args.nodes]
 | 
						|
 | 
						|
        neutronV20.update_dict(parsed_args, body[self.resource],
 | 
						|
                               ['name', 'tenant_id', 'description', 'shared'])
 | 
						|
        return body
 | 
						|
 | 
						|
 | 
						|
class UpdateServiceChainSpec(neutronV20.UpdateCommand):
 | 
						|
    """Update a given service chain spec."""
 | 
						|
 | 
						|
    resource = 'servicechain_spec'
 | 
						|
    log = logging.getLogger(__name__ + '.UpdateServiceChainSpec')
 | 
						|
 | 
						|
    def add_known_arguments(self, parser):
 | 
						|
        parser.add_argument(
 | 
						|
            '--nodes', type=utils.str2list,
 | 
						|
            help=_('New comma separated list of Service Chain Nodes '
 | 
						|
                   '(to unset use "")'))
 | 
						|
        n_utils.add_boolean_argument(
 | 
						|
            parser, '--shared', dest='shared',
 | 
						|
            help=_('Shared flag'))
 | 
						|
 | 
						|
    def args2body(self, parsed_args):
 | 
						|
        body = {self.resource: {}, }
 | 
						|
 | 
						|
        if parsed_args.nodes == []:
 | 
						|
            body[self.resource]['nodes'] = []
 | 
						|
        elif parsed_args.nodes:
 | 
						|
            body[self.resource]['nodes'] = [
 | 
						|
                neutronV20.find_resourceid_by_name_or_id(
 | 
						|
                    self.get_client(),
 | 
						|
                    'servicechain_node',
 | 
						|
                    elem) for elem in parsed_args.nodes]
 | 
						|
        neutronV20.update_dict(parsed_args, body[self.resource],
 | 
						|
                               ['name', 'description', 'shared'])
 | 
						|
        return body
 | 
						|
 | 
						|
 | 
						|
class DeleteServiceChainSpec(neutronV20.DeleteCommand):
 | 
						|
    """Delete a given service chain spec."""
 | 
						|
 | 
						|
    resource = 'servicechain_spec'
 | 
						|
    log = logging.getLogger(__name__ + '.DeleteServiceChainSpec')
 |