9baf4b892e
Previously tenant_id option was ignored in subnetpool-create. --tenant-id option is supported in all create commands in neutron CLI and it is important to keep this consistency for good user experience. Change-Id: Ifab51d623f8f3519523b284fc04e5b28301b5928 Closes-Bug: #1667279
155 lines
5.6 KiB
Python
155 lines
5.6 KiB
Python
# Copyright 2015 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.
|
|
#
|
|
|
|
from neutronclient._i18n import _
|
|
from neutronclient.common import utils
|
|
from neutronclient.neutron import v2_0 as neutronV20
|
|
|
|
|
|
def _format_prefixes(subnetpool):
|
|
try:
|
|
return '\n'.join(pool for pool in subnetpool['prefixes'])
|
|
except (TypeError, KeyError):
|
|
return subnetpool['prefixes']
|
|
|
|
|
|
def add_updatable_arguments(parser, for_create=False):
|
|
parser.add_argument(
|
|
'--description',
|
|
help=_('Description of subnetpool.'))
|
|
parser.add_argument(
|
|
'--min-prefixlen', type=int,
|
|
help=_('Subnetpool minimum prefix length.'))
|
|
parser.add_argument(
|
|
'--max-prefixlen', type=int,
|
|
help=_('Subnetpool maximum prefix length.'))
|
|
parser.add_argument(
|
|
'--default-prefixlen', type=int,
|
|
help=_('Subnetpool default prefix length.'))
|
|
parser.add_argument(
|
|
'--pool-prefix',
|
|
action='append', dest='prefixes',
|
|
required=for_create,
|
|
help=_('Subnetpool prefixes (This option can be repeated).'))
|
|
utils.add_boolean_argument(
|
|
parser, '--is-default',
|
|
help=_('Specify whether this should be the default subnetpool '
|
|
'(True meaning default).'))
|
|
|
|
|
|
def updatable_args2body(parsed_args, body):
|
|
neutronV20.update_dict(parsed_args, body,
|
|
['name', 'prefixes', 'default_prefixlen',
|
|
'min_prefixlen', 'max_prefixlen', 'is_default',
|
|
'description'])
|
|
|
|
|
|
class ListSubnetPool(neutronV20.ListCommand):
|
|
"""List subnetpools that belong to a given tenant."""
|
|
|
|
_formatters = {'prefixes': _format_prefixes, }
|
|
resource = 'subnetpool'
|
|
list_columns = ['id', 'name', 'prefixes',
|
|
'default_prefixlen', 'address_scope_id', 'is_default']
|
|
pagination_support = True
|
|
sorting_support = True
|
|
|
|
|
|
class ShowSubnetPool(neutronV20.ShowCommand):
|
|
"""Show information of a given subnetpool."""
|
|
|
|
resource = 'subnetpool'
|
|
|
|
|
|
class CreateSubnetPool(neutronV20.CreateCommand):
|
|
"""Create a subnetpool for a given tenant."""
|
|
|
|
resource = 'subnetpool'
|
|
|
|
def add_known_arguments(self, parser):
|
|
add_updatable_arguments(parser, for_create=True)
|
|
parser.add_argument(
|
|
'--shared',
|
|
action='store_true',
|
|
help=_('Set the subnetpool as shared.'))
|
|
parser.add_argument(
|
|
'name',
|
|
metavar='NAME',
|
|
help=_('Name of the subnetpool to be created.'))
|
|
parser.add_argument(
|
|
'--address-scope',
|
|
metavar='ADDRSCOPE',
|
|
help=_('ID or name of the address scope with which the subnetpool '
|
|
'is associated. Prefixes must be unique across address '
|
|
'scopes.'))
|
|
|
|
def args2body(self, parsed_args):
|
|
body = {'prefixes': parsed_args.prefixes}
|
|
updatable_args2body(parsed_args, body)
|
|
neutronV20.update_dict(parsed_args, body, ['tenant_id'])
|
|
if parsed_args.shared:
|
|
body['shared'] = True
|
|
|
|
# Parse and update for "address-scope" option
|
|
if parsed_args.address_scope:
|
|
_addrscope_id = neutronV20.find_resourceid_by_name_or_id(
|
|
self.get_client(), 'address_scope',
|
|
parsed_args.address_scope)
|
|
body['address_scope_id'] = _addrscope_id
|
|
return {'subnetpool': body}
|
|
|
|
|
|
class DeleteSubnetPool(neutronV20.DeleteCommand):
|
|
"""Delete a given subnetpool."""
|
|
|
|
resource = 'subnetpool'
|
|
|
|
|
|
class UpdateSubnetPool(neutronV20.UpdateCommand):
|
|
"""Update subnetpool's information."""
|
|
|
|
resource = 'subnetpool'
|
|
|
|
def add_known_arguments(self, parser):
|
|
add_updatable_arguments(parser)
|
|
parser.add_argument('--name',
|
|
help=_('Updated name of the subnetpool.'))
|
|
addrscope_args = parser.add_mutually_exclusive_group()
|
|
addrscope_args.add_argument('--address-scope',
|
|
metavar='ADDRSCOPE',
|
|
help=_('ID or name of the address scope '
|
|
'with which the subnetpool is '
|
|
'associated. Prefixes must be '
|
|
'unique across address scopes.'))
|
|
addrscope_args.add_argument('--no-address-scope',
|
|
action='store_true',
|
|
help=_('Detach subnetpool from the '
|
|
'address scope.'))
|
|
|
|
def args2body(self, parsed_args):
|
|
body = {}
|
|
updatable_args2body(parsed_args, body)
|
|
|
|
# Parse and update for "address-scope" option/s
|
|
if parsed_args.no_address_scope:
|
|
body['address_scope_id'] = None
|
|
elif parsed_args.address_scope:
|
|
_addrscope_id = neutronV20.find_resourceid_by_name_or_id(
|
|
self.get_client(), 'address_scope',
|
|
parsed_args.address_scope)
|
|
body['address_scope_id'] = _addrscope_id
|
|
return {'subnetpool': body}
|