summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHideki Saito <saito@fgrep.org>2015-08-29 15:39:07 +0900
committerHideki Saito <saito@fgrep.org>2015-10-01 11:07:35 +0900
commit3b1c1c2395236fcec9e3e6cc94a56f21df4a9861 (patch)
tree3ba4e562c10e3b6ef01b589fa0a5e694fb414c92
parent61c187d8ef7493bbec7aecb8d7fab2c12f943797 (diff)
downloadpython-neutronclient-3b1c1c2395236fcec9e3e6cc94a56f21df4a9861.tar.gz
Add allowed-address-pairs to port-update
--allowed-address-pair and --no-allowed-address-pairs have been newly defined to port-create and port-update. If you would like to disable allowed-address-pairs, you can use --no-address-pairs option. Change-Id: I4811bd1f8d48c34b6d3f20347e4d45625586ac86 Closes-Bug: #1485182
-rwxr-xr-xneutron_test.sh25
-rw-r--r--neutronclient/neutron/v2_0/port.py36
-rw-r--r--neutronclient/tests/unit/test_cli20_port.py97
3 files changed, 154 insertions, 4 deletions
diff --git a/neutron_test.sh b/neutron_test.sh
index f2dae36..ee0af2a 100755
--- a/neutron_test.sh
+++ b/neutron_test.sh
@@ -28,7 +28,7 @@ fi
echo "NOTE: User should be admin in order to perform all operations."
sleep 3
-FORMAT=" --request-format xml"
+FORMAT=" --request-format json"
# test the CRUD of network
network=$net_name
@@ -78,9 +78,30 @@ port_id=`neutron port-list $FORMAT -- --name $port --fields id | tail -n 2 | hea
echo "ID of port with name $port is $port_id"
neutron port-show $FORMAT $port || die "fail to show port $port"
neutron port-show $FORMAT $port_id || die "fail to show port $port_id"
-
neutron port-update $FORMAT $port --device_id deviceid1 || die "fail to update port $port"
neutron port-update $FORMAT $port_id --device_id deviceid2 || die "fail to update port $port_id"
+neutron port-update $FORMAT $port_id --allowed-address-pair ip_address=1.1.1.11,mac_address=10:00:00:00:00:00 --allowed-address-pair ip_address=1.1.1.12,mac_address=10:00:00:00:00:01 || die "fail to update port $port_id --allowed-address-pair"
+neutron port-show $FORMAT $port || die "fail to show port $port"
+neutron port-show $FORMAT $port_id || die "fail to show port $port_id"
+neutron port-update $FORMAT $port_id --no-allowed-address-pairs || die "fail to update port $port_id --no-allowed-address-pairs"
+neutron port-show $FORMAT $port || die "fail to show port $port"
+neutron port-show $FORMAT $port_id || die "fail to show port $port_id"
+neutron port-delete $port_id
+
+# test the create port with allowed-address-pairs
+port=$port_name
+neutron port-create $FORMAT $NOAUTH $network --name $port -- --allowed-address-pairs type=dict list=true ip_address=1.1.1.11,mac_address=10:00:00:00:00:00 ip_address=1.1.1.12,mac_address=10:00:00:00:00:01 || die "fail to create port $port"
+tempport=`neutron port-list $FORMAT -- --name $port --fields id | wc -l`
+echo $tempport
+if [ $tempport -ne 5 ]; then
+ die "ports with name $port is not unique or found"
+fi
+port_id=`neutron port-list $FORMAT -- --name $port --fields id | tail -n 2 | head -n 1 | cut -d' ' -f 2`
+echo "ID of port with name $port is $port_id"
+neutron port-show $FORMAT $port || die "fail to show port $port"
+neutron port-show $FORMAT $port_id || die "fail to show port $port_id"
+neutron port-update $FORMAT $port_id --no-allowed-address-pairs || die "fail to update port $port_id --no-allowed-address-pairs"
+neutron port-show $port_id
# test quota commands RUD
DEFAULT_NETWORKS=10
diff --git a/neutronclient/neutron/v2_0/port.py b/neutronclient/neutron/v2_0/port.py
index f2483e1..93a0a57 100644
--- a/neutronclient/neutron/v2_0/port.py
+++ b/neutronclient/neutron/v2_0/port.py
@@ -193,8 +193,35 @@ class UpdateExtraDhcpOptMixin(object):
port['extra_dhcp_opts'] = ops
+class UpdatePortAllowedAddressPair(object):
+ """Update Port for allowed_address_pairs"""
+
+ def add_arguments_allowedaddresspairs(self, parser):
+ group_aap = parser.add_mutually_exclusive_group()
+ group_aap.add_argument(
+ '--allowed-address-pair',
+ metavar='ip_address=IP_ADDR[,mac_address=MAC_ADDR]',
+ default=[],
+ action='append',
+ dest='allowed_address_pairs',
+ type=utils.str2dict,
+ help=_('Allowed address pair associated with the port.'
+ 'You can repeat this option.'))
+ group_aap.add_argument(
+ '--no-allowed-address-pairs',
+ action='store_true',
+ help=_('Associate no allowed address pairs with the port.'))
+
+ def args2body_allowedaddresspairs(self, parsed_args, port):
+ if parsed_args.allowed_address_pairs:
+ port['allowed_address_pairs'] = parsed_args.allowed_address_pairs
+ elif parsed_args.no_allowed_address_pairs:
+ port['allowed_address_pairs'] = []
+
+
class CreatePort(neutronV20.CreateCommand, UpdatePortSecGroupMixin,
- UpdateExtraDhcpOptMixin, qos_policy.CreateQosPolicyMixin):
+ UpdateExtraDhcpOptMixin, qos_policy.CreateQosPolicyMixin,
+ UpdatePortAllowedAddressPair):
"""Create a port for a given tenant."""
resource = 'port'
@@ -232,6 +259,7 @@ class CreatePort(neutronV20.CreateCommand, UpdatePortSecGroupMixin,
self.add_arguments_secgroup(parser)
self.add_arguments_extradhcpopt(parser)
self.add_arguments_qos_policy(parser)
+ self.add_arguments_allowedaddresspairs(parser)
parser.add_argument(
'network_id', metavar='NETWORK',
@@ -257,6 +285,7 @@ class CreatePort(neutronV20.CreateCommand, UpdatePortSecGroupMixin,
self.args2body_secgroup(parsed_args, body)
self.args2body_extradhcpopt(parsed_args, body)
self.args2body_qos_policy(parsed_args, body)
+ self.args2body_allowedaddresspairs(parsed_args, body)
return {'port': body}
@@ -268,7 +297,8 @@ class DeletePort(neutronV20.DeleteCommand):
class UpdatePort(neutronV20.UpdateCommand, UpdatePortSecGroupMixin,
- UpdateExtraDhcpOptMixin, qos_policy.UpdateQosPolicyMixin):
+ UpdateExtraDhcpOptMixin, qos_policy.UpdateQosPolicyMixin,
+ UpdatePortAllowedAddressPair):
"""Update port's information."""
resource = 'port'
@@ -286,6 +316,7 @@ class UpdatePort(neutronV20.UpdateCommand, UpdatePortSecGroupMixin,
self.add_arguments_secgroup(parser)
self.add_arguments_extradhcpopt(parser)
self.add_arguments_qos_policy(parser)
+ self.add_arguments_allowedaddresspairs(parser)
def args2body(self, parsed_args):
body = {}
@@ -297,5 +328,6 @@ class UpdatePort(neutronV20.UpdateCommand, UpdatePortSecGroupMixin,
self.args2body_secgroup(parsed_args, body)
self.args2body_extradhcpopt(parsed_args, body)
self.args2body_qos_policy(parsed_args, body)
+ self.args2body_allowedaddresspairs(parsed_args, body)
return {'port': body}
diff --git a/neutronclient/tests/unit/test_cli20_port.py b/neutronclient/tests/unit/test_cli20_port.py
index 7717753..db873c1 100644
--- a/neutronclient/tests/unit/test_cli20_port.py
+++ b/neutronclient/tests/unit/test_cli20_port.py
@@ -302,6 +302,54 @@ class CLITestV20PortJSON(test_cli20.CLITestV20Base):
self._test_create_resource(resource, cmd, name, myid, args,
position_names, position_values)
+ def test_create_port_with_allowed_address_pair_ipaddr(self):
+ """Create port:
+ --allowed-address-pair ip_address=addr0
+ --allowed-address-pair ip_address=addr1
+ """
+ resource = 'port'
+ cmd = port.CreatePort(test_cli20.MyApp(sys.stdout), None)
+ name = 'myname'
+ myid = 'myid'
+ netid = 'netid'
+ pairs = [{'ip_address': '123.123.123.123'},
+ {'ip_address': '123.123.123.45'}]
+ args = [netid,
+ '--allowed-address-pair',
+ 'ip_address=123.123.123.123',
+ '--allowed-address-pair',
+ 'ip_address=123.123.123.45']
+ position_names = ['network_id', 'allowed_address_pairs']
+ position_values = [netid, pairs]
+ position_values.extend([netid])
+ self._test_create_resource(resource, cmd, name, myid, args,
+ position_names, position_values)
+
+ def test_create_port_with_allowed_address_pair(self):
+ """Create port:
+ --allowed-address-pair ip_address=addr0,mac_address=mac0
+ --allowed-address-pair ip_address=addr1,mac_address=mac1
+ """
+ resource = 'port'
+ cmd = port.CreatePort(test_cli20.MyApp(sys.stdout), None)
+ name = 'myname'
+ myid = 'myid'
+ netid = 'netid'
+ pairs = [{'ip_address': '123.123.123.123',
+ 'mac_address': '10:00:00:00:00:00'},
+ {'ip_address': '123.123.123.45',
+ 'mac_address': '10:00:00:00:00:01'}]
+ args = [netid,
+ '--allowed-address-pair',
+ 'ip_address=123.123.123.123,mac_address=10:00:00:00:00:00',
+ '--allowed-address-pair',
+ 'ip_address=123.123.123.45,mac_address=10:00:00:00:00:01']
+ position_names = ['network_id', 'allowed_address_pairs']
+ position_values = [netid, pairs]
+ position_values.extend([netid])
+ self._test_create_resource(resource, cmd, name, myid, args,
+ position_names, position_values)
+
def test_list_ports(self):
"""List ports: -D."""
resources = "ports"
@@ -599,6 +647,55 @@ class CLITestV20PortJSON(test_cli20.CLITestV20Base):
['--no-security-groups', 'myid'],
{'security_groups': []})
+ def test_update_port_allowed_address_pair_ipaddr(self):
+ """Update port(ip_address only):
+ --allowed-address-pairs ip_address=addr0
+ --allowed-address-pairs ip_address=addr1
+ """
+ import sys
+ resource = 'port'
+ cmd = port.UpdatePort(test_cli20.MyApp(sys.stdout), None)
+ myid = 'myid'
+ pairs = [{'ip_address': '123.123.123.123'},
+ {'ip_address': '123.123.123.45'}]
+ args = [myid,
+ '--allowed-address-pair',
+ 'ip_address=123.123.123.123',
+ '--allowed-address-pair',
+ 'ip_address=123.123.123.45']
+ updatefields = {'allowed_address_pairs': pairs}
+ self._test_update_resource(resource, cmd, myid, args, updatefields)
+
+ def test_update_port_allowed_address_pair(self):
+ """Update port:
+ --allowed-address-pair
+ ip_address=addr0,mac_address=mac0
+ --allowed-address-pair
+ ip_address_addr1,mac_address=mac1
+ """
+ resource = 'port'
+ cmd = port.UpdatePort(test_cli20.MyApp(sys.stdout), None)
+ myid = 'myid'
+ pairs = [{'ip_address': '123.123.123.123',
+ 'mac_address': '10:00:00:00:00:00'},
+ {'ip_address': '123.123.123.45',
+ 'mac_address': '10:00:00:00:00:01'}]
+ args = [myid,
+ '--allowed-address-pair',
+ 'ip_address=123.123.123.123,mac_address=10:00:00:00:00:00',
+ '--allowed-address-pair',
+ 'ip_address=123.123.123.45,mac_address=10:00:00:00:00:01']
+ updatefields = {'allowed_address_pairs': pairs}
+ self._test_update_resource(resource, cmd, myid, args, updatefields)
+
+ def test_update_port_allowed_address_pairs_off(self):
+ """Update port: --no-allowed-address-pairs."""
+ resource = 'port'
+ cmd = port.UpdatePort(test_cli20.MyApp(sys.stdout), None)
+ self._test_update_resource(resource, cmd, 'myid',
+ ['--no-allowed-address-pairs', 'myid'],
+ {'allowed_address_pairs': []})
+
def test_show_port(self):
"""Show port: --fields id --fields name myid."""
resource = 'port'