Commit 51a46511 authored by Sergio Gimenez's avatar Sergio Gimenez
Browse files

delete app instances across federations

parent 9cc6e698
Loading
Loading
Loading
Loading
+54 −7
Original line number Diff line number Diff line
@@ -929,14 +929,61 @@ def delete_app_instance(appInstanceId: str, x_correlator=None):
        pi_edge_client_factory = PiEdgeAPIClientFactory()
        pi_edge_client = pi_edge_client_factory.create_pi_edge_api_client()
        response = pi_edge_client.delete_app_instance(appInstanceId)
        if isinstance(response, dict):
        if isinstance(response, dict) and response.get("status_code") != 404:
            status_code = response.get("status_code", 500)
            return jsonify(response), status_code
        if not isinstance(response, dict) and response.status_code != 404:
            return jsonify({
                "result": response.text,
                "status": response.status_code
            }), response.status_code

        if not isinstance(response, dict):
            status_code = response.status_code
        else:
            status_code = response.get("status_code", 404)

        instances_response = get_app_instance()
        if isinstance(instances_response, tuple):
            instances_payload, _instances_status = instances_response
        else:
            instances_payload = instances_response
        instances_data = instances_payload.get_json() if hasattr(instances_payload, "get_json") else None
        instances_list = []
        if isinstance(instances_data, dict):
            instances_list = instances_data.get("appInstanceInfo", [])

        for instance in instances_list:
            if not isinstance(instance, dict):
                continue
            instance_id = instance.get("appInstIdentifier") or instance.get("appInstanceId")
            if instance_id != appInstanceId:
                continue
            fed_context_id = instance.get("federationContextId") or instance.get("fedContextId")
            zone_id = instance.get("zoneId") or instance.get("edgeCloudZoneId")
            app_id = instance.get("appId")
            if not (fed_context_id and zone_id and app_id):
                continue
            fed = get_fed(fed_context_id)
            if not fed:
                continue
            fed_token = fed.get("token")
            if not fed_token:
                continue
            remove_response, remove_status = federation_client.remove_app_instance(
                federation_context_id=fed_context_id,
                app_id=app_id,
                app_instance_id=appInstanceId,
                zone_id=zone_id,
                token=fed_token,
            )
            return jsonify(remove_response), remove_status

        return jsonify({
            "error": response.get("error") if isinstance(response, dict) else response.text,
            "status_code": status_code
        }), status_code

    except Exception as e:
        return (
            jsonify({
+51 −0
Original line number Diff line number Diff line
@@ -270,6 +270,57 @@ class FederationManagerClient:
            )
            return {"error": str(e)}, 500

    def remove_app_instance(
        self,
        federation_context_id: str,
        app_id: str,
        app_instance_id: str,
        zone_id: str,
        token: str,
    ):
        url = (
            f"{self.base_url}/{federation_context_id}/application/lcm/app/{app_id}"
            f"/instance/{app_instance_id}/zone/{zone_id}"
        )
        try:
            response = requests.delete(url, headers=self._get_headers(token), timeout=10)
            try:
                body = response.json()
            except ValueError:
                body = response.text
            response.raise_for_status()
            return body, response.status_code
        except Timeout:
            logger.error("DELETE /application/lcm/app/{appId}/instance/{appInstanceId}/zone/{zoneId} timed out")
            return {"error": "Request timed out"}, 408
        except ConnectionError:
            logger.error(
                "DELETE /application/lcm/app/{appId}/instance/{appInstanceId}/zone/{zoneId} connection error"
            )
            return {"error": "Connection error"}, 503
        except requests.exceptions.HTTPError as http_err:
            logger.error(
                "DELETE /application/lcm/app/%s/instance/%s/zone/%s HTTP error: %s",
                app_id,
                app_instance_id,
                zone_id,
                http_err,
            )
            try:
                body = http_err.response.json()
            except ValueError:
                body = http_err.response.text
            return {"error": body}, http_err.response.status_code
        except Exception as e:
            logger.error(
                "DELETE /application/lcm/app/%s/instance/%s/zone/%s unexpected error: %s",
                app_id,
                app_instance_id,
                zone_id,
                e,
            )
            return {"error": str(e)}, 500

    '''---AVAILABILITY ZONE INFO SYNCHRONIZATION---'''

    def request_zone_sync(self, federation_context_id: str, body: dict, token: str):