fix: return the CAMARA appProvider on app instances not the owner id

Merge request reports

Loading
+1 −0
Changes for src/open_exposure_gateway/adapters/database/core.py: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ _ADDED_COLUMNS = (
    "ALTER TABLE qod_sessions ADD COLUMN IF NOT EXISTS device JSONB",
    "ALTER TABLE qod_sessions ADD COLUMN IF NOT EXISTS application_server JSONB",
    "ALTER TABLE app_registrations ADD COLUMN IF NOT EXISTS app_provider_id VARCHAR(255)",
    "ALTER TABLE app_registrations ADD COLUMN IF NOT EXISTS app_provider VARCHAR(64)",
)


+2 −0
Changes for src/open_exposure_gateway/adapters/database/mappers.py: 2 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ class AppRegistrationMapper:
            app_id=row.app_id,
            tenant_id=row.tenant_id,
            app_provider_id=row.app_provider_id,
            app_provider=row.app_provider,
            name=row.name,
            version=row.version,
            package_type=row.package_type,
@@ -49,6 +50,7 @@ class AppRegistrationMapper:
            app_id=domain.app_id,
            tenant_id=domain.tenant_id,
            app_provider_id=domain.app_provider_id,
            app_provider=domain.app_provider,
            name=domain.name,
            version=domain.version,
            package_type=domain.package_type,
+1 −0
Changes for src/open_exposure_gateway/adapters/database/sql.py: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -83,6 +83,7 @@ class AppRegistrationRow(AuditedMixin, Base):
    app_id: Mapped[UUID] = mapped_column(PG_UUID(as_uuid=True), nullable=False)
    tenant_id: Mapped[str] = mapped_column(String(255), nullable=False)
    app_provider_id: Mapped[str | None] = mapped_column(String(255))
    app_provider: Mapped[str | None] = mapped_column(String(64))
    name: Mapped[str] = mapped_column(String(64), nullable=False)
    version: Mapped[str] = mapped_column(String(64), nullable=False)
    package_type: Mapped[PackageType] = mapped_column(_enum_type(PackageType), nullable=False)
+2 −2
Changes for src/open_exposure_gateway/application/mappers/edge_application_mapper.py: 2 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -372,7 +372,7 @@ def build_app_manifest(catalog: SRMCatalogPayload) -> AppManifest:


def build_app_instance_info(
    instance: SRMServiceInstance, app_id: UUID, zone_id: UUID
    instance: SRMServiceInstance, app_id: UUID, zone_id: UUID, app_provider: str
) -> AppInstanceInfo:
    status = _SRM_STATE_TO_APP_INSTANCE_STATUS.get(instance.state, AppInstanceStatus.UNKNOWN)

@@ -398,7 +398,7 @@ def build_app_instance_info(
        appInstanceId=UUID(instance.service_instance_id),
        name=instance.name or instance.service_instance_id,
        appId=app_id,
        appProvider=instance.app_provider_id,
        appProvider=app_provider,
        status=status,
        edgeCloudZoneId=zone_id,
        componentEndpointInfo=endpoint_info or None,
+40 −15
Changes for src/open_exposure_gateway/application/services/edge_application_management_service.py: 40 added lines, 15 removed lines.
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ from open_exposure_gateway.api.camara.edge_application_management.v0_1_0_alpha_1
)
from open_exposure_gateway.application.callback_secrets import encrypt_secret, load_bearer_token
from open_exposure_gateway.application.mappers.edge_application_mapper import (
    UNKNOWN_APP_PROVIDER,
    build_app_deployment_info,
    build_app_deployment_status_change_events,
    build_app_deployment_translation,
@@ -228,6 +229,14 @@ def _log_rejected_transition(current: str, target: str, operation_id: UUID, **id
    )


def _camara_app_provider(
    app_registration: Optional[AppRegistration], fallback: Optional[str] = None
) -> str:
    if app_registration is not None and app_registration.app_provider:
        return app_registration.app_provider
    return fallback or UNKNOWN_APP_PROVIDER


def _build_reconcile_timeout_event(operation: Operation) -> SRMOperationCompleted:
    return SRMOperationCompleted(
        schema_version="1.0",
@@ -431,6 +440,7 @@ class EdgeApplicationManagementService:
                    app_id=translation.app_id,
                    tenant_id=translation.tenant_id,
                    app_provider_id=translation.app_provider_id,
                    app_provider=translation.app_provider or None,
                    name=translation.name,
                    version=translation.version,
                    package_type=PackageType(translation.package_type),
@@ -519,11 +529,14 @@ class EdgeApplicationManagementService:
                        "operations row found for idempotency_key but its app_instances "
                        "row is missing"
                    )
                existing_registration = await self._app_registration_repo.get_by_id(
                    existing_instance.app_registration_id
                )
                return AppInstanceInfo(
                    appInstanceId=existing_instance.app_instance_id,
                    name=request.name,
                    appId=request.appId,
                    appProvider=app_provider_id,
                    appProvider=_camara_app_provider(existing_registration),
                    status=to_app_instance_status(existing_instance.state),
                    edgeCloudZoneId=request.edgeCloudZoneId,
                )
@@ -531,7 +544,7 @@ class EdgeApplicationManagementService:
        owned = await self._get_owned_app(request.appId, app_provider_id, x_correlator)
        if owned is None:
            raise BadRequestException(message=f"App {request.appId} is not registered")
        app_registration, _ = owned
        app_registration, catalog = owned

        if await self._app_instance_repo.exists_in_zone(
            app_registration.app_registration_id, request.edgeCloudZoneId
@@ -594,7 +607,9 @@ class EdgeApplicationManagementService:
            appInstanceId=translation.app_instance_id,
            name=translation.name,
            appId=translation.app_id,
            appProvider=translation.app_provider_id,
            appProvider=_camara_app_provider(
                app_registration, catalog.service_specification.descriptor.app_provider
            ),
            status=AppInstanceStatus.INSTANTIATING,
            edgeCloudZoneId=UUID(translation.zone_id),
        )
@@ -931,13 +946,14 @@ class EdgeApplicationManagementService:
        x_correlator: Optional[str] = None,
    ) -> list[AppInstanceInfo]:
        resolved_app_id: Optional[UUID] = app_id
        filter_registration: Optional[AppRegistration] = None
        if app_id is not None:
            if self._app_registration_repo is None:
                raise RuntimeError("AppRegistrationRepository is not available")
            app_registration = await self._app_registration_repo.get_by_app_id(app_id)
            if app_registration is None:
            filter_registration = await self._app_registration_repo.get_by_app_id(app_id)
            if filter_registration is None:
                return []
            resolved_app_id = app_registration.app_registration_id
            resolved_app_id = filter_registration.app_registration_id

        instances = await self.srm_client.get_app_instances(
            app_provider_id=app_provider_id,
@@ -948,19 +964,21 @@ class EdgeApplicationManagementService:
        )

        result: list[AppInstanceInfo] = []
        app_id_cache: dict[UUID, Optional[UUID]] = {}
        registration_cache: dict[UUID, Optional[AppRegistration]] = {}
        for instance in instances:
            if app_id is not None:
                instance_app_id: Optional[UUID] = app_id
            instance_registration: Optional[AppRegistration]
            if filter_registration is not None:
                instance_registration = filter_registration
            else:
                if self._app_registration_repo is None:
                    raise RuntimeError("AppRegistrationRepository is not available")
                app_registration_id = UUID(instance.service_specification_id)
                if app_registration_id not in app_id_cache:
                    owner = await self._app_registration_repo.get_by_id(app_registration_id)
                    app_id_cache[app_registration_id] = owner.app_id if owner else None
                instance_app_id = app_id_cache[app_registration_id]
            if instance_app_id is None:
                if app_registration_id not in registration_cache:
                    registration_cache[
                        app_registration_id
                    ] = await self._app_registration_repo.get_by_id(app_registration_id)
                instance_registration = registration_cache[app_registration_id]
            if instance_registration is None:
                logger.warning(
                    "app_instance_listed_for_unresolvable_app_registration",
                    app_instance_id=instance.service_instance_id,
@@ -983,7 +1001,14 @@ class EdgeApplicationManagementService:
                    continue
                zone_id = local_instance.edge_cloud_zone_id

            result.append(build_app_instance_info(instance, instance_app_id, zone_id))
            result.append(
                build_app_instance_info(
                    instance,
                    instance_registration.app_id,
                    zone_id,
                    _camara_app_provider(instance_registration),
                )
            )
        return result

    async def delete_app_instance(
Loading
Loading