summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
authorBence Romsics <bence.romsics@ericsson.com>2017-03-07 15:54:31 +0100
committerDean Troyer <dtroyer@gmail.com>2017-03-20 15:40:48 +0000
commitf1345dc06f91177ced17f102bcdaaa126fe12568 (patch)
treee98f077515d9211ccf042cc8e682f2e5e4964daf /openstackclient
parentb6f51cdfa0765640a0c1c8d81323682de871a4fe (diff)
downloadpython-openstackclient-f1345dc06f91177ced17f102bcdaaa126fe12568.tar.gz
Make MAC address of port updatable
openstackclient does not allow the update of a port's MAC address. However this is possible in neutron API (though by default policy it is an admin-only operation). Allow it in openstackclient too. Change-Id: Ibd9e0a6fbd1d0d461b8a8daee24dbb7c3f929df6 Closes-Bug: #1670707
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/network/v2/port.py14
-rw-r--r--openstackclient/tests/functional/network/v2/test_port.py19
-rw-r--r--openstackclient/tests/unit/network/v2/test_port.py19
3 files changed, 45 insertions, 7 deletions
diff --git a/openstackclient/network/v2/port.py b/openstackclient/network/v2/port.py
index 6117175e..eced93ce 100644
--- a/openstackclient/network/v2/port.py
+++ b/openstackclient/network/v2/port.py
@@ -130,6 +130,8 @@ def _get_attrs(client_manager, parsed_args):
attrs['binding:vnic_type'] = parsed_args.vnic_type
if parsed_args.host:
attrs['binding:host_id'] = parsed_args.host
+ if parsed_args.mac_address is not None:
+ attrs['mac_address'] = parsed_args.mac_address
if parsed_args.dns_name is not None:
attrs['dns_name'] = parsed_args.dns_name
@@ -138,8 +140,6 @@ def _get_attrs(client_manager, parsed_args):
attrs['name'] = str(parsed_args.name)
# The remaining options do not support 'port set' command, so they require
# additional check
- if 'mac_address' in parsed_args and parsed_args.mac_address is not None:
- attrs['mac_address'] = parsed_args.mac_address
if 'network' in parsed_args and parsed_args.network is not None:
attrs['network_id'] = parsed_args.network
if 'project' in parsed_args and parsed_args.project is not None:
@@ -235,6 +235,11 @@ def _add_updatable_args(parser):
help=argparse.SUPPRESS,
)
parser.add_argument(
+ '--mac-address',
+ metavar='<mac-address>',
+ help=_("MAC address of this port (admin only)")
+ )
+ parser.add_argument(
'--device-owner',
metavar='<device-owner>',
help=_("Device owner of this port. This is the entity that uses "
@@ -325,11 +330,6 @@ class CreatePort(command.ShowOne):
help=_("Disable port")
)
parser.add_argument(
- '--mac-address',
- metavar='<mac-address>',
- help=_("MAC address of this port")
- )
- parser.add_argument(
'--project',
metavar='<project>',
help=_("Owner's project (name or ID)")
diff --git a/openstackclient/tests/functional/network/v2/test_port.py b/openstackclient/tests/functional/network/v2/test_port.py
index 78c57273..bd5eefa5 100644
--- a/openstackclient/tests/functional/network/v2/test_port.py
+++ b/openstackclient/tests/functional/network/v2/test_port.py
@@ -147,3 +147,22 @@ class PortTests(base.TestCase):
'port show -f json ' + self.NAME
))
self.assertEqual('', json_output.get('security_group_ids'))
+
+ def test_port_admin_set(self):
+ """Test create, set (as admin), show, delete"""
+ json_output = json.loads(self.openstack(
+ 'port create -f json ' +
+ '--network ' + self.NETWORK_NAME + ' ' + self.NAME
+ ))
+ id_ = json_output.get('id')
+ self.addCleanup(self.openstack, 'port delete ' + id_)
+
+ raw_output = self.openstack(
+ '--os-username admin '
+ + 'port set --mac-address 11:22:33:44:55:66 '
+ + self.NAME)
+ self.assertOutput('', raw_output)
+ json_output = json.loads(self.openstack(
+ 'port show -f json ' + self.NAME
+ ))
+ self.assertEqual(json_output.get('mac_address'), '11:22:33:44:55:66')
diff --git a/openstackclient/tests/unit/network/v2/test_port.py b/openstackclient/tests/unit/network/v2/test_port.py
index 80eba3a8..d2df5841 100644
--- a/openstackclient/tests/unit/network/v2/test_port.py
+++ b/openstackclient/tests/unit/network/v2/test_port.py
@@ -987,6 +987,25 @@ class TestSetPort(TestPort):
self.network.update_port.assert_called_once_with(_testport, **attrs)
self.assertIsNone(result)
+ def test_overwrite_mac_address(self):
+ _testport = network_fakes.FakePort.create_one_port(
+ {'mac_address': '11:22:33:44:55:66'})
+ self.network.find_port = mock.Mock(return_value=_testport)
+ arglist = [
+ '--mac-address', '66:55:44:33:22:11',
+ _testport.name,
+ ]
+ verifylist = [
+ ('mac_address', '66:55:44:33:22:11'),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ result = self.cmd.take_action(parsed_args)
+ attrs = {
+ 'mac_address': '66:55:44:33:22:11',
+ }
+ self.network.update_port.assert_called_once_with(_testport, **attrs)
+ self.assertIsNone(result)
+
def test_set_this(self):
arglist = [
'--disable',