github.com/huaweicloud/golangsdk@v0.0.0-20210831081626-d823fe11ceba/openstack/blockstorage/extensions/schedulerstats/results.go (about)

     1  package schedulerstats
     2  
     3  import (
     4  	"encoding/json"
     5  	"math"
     6  
     7  	"github.com/huaweicloud/golangsdk/pagination"
     8  )
     9  
    10  // Capabilities represents the information of an individual StoragePool.
    11  type Capabilities struct {
    12  	// The following fields should be present in all storage drivers.
    13  	DriverVersion     string  `json:"driver_version"`
    14  	FreeCapacityGB    float64 `json:"-"`
    15  	StorageProtocol   string  `json:"storage_protocol"`
    16  	TotalCapacityGB   float64 `json:"-"`
    17  	VendorName        string  `json:"vendor_name"`
    18  	VolumeBackendName string  `json:"volume_backend_name"`
    19  
    20  	// The following fields are optional and may have empty values depending
    21  	// on the storage driver in use.
    22  	ReservedPercentage       int64   `json:"reserved_percentage"`
    23  	LocationInfo             string  `json:"location_info"`
    24  	QoSSupport               bool    `json:"QoS_support"`
    25  	ProvisionedCapacityGB    float64 `json:"provisioned_capacity_gb"`
    26  	MaxOverSubscriptionRatio string  `json:"max_over_subscription_ratio"`
    27  	ThinProvisioningSupport  bool    `json:"thin_provisioning_support"`
    28  	ThickProvisioningSupport bool    `json:"thick_provisioning_support"`
    29  	TotalVolumes             int64   `json:"total_volumes"`
    30  	FilterFunction           string  `json:"filter_function"`
    31  	GoodnessFuction          string  `json:"goodness_function"`
    32  	Mutliattach              bool    `json:"multiattach"`
    33  	SparseCopyVolume         bool    `json:"sparse_copy_volume"`
    34  }
    35  
    36  // StoragePool represents an individual StoragePool retrieved from the
    37  // schedulerstats API.
    38  type StoragePool struct {
    39  	Name         string       `json:"name"`
    40  	Capabilities Capabilities `json:"capabilities"`
    41  }
    42  
    43  func (r *Capabilities) UnmarshalJSON(b []byte) error {
    44  	type tmp Capabilities
    45  	var s struct {
    46  		tmp
    47  		FreeCapacityGB  interface{} `json:"free_capacity_gb"`
    48  		TotalCapacityGB interface{} `json:"total_capacity_gb"`
    49  	}
    50  	err := json.Unmarshal(b, &s)
    51  	if err != nil {
    52  		return err
    53  	}
    54  	*r = Capabilities(s.tmp)
    55  
    56  	// Generic function to parse a capacity value which may be a numeric
    57  	// value, "unknown", or "infinite"
    58  	parseCapacity := func(capacity interface{}) float64 {
    59  		if capacity != nil {
    60  			switch capacity.(type) {
    61  			case float64:
    62  				return capacity.(float64)
    63  			case string:
    64  				if capacity.(string) == "infinite" {
    65  					return math.Inf(1)
    66  				}
    67  			}
    68  		}
    69  		return 0.0
    70  	}
    71  
    72  	r.FreeCapacityGB = parseCapacity(s.FreeCapacityGB)
    73  	r.TotalCapacityGB = parseCapacity(s.TotalCapacityGB)
    74  
    75  	return nil
    76  }
    77  
    78  // StoragePoolPage is a single page of all List results.
    79  type StoragePoolPage struct {
    80  	pagination.SinglePageBase
    81  }
    82  
    83  // IsEmpty satisfies the IsEmpty method of the Page interface. It returns true
    84  // if a List contains no results.
    85  func (page StoragePoolPage) IsEmpty() (bool, error) {
    86  	va, err := ExtractStoragePools(page)
    87  	return len(va) == 0, err
    88  }
    89  
    90  // ExtractStoragePools takes a List result and extracts the collection of
    91  // StoragePools returned by the API.
    92  func ExtractStoragePools(p pagination.Page) ([]StoragePool, error) {
    93  	var s struct {
    94  		StoragePools []StoragePool `json:"pools"`
    95  	}
    96  	err := (p.(StoragePoolPage)).ExtractInto(&s)
    97  	return s.StoragePools, err
    98  }