diff --git a/handlers/csv_handler.go b/handlers/csv_handler.go index 1c59ac5e8..4eb5ed213 100644 --- a/handlers/csv_handler.go +++ b/handlers/csv_handler.go @@ -5,14 +5,13 @@ import ( "encoding/csv" "encoding/json" "fmt" - "log" "net/http" "os" "strconv" "strings" "github.com/gin-gonic/gin" - "github.com/sirupsen/logrus" + log "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/models" "github.com/uptrace/bun/dialect" ) @@ -20,7 +19,7 @@ import ( func (handler *ApiHandler) DownloadInventoryCSV(c *gin.Context) { resources, err := handler.ctrl.ListResources(c) if err != nil { - logrus.WithError(err).Error("Could not read from DB") + log.WithError(err).Error("Could not read from DB") c.JSON(http.StatusInternalServerError, gin.H{"error": "cloud not read from DB"}) return } @@ -46,7 +45,7 @@ func (handler *ApiHandler) DownloadInventoryCSVForView(c *gin.Context) { if len(view.Filters) == 0 { err := handler.db.NewRaw("SELECT * FROM resources").Scan(handler.ctx, &resources) if err != nil { - logrus.WithError(err).Errorf("select failed") + log.WithError(err).Errorf("select failed") } respondWithCSVDownload(resources, c) } @@ -211,7 +210,7 @@ func (handler *ApiHandler) DownloadInventoryCSVForView(c *gin.Context) { err = handler.db.NewRaw(query).Scan(handler.ctx, &resources) if err != nil { - logrus.WithError(err).Errorf("scan failed") + log.WithError(err).Errorf("scan failed") } } else { query := fmt.Sprintf("SELECT * FROM resources WHERE %s ORDER BY id", whereClause) @@ -252,11 +251,15 @@ func respondWithCSVDownload(resources []models.Resource, c *gin.Context) { for _, record := range resources { tags, err := json.Marshal(record.Tags) if err != nil { - log.Fatalf("Could not marshal tags") + log.Error("Could not marshal tags") + c.JSON(http.StatusInternalServerError, gin.H{"error": "Something went wrong"}) + return } metadata, err := json.Marshal(record.Metadata) if err != nil { - log.Fatalf("Could not marshal metadata") + log.Error("Could not marshal metadata") + c.JSON(http.StatusInternalServerError, gin.H{"error": "Something went wrong"}) + return } row := []string{ diff --git a/handlers/helper.go b/handlers/helper.go index 4b65be5b1..652b3f193 100644 --- a/handlers/helper.go +++ b/handlers/helper.go @@ -240,12 +240,12 @@ func makeClientFromAccount(account models.Account) (*providers.ProviderClient, e &clientcmd.ClientConfigLoadingRules{ExplicitPath: account.Credentials["path"]}, &clientcmd.ConfigOverrides{}).ClientConfig() if err != nil { - log.Fatal(err) + return nil, err } k8sClient, err := kubernetes.NewForConfig(kubeConfig) if err != nil { - log.Fatal(err) + return nil, err } client := providers.K8sClient{ @@ -293,7 +293,7 @@ func makeClientFromAccount(account models.Account) (*providers.ProviderClient, e if account.Provider == "azure" { creds, err := azidentity.NewClientSecretCredential(account.Credentials["tenantId"], account.Credentials["clientId"], account.Credentials["clientSecret"], &azidentity.ClientSecretCredentialOptions{}) if err != nil { - log.Fatal(err) + return nil, err } client := providers.AzureClient{ @@ -326,7 +326,7 @@ func makeClientFromAccount(account models.Account) (*providers.ProviderClient, e t := digest.NewTransport(account.Credentials["publicApiKey"], account.Credentials["privateApiKey"]) tc, err := t.Client() if err != nil { - log.Fatal(err.Error()) + return nil, err } client := mdb.NewClient(tc) @@ -339,12 +339,12 @@ func makeClientFromAccount(account models.Account) (*providers.ProviderClient, e if account.Provider == "gcp" { data, err := os.ReadFile(account.Credentials["accountKey"]) if err != nil { - log.Fatal(err) + return nil, err } creds, err := google.CredentialsFromJSON(context.Background(), data, "https://www.googleapis.com/auth/cloud-platform") if err != nil { - log.Fatal(err) + return nil, err } return &providers.ProviderClient{ diff --git a/internal/config/load.go b/internal/config/load.go index 05ae373b6..b1eabddf7 100644 --- a/internal/config/load.go +++ b/internal/config/load.go @@ -59,7 +59,7 @@ func loadConfigFromBytes(b []byte) (*models.Config, error) { err := toml.Unmarshal([]byte(b), &config) if err != nil { - return nil, err + return nil, fmt.Errorf("invalid config file") } return &config, nil diff --git a/providers/aws/ec2/instances.go b/providers/aws/ec2/instances.go index 384c36e9b..413fa5170 100644 --- a/providers/aws/ec2/instances.go +++ b/providers/aws/ec2/instances.go @@ -117,14 +117,14 @@ func Instances(ctx context.Context, client providers.ProviderClient) ([]models.R pricingResult := models.PricingResult{} err := json.Unmarshal([]byte(pricingOutput.PriceList[0]), &pricingResult) if err != nil { - log.Fatalf("Failed to unmarshal JSON: %v", err) + log.Errorf("Failed to unmarshal JSON: %v", err) } for _, onDemand := range pricingResult.Terms.OnDemand { for _, priceDimension := range onDemand.PriceDimensions { hourlyCost, err = strconv.ParseFloat(priceDimension.PricePerUnit.USD, 64) if err != nil { - log.Fatalf("Failed to parse hourly cost: %v", err) + log.Errorf("Failed to parse hourly cost: %v", err) } break } diff --git a/providers/aws/elasticache/clusters.go b/providers/aws/elasticache/clusters.go index 43beb6e05..912c47edc 100644 --- a/providers/aws/elasticache/clusters.go +++ b/providers/aws/elasticache/clusters.go @@ -96,14 +96,14 @@ func Clusters(ctx context.Context, client ProviderClient) ([]Resource, error) { pricingResult := models.PricingResult{} err := json.Unmarshal([]byte(pricingOutput.PriceList[0]), &pricingResult) if err != nil { - log.Fatalf("Failed to unmarshal JSON: %v", err) + log.Errorf("Failed to unmarshal JSON: %v", err) } for _, onDemand := range pricingResult.Terms.OnDemand { for _, priceDimension := range onDemand.PriceDimensions { hourlyCost, err = strconv.ParseFloat(priceDimension.PricePerUnit.USD, 64) if err != nil { - log.Fatalf("Failed to parse hourly cost: %v", err) + log.Errorf("Failed to parse hourly cost: %v", err) } break } diff --git a/providers/aws/rds/instances.go b/providers/aws/rds/instances.go index 6515ed4f6..278209e78 100644 --- a/providers/aws/rds/instances.go +++ b/providers/aws/rds/instances.go @@ -95,14 +95,14 @@ func Instances(ctx context.Context, client providers.ProviderClient) ([]models.R pricingResult := models.PricingResult{} err := json.Unmarshal([]byte(pricingOutput.PriceList[0]), &pricingResult) if err != nil { - log.Fatalf("Failed to unmarshal JSON: %v", err) + log.Errorf("Failed to unmarshal JSON: %v", err) } for _, onDemand := range pricingResult.Terms.OnDemand { for _, priceDimension := range onDemand.PriceDimensions { hourlyCost, err = strconv.ParseFloat(priceDimension.PricePerUnit.USD, 64) if err != nil { - log.Fatalf("Failed to parse hourly cost: %v", err) + log.Errorf("Failed to parse hourly cost: %v", err) } break } diff --git a/utils/database.go b/utils/database.go index 79d95b129..befa16411 100644 --- a/utils/database.go +++ b/utils/database.go @@ -4,6 +4,7 @@ import ( "context" "database/sql" "fmt" + "strings" log "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/migrations" @@ -71,7 +72,10 @@ func SetupSchema(db *bun.DB, c *models.Config, accounts []models.Account) error account.Status = "CONNECTED" _, err = db.NewInsert().Model(&account).Exec(context.Background()) if err != nil { - log.Warnf("%s account cannot be inserted to database\n%v", account.Provider, err) + if strings.Contains(err.Error(), "failed: accounts.credentials (2067)") { + continue + } + log.Warnf("%s account cannot be inserted to database\n", account.Provider) } }