From d9df7c9c460f2cb0da6e39b55393b425b219f968 Mon Sep 17 00:00:00 2001 From: Jason Lynch Date: Tue, 21 Apr 2026 14:18:55 -0400 Subject: [PATCH] fix: invalidate services for systemd clusters We do not yet support services for systemd clusters. This commit adds API validation to return errors early. --- server/internal/api/apiv1/validate.go | 29 ++++++++++++++++++--------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/server/internal/api/apiv1/validate.go b/server/internal/api/apiv1/validate.go index 5bbed260..d20ea671 100644 --- a/server/internal/api/apiv1/validate.go +++ b/server/internal/api/apiv1/validate.go @@ -137,19 +137,28 @@ func validateDatabaseSpec(orchestrator config.Orchestrator, spec *api.DatabaseSp portOwner := make(servicePortOwnerMap) seedPostgresPorts(spec, portOwner) - seenServiceIDs := make(ds.Set[string], len(spec.Services)) - for i, svc := range spec.Services { - svcPath := []string{"services", arrayIndexPath(i)} + servicesPath := []string{"services"} - // Check for duplicate service IDs - if seenServiceIDs.Has(string(svc.ServiceID)) { - err := errors.New("service IDs must be unique within a database") - errs = append(errs, newValidationError(err, svcPath)) + switch orchestrator { + case config.OrchestratorSystemD: + if len(spec.Services) != 0 { + errs = append(errs, newValidationError(errors.New("services are not yet supported for systemd clusters"), servicesPath)) } - seenServiceIDs.Add(string(svc.ServiceID)) + default: + seenServiceIDs := make(ds.Set[string], len(spec.Services)) + for i, svc := range spec.Services { + svcPath := appendPath(servicesPath, arrayIndexPath(i)) + + // Check for duplicate service IDs + if seenServiceIDs.Has(string(svc.ServiceID)) { + err := errors.New("service IDs must be unique within a database") + errs = append(errs, newValidationError(err, svcPath)) + } + seenServiceIDs.Add(string(svc.ServiceID)) - errs = append(errs, validateServicePortConflicts(svc, svcPath, portOwner)...) - errs = append(errs, validateServiceSpec(svc, svcPath, false, spec.DatabaseUsers, seenNodeNames)...) + errs = append(errs, validateServicePortConflicts(svc, svcPath, portOwner)...) + errs = append(errs, validateServiceSpec(svc, svcPath, false, spec.DatabaseUsers, seenNodeNames)...) + } } return errors.Join(errs...)