Commit a4dbc0eb authored by Sergio Gimenez's avatar Sergio Gimenez
Browse files

delete federated app metadata when SRM fails

parent 7d85d3c2
Loading
Loading
Loading
Loading
+62 −7
Original line number Diff line number Diff line
@@ -151,6 +151,61 @@ def delete_app(appId, x_correlator=None):
        pi_edge_factory = PiEdgeAPIClientFactory()
        api_client = pi_edge_factory.create_pi_edge_api_client()
        response = api_client.delete_app(appId=appId)
        if isinstance(response, dict) and int(response.get("status_code", 500)) >= 400:
            logger.info("SRM app delete failed, attempting federation cleanup")
        else:
            return response

        feds = get_all_feds()
        if feds:
            app_provider_id = None
            app_response = api_client.get_app(appId)
            if isinstance(app_response, dict):
                app_provider_id = app_response.get("appProvider") or app_response.get("appProviderId")
                manifest = app_response.get("appManifest")
                if isinstance(manifest, dict) and not app_provider_id:
                    app_provider_id = manifest.get("appProvider") or manifest.get("appProviderId")

            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
                if app_provider_id:
                    fed_instances, fed_code = federation_client.get_all_app_instances(
                        federation_context_id=federation_context_id,
                        app_id=appId,
                        app_provider_id=app_provider_id,
                        token=fed_token,
                    )
                    if fed_code == 200 and isinstance(fed_instances, list):
                        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")
                                if not instance_id:
                                    continue
                                federation_client.remove_app_instance(
                                    federation_context_id=federation_context_id,
                                    app_id=appId,
                                    app_instance_id=instance_id,
                                    zone_id=zone_id,
                                    token=fed_token,
                                )

                remove_response, remove_status = federation_client.delete_onboarded_app(
                    federation_context_id, appId, fed_token
                )
                if remove_status in (200, 202, 204):
                    return jsonify(remove_response), remove_status

        return response

    except NotFound404Exception: