From bb9750d10604d3dd0908f581571a59268a5e02b6 Mon Sep 17 00:00:00 2001 From: Bobby Iliev Date: Wed, 22 Nov 2023 11:39:46 +0200 Subject: [PATCH] Init db clients for all enabled regions --- pkg/clients/cloud_client.go | 3 ++ pkg/provider/provider.go | 61 +++++++++++++++++-------------------- 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/pkg/clients/cloud_client.go b/pkg/clients/cloud_client.go index 8dde6ac1..4a35b91b 100644 --- a/pkg/clients/cloud_client.go +++ b/pkg/clients/cloud_client.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "io" + "log" "net/http" "strconv" "strings" @@ -77,6 +78,8 @@ func (c *CloudAPIClient) ListCloudProviders(ctx context.Context) ([]CloudProvide return nil, err } + log.Printf("[DEBUG] Cloud providers response body: %+v\n", response) + return response.Data, nil } diff --git a/pkg/provider/provider.go b/pkg/provider/provider.go index 3c8d5396..5238170a 100644 --- a/pkg/provider/provider.go +++ b/pkg/provider/provider.go @@ -2,7 +2,6 @@ package provider import ( "context" - "log" "github.com/MaterializeInc/terraform-provider-materialize/pkg/clients" "github.com/MaterializeInc/terraform-provider-materialize/pkg/datasources" @@ -145,9 +144,6 @@ func providerConfigure(ctx context.Context, d *schema.ResourceData, version stri return nil, diag.Errorf("Unable to create Frontegg client: %s", err) } - // Map to store DB clients for different regions. - dbClients := make(map[clients.Region]*clients.DBClient) - // Initialize the Cloud API client using the Frontegg client and endpoint cloudAPIClient := clients.NewCloudAPIClient(fronteggClient, cloudEndpoint) @@ -157,42 +153,41 @@ func providerConfigure(ctx context.Context, d *schema.ResourceData, version stri return nil, diag.Errorf("Unable to list cloud providers: %s", err) } - // Find the provider that matches the default region - var defaultProvider *clients.CloudProvider + // Map to store DB clients for all regions. + dbClients := make(map[clients.Region]*clients.DBClient) + for _, provider := range providers { - if provider.ID == string(defaultRegion) { - defaultProvider = &provider - break + regionDetails, err := cloudAPIClient.GetRegionDetails(ctx, provider) + if err != nil { + // Handle the error, possibly continue to the next provider + continue } - } - if defaultProvider == nil { - return nil, diag.Errorf("Default region '%s' not found among cloud providers", defaultRegion) - } + // Get the database connection details for the region + host, port, err := clients.SplitHostPort(regionDetails.RegionInfo.SqlAddress) + if err != nil { + // Handle the error, possibly continue to the next provider + continue + } - // Get the region details using the found provider - regionDetails, err := cloudAPIClient.GetRegionDetails(ctx, *defaultProvider) - if err != nil { - return nil, diag.Errorf("Unable to get region details for region '%s': %s", defaultRegion, err) - } + // Assuming email is used as the username and is the same for all regions + user := fronteggClient.Email - if regionDetails != nil && regionDetails.RegionInfo != nil { - log.Printf("[DEBUG] Region details: %+v\n", *regionDetails.RegionInfo) - } else { - log.Printf("[DEBUG] Region details: nil or empty\n") - } - // Get the database connection details - host, port, err := clients.SplitHostPort(regionDetails.RegionInfo.SqlAddress) - if err != nil { - return nil, diag.Errorf("Unable to parse host and port from '%s': %s", regionDetails.RegionInfo.SqlAddress, err) + // Instantiate a new DB client for the region + dbClient, diags := clients.NewDBClient(host, user, password, port, database, application_name_suffix, version, sslmode) + if diags.HasError() { + // Handle the error, possibly continue to the next provider + continue + } + + // Store the DB client in the map, keyed by the region + dbClients[clients.Region(provider.ID)] = dbClient } - user := fronteggClient.Email - dbClient, diags := clients.NewDBClient(host, user, password, port, database, application_name_suffix, version, sslmode) - if diags.HasError() { - return nil, diags + // Check if at least one region has been initialized successfully + if len(dbClients) == 0 { + return nil, diag.Errorf("No regions were initialized. Please check your configuration.") } - dbClients[clients.Region(defaultRegion)] = dbClient // Construct and return the provider meta with all clients initialized. providerMeta := &utils.ProviderMeta{ @@ -202,5 +197,5 @@ func providerConfigure(ctx context.Context, d *schema.ResourceData, version stri DefaultRegion: clients.Region(defaultRegion), } - return providerMeta, diags + return providerMeta, nil }