1 package config
2
3 import (
4 "context"
5 "database/sql"
6 "flag"
7 "fmt"
8
9 "github.com/peterbourgon/ff/v3"
10
11 "edge-infra.dev/pkg/lib/gcp/cloudsql"
12 )
13
14 type Environment struct {
15 DatabaseHost string
16 DatabaseConnectionName string
17 DatabaseName string
18 DatabaseUsername string
19 DatabasePassword string
20 DatabasePort string
21 DryRun bool
22 DeleteKubeconfigEntries bool
23 }
24
25 func NewConfig(args []string) (*Environment, error) {
26 config := Environment{}
27
28 fs := flag.NewFlagSet("re", flag.ExitOnError)
29
30 fs.StringVar(&config.DatabaseHost,
31 "database_host",
32 "",
33 "Database Host",
34 )
35
36 fs.StringVar(&config.DatabaseConnectionName,
37 "database_connection_name",
38 "",
39 "Database Connection Name",
40 )
41
42 fs.StringVar(&config.DatabaseName,
43 "database_name",
44 "",
45 "Database Name",
46 )
47
48 fs.StringVar(&config.DatabaseUsername,
49 "database_username",
50 "",
51 "Database User Name",
52 )
53
54 fs.StringVar(&config.DatabasePassword,
55 "database_password",
56 "",
57 "Database Password",
58 )
59
60 fs.StringVar(&config.DatabasePort,
61 "database_port",
62 "",
63 "Database Port",
64 )
65
66 fs.BoolVar(&config.DryRun,
67 "dry_run",
68 true,
69 "Run Commands in Dry Run",
70 )
71
72 fs.BoolVar(&config.DeleteKubeconfigEntries,
73 "delete_kubeconfig_entries",
74 false,
75 "Should added kubeconfig entries be cleaned up",
76 )
77
78 if err := ff.Parse(fs, args, ff.WithEnvVarNoPrefix()); err != nil {
79 return &Environment{}, err
80 }
81
82 return &config, nil
83 }
84
85 func (c *Environment) ConnectDatabase(ctx context.Context) (*sql.DB, error) {
86 edgeDB := &cloudsql.EdgePostgres{}
87 switch {
88 case c.DatabaseConnectionName != "":
89 edgeDB = cloudsql.GCPPostgresConnection(c.DatabaseConnectionName)
90 case c.DatabaseConnectionName == "" && c.DatabaseHost != "":
91 if c.DatabasePort == "" {
92 return nil, fmt.Errorf("database port is required")
93 }
94 edgeDB = cloudsql.PostgresConnection(c.DatabaseHost, c.DatabasePort).Password(c.DatabasePassword)
95 default:
96 return nil, fmt.Errorf("database_connection_name or database_host must be provided")
97 }
98 dbConnection, err := edgeDB.
99 DBName(c.DatabaseName).
100 Username(c.DatabaseUsername).
101 NewConnection()
102 if err != nil {
103 return nil, err
104 }
105 if err := dbConnection.PingContext(ctx); err != nil {
106 return nil, err
107 }
108 return dbConnection, nil
109 }
110
View as plain text