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')
|