Merge "[AIM][NFV] FlowClassifier conflict on L7Parameters"
This commit is contained in:
commit
32a5f08519
|
@ -260,8 +260,6 @@ try:
|
|||
# method when using L7 parameters.
|
||||
# - key: L7Parameter(key, val)
|
||||
# + key: L7Parameter(keyword=key, value=val)
|
||||
# Also, make sure classifiers with different l7 params are not considered
|
||||
# conflicting
|
||||
|
||||
def create_flow_classifier(self, context, flow_classifier):
|
||||
fc = flow_classifier['flow_classifier']
|
||||
|
@ -299,15 +297,8 @@ try:
|
|||
fc,
|
||||
flow_classifier_db
|
||||
):
|
||||
# REVISIT(ivar): Conflict considers l7_parameters
|
||||
if (validators.is_attr_set(fc['l7_parameters']) and
|
||||
validators.is_attr_set(
|
||||
flow_classifier_db['l7_parameters'])):
|
||||
if (fc['l7_parameters'] ==
|
||||
flow_classifier_db['l7_parameters']):
|
||||
raise fc_ext.FlowClassifierInConflict(
|
||||
id=flow_classifier_db['id']
|
||||
)
|
||||
raise fc_ext.FlowClassifierInConflict(
|
||||
id=flow_classifier_db['id'])
|
||||
flow_classifier_db = flowclassifier_db.FlowClassifier(
|
||||
id=uuidutils.generate_uuid(),
|
||||
tenant_id=tenant_id,
|
||||
|
@ -330,6 +321,32 @@ try:
|
|||
flowclassifier_db.FlowClassifierDbPlugin.create_flow_classifier = (
|
||||
create_flow_classifier)
|
||||
|
||||
# Flowclassifier validation should also take into account l7_parameters.
|
||||
|
||||
old_validation = (
|
||||
flowclassifier_db.FlowClassifierDbPlugin.flowclassifier_basic_conflict)
|
||||
|
||||
def flowclassifier_basic_conflict(cls, first_flowclassifier,
|
||||
second_flowclassifier):
|
||||
def _l7_params_conflict(fc1, fc2):
|
||||
if (validators.is_attr_set(fc1['l7_parameters']) and
|
||||
validators.is_attr_set(fc2['l7_parameters'])):
|
||||
if fc1['l7_parameters'] == fc2['l7_parameters']:
|
||||
return True
|
||||
return all(not validators.is_attr_set(fc['l7_parameters'])
|
||||
for fc in [fc1, fc2])
|
||||
return cls._old_flowclassifier_basic_conflict(
|
||||
first_flowclassifier, second_flowclassifier) and (
|
||||
_l7_params_conflict(first_flowclassifier, second_flowclassifier))
|
||||
|
||||
if getattr(flowclassifier_db.FlowClassifierDbPlugin,
|
||||
'_old_flowclassifier_basic_conflict', None) is None:
|
||||
flowclassifier_db.FlowClassifierDbPlugin.\
|
||||
_old_flowclassifier_basic_conflict = old_validation
|
||||
flowclassifier_db.FlowClassifierDbPlugin.\
|
||||
flowclassifier_basic_conflict = classmethod(
|
||||
flowclassifier_basic_conflict)
|
||||
|
||||
# NOTE(ivar): Trunk subports don't have a device ID, we need this
|
||||
# validation to pass
|
||||
# NOTE(ivar): It would be ideal to re-use the original function and call
|
||||
|
|
|
@ -838,6 +838,20 @@ class TestFlowClassifier(TestAIMServiceFunctionChainingBase):
|
|||
source_ip_prefix='192.168.0.0/24',
|
||||
destination_ip_prefix='192.168.1.0/24',
|
||||
expected_res_status=201)['flow_classifier']
|
||||
|
||||
# Same subnets, different networks.
|
||||
net3 = self._make_network(self.fmt, 'net3', True)
|
||||
self._make_subnet(self.fmt, net1, '192.168.2.1', '192.168.2.0/24')
|
||||
net4 = self._make_network(self.fmt, 'net4', True)
|
||||
self._make_subnet(self.fmt, net1, '192.168.3.1', '192.168.3.0/24')
|
||||
self.create_flow_classifier(
|
||||
l7_parameters={
|
||||
'logical_source_network': net3['network']['id'],
|
||||
'logical_destination_network': net4['network']['id']},
|
||||
source_ip_prefix='192.168.0.0/24',
|
||||
destination_ip_prefix='192.168.1.0/24',
|
||||
expected_res_status=201)
|
||||
|
||||
self.delete_flow_classifier(fc['id'], expected_res_status=204)
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue