Handle both types for MaxOverSubscriptionRatio

float <= Pike; string > Pike.

Related-PROD: PROD-25085 (PROD:25085)

Change-Id: I137ef82442d6277f4341ee71c4b793a912ef5f2d
diff --git a/openstack/blockstorage/extensions/schedulerstats/results.go b/openstack/blockstorage/extensions/schedulerstats/results.go
index c7b3e73..e176c61 100644
--- a/openstack/blockstorage/extensions/schedulerstats/results.go
+++ b/openstack/blockstorage/extensions/schedulerstats/results.go
@@ -2,7 +2,9 @@
 
 import (
 	"encoding/json"
+	"fmt"
 	"math"
+	"strconv"
 
 	"gerrit.mcp.mirantis.net/debian/gophercloud.git/pagination"
 )
@@ -23,7 +25,7 @@
 	LocationInfo             string  `json:"location_info"`
 	QoSSupport               bool    `json:"QoS_support"`
 	ProvisionedCapacityGB    float64 `json:"provisioned_capacity_gb"`
-	MaxOverSubscriptionRatio string  `json:"max_over_subscription_ratio"`
+	MaxOverSubscriptionRatio string  `json:"-"`
 	ThinProvisioningSupport  bool    `json:"thin_provisioning_support"`
 	ThickProvisioningSupport bool    `json:"thick_provisioning_support"`
 	TotalVolumes             int64   `json:"total_volumes"`
@@ -44,8 +46,9 @@
 	type tmp Capabilities
 	var s struct {
 		tmp
-		FreeCapacityGB  interface{} `json:"free_capacity_gb"`
-		TotalCapacityGB interface{} `json:"total_capacity_gb"`
+		FreeCapacityGB           interface{} `json:"free_capacity_gb"`
+		TotalCapacityGB          interface{} `json:"total_capacity_gb"`
+		MaxOverSubscriptionRatio interface{} `json:"max_over_subscription_ratio"`
 	}
 	err := json.Unmarshal(b, &s)
 	if err != nil {
@@ -72,6 +75,15 @@
 	r.FreeCapacityGB = parseCapacity(s.FreeCapacityGB)
 	r.TotalCapacityGB = parseCapacity(s.TotalCapacityGB)
 
+	switch t := s.MaxOverSubscriptionRatio.(type) {
+	case string:
+		r.MaxOverSubscriptionRatio = t
+	case float64:
+		r.MaxOverSubscriptionRatio = strconv.FormatFloat(t, 'f', -1, 64)
+	default:
+		return fmt.Errorf("MaxOverSubscriptionRatio has unexpected type: %T", t)
+	}
+
 	return nil
 }