
It is a common pattern to add class XXXCommand(NeutronCommand): log = logging.getLogger(__name__ + '.<command name>'). So introduce a metaclass to do that automatically in order to simplify the code a bit. Change-Id: I7febdcd806eb2da51781a5866cc5fac5422b1721
189 lines
6.3 KiB
Python
189 lines
6.3 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 argparse
|
|
|
|
from neutronclient.common import exceptions
|
|
from neutronclient.common import utils
|
|
from neutronclient.neutron import v2_0 as neutronV20
|
|
from neutronclient.openstack.common.gettextutils import _
|
|
|
|
|
|
def _format_allocation_pools(subnet):
|
|
try:
|
|
return '\n'.join([utils.dumps(pool) for pool in
|
|
subnet['allocation_pools']])
|
|
except Exception:
|
|
return ''
|
|
|
|
|
|
def _format_dns_nameservers(subnet):
|
|
try:
|
|
return '\n'.join([utils.dumps(server) for server in
|
|
subnet['dns_nameservers']])
|
|
except Exception:
|
|
return ''
|
|
|
|
|
|
def _format_host_routes(subnet):
|
|
try:
|
|
return '\n'.join([utils.dumps(route) for route in
|
|
subnet['host_routes']])
|
|
except Exception:
|
|
return ''
|
|
|
|
|
|
def add_updatable_arguments(parser):
|
|
parser.add_argument(
|
|
'--name',
|
|
help=_('Name of this subnet'))
|
|
parser.add_argument(
|
|
'--gateway', metavar='GATEWAY_IP',
|
|
help=_('Gateway ip of this subnet'))
|
|
parser.add_argument(
|
|
'--no-gateway',
|
|
action='store_true',
|
|
help=_('No distribution of gateway'))
|
|
parser.add_argument(
|
|
'--allocation-pool', metavar='start=IP_ADDR,end=IP_ADDR',
|
|
action='append', dest='allocation_pools', type=utils.str2dict,
|
|
help=_('Allocation pool IP addresses for this subnet '
|
|
'(This option can be repeated)'))
|
|
parser.add_argument(
|
|
'--allocation_pool',
|
|
action='append', dest='allocation_pools', type=utils.str2dict,
|
|
help=argparse.SUPPRESS)
|
|
parser.add_argument(
|
|
'--host-route', metavar='destination=CIDR,nexthop=IP_ADDR',
|
|
action='append', dest='host_routes', type=utils.str2dict,
|
|
help=_('Additional route (This option can be repeated)'))
|
|
parser.add_argument(
|
|
'--dns-nameserver', metavar='DNS_NAMESERVER',
|
|
action='append', dest='dns_nameservers',
|
|
help=_('DNS name server for this subnet '
|
|
'(This option can be repeated)'))
|
|
parser.add_argument(
|
|
'--disable-dhcp',
|
|
action='store_true',
|
|
help=_('Disable DHCP for this subnet'))
|
|
parser.add_argument(
|
|
'--enable-dhcp',
|
|
action='store_true',
|
|
help=_('Enable DHCP for this subnet'))
|
|
|
|
|
|
def updatable_args2body(parsed_args, body):
|
|
if parsed_args.gateway and parsed_args.no_gateway:
|
|
raise exceptions.CommandError(_("--gateway option and "
|
|
"--no-gateway option can "
|
|
"not be used same time"))
|
|
if parsed_args.disable_dhcp and parsed_args.enable_dhcp:
|
|
raise exceptions.CommandError(_("--enable-dhcp and --disable-dhcp can "
|
|
"not be used in the same command."))
|
|
|
|
if parsed_args.no_gateway:
|
|
body['subnet'].update({'gateway_ip': None})
|
|
if parsed_args.gateway:
|
|
body['subnet'].update({'gateway_ip': parsed_args.gateway})
|
|
if parsed_args.name:
|
|
body['subnet'].update({'name': parsed_args.name})
|
|
if parsed_args.disable_dhcp:
|
|
body['subnet'].update({'enable_dhcp': False})
|
|
if parsed_args.enable_dhcp:
|
|
body['subnet'].update({'enable_dhcp': True})
|
|
if parsed_args.allocation_pools:
|
|
body['subnet']['allocation_pools'] = parsed_args.allocation_pools
|
|
if parsed_args.host_routes:
|
|
body['subnet']['host_routes'] = parsed_args.host_routes
|
|
if parsed_args.dns_nameservers:
|
|
body['subnet']['dns_nameservers'] = parsed_args.dns_nameservers
|
|
|
|
|
|
class ListSubnet(neutronV20.ListCommand):
|
|
"""List subnets that belong to a given tenant."""
|
|
|
|
resource = 'subnet'
|
|
_formatters = {'allocation_pools': _format_allocation_pools,
|
|
'dns_nameservers': _format_dns_nameservers,
|
|
'host_routes': _format_host_routes, }
|
|
list_columns = ['id', 'name', 'cidr', 'allocation_pools']
|
|
pagination_support = True
|
|
sorting_support = True
|
|
|
|
|
|
class ShowSubnet(neutronV20.ShowCommand):
|
|
"""Show information of a given subnet."""
|
|
|
|
resource = 'subnet'
|
|
|
|
|
|
class CreateSubnet(neutronV20.CreateCommand):
|
|
"""Create a subnet for a given tenant."""
|
|
|
|
resource = 'subnet'
|
|
|
|
def add_known_arguments(self, parser):
|
|
add_updatable_arguments(parser)
|
|
parser.add_argument(
|
|
'--ip-version',
|
|
type=int,
|
|
default=4, choices=[4, 6],
|
|
help=_('IP version with default 4'))
|
|
parser.add_argument(
|
|
'--ip_version',
|
|
type=int,
|
|
choices=[4, 6],
|
|
help=argparse.SUPPRESS)
|
|
parser.add_argument(
|
|
'network_id', metavar='NETWORK',
|
|
help=_('Network id or name this subnet belongs to'))
|
|
parser.add_argument(
|
|
'cidr', metavar='CIDR',
|
|
help=_('CIDR of subnet to create'))
|
|
|
|
def args2body(self, parsed_args):
|
|
_network_id = neutronV20.find_resourceid_by_name_or_id(
|
|
self.get_client(), 'network', parsed_args.network_id)
|
|
body = {'subnet': {'cidr': parsed_args.cidr,
|
|
'network_id': _network_id,
|
|
'ip_version': parsed_args.ip_version, }, }
|
|
|
|
updatable_args2body(parsed_args, body)
|
|
if parsed_args.tenant_id:
|
|
body['subnet'].update({'tenant_id': parsed_args.tenant_id})
|
|
|
|
return body
|
|
|
|
|
|
class DeleteSubnet(neutronV20.DeleteCommand):
|
|
"""Delete a given subnet."""
|
|
|
|
resource = 'subnet'
|
|
|
|
|
|
class UpdateSubnet(neutronV20.UpdateCommand):
|
|
"""Update subnet's information."""
|
|
|
|
resource = 'subnet'
|
|
|
|
def add_known_arguments(self, parser):
|
|
add_updatable_arguments(parser)
|
|
|
|
def args2body(self, parsed_args):
|
|
body = {'subnet': {}}
|
|
updatable_args2body(parsed_args, body)
|
|
return body
|