From 7d9d6efa6e4909c1be55d5126cd70da45c68c6e5 Mon Sep 17 00:00:00 2001 From: nfebe Date: Mon, 30 Mar 2026 00:43:05 +0200 Subject: [PATCH] fix(api): Generate env vars for existing database mode The existing database path was not generating environment variables or writing credentials to .env.flatrun. Validation now requires database_name, username, and password since we lack admin access to create them on an existing database. Port defaults are explicit per database type (mysql, mariadb, postgres, mongodb, redis) with a logged fallback for unknown types. Deployment name sanitization handles hyphens, dots, and spaces. Signed-off-by: nfebe --- internal/api/multi_database_test.go | 42 +++++++++++++++++++++++++++++ internal/api/server.go | 34 +++++++++++++++++++---- 2 files changed, 71 insertions(+), 5 deletions(-) diff --git a/internal/api/multi_database_test.go b/internal/api/multi_database_test.go index 98a8daa..27205a4 100644 --- a/internal/api/multi_database_test.go +++ b/internal/api/multi_database_test.go @@ -148,9 +148,51 @@ func TestDatabaseConfigRequest_Validate(t *testing.T) { Type: "redis", Mode: "existing", ExistingContainer: "redis-server", + DatabaseName: "cache_db", + Username: "cache_user", + Password: "secret", }, wantErr: false, }, + { + name: "existing mode missing database_name", + req: DatabaseConfigRequest{ + Alias: "cache", + Type: "redis", + Mode: "existing", + ExistingContainer: "redis-server", + Username: "cache_user", + Password: "secret", + }, + wantErr: true, + errMsg: "database_name is required", + }, + { + name: "existing mode missing username", + req: DatabaseConfigRequest{ + Alias: "cache", + Type: "redis", + Mode: "existing", + ExistingContainer: "redis-server", + DatabaseName: "cache_db", + Password: "secret", + }, + wantErr: true, + errMsg: "username is required", + }, + { + name: "existing mode missing password", + req: DatabaseConfigRequest{ + Alias: "cache", + Type: "redis", + Mode: "existing", + ExistingContainer: "redis-server", + DatabaseName: "cache_db", + Username: "cache_user", + }, + wantErr: true, + errMsg: "password is required", + }, { name: "valid create mode config", req: DatabaseConfigRequest{ diff --git a/internal/api/server.go b/internal/api/server.go index 0b61c46..1f7e2f4 100644 --- a/internal/api/server.go +++ b/internal/api/server.go @@ -729,6 +729,15 @@ func (d *DatabaseConfigRequest) Validate() error { if d.ExistingContainer == "" { return fmt.Errorf("existing_container is required for mode 'existing'") } + if d.DatabaseName == "" { + return fmt.Errorf("database_name is required for mode 'existing'") + } + if d.Username == "" { + return fmt.Errorf("username is required for mode 'existing'") + } + if d.Password == "" { + return fmt.Errorf("password is required for mode 'existing'") + } case "external": if d.ExternalHost == "" { return fmt.Errorf("external_host is required for mode 'external'") @@ -1140,12 +1149,27 @@ func (s *Server) createDatabasesForDeployment(deploymentName string, databases [ case "existing": config.Container = dbReq.ExistingContainer config.Host = dbReq.ExistingContainer - if dbReq.DatabaseName != "" { - config.DatabaseName = dbReq.DatabaseName - } - if dbReq.Username != "" { - config.Username = dbReq.Username + config.DatabaseName = dbReq.DatabaseName + config.Username = dbReq.Username + + existDbPort := dbReq.ExternalPort + if existDbPort == 0 { + switch dbReq.Type { + case "mysql", "mariadb": + existDbPort = 3306 + case "postgres": + existDbPort = 5432 + case "mongodb": + existDbPort = 27017 + case "redis": + existDbPort = 6379 + default: + return nil, nil, fmt.Errorf("unknown database type %q for %q: port must be specified explicitly", dbReq.Type, alias) + } } + config.Port = existDbPort + + envVars = s.generateDatabaseEnvVars(envPrefix, dbReq.ExistingContainer, existDbPort, dbReq.DatabaseName, dbReq.Username, dbReq.Password, dbReq.Type, isFirst) case "external": config.Host = dbReq.ExternalHost