1
28
29 package main
30
31 import (
32 "context"
33 "database/sql"
34 "errors"
35 "flag"
36 "fmt"
37 "os"
38
39 _ "github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/dialers/postgres"
40 "github.com/peterbourgon/ff/v3/ffcli"
41
42 "edge-infra.dev/pkg/lib/gcp/cloudsql"
43
44 usedatabase "edge-infra.dev/hack/tools/eyede/use-database"
45 usestorage "edge-infra.dev/hack/tools/eyede/use-storage"
46 eyedeUtils "edge-infra.dev/hack/tools/eyede/utils"
47 "edge-infra.dev/pkg/edge/api/utils"
48 "edge-infra.dev/pkg/lib/cli/commands"
49 )
50
51 var (
52 fs = flag.NewFlagSet("eyede", flag.ExitOnError)
53 databaseHost = fs.String("databaseHost", os.Getenv("DatabaseHost"), "the host of the database to query")
54 databaseName = fs.String("databaseName", os.Getenv("DatabaseName"), "the name of the database to query")
55 databaseUser = fs.String("databaseUser", os.Getenv("DatabaseUser"), "the user of the specified database")
56 topLevelProjectID = fs.String("topLevelProjectID", os.Getenv("TopLevelProjectID"), "the top level project id")
57 chariotTopic = fs.String("chariotTopic", os.Getenv("ChariotTopic"), "chariot pubsub topic")
58 launchdarklyKey = fs.String("launchdarklyKey", os.Getenv("LD_KEY"), "launch darkly sdk key")
59 dryRun = fs.Bool("dryRun", false, "run eyede in dryRun mode and output results in stdout")
60 edgeAPIURL = fs.String("edgeAPIURL", os.Getenv("EDGE_API_URL"), "edge api url")
61 errDatabaseHostRequired = errors.New("error database host is required")
62 errDatabaseNameRequired = errors.New("error database name is required")
63 errDatabaseUserRequired = errors.New("error database user is required")
64 errTopLevelProjectIDRequired = errors.New("error top level project id is required")
65 errChariotTopicRequired = errors.New("error chariot topic is required")
66 errEdgeAPIURLRequired = errors.New("error edge api url is required")
67 )
68
69 func main() {
70 err := fs.Parse(os.Args[2:])
71 if err != nil {
72 fmt.Println("Flag parsing error ", err)
73 os.Exit(1)
74 }
75 if err := validateRequiredFlags(); err != nil {
76 fmt.Println("Flag validation error ", err)
77 os.Exit(1)
78 }
79 if utils.IsNullOrEmpty(launchdarklyKey) {
80 os.Setenv("LD_KEY", *launchdarklyKey)
81 }
82 eyeConfig := eyedeUtils.New()
83 fmt.Println("")
84 fmt.Println(`
85 ███████╗██╗░️░️░██╗███████╗██████╗░███████╗
86 ██╔════╝╚██╗░██╔╝██╔════╝██╔══██╗██╔════╝
87 👁 █████╗░░░╚████╔╝░█████╗░░██║░░██║█████╗░░ ️️👁
88 ██╔══╝░░░░╚██╔╝░░██╔══╝░░██║░░██║██╔══╝░░
89 ███████╗░░░██║░░░███████╗██████╔╝███████╗
90 ╚══════╝░░░╚═╝░░░╚══════╝╚═════╝░╚══════╝
91 `)
92 fmt.Println("")
93 fmt.Printf("Connecting to Database: %s with user %s\n", *databaseName, *databaseUser)
94 db, err := connectToDatabase()
95 if err != nil {
96 fmt.Println("db connection error occurred ", err)
97 os.Exit(1)
98 }
99 eyeConfig.SetDBConnection(db)
100 useDatabase := eyeConfig.Exec("useDatabase", "eyede useDatabase", "populate the edge-info configmap using the SQL Database", *topLevelProjectID, *chariotTopic, *edgeAPIURL, *dryRun, usedatabase.CreateEdgeInfoConfigMap, fs)
101 useStorage := eyeConfig.Exec("useStorage", "eyede useStorage", "populate the edge-info configmap using the storage buckets", *topLevelProjectID, *chariotTopic, *edgeAPIURL, *dryRun, usestorage.UpdateEdgeInfoConfigMapsInStorage, fs)
102 cmd := &ffcli.Command{
103 Name: "eyede",
104 ShortUsage: "eyede --databaseHost=ret-edge-dev0-foreman:us-central1:edge-dev0 --databaseName=edge-dev0 --databaseUser=bff-sa@ret-edge-dev0-foreman.iam --topLevelProjectID=ret-edge-dev0-foreman --chariotTopic=chariot-rides --edgeAPIURL=https://dev0.edge-preprod.dev/api/v2",
105 ShortHelp: "populate edge ids for all clusters",
106 Subcommands: []*ffcli.Command{
107 useDatabase,
108 useStorage,
109 commands.Version(),
110 },
111 }
112 if err := cmd.ParseAndRun(context.Background(), os.Args[1:]); err != nil {
113 fmt.Fprintf(os.Stderr, "error: %v\n", err)
114 os.Exit(1)
115 }
116 }
117
118 func validateRequiredFlags() error {
119 if utils.IsNullOrEmpty(databaseHost) {
120 return errDatabaseHostRequired
121 }
122 if utils.IsNullOrEmpty(databaseName) {
123 return errDatabaseNameRequired
124 }
125 if utils.IsNullOrEmpty(databaseUser) {
126 return errDatabaseUserRequired
127 }
128 if utils.IsNullOrEmpty(topLevelProjectID) {
129 return errTopLevelProjectIDRequired
130 }
131 if utils.IsNullOrEmpty(chariotTopic) {
132 return errChariotTopicRequired
133 }
134 if utils.IsNullOrEmpty(edgeAPIURL) {
135 return errEdgeAPIURLRequired
136 }
137 return nil
138 }
139
140 func connectToDatabase() (*sql.DB, error) {
141 return cloudsql.GCPPostgresConnection(*databaseHost).Username(*databaseUser).DBName(*databaseName).NewConnection()
142 }
143
View as plain text