Loading src/realizer/e2e/e2e_connect.py +36 −2 Original line number Diff line number Diff line Loading @@ -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): """ Loading @@ -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 src/realizer/e2e/service_types/l3ipowdm_slice.py +7 −8 Original line number Diff line number Diff line Loading @@ -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) Loading src/realizer/tfs/helpers/tfs_connector.py +29 −0 Original line number Diff line number Diff line Loading @@ -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. Loading src/templates/IPoWDM_orchestrator.json +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 Loading
src/realizer/e2e/e2e_connect.py +36 −2 Original line number Diff line number Diff line Loading @@ -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): """ Loading @@ -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
src/realizer/e2e/service_types/l3ipowdm_slice.py +7 −8 Original line number Diff line number Diff line Loading @@ -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) Loading
src/realizer/tfs/helpers/tfs_connector.py +29 −0 Original line number Diff line number Diff line Loading @@ -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. Loading
src/templates/IPoWDM_orchestrator.json +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