Support creating unaddress neutron port

Introduce an option '--no-fixed-ip' on port create command.
If this option is specified and '--fixed-ip' is unspecified,
OSC will send a request to neutron with 'fixed_ips' as an empty
list, which will create an unaddress neutron port.

Note: The use cases of unaddress port was outlined in:
https://specs.openstack.org/openstack/neutron-specs/specs/liberty/unaddressed-port.html

(dtroyer: add Depends-On for Zuul v3 test)

Depends-On: I39e8e49243ab0bda631600715c971c55a34e2fd9
Change-Id: Ibe38598acbbcd0d353c952fc2a6fa67780762151
Closes-Bug: #1717829
This commit is contained in:
Hongbin Lu 2017-09-18 01:41:32 +00:00 committed by Dean Troyer
parent a452c9d825
commit de23ab8d75
4 changed files with 45 additions and 2 deletions

View File

@ -19,7 +19,7 @@ Create new port
openstack port create
--network <network>
[--description <description>]
[--fixed-ip subnet=<subnet>,ip-address=<ip-address>]
[--fixed-ip subnet=<subnet>,ip-address=<ip-address> | --no-fixed-ip]
[--device <device-id>]
[--device-owner <device-owner>]
[--vnic-type <vnic-type>]
@ -50,6 +50,10 @@ Create new port
subnet=<subnet>,ip-address=<ip-address>
(repeat option to set multiple fixed IP addresses)
.. option:: --no-fixed-ip
No IP or subnet for this port
.. option:: --device <device-id>
Port device ID

View File

@ -302,7 +302,8 @@ class CreatePort(command.ShowOne):
help=_("Network this port belongs to (name or ID)")
)
_add_updatable_args(parser)
parser.add_argument(
fixed_ip = parser.add_mutually_exclusive_group()
fixed_ip.add_argument(
'--fixed-ip',
metavar='subnet=<subnet>,ip-address=<ip-address>',
action=parseractions.MultiKeyValueAction,
@ -311,6 +312,11 @@ class CreatePort(command.ShowOne):
"subnet=<subnet>,ip-address=<ip-address> "
"(repeat option to set multiple fixed IP addresses)")
)
fixed_ip.add_argument(
'--no-fixed-ip',
action='store_true',
help=_("No IP or subnet for this port.")
)
parser.add_argument(
'--binding-profile',
metavar='<binding-profile>',
@ -402,6 +408,8 @@ class CreatePort(command.ShowOne):
if parsed_args.fixed_ip:
attrs['fixed_ips'] = parsed_args.fixed_ip
elif parsed_args.no_fixed_ip:
attrs['fixed_ips'] = []
if parsed_args.security_group:
attrs['security_group_ids'] = [client.find_security_group(

View File

@ -356,6 +356,32 @@ class TestCreatePort(TestPort):
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
def test_create_with_no_fixed_ips(self):
arglist = [
'--network', self._port.network_id,
'--no-fixed-ip',
'test-port',
]
verifylist = [
('network', self._port.network_id),
('enable', True),
('no_fixed_ip', True),
('name', 'test-port'),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = (self.cmd.take_action(parsed_args))
self.network.create_port.assert_called_once_with(**{
'admin_state_up': True,
'network_id': self._port.network_id,
'fixed_ips': [],
'name': 'test-port',
})
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
def test_create_port_with_allowed_address_pair_ipaddr(self):
pairs = [{'ip_address': '192.168.1.123'},
{'ip_address': '192.168.1.45'}]

View File

@ -0,0 +1,5 @@
---
fixes:
- |
Add ``--no-fixed-ip`` option to ``port create`` command.
[Bug `1717829 <https://launchpad.net/bugs/1717829>`_]