Skip to content
Snippets Groups Projects
network_slice_controller.py 47.9 KiB
Newer Older
Javier Velázquez's avatar
Javier Velázquez committed

        Args:
            ietf_intent (dict): IETF-formatted network slice intent.

        Returns:
            dict: A TeraFlow service request for L3VPN configuration.
        """
        # Hardcoded router endpoints
        # TODO should be dynamically determined
        origin_router_id = ietf_intent["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][0]["attachment-circuits"]["attachment-circuit"][0]["sdp-peering"]["peer-sap-id"]
Javier Velázquez's avatar
Javier Velázquez committed
        origin_router_if = '0/0/0-GigabitEthernet0/0/0/0'
        destination_router_id = ietf_intent["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][1]["attachment-circuits"]["attachment-circuit"][0]["sdp-peering"]["peer-sap-id"]
Javier Velázquez's avatar
Javier Velázquez committed
        destination_router_if = '0/0/3-GigabitEthernet0/0/0/3'
        
        # Load L3VPN service template
        self.__load_template(2, os.path.join(TEMPLATES_PATH, "L3-VPN_template_empty.json"))
        tfs_request = json.loads(str(self.__teraflow_template))["services"][0]

        # Generate unique service UUID
        tfs_request["service_id"]["service_uuid"]["uuid"] += "-" + str(int(datetime.now().timestamp() * 1e7))

        # Configure service endpoints
        for endpoint in tfs_request["service_endpoint_ids"]:
            endpoint["device_id"]["device_uuid"]["uuid"] = origin_router_id if endpoint is tfs_request["service_endpoint_ids"][0] else destination_router_id
            endpoint["endpoint_uuid"]["uuid"] = origin_router_if if endpoint is tfs_request["service_endpoint_ids"][0] else destination_router_if

        # Add service constraints
        for i, constraint in enumerate(tfs_request["service_constraints"]):
            bound = ietf_intent["ietf-network-slice-service:network-slice-services"]["slo-sle-templates"]["slo-sle-template"][0]["slo-policy"]["metric-bound"][i]["bound"]
            constraint["custom"]["constraint_value"] = str(bound)

        # Add configuration rules
        for i, config_rule in enumerate(tfs_request["service_config"]["config_rules"][1:], start=1):
            router_id = origin_router_id if i == 1 else destination_router_id
            router_if = origin_router_if if i == 1 else destination_router_if
            resource_value = config_rule["custom"]["resource_value"]

            sdp_index = i - 1
            vlan_value = ietf_intent["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["sdps"]["sdp"][sdp_index]["service-match-criteria"]["match-criterion"][0]["value"]
            resource_value["router_id"] = destination_router_id if i == 1 else origin_router_id
            resource_value["vlan_id"] = int(vlan_value)
            resource_value["address_ip"] = destination_router_id if i == 1 else origin_router_id
            resource_value["policy_AZ"] = "policyA"
            resource_value["policy_ZA"] = "policyB"
            resource_value["ni_name"] = 'ELAN{:s}'.format(str(vlan_value))
            config_rule["custom"]["resource_key"] = f"/device[{router_id}]/endpoint[{router_if}]/settings"
        
        return tfs_request