summaryrefslogtreecommitdiff
path: root/openstackclient/network
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/network')
-rw-r--r--openstackclient/network/v2/port.py3
-rw-r--r--openstackclient/network/v2/router.py26
-rw-r--r--openstackclient/network/v2/subnet.py18
-rw-r--r--openstackclient/network/v2/subnet_pool.py50
4 files changed, 79 insertions, 18 deletions
diff --git a/openstackclient/network/v2/port.py b/openstackclient/network/v2/port.py
index fbfce4d3..9b6161fd 100644
--- a/openstackclient/network/v2/port.py
+++ b/openstackclient/network/v2/port.py
@@ -249,7 +249,8 @@ class CreatePort(command.ShowOne):
parser.add_argument(
'name',
metavar='<name>',
- help='Name of this port')
+ help=_("Name of this port")
+ )
# TODO(singhj): Add support for extended options:
# qos,security groups,dhcp, address pairs
return parser
diff --git a/openstackclient/network/v2/router.py b/openstackclient/network/v2/router.py
index 56630a23..a32ab5ea 100644
--- a/openstackclient/network/v2/router.py
+++ b/openstackclient/network/v2/router.py
@@ -34,11 +34,20 @@ def _format_external_gateway_info(info):
return ''
+def _format_routes(routes):
+ # Map the route keys to match --route option.
+ for route in routes:
+ if 'nexthop' in route:
+ route['gateway'] = route.pop('nexthop')
+ return utils.format_list_of_dicts(routes)
+
+
_formatters = {
'admin_state_up': _format_admin_state,
'external_gateway_info': _format_external_gateway_info,
'availability_zones': utils.format_list,
'availability_zone_hints': utils.format_list,
+ 'routes': _format_routes,
}
@@ -67,11 +76,6 @@ def _get_attrs(client_manager, parsed_args):
and parsed_args.availability_zone_hints is not None):
attrs['availability_zone_hints'] = parsed_args.availability_zone_hints
- if 'clear_routes' in parsed_args and parsed_args.clear_routes:
- attrs['routes'] = []
- elif 'routes' in parsed_args and parsed_args.routes is not None:
- attrs['routes'] = parsed_args.routes
-
# "router set" command doesn't support setting project.
if 'project' in parsed_args and parsed_args.project is not None:
identity_client = client_manager.identity
@@ -393,7 +397,19 @@ class SetRouter(command.Command):
client = self.app.client_manager.network
obj = client.find_router(parsed_args.router, ignore_missing=False)
+ # Get the common attributes.
attrs = _get_attrs(self.app.client_manager, parsed_args)
+
+ # Get the route attributes.
+ if parsed_args.clear_routes:
+ attrs['routes'] = []
+ elif parsed_args.routes is not None:
+ # Map the route keys and append to the current routes.
+ # The REST API will handle route validation and duplicates.
+ for route in parsed_args.routes:
+ route['nexthop'] = route.pop('gateway')
+ attrs['routes'] = obj.routes + parsed_args.routes
+
if attrs == {}:
msg = "Nothing specified to be set"
raise exceptions.CommandError(msg)
diff --git a/openstackclient/network/v2/subnet.py b/openstackclient/network/v2/subnet.py
index 715e6620..fb441cbf 100644
--- a/openstackclient/network/v2/subnet.py
+++ b/openstackclient/network/v2/subnet.py
@@ -14,8 +14,6 @@
"""Subnet action implementations"""
import copy
-from json.encoder import JSONEncoder
-
from openstackclient.common import command
from openstackclient.common import exceptions
from openstackclient.common import parseractions
@@ -31,10 +29,8 @@ def _format_allocation_pools(data):
def _format_host_routes(data):
- try:
- return '\n'.join([JSONEncoder().encode(route) for route in data])
- except (TypeError, KeyError):
- return ''
+ # Map the host route keys to match --host-route option.
+ return utils.format_list_of_dicts(convert_entries_to_gateway(data))
_formatters = {
@@ -89,8 +85,9 @@ def convert_entries_to_nexthop(entries):
# Change 'gateway' entry to 'nexthop'
changed_entries = copy.deepcopy(entries)
for entry in changed_entries:
- entry['nexthop'] = entry['gateway']
- del entry['gateway']
+ if 'gateway' in entry:
+ entry['nexthop'] = entry['gateway']
+ del entry['gateway']
return changed_entries
@@ -99,8 +96,9 @@ def convert_entries_to_gateway(entries):
# Change 'nexthop' entry to 'gateway'
changed_entries = copy.deepcopy(entries)
for entry in changed_entries:
- entry['gateway'] = entry['nexthop']
- del entry['nexthop']
+ if 'nexthop' in entry:
+ entry['gateway'] = entry['nexthop']
+ del entry['nexthop']
return changed_entries
diff --git a/openstackclient/network/v2/subnet_pool.py b/openstackclient/network/v2/subnet_pool.py
index 482b5ecf..f1174dda 100644
--- a/openstackclient/network/v2/subnet_pool.py
+++ b/openstackclient/network/v2/subnet_pool.py
@@ -55,6 +55,16 @@ def _get_attrs(client_manager, parsed_args):
if 'no_address_scope' in parsed_args and parsed_args.no_address_scope:
attrs['address_scope_id'] = None
+ if parsed_args.default:
+ attrs['is_default'] = True
+ if parsed_args.no_default:
+ attrs['is_default'] = False
+
+ if 'share' in parsed_args and parsed_args.share:
+ attrs['shared'] = True
+ if 'no_share' in parsed_args and parsed_args.no_share:
+ attrs['shared'] = False
+
# "subnet pool set" command doesn't support setting project.
if 'project' in parsed_args and parsed_args.project is not None:
identity_client = client_manager.identity
@@ -68,18 +78,20 @@ def _get_attrs(client_manager, parsed_args):
return attrs
-def _add_prefix_options(parser):
+def _add_prefix_options(parser, for_create=False):
parser.add_argument(
'--pool-prefix',
metavar='<pool-prefix>',
dest='prefixes',
action='append',
+ required=for_create,
help=_("Set subnet pool prefixes (in CIDR notation) "
"(repeat option to set multiple prefixes)")
)
parser.add_argument(
'--default-prefix-length',
metavar='<default-prefix-length>',
+ type=int,
action=parseractions.NonNegativeAction,
help=_("Set subnet pool default prefix length")
)
@@ -87,16 +99,32 @@ def _add_prefix_options(parser):
'--min-prefix-length',
metavar='<min-prefix-length>',
action=parseractions.NonNegativeAction,
+ type=int,
help=_("Set subnet pool minimum prefix length")
)
parser.add_argument(
'--max-prefix-length',
metavar='<max-prefix-length>',
+ type=int,
action=parseractions.NonNegativeAction,
help=_("Set subnet pool maximum prefix length")
)
+def _add_default_options(parser):
+ default_group = parser.add_mutually_exclusive_group()
+ default_group.add_argument(
+ '--default',
+ action='store_true',
+ help=_("Set this as a default subnet pool"),
+ )
+ default_group.add_argument(
+ '--no-default',
+ action='store_true',
+ help=_("Set this as a non-default subnet pool"),
+ )
+
+
class CreateSubnetPool(command.ShowOne):
"""Create subnet pool"""
@@ -107,7 +135,7 @@ class CreateSubnetPool(command.ShowOne):
metavar='<name>',
help=_("Name of the new subnet pool")
)
- _add_prefix_options(parser)
+ _add_prefix_options(parser, for_create=True)
parser.add_argument(
'--project',
metavar='<project>',
@@ -121,6 +149,18 @@ class CreateSubnetPool(command.ShowOne):
"(name or ID), prefixes must be unique across address "
"scopes")
)
+ _add_default_options(parser)
+ shared_group = parser.add_mutually_exclusive_group()
+ shared_group.add_argument(
+ '--share',
+ action='store_true',
+ help=_("Set this subnet pool as shared"),
+ )
+ shared_group.add_argument(
+ '--no-share',
+ action='store_true',
+ help=_("Set this subnet pool as not shared"),
+ )
return parser
def take_action(self, parsed_args):
@@ -176,6 +216,8 @@ class ListSubnetPool(command.Lister):
'Prefixes',
'Default Prefix Length',
'Address Scope',
+ 'Default Subnet Pool',
+ 'Shared',
)
columns = (
'id',
@@ -183,6 +225,8 @@ class ListSubnetPool(command.Lister):
'prefixes',
'default_prefixlen',
'address_scope_id',
+ 'is_default',
+ 'shared',
)
else:
headers = (
@@ -232,6 +276,8 @@ class SetSubnetPool(command.Command):
action='store_true',
help=_("Remove address scope associated with the subnet pool")
)
+ _add_default_options(parser)
+
return parser
def take_action(self, parsed_args):