package config import ( "context" "database/sql" "flag" "fmt" "github.com/peterbourgon/ff/v3" "edge-infra.dev/pkg/lib/gcp/cloudsql" ) type Environment struct { DatabaseHost string DatabaseConnectionName string DatabaseName string DatabaseUsername string DatabasePassword string DatabasePort string DryRun bool DeleteKubeconfigEntries bool } func NewConfig(args []string) (*Environment, error) { config := Environment{} fs := flag.NewFlagSet("re", flag.ExitOnError) fs.StringVar(&config.DatabaseHost, "database_host", "", "Database Host", ) fs.StringVar(&config.DatabaseConnectionName, "database_connection_name", "", "Database Connection Name", ) fs.StringVar(&config.DatabaseName, "database_name", "", "Database Name", ) fs.StringVar(&config.DatabaseUsername, "database_username", "", "Database User Name", ) fs.StringVar(&config.DatabasePassword, "database_password", "", "Database Password", ) fs.StringVar(&config.DatabasePort, "database_port", "", "Database Port", ) fs.BoolVar(&config.DryRun, "dry_run", true, "Run Commands in Dry Run", ) fs.BoolVar(&config.DeleteKubeconfigEntries, "delete_kubeconfig_entries", false, "Should added kubeconfig entries be cleaned up", ) if err := ff.Parse(fs, args, ff.WithEnvVarNoPrefix()); err != nil { return &Environment{}, err } return &config, nil } func (c *Environment) ConnectDatabase(ctx context.Context) (*sql.DB, error) { edgeDB := &cloudsql.EdgePostgres{} switch { case c.DatabaseConnectionName != "": edgeDB = cloudsql.GCPPostgresConnection(c.DatabaseConnectionName) case c.DatabaseConnectionName == "" && c.DatabaseHost != "": if c.DatabasePort == "" { return nil, fmt.Errorf("database port is required") } edgeDB = cloudsql.PostgresConnection(c.DatabaseHost, c.DatabasePort).Password(c.DatabasePassword) default: return nil, fmt.Errorf("database_connection_name or database_host must be provided") } dbConnection, err := edgeDB. DBName(c.DatabaseName). Username(c.DatabaseUsername). NewConnection() if err != nil { return nil, err } if err := dbConnection.PingContext(ctx); err != nil { return nil, err } return dbConnection, nil }