diff --git a/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py b/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py index c6621773b8b45230358eebff2c60b95aacdda31f..02f412a3f88c495f77046cd5d6be7ca9ee990fab 100644 --- a/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py +++ b/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py @@ -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')