Loading src/open_exposure_gateway/adapters/database/core.py +1 −0 Viewed Changes for src/open_exposure_gateway/adapters/database/core.py: 1 added line, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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)", ) Loading src/open_exposure_gateway/adapters/database/mappers.py +2 −0 Viewed Changes for src/open_exposure_gateway/adapters/database/mappers.py: 2 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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, Loading src/open_exposure_gateway/adapters/database/sql.py +1 −0 Viewed Changes for src/open_exposure_gateway/adapters/database/sql.py: 1 added line, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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) Loading src/open_exposure_gateway/application/mappers/edge_application_mapper.py +2 −2 Viewed 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 Loading @@ -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) Loading @@ -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, Loading src/open_exposure_gateway/application/services/edge_application_management_service.py +40 −15 Viewed 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 Loading @@ -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, Loading Loading @@ -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", Loading Loading @@ -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), Loading Loading @@ -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, ) Loading @@ -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 Loading Loading @@ -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), ) Loading Loading @@ -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, Loading @@ -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, Loading @@ -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
src/open_exposure_gateway/adapters/database/core.py +1 −0 Viewed Changes for src/open_exposure_gateway/adapters/database/core.py: 1 added line, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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)", ) Loading
src/open_exposure_gateway/adapters/database/mappers.py +2 −0 Viewed Changes for src/open_exposure_gateway/adapters/database/mappers.py: 2 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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, Loading
src/open_exposure_gateway/adapters/database/sql.py +1 −0 Viewed Changes for src/open_exposure_gateway/adapters/database/sql.py: 1 added line, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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) Loading
src/open_exposure_gateway/application/mappers/edge_application_mapper.py +2 −2 Viewed 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 Loading @@ -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) Loading @@ -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, Loading
src/open_exposure_gateway/application/services/edge_application_management_service.py +40 −15 Viewed 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 Loading @@ -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, Loading Loading @@ -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", Loading Loading @@ -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), Loading Loading @@ -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, ) Loading @@ -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 Loading Loading @@ -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), ) Loading Loading @@ -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, Loading @@ -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, Loading @@ -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