Просмотр исходного кода

Merge pull request #116 from kubecost/AjayTripathy-fix-pv-panics

stop pv panics
Ajay Tripathy 6 лет назад
Родитель
Сommit
84b6fcebcf
2 измененных файлов с 46 добавлено и 5 удалено
  1. 45 4
      costmodel/costmodel.go
  2. 1 1
      main.go

+ 45 - 4
costmodel/costmodel.go

@@ -221,7 +221,7 @@ func ComputeCostData(cli prometheusClient.Client, clientset kubernetes.Interface
 
 	normalizationValue, err := getNormalization(normalizationResult)
 	if err != nil {
-		return nil, err
+		return nil, fmt.Errorf("Error parsing normalization values: " + err.Error())
 	}
 
 	nodes, err := getNodeCost(clientset, cloud)
@@ -913,12 +913,13 @@ func ComputeCostDataRange(cli prometheusClient.Client, clientset kubernetes.Inte
 
 	normalizationValue, err := getNormalization(normalizationResult)
 	if err != nil {
-		return nil, err
+		return nil, fmt.Errorf("Error parsing normalization values: " + err.Error())
 	}
 
 	nodes, err := getNodeCost(clientset, cloud)
 	if err != nil {
 		klog.V(1).Infof("Warning, no cost model available: " + err.Error())
+		return nil, err
 	}
 
 	podlist, err := clientset.CoreV1().Pods("").List(metav1.ListOptions{})
@@ -1269,7 +1270,27 @@ func getCost(qr interface{}) (map[string][]*Vector, error) {
 
 func getPVInfoVectors(qr interface{}) (map[string]*PersistentVolumeClaimData, error) {
 	pvmap := make(map[string]*PersistentVolumeClaimData)
-	for _, val := range qr.(map[string]interface{})["data"].(map[string]interface{})["result"].([]interface{}) {
+	data, ok := qr.(map[string]interface{})["data"]
+	if !ok {
+		e, err := wrapPrometheusError(qr)
+		if err != nil {
+			return nil, err
+		}
+		return nil, fmt.Errorf(e)
+	}
+	d, ok := data.(map[string]interface{})
+	if !ok {
+		return nil, fmt.Errorf("Data field improperly formatted in prometheus repsonse")
+	}
+	result, ok := d["result"]
+	if !ok {
+		return nil, fmt.Errorf("Result field not present in prometheus response")
+	}
+	results, ok := result.([]interface{})
+	if !ok {
+		return nil, fmt.Errorf("Result field improperly formatted in prometheus response")
+	}
+	for _, val := range results {
 		metricInterface, ok := val.(map[string]interface{})["metric"]
 		if !ok {
 			return nil, fmt.Errorf("Metric field does not exist in data result vector")
@@ -1343,7 +1364,27 @@ func getPVInfoVectors(qr interface{}) (map[string]*PersistentVolumeClaimData, er
 
 func getPVInfoVector(qr interface{}) (map[string]*PersistentVolumeClaimData, error) {
 	pvmap := make(map[string]*PersistentVolumeClaimData)
-	for _, val := range qr.(map[string]interface{})["data"].(map[string]interface{})["result"].([]interface{}) {
+	data, ok := qr.(map[string]interface{})["data"]
+	if !ok {
+		e, err := wrapPrometheusError(qr)
+		if err != nil {
+			return nil, err
+		}
+		return nil, fmt.Errorf(e)
+	}
+	d, ok := data.(map[string]interface{})
+	if !ok {
+		return nil, fmt.Errorf("Data field improperly formatted in prometheus repsonse")
+	}
+	result, ok := d["result"]
+	if !ok {
+		return nil, fmt.Errorf("Result field not present in prometheus response")
+	}
+	results, ok := result.([]interface{})
+	if !ok {
+		return nil, fmt.Errorf("Result field improperly formatted in prometheus response")
+	}
+	for _, val := range results {
 		metricInterface, ok := val.(map[string]interface{})["metric"]
 		if !ok {
 			return nil, fmt.Errorf("Metric field does not exist in data result vector")

+ 1 - 1
main.go

@@ -146,7 +146,7 @@ func (a *Accesses) ClusterCostsOverTime(w http.ResponseWriter, r *http.Request,
 
 	start := r.URL.Query().Get("start")
 	end := r.URL.Query().Get("end")
-	window := r.URL.Query().Get("timeWindow")
+	window := r.URL.Query().Get("window")
 	offset := r.URL.Query().Get("offset")
 
 	if offset != "" {