Merge "Add subport validator for vlan-aware-vms"
This commit is contained in:
commit
8ff5a63eff
@ -488,6 +488,54 @@ def validate_non_negative(data, valid_values=None):
|
|||||||
return msg
|
return msg
|
||||||
|
|
||||||
|
|
||||||
|
def validate_subports(data, valid_values=None):
|
||||||
|
if not isinstance(data, list):
|
||||||
|
msg = _("Invalid data format for subports: '%s'") % data
|
||||||
|
LOG.debug(msg)
|
||||||
|
return msg
|
||||||
|
|
||||||
|
subport_ids = set()
|
||||||
|
segmentation_ids = set()
|
||||||
|
for subport in data:
|
||||||
|
if not isinstance(subport, dict):
|
||||||
|
msg = _("Invalid data format for subport: '%s'") % subport
|
||||||
|
LOG.debug(msg)
|
||||||
|
return msg
|
||||||
|
|
||||||
|
# Expect a non duplicated and valid port_id for the subport
|
||||||
|
if 'port_id' not in subport:
|
||||||
|
msg = _("A valid port UUID must be specified")
|
||||||
|
LOG.debug(msg)
|
||||||
|
return msg
|
||||||
|
elif validate_uuid(subport["port_id"]):
|
||||||
|
msg = _("Invalid UUID for subport: '%s'") % subport["port_id"]
|
||||||
|
return msg
|
||||||
|
elif subport["port_id"] in subport_ids:
|
||||||
|
msg = _("Non unique UUID for subport: '%s'") % subport["port_id"]
|
||||||
|
return msg
|
||||||
|
subport_ids.add(subport["port_id"])
|
||||||
|
|
||||||
|
# Validate that both segmentation id and segmentation type are
|
||||||
|
# specified, and that the client does not duplicate segmentation
|
||||||
|
# ids
|
||||||
|
segmentation_id = subport.get("segmentation_id")
|
||||||
|
segmentation_type = subport.get("segmentation_type")
|
||||||
|
if (not segmentation_id or not segmentation_type) and len(subport) > 1:
|
||||||
|
msg = _("Invalid subport details '%s': missing segmentation "
|
||||||
|
"information. Must specify both segmentation_id and "
|
||||||
|
"segmentation_type") % subport
|
||||||
|
LOG.debug(msg)
|
||||||
|
return msg
|
||||||
|
if segmentation_id in segmentation_ids:
|
||||||
|
msg = _("Segmentation ID '%(seg_id)s' for '%(subport)s' is not "
|
||||||
|
"unique") % {"seg_id": segmentation_id,
|
||||||
|
"subport": subport["port_id"]}
|
||||||
|
LOG.debug(msg)
|
||||||
|
return msg
|
||||||
|
if segmentation_id:
|
||||||
|
segmentation_ids.add(segmentation_id)
|
||||||
|
|
||||||
|
|
||||||
# Dictionary that maintains a list of validation functions
|
# Dictionary that maintains a list of validation functions
|
||||||
validators = {'type:dict': validate_dict,
|
validators = {'type:dict': validate_dict,
|
||||||
'type:dict_or_none': validate_dict_or_none,
|
'type:dict_or_none': validate_dict_or_none,
|
||||||
@ -515,6 +563,7 @@ validators = {'type:dict': validate_dict,
|
|||||||
'type:subnet_or_none': validate_subnet_or_none,
|
'type:subnet_or_none': validate_subnet_or_none,
|
||||||
'type:subnetpool_id': validate_subnetpool_id,
|
'type:subnetpool_id': validate_subnetpool_id,
|
||||||
'type:subnetpool_id_or_none': validate_subnetpool_id_or_none,
|
'type:subnetpool_id_or_none': validate_subnetpool_id_or_none,
|
||||||
|
'type:subports': validate_subports,
|
||||||
'type:uuid': validate_uuid,
|
'type:uuid': validate_uuid,
|
||||||
'type:uuid_or_none': validate_uuid_or_none,
|
'type:uuid_or_none': validate_uuid_or_none,
|
||||||
'type:uuid_list': validate_uuid_list,
|
'type:uuid_list': validate_uuid_list,
|
||||||
|
@ -838,3 +838,66 @@ class TestAttributeValidation(base.BaseTestCase):
|
|||||||
for value in (0, 1, '2', True, False):
|
for value in (0, 1, '2', True, False):
|
||||||
msg = validators.validate_non_negative(value)
|
msg = validators.validate_non_negative(value)
|
||||||
self.assertIsNone(msg)
|
self.assertIsNone(msg)
|
||||||
|
|
||||||
|
def test_validate_subports_invalid_body(self):
|
||||||
|
self.assertIsNotNone(validators.validate_subports(None))
|
||||||
|
|
||||||
|
def test_validate_subports_invalid_subport_object(self):
|
||||||
|
self.assertIsNotNone(validators.validate_subports(['foo_port']))
|
||||||
|
|
||||||
|
def test_validate_subports_invalid_port_uuid(self):
|
||||||
|
body = [{'port_id': 'foo_port'}]
|
||||||
|
self.assertIsNotNone(validators.validate_subports(body))
|
||||||
|
|
||||||
|
def test_validate_subports_invalid_missing_port_id(self):
|
||||||
|
body = [{'poort_id': 'foo_port'}]
|
||||||
|
self.assertIsNotNone(validators.validate_subports(body))
|
||||||
|
|
||||||
|
def test_validate_subports_invalid_duplicate_port_ids(self):
|
||||||
|
body = [
|
||||||
|
{'port_id': '00000000-ffff-ffff-ffff-000000000000'},
|
||||||
|
{'port_id': '00000000-ffff-ffff-ffff-000000000000'}
|
||||||
|
]
|
||||||
|
self.assertIsNotNone(validators.validate_subports(body))
|
||||||
|
|
||||||
|
def test_validate_subports_invalid_incomplete_segmentation_details(self):
|
||||||
|
body = [
|
||||||
|
{'port_id': '00000000-ffff-ffff-ffff-000000000000',
|
||||||
|
'segmentation_id': '3'}
|
||||||
|
]
|
||||||
|
self.assertIsNotNone(validators.validate_subports(body))
|
||||||
|
|
||||||
|
def test_validate_subports_invalid_unknown_paramenter(self):
|
||||||
|
body = [
|
||||||
|
{'port_id': '00000000-ffff-ffff-ffff-000000000000',
|
||||||
|
'segmentation_id': '3', 'segmeNAtion_type': 'vlan'}
|
||||||
|
]
|
||||||
|
self.assertIsNotNone(validators.validate_subports(body))
|
||||||
|
|
||||||
|
def test_validate_subports_invalid_duplicate_segmentation_id(self):
|
||||||
|
body = [
|
||||||
|
{'port_id': '00000000-ffff-ffff-ffff-000000000000',
|
||||||
|
'segmentation_id': '3', 'segmentation_type': 'vlan'},
|
||||||
|
{'port_id': '11111111-ffff-ffff-ffff-000000000000',
|
||||||
|
'segmentation_id': '3', 'segmentation_type': 'vlan'}
|
||||||
|
]
|
||||||
|
self.assertIsNotNone(validators.validate_subports(body))
|
||||||
|
|
||||||
|
def test_validate_subports_valid_empty_body(self):
|
||||||
|
self.assertIsNone(validators.validate_subports([]))
|
||||||
|
|
||||||
|
def test_validate_subports_valid_suports_with_segmentation_details(self):
|
||||||
|
body = [
|
||||||
|
{'port_id': '00000000-ffff-ffff-ffff-000000000000',
|
||||||
|
'segmentation_id': '3', 'segmentation_type': 'vlan'},
|
||||||
|
{'port_id': '11111111-ffff-ffff-ffff-000000000000',
|
||||||
|
'segmentation_id': '5', 'segmentation_type': 'vlan'}
|
||||||
|
]
|
||||||
|
self.assertIsNone(validators.validate_subports(body))
|
||||||
|
|
||||||
|
def test_validate_subports_valid_subports(self):
|
||||||
|
body = [
|
||||||
|
{'port_id': '00000000-ffff-ffff-ffff-000000000000'},
|
||||||
|
{'port_id': '11111111-ffff-ffff-ffff-000000000000'},
|
||||||
|
]
|
||||||
|
self.assertIsNone(validators.validate_subports(body))
|
||||||
|
Loading…
Reference in New Issue
Block a user