From a9bd0a4e0e6c39f4731c9f67414ee0623e9d8747 Mon Sep 17 00:00:00 2001 From: aschumann-virtualcable Date: Fri, 22 May 2026 17:19:24 +0200 Subject: [PATCH] Prevents removal of machines with active user services Ensures machines cannot be removed if they have assigned user services, avoiding orphaned resources and enforcing service limits integrity. Raises a validation error listing machines that cannot be removed. --- .../src/uds/core/services/generics/fixed/service.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/server/src/uds/core/services/generics/fixed/service.py b/server/src/uds/core/services/generics/fixed/service.py index ca3b96986..d059edddc 100644 --- a/server/src/uds/core/services/generics/fixed/service.py +++ b/server/src/uds/core/services/generics/fixed/service.py @@ -151,9 +151,16 @@ def initialize(self, values: 'types.core.ValuesType') -> None: if not self.machines.value: raise exceptions.ui.ValidationError(gettext('We need at least a machine')) - # Remove machines not in values from "assigned" set + # Do not allow removing machines that still have assigned user services. + # (their UserService rows would linger, counting against userservices_limit) with self._assigned_access() as assigned_vms: - assigned_vms &= set(self.machines.as_list()) + removed_assigned = assigned_vms - set(self.machines.as_list()) + if removed_assigned: + raise exceptions.ui.ValidationError( + gettext('Cannot remove machines with assigned services: {}').format( + ', '.join(sorted(removed_assigned)) + ) + ) self.token.value = self.token.value.strip() @contextlib.contextmanager