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

fix: dedupe overlapping app instance results

parent 4e041cfb
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -202,6 +202,21 @@ def _normalize_federated_app_instances(fed_instances, zone_provider=None, region
    return normalized_instances


def _dedupe_app_instances(instances):
    deduped = []
    seen_instance_ids = set()
    for instance in instances:
        if not isinstance(instance, dict):
            continue
        app_instance_id = instance.get("appInstanceId")
        if app_instance_id and app_instance_id in seen_instance_ids:
            continue
        if app_instance_id:
            seen_instance_ids.add(app_instance_id)
        deduped.append(instance)
    return deduped


def _resolve_app_provider(pi_edge_client, app_id_value, app_payload=None):
    if isinstance(app_payload, dict):
        provider = app_payload.get("appProvider") or app_payload.get("appProviderId")
@@ -890,6 +905,8 @@ def get_app_instance(app_id=None, appId=None, x_correlator=None, xCorrelator=Non
                and instance["edgeCloudZone"].get("edgeCloudRegion") == region
            ]

        instances = _dedupe_app_instances(instances)

        return jsonify(instances), 200

    except Exception as e:
+60 −0
Original line number Diff line number Diff line
@@ -79,6 +79,66 @@ def test_get_app_instance_uses_normalized_provider_for_federated_lookup(
    )


@patch("edge_cloud_management_api.controllers.app_controllers.get_all_feds")
@patch("edge_cloud_management_api.controllers.app_controllers.federation_client")
@patch("edge_cloud_management_api.controllers.app_controllers.PiEdgeAPIClientFactory")
def test_get_app_instance_dedupes_local_and_federated_results(
    mock_factory_class,
    mock_federation_client,
    mock_get_all_feds,
):
    app = Flask(__name__)
    app.config["TESTING"] = True

    mock_client = MagicMock()
    mock_client.get_app_instances.return_value = {
        "appInstances": [{
            "appId": "app-123",
            "appInstanceId": "inst-1",
            "status": "ready",
            "edgeCloudZone": {
                "edgeCloudZoneId": "default",
                "edgeCloudZoneName": "unknown",
                "edgeCloudProvider": "unknown",
                "edgeCloudZoneStatus": "unknown",
                "edgeCloudRegion": "unknown",
            },
        }]
    }
    mock_client.get_app.return_value = {
        "appManifest": {
            "appProvider": "Local Operator",
        }
    }
    mock_factory_class.return_value.create_pi_edge_api_client.return_value = mock_client
    mock_get_all_feds.return_value = [{"_id": "fed-1", "token": "token-1", "partnerOPFederationId": "Remote Operator"}]
    mock_federation_client.get_all_app_instances.return_value = ([{
        "zoneId": "default",
        "appInstanceInfo": [{
            "appId": "app-123",
            "appInstIdentifier": "inst-1",
            "appInstanceState": "ready",
        }],
    }], 200)

    with app.test_request_context():
        response, status_code = app_controllers.get_app_instance(app_id="app-123")

    assert status_code == 200
    assert response.get_json() == [{
        "appId": "app-123",
        "appInstanceId": "inst-1",
        "status": "ready",
        "edgeCloudZone": {
            "edgeCloudZoneId": "default",
            "edgeCloudZoneName": "unknown",
            "edgeCloudProvider": "unknown",
            "edgeCloudZoneStatus": "unknown",
            "edgeCloudRegion": "unknown",
        },
    }]


@patch("edge_cloud_management_api.controllers.app_controllers.get_all_feds", return_value=[])
@patch("edge_cloud_management_api.controllers.app_controllers.PiEdgeAPIClientFactory")
def test_get_app_instance_returns_empty_list_when_no_instances(mock_factory_class, _mock_get_all_feds):