Add external network options to osc network create

The following patch adds the options "--external" & "--internal"
and the suboptions to "external": "--default" & "--no-default",
to "osc network create" CLI to provide the user an option to create
a network as an external network.

Change-Id: Idf73714bb94c0610ea164131140a51848908b00b
Partial-Bug: #1545537
This commit is contained in:
reedip 2016-03-14 15:35:46 +09:00 committed by Reedip
parent 55b37d5e33
commit 107bc5164f
5 changed files with 79 additions and 1 deletions

View File

@ -17,6 +17,7 @@ Create new network
[--enable | --disable] [--enable | --disable]
[--share | --no-share] [--share | --no-share]
[--availability-zone-hint <availability-zone>] [--availability-zone-hint <availability-zone>]
[--external [--default | --no-default] | --internal]
<name> <name>
.. option:: --project <project> .. option:: --project <project>
@ -59,6 +60,29 @@ Create new network
IPv4 subnet for fixed IPs (in CIDR notation) IPv4 subnet for fixed IPs (in CIDR notation)
(Compute v2 network only) (Compute v2 network only)
.. option:: --external
Set this network as an external network.
Requires the "external-net" extension to be enabled.
(Network v2 only)
.. option:: --internal
Set this network as an internal network (default)
(Network v2 only)
.. option:: --default
Specify if this network should be used as
the default external network
(Network v2 only)
.. option:: --no-default
Do not use the network as the default external network.
By default, no network is set as an external network.
(Network v2 only)
.. _network_create-name: .. _network_create-name:
.. describe:: <name> .. describe:: <name>

View File

@ -144,6 +144,27 @@ class CreateNetwork(common.NetworkAndComputeShowOne):
'(requires the Network Availability Zone extension, ' '(requires the Network Availability Zone extension, '
'this option can be repeated).', 'this option can be repeated).',
) )
external_router_grp = parser.add_mutually_exclusive_group()
external_router_grp.add_argument(
'--external',
action='store_true',
help='Set this network as an external network. '
'Requires the "external-net" extension to be enabled.')
external_router_grp.add_argument(
'--internal',
action='store_true',
help='Set this network as an internal network (default)')
default_router_grp = parser.add_mutually_exclusive_group()
default_router_grp.add_argument(
'--default',
action='store_true',
help='Specify if this network should be used as '
'the default external network')
default_router_grp.add_argument(
'--no-default',
action='store_true',
help='Do not use the network as the default external network.'
'By default, no network is set as an external network.')
return parser return parser
def update_parser_compute(self, parser): def update_parser_compute(self, parser):
@ -156,6 +177,14 @@ class CreateNetwork(common.NetworkAndComputeShowOne):
def take_action_network(self, client, parsed_args): def take_action_network(self, client, parsed_args):
attrs = _get_attrs(self.app.client_manager, parsed_args) attrs = _get_attrs(self.app.client_manager, parsed_args)
if parsed_args.internal:
attrs['router:external'] = False
if parsed_args.external:
attrs['router:external'] = True
if parsed_args.no_default:
attrs['is_default'] = False
if parsed_args.default:
attrs['is_default'] = True
obj = client.create_network(**attrs) obj = client.create_network(**attrs)
columns = _get_columns(obj) columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns, formatters=_formatters) data = utils.get_item_properties(obj, columns, formatters=_formatters)

View File

@ -152,6 +152,7 @@ class FakeNetwork(object):
'router_external': True, 'router_external': True,
'availability_zones': [], 'availability_zones': [],
'availability_zone_hints': [], 'availability_zone_hints': [],
'is_default': False,
} }
# Overwrite default attributes. # Overwrite default attributes.
@ -161,7 +162,7 @@ class FakeNetwork(object):
network_methods = { network_methods = {
'keys': ['id', 'name', 'admin_state_up', 'router_external', 'keys': ['id', 'name', 'admin_state_up', 'router_external',
'status', 'subnets', 'tenant_id', 'availability_zones', 'status', 'subnets', 'tenant_id', 'availability_zones',
'availability_zone_hints'], 'availability_zone_hints', 'is_default'],
} }
# Overwrite default methods. # Overwrite default methods.

View File

@ -51,6 +51,7 @@ class TestCreateNetworkIdentityV3(TestNetwork):
'availability_zone_hints', 'availability_zone_hints',
'availability_zones', 'availability_zones',
'id', 'id',
'is_default',
'name', 'name',
'project_id', 'project_id',
'router_external', 'router_external',
@ -63,6 +64,7 @@ class TestCreateNetworkIdentityV3(TestNetwork):
utils.format_list(_network.availability_zone_hints), utils.format_list(_network.availability_zone_hints),
utils.format_list(_network.availability_zones), utils.format_list(_network.availability_zones),
_network.id, _network.id,
_network.is_default,
_network.name, _network.name,
_network.project_id, _network.project_id,
network._format_router_external(_network.router_external), network._format_router_external(_network.router_external),
@ -119,6 +121,7 @@ class TestCreateNetworkIdentityV3(TestNetwork):
('enable', True), ('enable', True),
('share', None), ('share', None),
('project', None), ('project', None),
('external', False),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@ -138,6 +141,7 @@ class TestCreateNetworkIdentityV3(TestNetwork):
"--project", identity_fakes_v3.project_name, "--project", identity_fakes_v3.project_name,
"--project-domain", identity_fakes_v3.domain_name, "--project-domain", identity_fakes_v3.domain_name,
"--availability-zone-hint", "nova", "--availability-zone-hint", "nova",
"--external", "--default",
self._network.name, self._network.name,
] ]
verifylist = [ verifylist = [
@ -146,6 +150,8 @@ class TestCreateNetworkIdentityV3(TestNetwork):
('project', identity_fakes_v3.project_name), ('project', identity_fakes_v3.project_name),
('project_domain', identity_fakes_v3.domain_name), ('project_domain', identity_fakes_v3.domain_name),
('availability_zone_hints', ["nova"]), ('availability_zone_hints', ["nova"]),
('external', True),
('default', True),
('name', self._network.name), ('name', self._network.name),
] ]
@ -158,6 +164,8 @@ class TestCreateNetworkIdentityV3(TestNetwork):
'name': self._network.name, 'name': self._network.name,
'shared': True, 'shared': True,
'tenant_id': identity_fakes_v3.project_id, 'tenant_id': identity_fakes_v3.project_id,
'is_default': True,
'router:external': True,
}) })
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data) self.assertEqual(self.data, data)
@ -172,6 +180,7 @@ class TestCreateNetworkIdentityV3(TestNetwork):
('enable', True), ('enable', True),
('no_share', True), ('no_share', True),
('name', self._network.name), ('name', self._network.name),
('external', False),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@ -198,6 +207,7 @@ class TestCreateNetworkIdentityV2(TestNetwork):
'availability_zone_hints', 'availability_zone_hints',
'availability_zones', 'availability_zones',
'id', 'id',
'is_default',
'name', 'name',
'project_id', 'project_id',
'router_external', 'router_external',
@ -210,6 +220,7 @@ class TestCreateNetworkIdentityV2(TestNetwork):
utils.format_list(_network.availability_zone_hints), utils.format_list(_network.availability_zone_hints),
utils.format_list(_network.availability_zones), utils.format_list(_network.availability_zones),
_network.id, _network.id,
_network.is_default,
_network.name, _network.name,
_network.project_id, _network.project_id,
network._format_router_external(_network.router_external), network._format_router_external(_network.router_external),
@ -253,6 +264,7 @@ class TestCreateNetworkIdentityV2(TestNetwork):
('share', None), ('share', None),
('name', self._network.name), ('name', self._network.name),
('project', identity_fakes_v2.project_name), ('project', identity_fakes_v2.project_name),
('external', False),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@ -278,6 +290,7 @@ class TestCreateNetworkIdentityV2(TestNetwork):
('project', identity_fakes_v3.project_name), ('project', identity_fakes_v3.project_name),
('project_domain', identity_fakes_v3.domain_name), ('project_domain', identity_fakes_v3.domain_name),
('name', self._network.name), ('name', self._network.name),
('external', False),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@ -514,6 +527,7 @@ class TestShowNetwork(TestNetwork):
'availability_zone_hints', 'availability_zone_hints',
'availability_zones', 'availability_zones',
'id', 'id',
'is_default',
'name', 'name',
'project_id', 'project_id',
'router_external', 'router_external',
@ -526,6 +540,7 @@ class TestShowNetwork(TestNetwork):
utils.format_list(_network.availability_zone_hints), utils.format_list(_network.availability_zone_hints),
utils.format_list(_network.availability_zones), utils.format_list(_network.availability_zones),
_network.id, _network.id,
_network.is_default,
_network.name, _network.name,
_network.project_id, _network.project_id,
network._format_router_external(_network.router_external), network._format_router_external(_network.router_external),

View File

@ -0,0 +1,9 @@
---
features:
- |
New options have been added to the ``network create`` command
to support external network functionality. The new options are
``--external/--internal`` and suboptions to ``external``:
``--default/--no-default``.
These options are available for Networkv2 only.
[Bug `1545537 <https://bugs.launchpad.net/bugs/1545537>`_]