Loading edge_cloud_management_api/controllers/app_controllers.py +17 −0 Original line number Diff line number Diff line Loading @@ -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") Loading Loading @@ -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: Loading tests/unit/controllers/test_app_controllers.py +60 −0 Original line number Diff line number Diff line Loading @@ -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): Loading Loading
edge_cloud_management_api/controllers/app_controllers.py +17 −0 Original line number Diff line number Diff line Loading @@ -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") Loading Loading @@ -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: Loading
tests/unit/controllers/test_app_controllers.py +60 −0 Original line number Diff line number Diff line Loading @@ -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): Loading