...

Source file src/edge-infra.dev/hack/tools/eyede/main.go

Documentation: edge-infra.dev/hack/tools/eyede

     1  /*
     2  ███████╗██╗░░░██╗███████╗██████╗░███████╗
     3  ██╔════╝╚██╗░██╔╝██╔════╝██╔══██╗██╔════╝
     4  █████╗░░░╚████╔╝░█████╗░░██║░░██║█████╗░░
     5  ██╔══╝░░░░╚██╔╝░░██╔══╝░░██║░░██║██╔══╝░░
     6  ███████╗░░░██║░░░███████╗██████╔╝███████╗
     7  ╚══════╝░░░╚═╝░░░╚══════╝╚═════╝░╚══════╝
     8  
     9  
    10  CLI program written to populate existing edge info configmap with the correct cluster edge id
    11  The cli program can be run like so:
    12  
    13  Using Storage Bucket:
    14  eyede useStorage --databaseHost=ret-edge-dev0-foreman:us-central1:edge-dev0 --databaseName=edge-dev0
    15  --databaseUser=bff-sa@ret-edge-dev0-foreman.iam --topLevelProjectID=ret-edge-dev0-foreman
    16  --chariotTopic=chariot-rides
    17  
    18  Using Database:
    19  eyede useDatabase --databaseHost=ret-edge-dev0-foreman:us-central1:edge-dev0 --databaseName=edge-dev0
    20  --databaseUser=bff-sa@ret-edge-dev0-foreman.iam --topLevelProjectID=ret-edge-dev0-foreman
    21  --chariotTopic=chariot-rides
    22  
    23  The following flags are required for the cli to run:
    24  databaseHost, databaseName, databaseUser, databasePassword, topLevelProjectID and chariotTopic
    25  The dryRun flag is an optional and defaults to false if not specified.
    26  launchdarklyKey is also an optional flag that defaults to using cluster id if not set.
    27  */
    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