Commit 7d85d3c2 authored by Sergio Gimenez's avatar Sergio Gimenez
Browse files

terminate federated app instances by id

parent 51a46511
Loading
Loading
Loading
Loading
+68 −32
Original line number Diff line number Diff line
@@ -943,36 +943,72 @@ def delete_app_instance(appInstanceId: str, x_correlator=None):
        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", [])
        def resolve_app_provider(app_id_value, app_payload=None):
            if isinstance(app_payload, dict):
                provider = app_payload.get("appProvider") or app_payload.get("appProviderId")
                if provider:
                    return provider
                manifest = app_payload.get("appManifest")
                if isinstance(manifest, dict):
                    provider = manifest.get("appProvider") or manifest.get("appProviderId")
                    if provider:
                        return provider
            app_response = pi_edge_client.get_app(app_id_value)
            if isinstance(app_response, dict):
                manifest = app_response.get("appManifest")
                if isinstance(manifest, dict):
                    provider = manifest.get("appProvider") or manifest.get("appProviderId")
                    if provider:
                        return provider
                provider = app_response.get("appProvider") or app_response.get("appProviderId")
                if provider:
                    return provider
            return None

        apps = pi_edge_client.get_service_functions_catalogue()
        app_provider_map = {}
        if isinstance(apps, list):
            for app in apps:
                if not isinstance(app, dict):
                    continue
                app_id_value = app.get("appId") or app.get("id")
                if not app_id_value:
                    continue
                provider = resolve_app_provider(app_id_value, app_payload=app)
                if provider:
                    app_provider_map[app_id_value] = provider

        feds = get_all_feds()
        for fed in feds:
            fed_token = fed.get("token")
            federation_context_id = fed.get("_id")
            if not federation_context_id or not fed_token:
                continue
            for app_id_value, app_provider_id in app_provider_map.items():
                fed_instances, fed_code = federation_client.get_all_app_instances(
                    federation_context_id=federation_context_id,
                    app_id=app_id_value,
                    app_provider_id=app_provider_id,
                    token=fed_token,
                )
                if fed_code != 200 or not isinstance(fed_instances, list):
                    continue
                for zone_info in fed_instances:
                    if not isinstance(zone_info, dict):
                        continue
                    zone_id = zone_info.get("zoneId")
                    instances_list = zone_info.get("appInstanceInfo", [])
                    if not zone_id or not isinstance(instances_list, list):
                        continue
                    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,
                            federation_context_id=federation_context_id,
                            app_id=app_id_value,
                            app_instance_id=appInstanceId,
                            zone_id=zone_id,
                            token=fed_token,