github.com/huaweicloud/golangsdk@v0.0.0-20210831081626-d823fe11ceba/openstack/compute/v2/extensions/hypervisors/results.go (about) 1 package hypervisors 2 3 import ( 4 "encoding/json" 5 "fmt" 6 7 "github.com/huaweicloud/golangsdk" 8 "github.com/huaweicloud/golangsdk/pagination" 9 ) 10 11 // Topology represents a CPU Topology. 12 type Topology struct { 13 Sockets int `json:"sockets"` 14 Cores int `json:"cores"` 15 Threads int `json:"threads"` 16 } 17 18 // CPUInfo represents CPU information of the hypervisor. 19 type CPUInfo struct { 20 Vendor string `json:"vendor"` 21 Arch string `json:"arch"` 22 Model string `json:"model"` 23 Features []string `json:"features"` 24 Topology Topology `json:"topology"` 25 } 26 27 // Service represents a Compute service running on the hypervisor. 28 type Service struct { 29 Host string `json:"host"` 30 ID int `json:"id"` 31 DisabledReason string `json:"disabled_reason"` 32 } 33 34 // Hypervisor represents a hypervisor in the OpenStack cloud. 35 type Hypervisor struct { 36 // A structure that contains cpu information like arch, model, vendor, 37 // features and topology. 38 CPUInfo CPUInfo `json:"-"` 39 40 // The current_workload is the number of tasks the hypervisor is responsible 41 // for. This will be equal or greater than the number of active VMs on the 42 // system (it can be greater when VMs are being deleted and the hypervisor is 43 // still cleaning up). 44 CurrentWorkload int `json:"current_workload"` 45 46 // Status of the hypervisor, either "enabled" or "disabled". 47 Status string `json:"status"` 48 49 // State of the hypervisor, either "up" or "down". 50 State string `json:"state"` 51 52 // DiskAvailableLeast is the actual free disk on this hypervisor, 53 // measured in GB. 54 DiskAvailableLeast int `json:"disk_available_least"` 55 56 // HostIP is the hypervisor's IP address. 57 HostIP string `json:"host_ip"` 58 59 // FreeDiskGB is the free disk remaining on the hypervisor, measured in GB. 60 FreeDiskGB int `json:"-"` 61 62 // FreeRAMMB is the free RAM in the hypervisor, measured in MB. 63 FreeRamMB int `json:"free_ram_mb"` 64 65 // HypervisorHostname is the hostname of the hypervisor. 66 HypervisorHostname string `json:"hypervisor_hostname"` 67 68 // HypervisorType is the type of hypervisor. 69 HypervisorType string `json:"hypervisor_type"` 70 71 // HypervisorVersion is the version of the hypervisor. 72 HypervisorVersion int `json:"-"` 73 74 // ID is the unique ID of the hypervisor. 75 ID int `json:"id"` 76 77 // LocalGB is the disk space in the hypervisor, measured in GB. 78 LocalGB int `json:"-"` 79 80 // LocalGBUsed is the used disk space of the hypervisor, measured in GB. 81 LocalGBUsed int `json:"local_gb_used"` 82 83 // MemoryMB is the total memory of the hypervisor, measured in MB. 84 MemoryMB int `json:"memory_mb"` 85 86 // MemoryMBUsed is the used memory of the hypervisor, measured in MB. 87 MemoryMBUsed int `json:"memory_mb_used"` 88 89 // RunningVMs is the The number of running vms on the hypervisor. 90 RunningVMs int `json:"running_vms"` 91 92 // Service is the service this hypervisor represents. 93 Service Service `json:"service"` 94 95 // VCPUs is the total number of vcpus on the hypervisor. 96 VCPUs int `json:"vcpus"` 97 98 // VCPUsUsed is the number of used vcpus on the hypervisor. 99 VCPUsUsed int `json:"vcpus_used"` 100 } 101 102 func (r *Hypervisor) UnmarshalJSON(b []byte) error { 103 type tmp Hypervisor 104 var s struct { 105 tmp 106 CPUInfo interface{} `json:"cpu_info"` 107 HypervisorVersion interface{} `json:"hypervisor_version"` 108 FreeDiskGB interface{} `json:"free_disk_gb"` 109 LocalGB interface{} `json:"local_gb"` 110 } 111 112 err := json.Unmarshal(b, &s) 113 if err != nil { 114 return err 115 } 116 117 *r = Hypervisor(s.tmp) 118 119 // Newer versions return the CPU info as the correct type. 120 // Older versions return the CPU info as a string and need to be 121 // unmarshalled by the json parser. 122 var tmpb []byte 123 124 switch t := s.CPUInfo.(type) { 125 case string: 126 tmpb = []byte(t) 127 case map[string]interface{}: 128 tmpb, err = json.Marshal(t) 129 if err != nil { 130 return err 131 } 132 default: 133 return fmt.Errorf("CPUInfo has unexpected type: %T", t) 134 } 135 136 err = json.Unmarshal(tmpb, &r.CPUInfo) 137 if err != nil { 138 return err 139 } 140 141 // These fields may be returned as a scientific notation, so they need 142 // converted to int. 143 switch t := s.HypervisorVersion.(type) { 144 case int: 145 r.HypervisorVersion = t 146 case float64: 147 r.HypervisorVersion = int(t) 148 default: 149 return fmt.Errorf("Hypervisor version of unexpected type") 150 } 151 152 switch t := s.FreeDiskGB.(type) { 153 case int: 154 r.FreeDiskGB = t 155 case float64: 156 r.FreeDiskGB = int(t) 157 default: 158 return fmt.Errorf("Free disk GB of unexpected type") 159 } 160 161 switch t := s.LocalGB.(type) { 162 case int: 163 r.LocalGB = t 164 case float64: 165 r.LocalGB = int(t) 166 default: 167 return fmt.Errorf("Local GB of unexpected type") 168 } 169 170 return nil 171 } 172 173 // HypervisorPage represents a single page of all Hypervisors from a List 174 // request. 175 type HypervisorPage struct { 176 pagination.SinglePageBase 177 } 178 179 // IsEmpty determines whether or not a HypervisorPage is empty. 180 func (page HypervisorPage) IsEmpty() (bool, error) { 181 va, err := ExtractHypervisors(page) 182 return len(va) == 0, err 183 } 184 185 // ExtractHypervisors interprets a page of results as a slice of Hypervisors. 186 func ExtractHypervisors(p pagination.Page) ([]Hypervisor, error) { 187 var h struct { 188 Hypervisors []Hypervisor `json:"hypervisors"` 189 } 190 err := (p.(HypervisorPage)).ExtractInto(&h) 191 return h.Hypervisors, err 192 } 193 194 type HypervisorResult struct { 195 golangsdk.Result 196 } 197 198 // Extract interprets any HypervisorResult as a Hypervisor, if possible. 199 func (r HypervisorResult) Extract() (*Hypervisor, error) { 200 var s struct { 201 Hypervisor Hypervisor `json:"hypervisor"` 202 } 203 err := r.ExtractInto(&s) 204 return &s.Hypervisor, err 205 } 206 207 // Statistics represents a summary statistics for all enabled 208 // hypervisors over all compute nodes in the OpenStack cloud. 209 type Statistics struct { 210 // The number of hypervisors. 211 Count int `json:"count"` 212 213 // The current_workload is the number of tasks the hypervisor is responsible for 214 CurrentWorkload int `json:"current_workload"` 215 216 // The actual free disk on this hypervisor(in GB). 217 DiskAvailableLeast int `json:"disk_available_least"` 218 219 // The free disk remaining on this hypervisor(in GB). 220 FreeDiskGB int `json:"free_disk_gb"` 221 222 // The free RAM in this hypervisor(in MB). 223 FreeRamMB int `json:"free_ram_mb"` 224 225 // The disk in this hypervisor(in GB). 226 LocalGB int `json:"local_gb"` 227 228 // The disk used in this hypervisor(in GB). 229 LocalGBUsed int `json:"local_gb_used"` 230 231 // The memory of this hypervisor(in MB). 232 MemoryMB int `json:"memory_mb"` 233 234 // The memory used in this hypervisor(in MB). 235 MemoryMBUsed int `json:"memory_mb_used"` 236 237 // The total number of running vms on all hypervisors. 238 RunningVMs int `json:"running_vms"` 239 240 // The number of vcpu in this hypervisor. 241 VCPUs int `json:"vcpus"` 242 243 // The number of vcpu used in this hypervisor. 244 VCPUsUsed int `json:"vcpus_used"` 245 } 246 247 type StatisticsResult struct { 248 golangsdk.Result 249 } 250 251 // Extract interprets any StatisticsResult as a Statistics, if possible. 252 func (r StatisticsResult) Extract() (*Statistics, error) { 253 var s struct { 254 Stats Statistics `json:"hypervisor_statistics"` 255 } 256 err := r.ExtractInto(&s) 257 return &s.Stats, err 258 } 259 260 // Uptime represents uptime and additional info for a specific hypervisor. 261 type Uptime struct { 262 // The hypervisor host name provided by the Nova virt driver. 263 // For the Ironic driver, it is the Ironic node uuid. 264 HypervisorHostname string `json:"hypervisor_hostname"` 265 266 // The id of the hypervisor. 267 ID int `json:"id"` 268 269 // The state of the hypervisor. One of up or down. 270 State string `json:"state"` 271 272 // The status of the hypervisor. One of enabled or disabled. 273 Status string `json:"status"` 274 275 // The total uptime of the hypervisor and information about average load. 276 Uptime string `json:"uptime"` 277 } 278 279 type UptimeResult struct { 280 golangsdk.Result 281 } 282 283 // Extract interprets any UptimeResult as a Uptime, if possible. 284 func (r UptimeResult) Extract() (*Uptime, error) { 285 var s struct { 286 Uptime Uptime `json:"hypervisor"` 287 } 288 err := r.ExtractInto(&s) 289 return &s.Uptime, err 290 }