Skip to content
Snippets Groups Projects
Commit f0de9596 authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

Update ComposeConfigRules.py

parent a2a1426d
No related branches found
No related tags found
2 merge requests!142Release TeraFlowSDN 2.1,!139Fixes on OpenConfig and ACLs
......@@ -12,11 +12,14 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import itertools, json, re
import itertools, json, logging, re
from typing import Dict, List, Optional, Tuple
from common.proto.context_pb2 import ConfigRule
from common.tools.grpc.Tools import grpc_message_to_json_string
from common.tools.object_factory.ConfigRule import json_config_rule_set
LOGGER = logging.getLogger(__name__)
SETTINGS_RULE_NAME = '/settings'
DEVICE_SETTINGS = re.compile(r'\/device\[([^\]]+)\]\/settings')
......@@ -76,6 +79,7 @@ def compose_device_config_rules(
config_rules : List, subservice_config_rules : List, path_hops : List,
device_name_mapping : Dict[str, str], endpoint_name_mapping : Dict[Tuple[str, str], str]
) -> None:
LOGGER.warning('[compose_device_config_rules] begin')
devices_traversed = set()
endpoints_traversed = set()
......@@ -85,29 +89,61 @@ def compose_device_config_rules(
endpoints_traversed.add((device_uuid_or_name, path_hop['ingress_ep']))
endpoints_traversed.add((device_uuid_or_name, path_hop['egress_ep']))
LOGGER.warning('[compose_device_config_rules] devices_traversed={:s}'.format(str(devices_traversed)))
LOGGER.warning('[compose_device_config_rules] endpoints_traversed={:s}'.format(str(endpoints_traversed)))
for config_rule in config_rules:
if config_rule.WhichOneof('config_rule') != 'custom': continue
LOGGER.warning('[compose_device_config_rules] processing config_rule: {:s}'.format(
grpc_message_to_json_string(config_rule)))
if config_rule.WhichOneof('config_rule') == 'acl':
LOGGER.warning('[compose_device_config_rules] is acl')
acl_endpoint_id = config_rule.acl.endpoint_id
acl_device_uuid = acl_endpoint_id.device_id.device_uuid.uuid
LOGGER.warning('[compose_device_config_rules] acl_device_uuid={:s}'.format(str(acl_device_uuid)))
if acl_device_uuid not in devices_traversed: continue
acl_endpoint_uuid = acl_endpoint_id.endpoint_uuid.uuid
LOGGER.warning('[compose_device_config_rules] initial acl_endpoint_uuid={:s}'.format(str(acl_endpoint_uuid)))
# given endpoint uuids link 'eth-1/0/20.533', remove last part after the '.'
acl_endpoint_uuid_reversed = acl_endpoint_uuid[::-1]
acl_endpoint_uuid_reversed_parts = acl_endpoint_uuid_reversed.split('.', maxsplit=1)
acl_endpoint_uuid_reversed_last_part = acl_endpoint_uuid_reversed_parts[-1]
acl_endpoint_uuid = acl_endpoint_uuid_reversed_last_part[::-1]
LOGGER.warning('[compose_device_config_rules] corrected acl_endpoint_uuid={:s}'.format(str(acl_endpoint_uuid)))
if acl_endpoint_uuid not in endpoints_traversed: continue
LOGGER.warning('[compose_device_config_rules] adding acl config rule')
subservice_config_rules.append(config_rule)
match = DEVICE_SETTINGS.match(config_rule.custom.resource_key)
if match is not None:
device_uuid_or_name = match.group(1)
device_name_or_uuid = device_name_mapping[device_uuid_or_name]
device_keys = {device_uuid_or_name, device_name_or_uuid}
elif config_rule.WhichOneof('config_rule') == 'custom':
LOGGER.warning('[compose_device_config_rules] is custom')
if len(device_keys.intersection(devices_traversed)) == 0: continue
subservice_config_rules.append(config_rule)
match = DEVICE_SETTINGS.match(config_rule.custom.resource_key)
if match is not None:
device_uuid_or_name = match.group(1)
device_name_or_uuid = device_name_mapping[device_uuid_or_name]
device_keys = {device_uuid_or_name, device_name_or_uuid}
match = ENDPOINT_SETTINGS.match(config_rule.custom.resource_key)
if match is not None:
device_uuid_or_name = match.group(1)
device_name_or_uuid = device_name_mapping[device_uuid_or_name]
device_keys = {device_uuid_or_name, device_name_or_uuid}
if len(device_keys.intersection(devices_traversed)) == 0: continue
subservice_config_rules.append(config_rule)
endpoint_uuid_or_name = match.group(2)
endpoint_name_or_uuid_1 = endpoint_name_mapping[(device_uuid_or_name, endpoint_uuid_or_name)]
endpoint_name_or_uuid_2 = endpoint_name_mapping[(device_name_or_uuid, endpoint_uuid_or_name)]
endpoint_keys = {endpoint_uuid_or_name, endpoint_name_or_uuid_1, endpoint_name_or_uuid_2}
match = ENDPOINT_SETTINGS.match(config_rule.custom.resource_key)
if match is not None:
device_uuid_or_name = match.group(1)
device_name_or_uuid = device_name_mapping[device_uuid_or_name]
device_keys = {device_uuid_or_name, device_name_or_uuid}
device_endpoint_keys = set(itertools.product(device_keys, endpoint_keys))
if len(device_endpoint_keys.intersection(endpoints_traversed)) == 0: continue
subservice_config_rules.append(config_rule)
endpoint_uuid_or_name = match.group(2)
endpoint_name_or_uuid_1 = endpoint_name_mapping[(device_uuid_or_name, endpoint_uuid_or_name)]
endpoint_name_or_uuid_2 = endpoint_name_mapping[(device_name_or_uuid, endpoint_uuid_or_name)]
endpoint_keys = {endpoint_uuid_or_name, endpoint_name_or_uuid_1, endpoint_name_or_uuid_2}
device_endpoint_keys = set(itertools.product(device_keys, endpoint_keys))
if len(device_endpoint_keys.intersection(endpoints_traversed)) == 0: continue
subservice_config_rules.append(config_rule)
else:
continue
LOGGER.warning('[compose_device_config_rules] end')
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment