diff --git a/edge_cloud_management_api/controllers/federation_manager_controller.py b/edge_cloud_management_api/controllers/federation_manager_controller.py index 8dc579ff9b779432c3c5c9a8aff2a56c2099f554..05747f2529d9a7900ad08297447b57db754fa551 100644 --- a/edge_cloud_management_api/controllers/federation_manager_controller.py +++ b/edge_cloud_management_api/controllers/federation_manager_controller.py @@ -46,6 +46,18 @@ def create_federation(): zones_to_insert.append(inserted_item) insert_zones(zones_to_insert) insert_federation(fed) + + zone_ids = [zone.get('zoneId') for zone in av_zones] + callback_url = body.get('availZoneNotifLink') # Optional from request + zone_response, zone_code = federation_client.subscribe_to_zones( + response.get('federationContextId'), + zone_ids, + token, + callback_url + ) + if zone_code != 200: + logger.warning(f"Zone subscription returned non-200: {zone_code} - {zone_response}") + return response, code def get_federation(federationContextId): diff --git a/edge_cloud_management_api/services/federation_services.py b/edge_cloud_management_api/services/federation_services.py index 28ea4cb2fa21e3e936e1bf91981a4b1c95ac8658..264bf24d7cf5056b32c24e164d7f54904740e2db 100644 --- a/edge_cloud_management_api/services/federation_services.py +++ b/edge_cloud_management_api/services/federation_services.py @@ -253,6 +253,38 @@ class FederationManagerClient: logger.error(f"Zone synchronization unexpected error: {e}") return {"error": str(e), "status_code": 500} + def subscribe_to_zones(self, federation_context_id: str, accepted_zone_ids: list, token: str, + callback_url: str = None): + + url = f"{self.base_url}/{federation_context_id}/zones" + + body = { + 'acceptedAvailabilityZones': accepted_zone_ids + } + + if callback_url: + body['availZoneNotifLink'] = callback_url + + try: + response = requests.post(url, headers=self._get_headers(token), json=body, timeout=10) + try: + response_body = response.json() + except ValueError: + response_body = response.text + return response_body, response.status_code + except Timeout: + logger.error("Subscribe to zones timed out") + return {"error": "Request timed out"}, 408 + except ConnectionError: + logger.error("Subscribe to zones connection error") + return {"error": "Connection error"}, 503 + except requests.exceptions.HTTPError as http_err: + logger.error(f"Subscribe to zones HTTP error: {http_err}") + return {"error": str(http_err)}, response.status_code + except Exception as e: + logger.error(f"Subscribe to zones unexpected error: {e}") + return {"error": str(e)}, 500 + def get_zone_resource_info(self, federation_context_id: str, zone_id: str, token: str): url = f"{self.base_url}/{federation_context_id}/zones/{zone_id}"