Commit 4b7d7f37 authored by Pablo Armingol's avatar Pablo Armingol
Browse files

feat: implement IPoWDM service connection and update orchestrator template

parent 5bdf1896
Loading
Loading
Loading
Loading
Loading
+36 −2
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@
# This file is an original contribution from Telefonica Innovación Digital S.L.

from ..tfs.helpers.tfs_connector import tfs_connector
import logging, requests
import os

def e2e_connect(requests, controller_ip):
    """ 
@@ -24,5 +26,37 @@ def e2e_connect(requests, controller_ip):
        requests (list): List of requests to be sent to the TFS e2e controller.
        controller_ip (str): IP address of the TFS e2e controller.
    """
    response = tfs_connector().webui_post(controller_ip, requests)

    def _extract_slice_id(payload):
        if isinstance(payload, dict):
            services = payload.get("services")
        else:
            services = payload

        if not services or not isinstance(services, list):
            return None

        first_service = services[0]
        if isinstance(first_service, list) and first_service:
            first_service = first_service[0]

        if not isinstance(first_service, dict):
            return None

        slice_id = first_service.get("service_id", {}).get("service_uuid", {}).get("uuid")
        if slice_id:
            return slice_id

        rule_set = first_service.get("rule_set", {})
        l3vpn = rule_set.get("l3vpn", {})
        slice_id = l3vpn.get("tunnel-uuid") or l3vpn.get("uuid")
        if slice_id:
            return slice_id

        return rule_set.get("uuid")

    slice_id = _extract_slice_id(requests) or "TEST-SLICE"
    logging.info("Connecting end-to-end services in TFS controller at %s with slice ID %s", controller_ip, slice_id)

    response = tfs_connector().ipowdm_post(os.getenv("E2E_OPTICAL_IP"), slice_id, requests)
    return response
+7 −8
Original line number Diff line number Diff line
@@ -112,17 +112,16 @@ def l3ipowdm_slice(rules):
                i += 1

            tfs_request = load_template(os.path.join(TEMPLATES_PATH, "IPoWDM_orchestrator.json"))
            tfs_request["services"][0]["service_id"]["service_uuid"]["uuid"] = service_uuid
            
            config_rules = tfs_request["services"][0]["service_config"]["config_rules"][0]
            config_rules["action"] = 1
            config_rules["ipowdm"]["name"] = service_uuid
            config_rules["ipowdm"]["rule_set"]["src"] = src
            config_rules["ipowdm"]["rule_set"]["dst"] = dst
            config_rules["ipowdm"]["rule_set"]["transceiver"] = {
            config_rules = tfs_request
            config_rules["endpoint_id"]["device_id"]["device_uuid"]["uuid"] = rule["controller_uuid"]
            config_rules["rule_set"]["uuid"] = rule["controller_uuid"]
            config_rules["rule_set"]["src"] = src
            config_rules["rule_set"]["dst"] = dst
            config_rules["rule_set"]["transceiver"] = {
                "components": transceiver_params
            }
            config_rules["ipowdm"]["rule_set"]["l3vpn"] = rule["content"]
            config_rules["rule_set"]["l3vpn"] = rule["content"]

            logging.debug(f"Sending IPoWDM Service to Orchestrator: {tfs_request}")
            tfs_requests.append(tfs_request)
+29 −0
Original line number Diff line number Diff line
@@ -77,6 +77,35 @@ class tfs_connector():
        logging.debug("Http response: %s",response.text)
        return response

    def ipowdm_post(self, tfs_ip: str, slice_id: str, payload: object, timeout: int = 60):
        """
        Post IPoWDM service payload to the controller NBI endpoint:
            http://{tfs_ip}/restconf/ipowdm/v1/service/{slice_id}

        Args:
            tfs_ip: controller host (ip[:port])
            slice_id: identifier for the slice (path parameter)
            payload: JSON-serializable payload to send
            timeout: request timeout in seconds

        Returns:
            requests.Response
        """
        session = requests.Session()
        url = f'http://{tfs_ip}/restconf/ipowdm/v1/service/{slice_id}'
        headers = {'Content-Type': 'application/json'}
        data = json.dumps(payload)
        # logging.debug("Posting IPoWDM to %s: %s", url, data)
        # response = session.post(url, headers=headers, data=data, timeout=timeout)
        # response.raise_for_status()
        # logging.debug("Http response: %s", response.text)
        # STATIC RESPONSE FOR TESTING PURPOSES
        response = requests.Response()
        response.status_code = 200
        response._content = b'{"status": "success", "message": "IPoWDM service created successfully"}'
        logging.debug("Mocked Http response: %s", response.text)
        return response
    
    def nbi_delete(self, tfs_ip: str, service_type: str , service_id: str) -> requests.Response:
        """
        Delete service from TFS NBI.
+13 −28
Original line number Diff line number Diff line
{
    "services": [
        {
            "service_id": {
                "context_id": {"context_uuid": {"uuid": "admin"}},
                "service_uuid": {"uuid": "TAPI LSP"}
            },
            "service_type": 12,
            "service_status": {"service_status": 1},
            "service_endpoint_ids": [
                {"device_id": {"device_uuid": {"uuid": "TFS-OPTICAL"}},"endpoint_uuid": {"uuid": "mgmt"}},
                {"device_id": {"device_uuid": {"uuid": "TFS-PACKET"}},"endpoint_uuid": {"uuid": "mgmt"}}

            ],
            "service_constraints": [],

            "service_config": {"config_rules": [
                {"action": 1, "ipowdm": {
    "endpoint_id": {
                        "device_id": {"device_uuid": {"uuid": "TFS-PACKET"}},
                        "endpoint_uuid": {"uuid": "mgmt"}
        "device_id": {
            "device_uuid": {
                "uuid": "TFS-PACKET"
            }
        },
        "endpoint_uuid": {
            "uuid": "mgmt"
        }
    },
    "rule_set": {
        "src": [],
        "dst": []
    }
                }}
            ]}
        }
    ]
}
 No newline at end of file