package controllers import ( "context" "database/sql" "flag" "fmt" "time" "github.com/peterbourgon/ff/v3" "edge-infra.dev/pkg/lib/gcp/cloudsql" ) type Config struct { TopLevelProjectID string TopLevelCNRMSA string TotpSecret string BannerID string // DB is used to create a dbinfrastatus.EdgeDB wrapper. Infra status recording is disabled when DB is nil. DB *sql.DB // DatabaseName is passed into the cluster-infra shipment. DatabaseName string DatabaseUser string DatabaseConnectionName string } func NewConfig(args []string) (*Config, error) { fs := flag.NewFlagSet("edge-issuer", flag.ExitOnError) cfg := &Config{} cfg.bind(fs) if err := ff.Parse(fs, args, ff.WithEnvVarNoPrefix()); err != nil { return nil, fmt.Errorf("failed to parse configuration: %w", err) } return cfg, nil } func (c *Config) bind(fs *flag.FlagSet) { fs.StringVar(&c.BannerID, "banner-id", "", "The Banner ID") fs.StringVar(&c.DatabaseConnectionName, "sql-connection-name", "", "The Database Connection Name") fs.StringVar(&c.DatabaseName, "sql-db-name", "", "The Database Name") fs.StringVar(&c.DatabaseUser, "sql-user", "", "The Database User") fs.StringVar(&c.TopLevelProjectID, "top-level-project-id", "", "The Foreman Project ID") } func (c *Config) AfterParse() error { db, err := cloudsql.GCPPostgresConnection(c.DatabaseConnectionName). DBName(c.DatabaseName). Username(c.DatabaseUser). NewConnection() if err != nil { return fmt.Errorf("failed to create sql connection: %w", err) } pingCtx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() if err := db.PingContext(pingCtx); err != nil { return fmt.Errorf("failed to ping sql connection: %w", err) } c.DB = db return nil }