From a9ce6691730a0e7ea8c9acb02385e997594f9d8b Mon Sep 17 00:00:00 2001 From: Matthias Tafelmeier Date: Mon, 26 Jan 2026 18:42:20 +0100 Subject: [PATCH] =?UTF-8?q?=E2=97=8F=20Fix:=20Normalize=20constraint=20lau?= =?UTF-8?q?nching=20workers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add _normalize_constraints() method to BreederService - Convert dict format {"values": [...]} to list format [{"values": [...]}] - Call normalization after preflight validation passes - Fixes "constraints must be a non-empty list" error in sysfs.qdisc Config v0.3 allows both dict and list formats for categorical constraints, but breeder_workers expect list format. This ensures workers receive normalized constraints regardless of input format. --- controller/breeder_service.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/controller/breeder_service.py b/controller/breeder_service.py index 030363d..8c76fd0 100644 --- a/controller/breeder_service.py +++ b/controller/breeder_service.py @@ -188,6 +188,29 @@ def __init__(self, archive_db_config, meta_db_config): self.archive_repo = ArchiveDatabaseRepository(archive_db_config) self.metadata_repo = MetadataDatabaseRepository(meta_db_config) + def _normalize_constraints(self, config): + """Normalize constraint formats in config for breeder workers + + Converts dict format {"values": [...]} to list format [{"values": [...]}] + to ensure workers receive consistent constraint structure. + + Args: + config: Breeder configuration dict (modified in place) + """ + settings = config.get('settings', {}) + for category_name, category_settings in settings.items(): + if not isinstance(category_settings, dict): + continue + + for param_name, param_config in category_settings.items(): + if not isinstance(param_config, dict): + continue + + constraints = param_config.get('constraints') + if constraints and isinstance(constraints, dict) and 'values' in constraints: + # Normalize dict to list format (same logic as ConfigValidator.validate_constraints_v03) + param_config['constraints'] = [constraints] + def create_breeder(self, breeder_config, name): """Create a new breeder instance @@ -238,6 +261,11 @@ def create_breeder(self, breeder_config, name): # (for backwards compatibility with breeders that don't have preflight yet) logger.warning(f"Preflight check failed or not found: {e}. Continuing with worker launch.") + # Normalize constraint formats for workers + # Convert dict format {"values": [...]} to list format [{"values": [...]}] + # This ensures breeder_workers receive consistent constraint structure + self._normalize_constraints(breeder_config) + breeder_uuid = str(uuid.uuid4()) breeder_config['breeder']['uuid'] = breeder_uuid creation_ts = datetime.datetime.now()