python-shade expose MTU setting.

The networking API v2 specification, which is implemented by
openstack neutron, features an optional MTU parameter - when
creating a network, this allows operators to specify the value
for the maximum transmission unit value.

Change-Id: I288f02551555fff3e8b350fc6d7c6ae8f60c405c
This commit is contained in:
Toure Dunnon 2018-06-28 11:51:03 -04:00
parent de9bc53b1b
commit 545b5aae28
3 changed files with 58 additions and 3 deletions

View File

@ -0,0 +1,6 @@
---
features:
- |
create_network now exposes the mtu api option in accordance to network
v2 api. This allows the operator to adjust the given MTU value which
is needed in various complex network deployments.

View File

@ -3462,7 +3462,8 @@ class OpenStackCloud(
def create_network(self, name, shared=False, admin_state_up=True, def create_network(self, name, shared=False, admin_state_up=True,
external=False, provider=None, project_id=None, external=False, provider=None, project_id=None,
availability_zone_hints=None, availability_zone_hints=None,
port_security_enabled=None): port_security_enabled=None,
mtu_size=None):
"""Create a network. """Create a network.
:param string name: Name of the network being created. :param string name: Name of the network being created.
@ -3476,6 +3477,8 @@ class OpenStackCloud(
will be created on (admin-only). will be created on (admin-only).
:param list availability_zone_hints: A list of availability zone hints. :param list availability_zone_hints: A list of availability zone hints.
:param bool port_security_enabled: Enable / Disable port security :param bool port_security_enabled: Enable / Disable port security
:param int mtu_size: maximum transmission unit value to address
fragmentation. Minimum value is 68 for IPv4, and 1280 for IPv6.
:returns: The network object. :returns: The network object.
:raises: OpenStackCloudException on operation error. :raises: OpenStackCloudException on operation error.
@ -3524,6 +3527,16 @@ class OpenStackCloud(
"Parameter 'port_security_enabled' must be a bool") "Parameter 'port_security_enabled' must be a bool")
network['port_security_enabled'] = port_security_enabled network['port_security_enabled'] = port_security_enabled
if mtu_size:
if not isinstance(mtu_size, int):
raise exc.OpenStackCloudException(
"Parameter 'mtu_size' must be an integer.")
if not mtu_size >= 68:
raise exc.OpenStackCloudException(
"Parameter 'mtu_size' must be greater than 67.")
network['mtu'] = mtu_size
data = self._network_client.post("/networks.json", data = self._network_client.post("/networks.json",
json={'network': network}) json={'network': network})
@ -11239,7 +11252,7 @@ class OpenStackCloud(
json=dict(addProjectAccess=payload), json=dict(addProjectAccess=payload),
error_message="Unable to authorize {project} " error_message="Unable to authorize {project} "
"to use volume type {name}".format( "to use volume type {name}".format(
name=name_or_id, project=project_id)) name=name_or_id, project=project_id))
def remove_volume_type_access(self, name_or_id, project_id): def remove_volume_type_access(self, name_or_id, project_id):
"""Revoke access on a volume_type to a project. """Revoke access on a volume_type to a project.
@ -11260,7 +11273,7 @@ class OpenStackCloud(
json=dict(removeProjectAccess=payload), json=dict(removeProjectAccess=payload),
error_message="Unable to revoke {project} " error_message="Unable to revoke {project} "
"to use volume type {name}".format( "to use volume type {name}".format(
name=name_or_id, project=project_id)) name=name_or_id, project=project_id))
def set_compute_quotas(self, name_or_id, **kwargs): def set_compute_quotas(self, name_or_id, **kwargs):
""" Set a quota in a project """ Set a quota in a project
@ -11333,6 +11346,7 @@ class OpenStackCloud(
:returns: Munch object with the usage :returns: Munch object with the usage
""" """
def parse_date(date): def parse_date(date):
try: try:
return iso8601.parse_date(date) return iso8601.parse_date(date)

View File

@ -250,6 +250,41 @@ class TestNetwork(base.RequestsMockTestCase):
self.assertEqual(mock_new_network_rep, network) self.assertEqual(mock_new_network_rep, network)
self.assert_calls() self.assert_calls()
def test_create_network_with_mtu(self):
mtu_size = 1500
mock_new_network_rep = copy.copy(self.mock_new_network_rep)
mock_new_network_rep['mtu'] = mtu_size
self.register_uris([
dict(method='POST',
uri=self.get_mock_url(
'network', 'public', append=['v2.0', 'networks.json']),
json={'network': mock_new_network_rep},
validate=dict(
json={'network': {
'admin_state_up': True,
'name': 'netname',
'mtu': mtu_size}}))
])
network = self.cloud.create_network("netname",
mtu_size=mtu_size
)
self.assertEqual(mock_new_network_rep, network)
self.assert_calls()
def test_create_network_with_wrong_mtu_size(self):
with testtools.ExpectedException(
shade.OpenStackCloudException,
"Parameter 'mtu_size' must be greater than 67."
):
self.cloud.create_network("netname", mtu_size=42)
def test_create_network_with_wrong_mtu_type(self):
with testtools.ExpectedException(
shade.OpenStackCloudException,
"Parameter 'mtu_size' must be an integer."
):
self.cloud.create_network("netname", mtu_size="fourty_two")
def test_delete_network(self): def test_delete_network(self):
network_id = "test-net-id" network_id = "test-net-id"
network_name = "network" network_name = "network"