diff --git a/edge_cloud_management_api/configs/env_config.py b/edge_cloud_management_api/configs/env_config.py index 877a5a12f7273d228e0d6f25fb20d903d7f7d621..87c5878db2f60446a3c50d87f0dfc79de6a6e4be 100644 --- a/edge_cloud_management_api/configs/env_config.py +++ b/edge_cloud_management_api/configs/env_config.py @@ -6,12 +6,12 @@ load_dotenv() class Configuration(BaseSettings): - MONGO_URI: str = os.getenv("MONGO_URI") or "" - SRM_HOST: str = os.getenv("SRM_HOST") or "" - PI_EDGE_USERNAME: str = os.getenv("PI_EDGE_USERNAME") or "" - PI_EDGE_PASSWORD: str = os.getenv("PI_EDGE_PASSWORD") or "" - HTTP_PROXY: str = os.getenv("HTTP_PROXY") or "" - FEDERATION_MANAGER_HOST: str = os.getenv("FEDERATION_MANAGER_HOST") or "" + MONGO_URI: str = os.getenv("MONGO_URI") + SRM_HOST: str = os.getenv("SRM_HOST") + PI_EDGE_USERNAME: str = os.getenv("PI_EDGE_USERNAME") + PI_EDGE_PASSWORD: str = os.getenv("PI_EDGE_PASSWORD") + HTTP_PROXY: str = os.getenv("HTTP_PROXY") + FEDERATION_MANAGER_HOST=os.getenv("FEDERATION_MANAGER_HOST") config = Configuration() diff --git a/edge_cloud_management_api/controllers/app_controllers.py b/edge_cloud_management_api/controllers/app_controllers.py index a731ee515c1fd8af9a5f2ce9aec60a754ed780da..3ce787fc79e569e562f741f36c58f2b458b3a8a0 100644 --- a/edge_cloud_management_api/controllers/app_controllers.py +++ b/edge_cloud_management_api/controllers/app_controllers.py @@ -85,6 +85,80 @@ def delete_app(appId, x_correlator=None): ) +#def create_app_instance(): + # logger.info("Received request to create app instance") + + # try: + # Step 1: Get request body + # body = request.get_json() + # logger.debug(f"Request body: {body}") + + # Step 2: Validate body format + # app_id = body.get('appId') + # app_zones = body.get('appZones') + + # if not app_id or not app_zones: + # return jsonify({"error": "Missing required fields: appId or appZones"}), 400 + + # Step 3: Connect to Mongo and check if app exists + # with MongoManager() as mongo_manager: + # app_data = mongo_manager.find_document("apps", {"_id": app_id}) + # pi_edge_client_factory = PiEdgeAPIClientFactory() + # pi_edge_client = pi_edge_client_factory.create_pi_edge_api_client() + # app_data = pi_edge_client.get_app(app_id) + + # if len(app_data)<1: + # logger.warning(f"No application found with ID {app_id}") + # return jsonify({"error": "App not found", "details": f"No application found with ID {app_id}"}), 404 + + # logger.info(f"Application {app_id} found in database") + + # Step 4: Deploy app instance using Pi-Edge client + + + #logger.info(f"Preparing to send deployment request to SRM for appId={app_id}") + + # deployment_payload = { + # "appId": app_id, + # "appZones": app_zones + #} + + #Print everything before sending + # print("\n=== Preparing Deployment Request ===") + # print(f"Endpoint: {pi_edge_client.base_url}/deployedServiceFunction") + # print(f"Headers: {pi_edge_client._get_headers()}") + # print(f"Payload: {deployment_payload}") + # print("=== End of Deployment Request ===\n") + + #Try sending to Pi-Edge, catch connection errors separately + # try: + # response = pi_edge_client.deploy_service_function(data=deployment_payload) + + # if isinstance(response, dict) and "error" in response: + # logger.warning(f"Failed to deploy service function: {response}") + # return jsonify({ + # "warning": "Deployment not completed (SRM service unreachable)", + # "details": response + # }), 202 # Still accept the request but warn + + # logger.info(f"Deployment response from SRM: {response}") + + # except Exception as inner_error: + # logger.error(f"Exception while trying to deploy to SRM: {inner_error}") + # return jsonify({ + # "warning": "SRM backend unavailable. Deployment request was built correctly.", + # "details": str(inner_error) + # }), 202 # Still accept it (because your backend worked) + + # return jsonify({"message": f"Application {app_id} instantiation accepted"}), 202 + + # except ValidationError as e: + # logger.error(f"Validation error: {str(e)}") + # return jsonify({"error": "Validation error", "details": str(e)}), 400 + #except Exception as e: + # logger.error(f"Unexpected error in create_app_instance: {str(e)}") + # return jsonify({"error": "An unexpected error occurred", "details": str(e)}), 500 + def create_app_instance(): logger.info("Received request to create app instance") @@ -170,7 +244,12 @@ def get_app_instance(app_id=None, x_correlator=None, app_instance_id=None, regio def delete_app_instance(appInstanceId: str, x_correlator=None): - + """ + Terminate an Application Instance + + - Removes a specific app instance from the database. + - Returns 204 if deleted, 404 if not found. + """ try: pi_edge_client_factory = PiEdgeAPIClientFactory() pi_edge_client = pi_edge_client_factory.create_pi_edge_api_client() diff --git a/edge_cloud_management_api/controllers/edge_cloud_controller.py b/edge_cloud_management_api/controllers/edge_cloud_controller.py index 5fe9f5e0246c02041fe9bc0d7817a1727abae0e4..ce31309268791eaca66f3d9a55fd672384b2cf3a 100644 --- a/edge_cloud_management_api/controllers/edge_cloud_controller.py +++ b/edge_cloud_management_api/controllers/edge_cloud_controller.py @@ -111,9 +111,14 @@ def get_edge_cloud_zones(x_correlator: str | None = None, region=None, status=No } return jsonify(error_info), 500 +<<<<<<< HEAD def edge_cloud_zone_details(zoneId: str) -> dict: pi_edge_factory = PiEdgeAPIClientFactory() api_client = pi_edge_factory.create_pi_edge_api_client() result = api_client.edge_cloud_zone_details(zone_id=zoneId) return result +======= + def get_zone_details(zoneId:str): + pass +>>>>>>> 1c306f8dd595452cbe7804c3473f2f4b77a0b270 diff --git a/edge_cloud_management_api/controllers/federation_manager_controller.py b/edge_cloud_management_api/controllers/federation_manager_controller.py index 6e872c82fd829b53ecd59f33469b6c0e4fac3e30..eba0139bbf69332d35ef3a52cecc7cea6fb09f20 100644 --- a/edge_cloud_management_api/controllers/federation_manager_controller.py +++ b/edge_cloud_management_api/controllers/federation_manager_controller.py @@ -1,6 +1,8 @@ from flask import request, jsonify from edge_cloud_management_api.services.federation_services import FederationManagerClientFactory +factory = FederationManagerClientFactory() +federation_client = factory.create_federation_client() def create_federation(): """ diff --git a/edge_cloud_management_api/services/federation_services.py b/edge_cloud_management_api/services/federation_services.py index b01a6b1a310cfed4f1eace87b0c22f5b8eeb3dab..4c671a96a4d6b54657786c9c089408fbf1c87aee 100644 --- a/edge_cloud_management_api/services/federation_services.py +++ b/edge_cloud_management_api/services/federation_services.py @@ -1,11 +1,17 @@ +<<<<<<< HEAD import os +======= +>>>>>>> 1c306f8dd595452cbe7804c3473f2f4b77a0b270 import requests from requests.exceptions import Timeout, ConnectionError from edge_cloud_management_api.configs.env_config import config from edge_cloud_management_api.managers.log_manager import logger +<<<<<<< HEAD from edge_cloud_management_api.services.pi_edge_services import PiEdgeAPIClientFactory +======= +>>>>>>> 1c306f8dd595452cbe7804c3473f2f4b77a0b270 class FederationManagerClient: def __init__(self, base_url=None): @@ -94,6 +100,7 @@ class FederationManagerClient: logger.error(f"GET /fed-context-id unexpected error: {e}") return {"error": str(e)} +<<<<<<< HEAD def onboard_application(self, federation_context_id: str, body: dict): url = f"{self.base_url}/{federation_context_id}/application/onboarding" try: @@ -153,6 +160,8 @@ class FederationManagerClient: return {"error": str(e), "status_code": 500} +======= +>>>>>>> 1c306f8dd595452cbe7804c3473f2f4b77a0b270 class FederationManagerClientFactory: def __init__(self): @@ -162,6 +171,7 @@ class FederationManagerClientFactory: base_url = base_url or self.default_base_url return FederationManagerClient(base_url=base_url) +<<<<<<< HEAD def onboard_application_to_partners(app_id, zones): SOURCE_OP = os.getenv("SOURCE_OP_ID") federation_context_id = os.getenv("FEDERATION_CONTEXT_ID") @@ -209,6 +219,8 @@ class FederationManagerClientFactory: return {"onboardingResults": results}, 202 +======= +>>>>>>> 1c306f8dd595452cbe7804c3473f2f4b77a0b270 if __name__ == "__main__": factory = FederationManagerClientFactory() diff --git a/edge_cloud_management_api/services/pi_edge_services.py b/edge_cloud_management_api/services/pi_edge_services.py index cfdf3cb05e19d05216ff52a5d6b847f2f4c39373..e7ae41bccbc5a68699e27dea48d61663504390f6 100644 --- a/edge_cloud_management_api/services/pi_edge_services.py +++ b/edge_cloud_management_api/services/pi_edge_services.py @@ -239,7 +239,7 @@ class PiEdgeAPIClient: url = f"{self.base_url}/node" #try: request_headers = self._get_headers() - response = requests.get(url, headers=request_headers,verify=False) + response = requests.get(url, headers=request_headers, verify=False) response.raise_for_status() nodes = response.json() if not nodes: @@ -341,6 +341,87 @@ class PiEdgeAPIClient: logger.info(e.args) return e.args + def create_qod_session(self, body:dict): + + url = f"{self.base_url}/sessions" + request_headers = self._get_headers() + try: + response = requests.post(url, json=body, headers=request_headers,verify=False) + response.raise_for_status() + return response.json() + except Exception as e: + logger.info(e.args) + return e.args + + def get_qod_session(self, sessionId: str): + + url = f"{self.base_url}/sessions/"+sessionId + request_headers = self._get_headers() + try: + response = requests.get(url, headers=request_headers,verify=False) + response.raise_for_status() + return response + except Exception as e: + logger.info(e.args) + return e.args + + def delete_qod_session(self, sessionId: str): + + url = f"{self.base_url}/sessions/"+sessionId + request_headers = self._get_headers() + try: + response = requests.delete(url, headers=request_headers,verify=False) + response.raise_for_status() + return response + except Exception as e: + logger.info(e.args) + return e.args + + def create_traffic_influence_resource(self, body_dict): + url = f"{self.base_url}/traffic-influences/" + request_headers = self._get_headers() + try: + response = requests.post(url, json=body_dict, headers=request_headers,verify=False) + response.raise_for_status() + return response.json() + except Exception as e: + logger.info(e.args) + return e.args + + def delete_traffic_influence_resource(self, id: str): + url = f"{self.base_url}/traffic-influences/"+id + request_headers = self._get_headers() + try: + response = requests.delete(url, headers=request_headers,verify=False) + response.raise_for_status() + return response + except Exception as e: + logger.info(e.args) + return e.args + + def get_traffic_influence_resource(self, id: str): + url = f"{self.base_url}/traffic-influences/"+id + request_headers = self._get_headers() + try: + response = requests.get(url, headers=request_headers,verify=False) + response.raise_for_status() + return response.json() + except Exception as e: + logger.info(e.args) + return e.args + + def get_all_traffic_influence_resources(self): + url = f"{self.base_url}/traffic-influences/" + request_headers = self._get_headers() + try: + response = requests.get(url, headers=request_headers,verify=False) + response.raise_for_status() + return response.json() + except Exception as e: + logger.info(e.args) + return e.args + + class PiEdgeAPIClientFactory: """ diff --git a/edge_cloud_management_api/specification/openapi.yaml b/edge_cloud_management_api/specification/openapi.yaml index 67f026d04b4a855a4dc39c75301b6e3ff7c359e2..ab8567e9af9d0cce78834e6cc91866fd6d5d0f70 100644 --- a/edge_cloud_management_api/specification/openapi.yaml +++ b/edge_cloud_management_api/specification/openapi.yaml @@ -824,7 +824,12 @@ paths: "405": description: Method not allowed "404": +<<<<<<< HEAD description: Session not found +======= + description: Session not found + +>>>>>>> 1c306f8dd595452cbe7804c3473f2f4b77a0b270 /partner: post: tags: @@ -1232,12 +1237,6 @@ paths: application/json: schema: $ref: '#/components/schemas/inline_response_200_2' - "400": - description: Bad request - content: - application:/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' "401": description: Unauthorized content: @@ -1250,38 +1249,6 @@ paths: application/problem+json: schema: $ref: '#/components/schemas/ProblemDetails' - "409": - description: Conflict - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "422": - description: Unprocessable Entity - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "500": - description: Internal Server Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "503": - description: Service Unavailable - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - "520": - description: Web Server Returned an Unknown Error - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ProblemDetails' - default: - description: Generic Error components: # securitySchemes: @@ -1509,7 +1476,7 @@ components: properties: interfaceId: type: string - pattern: ^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$ + #pattern: ^[A-Za-z0-9][A-Za-z0-9_]{6,30}[A-Za-z0-9]$ description: | This is the interface Identifier that Application Provider defines when application is being submitted.