From d2d6cdb33819b716e9dbc00a47a4d71e66ddada2 Mon Sep 17 00:00:00 2001 From: Antony Natale Date: Mon, 20 May 2024 13:10:19 +0000 Subject: [PATCH] updates db client setup with new config creation --- frontend/database.go | 52 ++++++++++++++++++++++++++++++++------------ frontend/frontend.go | 4 ++-- frontend/main.go | 13 +++++++++-- 3 files changed, 51 insertions(+), 18 deletions(-) diff --git a/frontend/database.go b/frontend/database.go index c7f40d476..a1b99e0b2 100644 --- a/frontend/database.go +++ b/frontend/database.go @@ -17,30 +17,54 @@ const ( // DBClient defines the needed values to perform CRUD operations against the async DB type DBClient struct { client *azcosmos.Client - DBName string - DBUrl string + config *DBConfig +} + +// DBConfig stores database and client configuration data +type DBConfig struct { + DBName string + DBUrl string + ClientOptions *azidentity.DefaultAzureCredentialOptions +} + +// NewDatabaseConfig configures database configuration values for access +func NewDatabaseConfig() *DBConfig { + opt := &azidentity.DefaultAzureCredentialOptions{} + c := &DBConfig{ + DBName: os.Getenv("DB_NAME"), + DBUrl: os.Getenv("DB_URL"), + ClientOptions: opt, + } + return c } // NewDatabaseClient instanstiates a Cosmos DatabaseClient targeting Frontends async DB -func NewDatabaseClient() *DBClient { - cred, _ := azidentity.NewDefaultAzureCredential(nil) +func NewDatabaseClient(config *DBConfig) (*DBClient, error) { + cred, err := azidentity.NewDefaultAzureCredential(config.ClientOptions) + if err != nil { + return nil, err + } + d := &DBClient{ - DBName: os.Getenv("DB_NAME"), - DBUrl: os.Getenv("DB_URL"), + config: config, + } + + client, err := azcosmos.NewClient(d.config.DBUrl, cred, nil) + if err != nil { + return nil, err } - client, _ := azcosmos.NewClient(d.DBUrl, cred, nil) - d.client = client - return d + d.client = client + return d, nil } // DBConnectionTest checks the async database is accessible on startup func (d *DBClient) DBConnectionTest(ctx context.Context) (string, error) { - if d.DBName == "none" || d.DBName == "" { + if d.config.DBName == "none" || d.config.DBName == "" { return "No database configured, skipping", nil } - database, err := d.client.NewDatabase(d.DBName) + database, err := d.client.NewDatabase(d.config.DBName) if err != nil { return "", err } @@ -53,7 +77,7 @@ func (d *DBClient) DBConnectionTest(ctx context.Context) (string, error) { // GetCluster retreives a cluster document from async DB using resource ID func (d *DBClient) GetClusterDoc(ctx context.Context, resourceID string, partitionKey string) (*HCPOpenShiftClusterDocument, bool, error) { - container, err := d.client.NewContainer(d.DBName, clustersContainer) + container, err := d.client.NewContainer(d.config.DBName, clustersContainer) if err != nil { return nil, false, err } @@ -95,7 +119,7 @@ func (d *DBClient) SetClusterDoc(ctx context.Context, doc *HCPOpenShiftClusterDo return err } - container, err := d.client.NewContainer(d.DBName, clustersContainer) + container, err := d.client.NewContainer(d.config.DBName, clustersContainer) if err != nil { return err } @@ -118,7 +142,7 @@ func (d *DBClient) DeleteClusterDoc(ctx context.Context, resourceID string, part return err } - container, err := d.client.NewContainer(d.DBName, clustersContainer) + container, err := d.client.NewContainer(d.config.DBName, clustersContainer) if err != nil { return err } diff --git a/frontend/frontend.go b/frontend/frontend.go index 256e54169..cfd692b36 100644 --- a/frontend/frontend.go +++ b/frontend/frontend.go @@ -53,7 +53,7 @@ func MuxPattern(method string, segments ...string) string { return fmt.Sprintf("%s /%s", method, strings.ToLower(path.Join(segments...))) } -func NewFrontend(logger *slog.Logger, listener net.Listener, emitter metrics.Emitter) *Frontend { +func NewFrontend(logger *slog.Logger, listener net.Listener, emitter metrics.Emitter, dbClient *DBClient) *Frontend { f := &Frontend{ logger: logger, listener: listener, @@ -65,7 +65,7 @@ func NewFrontend(logger *slog.Logger, listener net.Listener, emitter metrics.Emi }, }, cache: *NewCache(), - dbClient: *NewDatabaseClient(), + dbClient: *dbClient, done: make(chan struct{}), } diff --git a/frontend/main.go b/frontend/main.go index 1eea0c7f1..48c5071bd 100644 --- a/frontend/main.go +++ b/frontend/main.go @@ -43,9 +43,18 @@ func main() { // Init prometheus emitter prometheusEmitter := NewPrometheusEmitter() - frontend := NewFrontend(logger, listener, prometheusEmitter) - // Verify the Async DB is available and accessible + // Configure database configuration and client + dbConfig := NewDatabaseConfig() + + dbClient, err := NewDatabaseClient(dbConfig) + if err != nil { + logger.Error(fmt.Sprintf("Creating the database client failed: %v", err)) + } + + frontend := NewFrontend(logger, listener, prometheusEmitter, dbClient) + + // Verify the Async DB is available and accessible logger.Info("Testing DB Access") result, err := frontend.dbClient.DBConnectionTest(ctx) if err != nil {