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

fix: return 204 on app delete per CAMARA spec

parent d0603a20
Loading
Loading
Loading
Loading
+66 −38
Original line number Diff line number Diff line
@@ -52,6 +52,52 @@ _resolve_federated_app_identity = resolve_federated_app_identity
_resolve_federated_app_provider_id = resolve_federated_app_provider_id


def _get_app_provider_for_delete(api_client, app_id):
    app_response = api_client.get_app(app_id)
    if not isinstance(app_response, dict):
        return None

    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")
    return app_provider_id


def _cleanup_federated_app_before_local_delete(api_client, app_id):
    feds = get_all_feds()
    if not feds:
        return None

    app_provider_id = _get_app_provider_for_delete(api_client, app_id)
    cleanup_response = cleanup_federated_app(
        federation_client=federation_client,
        feds=feds,
        app_id=app_id,
        app_provider_id=app_provider_id,
        normalize_federated_app_id=_normalize_federated_app_id,
        resolve_federated_app_identity=_resolve_federated_app_identity,
    )
    if cleanup_response is None:
        return None

    _, cleanup_status = cleanup_response
    if cleanup_status in (200, 202, 204):
        return None
    return cleanup_response


def _delete_local_app(api_client, app_id):
    response = api_client.delete_app(appId=app_id)
    if isinstance(response, dict):
        status = int(response.get("status_code", 500))
        if status == 404:
            return None
        if status >= 400:
            return jsonify(response), status
    return "", 204


def _iter_federated_instances(feds, app_id_provider_pairs):
    return iter_federated_instances(federation_client, feds, app_id_provider_pairs)

@@ -134,6 +180,8 @@ def get_app(appId, x_correlator=None):
        srm_factory = SRMAPIClientFactory()
        api_client = srm_factory.create_srm_api_client()
        response = api_client.get_app(appId)
        if isinstance(response, dict) and int(response.get("status_code", 200)) >= 400:
            return jsonify(response), int(response.get("status_code", 500))
        return response

    except NotFound404Exception:
@@ -154,34 +202,14 @@ def delete_app(appId, x_correlator=None):
    try:
        srm_factory = SRMAPIClientFactory()
        api_client = srm_factory.create_srm_api_client()
        feds = get_all_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")

        if feds:
            cleanup_response = cleanup_federated_app(
                federation_client=federation_client,
                feds=feds,
                app_id=appId,
                app_provider_id=app_provider_id,
                normalize_federated_app_id=_normalize_federated_app_id,
                resolve_federated_app_identity=_resolve_federated_app_identity,
            )
        cleanup_response = _cleanup_federated_app_before_local_delete(api_client, appId)
        if cleanup_response is not None:
                cleanup_body, cleanup_status = cleanup_response
                if cleanup_status not in (200, 202, 204):
            return cleanup_response

        response = api_client.delete_app(appId=appId)
        if isinstance(response, dict) and int(response.get("status_code", 500)) >= 400:
            return response

        return response
        result = _delete_local_app(api_client, appId)
        if result is not None:
            return result
        return "", 204

    except NotFound404Exception:
        return (