From 524797526dcfe541aceee33cb77a03f74d84be83 Mon Sep 17 00:00:00 2001 From: Sergio Gimenez Date: Sat, 31 Jan 2026 22:10:41 +0100 Subject: [PATCH] fix: normalize adapter responses and QoD handling --- requirements.txt | 2 +- .../edge_cloud_management_controller.py | 57 +++++++++++++++---- .../network_functions_controller.py | 47 ++++++++++----- 3 files changed, 80 insertions(+), 26 deletions(-) diff --git a/requirements.txt b/requirements.txt index 9ea2d85..277f494 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,4 @@ requests==2.32.4 psycopg2-binary urllib3 pydantic-extra-types==2.10.3 -sunrise6g-opensdk==1.0.2.post3 \ No newline at end of file +sunrise6g-opensdk==1.0.29 diff --git a/service-resource-manager-implementation/src/controllers/edge_cloud_management_controller.py b/service-resource-manager-implementation/src/controllers/edge_cloud_management_controller.py index 0194906..3b8fd20 100644 --- a/service-resource-manager-implementation/src/controllers/edge_cloud_management_controller.py +++ b/service-resource-manager-implementation/src/controllers/edge_cloud_management_controller.py @@ -1,6 +1,7 @@ import connexion import logging from os import environ +from requests import Response as RequestsResponse from sunrise6g_opensdk import Sdk as sdkclient import sys @@ -20,6 +21,27 @@ if environ['EDGE_CLOUD_ADAPTER_NAME'] is not None: # sys.exit() +def _normalize_adapter_response(response): + if isinstance(response, RequestsResponse): + try: + data = response.json() + except ValueError: + data = response.text + return data, response.status_code + return response + + +def _ensure_edge_cloud_region(data): + if isinstance(data, list): + for item in data: + if isinstance(item, dict) and not item.get("edgeCloudRegion"): + item["edgeCloudRegion"] = "unknown" + elif isinstance(data, dict): + if not data.get("edgeCloudRegion"): + data["edgeCloudRegion"] = "unknown" + return data + + def deregister_service_function(service_function_id: str): # noqa: E501 """Deregister service. @@ -38,7 +60,7 @@ def get_service_function(service_function_id: str): # noqa: E501 try: service_function = edgecloud_adapter.get_onboarded_app(service_function_id) - return service_function + return _normalize_adapter_response(service_function) except Exception as ce_: raise Exception("An exception occurred :", ce_) @@ -48,7 +70,7 @@ def get_service_functions(): # noqa: E501 """ try: service_functions = edgecloud_adapter.get_all_onboarded_apps() - return service_functions + return _normalize_adapter_response(service_functions) except Exception as ce_: raise Exception("An exception occurred :", ce_) @@ -61,7 +83,8 @@ def register_service_function(body=None): # noqa: E501 insert_doc = connexion.request.get_json() try: - return edgecloud_adapter.onboard_app(insert_doc) + response = edgecloud_adapter.onboard_app(insert_doc) + return _normalize_adapter_response(response) except Exception as ce_: return ce_ @@ -72,6 +95,7 @@ def delete_deployed_service_function(app_id: str): # noqa: E501 response = None try: response = edgecloud_adapter.undeploy_app(app_id) + return _normalize_adapter_response(response) # return response except Exception as ce_: @@ -98,10 +122,15 @@ def deploy_service_function(): # noqa: E501 try: # body = DeployApp.from_dict(connexion.request.get_json()) body = connexion.request.get_json() - response = edgecloud_adapter.deploy_app(body) + app_id = body.get("appId") if isinstance(body, dict) else None + app_zones = body.get("appZones") if isinstance(body, dict) else None + if app_id is not None and app_zones is not None: + response = edgecloud_adapter.deploy_app(app_id, app_zones) + else: + response = edgecloud_adapter.deploy_app(body) # body = DeployServiceFunction.from_dict(connexion.request.get_json()) # response = piedge_encoder.deploy_service_function(body) - return response + return _normalize_adapter_response(response) except Exception as ce_: logger.error(ce_) return ce_ @@ -123,7 +152,7 @@ def get_deployed_service_functions(): # noqa: E501 # if role is not None and role == "admin": try: response = edgecloud_adapter.get_all_deployed_apps() - return response + return _normalize_adapter_response(response) except Exception as ce_: logger.error(ce_) return ce_ @@ -143,7 +172,7 @@ def get_deployed_service_function(app_id: str): # noqa: E501 # if role is not None and role == "admin": try: response = edgecloud_adapter.get_deployed_app(app_id=app_id) - return response + return _normalize_adapter_response(response) except Exception as ce_: logger.error(ce_) return ce_ @@ -157,7 +186,11 @@ def get_nodes(): # noqa: E501 """ # try: response = edgecloud_adapter.get_edge_cloud_zones() - return response + normalized = _normalize_adapter_response(response) + if isinstance(normalized, tuple): + data, status = normalized + return _ensure_edge_cloud_region(data), status + return _ensure_edge_cloud_region(normalized) # except Exception as ce_: # logger.info(ce_) @@ -170,6 +203,10 @@ def node_details(node_id: str): # noqa: E501 """ try: response = edgecloud_adapter.get_edge_cloud_zones_details(zone_id=node_id) - return response + normalized = _normalize_adapter_response(response) + if isinstance(normalized, tuple): + data, status = normalized + return _ensure_edge_cloud_region(data), status + return _ensure_edge_cloud_region(normalized) except Exception as ce_: - logger.info(ce_) \ No newline at end of file + logger.info(ce_) diff --git a/service-resource-manager-implementation/src/controllers/network_functions_controller.py b/service-resource-manager-implementation/src/controllers/network_functions_controller.py index 862731c..1c5db7d 100644 --- a/service-resource-manager-implementation/src/controllers/network_functions_controller.py +++ b/service-resource-manager-implementation/src/controllers/network_functions_controller.py @@ -1,19 +1,25 @@ from os import environ import logging +from os import environ +from typing import Any + import connexion -import sys +from requests import Response as RequestsResponse from sunrise6g_opensdk.common.sdk import Sdk as sdkclient logger = logging.getLogger(__name__) logging.basicConfig(level=logging.DEBUG) -network_adapter = None +network_adapter: Any = None if environ.get('NETWORK_ADAPTER_NAME') is not None: network_adapter_name = environ.get('NETWORK_ADAPTER_NAME') - adapter_base_url = environ.get('NETWORK_ADAPTER_BASE_URL') - scs_as_id = environ.get('SCS_AS_ID') - network_adapter_specs = {'client_name': network_adapter_name, 'base_url': adapter_base_url, 'scs_as_id': scs_as_id} - network_adapter_specs.update(environ) + adapter_base_url = environ.get('NETWORK_ADAPTER_BASE_URL') or "" + scs_as_id = environ.get('SCS_AS_ID') or "" + network_adapter_specs = { + 'client_name': network_adapter_name, + 'base_url': adapter_base_url, + 'scs_as_id': scs_as_id, + } print('Creating network adapter with env: ', network_adapter_specs) adapters = sdkclient.create_adapters_from(adapter_specs={'network': network_adapter_specs}) network_adapter = adapters.get("network") @@ -21,13 +27,23 @@ if environ.get('NETWORK_ADAPTER_NAME') is not None: # logging.error('Network adapter has not been specified! Aborting...') # sys.exit() + +def _normalize_adapter_response(response): + if isinstance(response, RequestsResponse): + try: + data = response.json() + except ValueError: + data = response.text + return data, response.status_code + return response + def create_qod_session(): if connexion.request.is_json: try: if network_adapter is not None: response = network_adapter.create_qod_session(connexion.request.get_json()) - return response + return _normalize_adapter_response(response) else: return { "applicationServer": { @@ -41,7 +57,7 @@ def create_qod_session(): } except Exception as ce_: logger.error(ce_) - return ce_ + return {"error": str(ce_)}, 500 else: return 'ERROR: Could not read JSON payload.', 400 @@ -49,25 +65,26 @@ def get_qod_session(session_id: str): try: if network_adapter is not None: - response = network_adapter.get_qod_session(id) - return {'status': 200, 'session': response} + response = network_adapter.get_qod_session(session_id) + normalized = _normalize_adapter_response(response) + return normalized else: return "Requested QoD session with ID: "+session_id except Exception as ce_: logger.error(ce_) - return ce_ + return {"error": str(ce_)}, 500 def delete_qod_session(session_id: str): try: if network_adapter is not None: - response = network_adapter.delete_qod_session(id) - return response + response = network_adapter.delete_qod_session(session_id) + return _normalize_adapter_response(response) else: return "Deleting QoD session with ID: "+ session_id except Exception as ce_: logger.error(ce_) - return ce_ + return {"error": str(ce_)}, 500 def create_traffic_influence_resource(body): try: @@ -121,4 +138,4 @@ def get_traffic_influence_resource(traffic_influence_id: str): def get_all_traffic_influence_resources(): #TODO - pass \ No newline at end of file + pass -- GitLab