Răsfoiți Sursa

Merge pull request #1072 from kubecost/sean/bug-fix/aws-sdk-v2-nil-pointer

nil checks and error handling for queryAthenaPaginated
Sean Holcomb 4 ani în urmă
părinte
comite
4eeb374757
1 a modificat fișierele cu 26 adăugiri și 1 ștergeri
  1. 26 1
      pkg/cloud/awsprovider.go

+ 26 - 1
pkg/cloud/awsprovider.go

@@ -1597,7 +1597,11 @@ func (aws *AWS) QueryAthenaPaginated(ctx context.Context, query string, fn func(
 	}
 	getQueryResultsPaginator := athena.NewGetQueryResultsPaginator(cli, queryResultsInput)
 	for getQueryResultsPaginator.HasMorePages() {
-		pg, _ := getQueryResultsPaginator.NextPage(ctx)
+		pg, err := getQueryResultsPaginator.NextPage(ctx)
+		if err != nil {
+			log.Errorf("QueryAthenaPaginated: NextPage error: %s", err.Error())
+			continue
+		}
 		fn(pg)
 	}
 	return nil
@@ -1653,6 +1657,13 @@ func (aws *AWS) GetSavingsPlanDataFromAthena() error {
 
 	page := 0
 	processResults := func(op *athena.GetQueryResultsOutput) bool {
+		if op == nil {
+			log.Errorf("GetSavingsPlanDataFromAthena: Athena page is nil")
+			return false
+		} else if op.ResultSet == nil {
+			log.Errorf("GetSavingsPlanDataFromAthena: Athena page.ResultSet is nil")
+			return false
+		}
 		aws.SavingsPlanDataLock.Lock()
 		aws.SavingsPlanDataByInstanceID = make(map[string]*SavingsPlanData) // Clean out the old data and only report a savingsplan price if its in the most recent run.
 		mostRecentDate := ""
@@ -1743,6 +1754,13 @@ func (aws *AWS) GetReservationDataFromAthena() error {
 
 	page := 0
 	processResults := func(op *athena.GetQueryResultsOutput) bool {
+		if op == nil {
+			log.Errorf("GetReservationDataFromAthena: Athena page is nil")
+			return false
+		} else if op.ResultSet == nil {
+			log.Errorf("GetReservationDataFromAthena: Athena page.ResultSet is nil")
+			return false
+		}
 		aws.RIDataLock.Lock()
 		aws.RIPricingByInstanceID = make(map[string]*RIData) // Clean out the old data and only report a RI price if its in the most recent run.
 		mostRecentDate := ""
@@ -1806,6 +1824,13 @@ func (aws *AWS) fetchColumns() (map[string]bool, error) {
 	query := fmt.Sprintf(q, awsAthenaInfo.AthenaDatabase, awsAthenaInfo.AthenaTable)
 	pageNum := 0
 	athenaErr := aws.QueryAthenaPaginated(context.TODO(), query, func(page *athena.GetQueryResultsOutput) bool {
+		if page == nil {
+			log.Errorf("fetchColumns: Athena page is nil")
+			return false
+		} else if page.ResultSet == nil {
+			log.Errorf("fetchColumns: Athena page.ResultSet is nil")
+			return false
+		}
 		// remove header row 'column_name'
 		rows := page.ResultSet.Rows[1:]
 		for _, row := range rows {