Skip to content

Commit

Permalink
Merge pull request #6 from Starttoaster/typefix
Browse files Browse the repository at this point in the history
Use IntOrString type for disk RPM representation
  • Loading branch information
Starttoaster authored Sep 21, 2024
2 parents 8689574 + a1c6cad commit c51bebf
Show file tree
Hide file tree
Showing 6 changed files with 250 additions and 28 deletions.
29 changes: 15 additions & 14 deletions nodes.go
Original file line number Diff line number Diff line change
Expand Up @@ -214,20 +214,21 @@ type GetNodeDisksListResponse struct {

// GetNodeDisksListData contains data of disks from a GetNodeDisksList response
type GetNodeDisksListData struct {
ByIDLink string `json:"by_id_link"`
DevPath string `json:"devpath"`
GPT int `json:"gpt"`
Health string `json:"health"`
Model string `json:"model"`
RPM int `json:"rpm"`
Serial string `json:"serial"`
Size int `json:"size"`
Type string `json:"type"`
Used string `json:"used"`
Vendor string `json:"vendor"`
WWN string `json:"wwn"`
Bluestore int `json:"bluestore,omitempty"`
OSDEncrypted int `json:"osdencrypted,omitempty"`
ByIDLink string `json:"by_id_link"`
DevPath string `json:"devpath"`
GPT int `json:"gpt"`
Health string `json:"health"`
Model string `json:"model"`
RPM IntOrString `json:"rpm"`
Serial string `json:"serial"`
Size int `json:"size"`
Type string `json:"type"`
Used string `json:"used"`
Vendor string `json:"vendor"`
WWN string `json:"wwn"`
Wearout IntOrString `json:"wearout"`
Bluestore int `json:"bluestore,omitempty"`
OSDEncrypted int `json:"osdencrypted,omitempty"`
}

// GetNodeDisksList makes a GET request to the /nodes/{node}/disks/list endpoint
Expand Down
119 changes: 119 additions & 0 deletions nodes_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,24 @@ func TestGetNodeLxc(t *testing.T) {
Uptime: 0,
VMID: IntOrString("103"),
},
{
CPU: 0,
CPUs: 1,
Disk: 0,
DiskRead: 0,
DiskWrite: 0,
MaxDisk: 8589934592,
MaxMem: 536870912,
MaxSwap: 536870912,
Mem: 0,
Name: "CT104",
NetIn: 0,
NetOut: 0,
Status: "stopped",
Type: "lxc",
Uptime: 0,
VMID: IntOrString("104"),
},
},
}

Expand Down Expand Up @@ -155,3 +173,104 @@ func TestGetNodeQemu(t *testing.T) {
require.NotNil(t, resp)
require.Equal(t, want, *r)
}

func TestGetNodeDisksList(t *testing.T) {
mux, server, client := setup(t)
defer teardown(server)

mux.HandleFunc("/api2/json/nodes/srv1/disks/list", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
_, err := fmt.Fprint(w, fixture("nodes/get_node_disks_list.json"))
if err != nil {
return
}
})

want := GetNodeDisksListResponse{
Data: []GetNodeDisksListData{
{
DevPath: "/dev/nvme0n1",
WWN: "testwwn",
Serial: "testser",
ByIDLink: "/dev/disk/by-id/nvme-drive",
Size: 512110190592,
Used: "BIOS boot",
RPM: IntOrString("0"),
Wearout: IntOrString("99"),
GPT: 1,
Health: "PASSED",
Model: "Test Model",
Vendor: "unknown",
Type: "nvme",
},
{
Serial: "testser",
ByIDLink: "/dev/disk/by-id/ata-TOSHIBA_THNS",
Bluestore: 1,
DevPath: "/dev/sda",
OSDEncrypted: 0,
Type: "ssd",
Health: "PASSED",
RPM: IntOrString("0"),
Wearout: IntOrString("N/A"),
GPT: 0,
Vendor: "unknown",
Size: 1920383410176,
Model: "Test Model",
WWN: "testwwn",
Used: "LVM",
},
{
DevPath: "/dev/sda",
WWN: "testwwn",
Serial: "testser",
ByIDLink: "/dev/disk/by-id/ata-ST2000",
Size: 2000398934016,
Used: "LVM",
RPM: IntOrString("5400"),
Wearout: IntOrString("N/A"),
GPT: 0,
Health: "PASSED",
Model: "Test Model",
Vendor: "unknown",
Type: "hdd",
},
{
DevPath: "/dev/sdc",
WWN: "testwwn",
Serial: "testser",
ByIDLink: "/dev/disk/by-id/ata-WDC_DRIVE2",
Size: 5000947302400,
Used: "ext4",
RPM: IntOrString("4800"),
Wearout: IntOrString("N/A"),
GPT: 0,
Health: "PASSED",
Model: "Test Model",
Vendor: "unknown",
Type: "hdd",
},
{
DevPath: "/dev/sde",
WWN: "testwwn",
Serial: "testser",
ByIDLink: "/dev/disk/by-id/ata-WDC_DRIVE1",
Size: 5000947302400,
Used: "ZFS",
RPM: IntOrString("4800"),
Wearout: IntOrString("N/A"),
GPT: 0,
Health: "PASSED",
Model: "Test Model",
Vendor: "unknown",
Type: "hdd",
},
},
}

r, resp, err := client.Nodes.GetNodeDisksList("srv1")
require.NoError(t, err)
require.NotNil(t, resp)
require.Equal(t, want, *r)
}
14 changes: 2 additions & 12 deletions request.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ package proxmox

import (
"encoding/json"
"errors"
"fmt"
"io"
"log"
"net/http"
"net/url"

Expand Down Expand Up @@ -61,16 +61,6 @@ func (c *Client) Do(req *http.Request, v interface{}) (*http.Response, error) {
if err != nil {
return nil, err
}
defer func() {
if err := resp.Body.Close(); err != nil {
log.Printf("proxmox client couldn't close the response body: %v", err)
}
}()
defer func() {
if _, err := io.Copy(io.Discard, resp.Body); err != nil {
log.Printf("proxmox client couldn't discard the response body: %v", err)
}
}()

// Check for error API response and capture it as an error
// 3xx codes get treated as errors, unclear if there's a valid reason for redirection here
Expand All @@ -80,7 +70,7 @@ func (c *Client) Do(req *http.Request, v interface{}) (*http.Response, error) {
return nil, fmt.Errorf("error reading Proxmox response body: %v", err)
}

return resp, fmt.Errorf(string(body))
return resp, errors.New(string(body))
}

// Copy body into v
Expand Down
93 changes: 93 additions & 0 deletions testdata/nodes/get_node_disks_list.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
{
"data": [
{
"devpath": "/dev/nvme0n1",
"wwn": "testwwn",
"serial": "testser",
"by_id_link": "/dev/disk/by-id/nvme-drive",
"size": 512110190592,
"used": "BIOS boot",
"osdid": -1,
"rpm": 0,
"wearout": 99,
"gpt": 1,
"osdid-list": null,
"health": "PASSED",
"model": "Test Model",
"vendor": "unknown",
"type": "nvme"
},
{
"serial": "testser",
"by_id_link": "/dev/disk/by-id/ata-TOSHIBA_THNS",
"bluestore": 1,
"devpath": "/dev/sda",
"osdencrypted": 0,
"type": "ssd",
"osdid-list":[
"1"
],
"osdid": "1",
"health": "PASSED",
"rpm": 0,
"wearout": "N/A",
"gpt": 0,
"vendor": "unknown",
"size": 1920383410176,
"model": "Test Model",
"wwn": "testwwn",
"used": "LVM"
},
{
"osdid": -1,
"rpm": "5400",
"serial": "testser",
"by_id_link": "/dev/disk/by-id/ata-ST2000",
"size": 2000398934016,
"used": "LVM",
"devpath": "/dev/sda",
"wwn": "testwwn",
"type": "hdd",
"vendor": "unknown",
"health": "PASSED",
"model": "Test Model",
"gpt": 0,
"osdid-list": null,
"wearout": "N/A"
},
{
"rpm": "4800",
"osdid": -1,
"by_id_link": "/dev/disk/by-id/ata-WDC_DRIVE2",
"size": 5000947302400,
"used": "ext4",
"serial": "testser",
"wwn": "testwwn",
"devpath": "/dev/sdc",
"type": "hdd",
"vendor": "unknown",
"model": "Test Model",
"health": "PASSED",
"osdid-list": null,
"gpt": 0,
"wearout": "N/A"
},
{
"size": 5000947302400,
"used": "ZFS",
"by_id_link": "/dev/disk/by-id/ata-WDC_DRIVE1",
"serial": "testser",
"rpm": "4800",
"osdid": -1,
"wwn": "testwwn",
"devpath": "/dev/sde",
"model": "Test Model",
"health": "PASSED",
"type": "hdd",
"vendor": "unknown",
"wearout": "N/A",
"osdid-list": null,
"gpt": 0
}
]
}
19 changes: 19 additions & 0 deletions testdata/nodes/get_node_lxc.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,25 @@
"diskread":0,
"netout":0,
"mem":0
},
{
"status":"stopped",
"maxdisk":8589934592,
"maxswap":536870912,
"swap":0,
"netin":0,
"cpu":0,
"cpus":1,
"type":"lxc",
"maxmem":536870912,
"name":"CT104",
"disk":0,
"diskwrite":0,
"vmid":"104",
"uptime":0,
"diskread":0,
"netout":0,
"mem":0
}
]
}
4 changes: 2 additions & 2 deletions types.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,15 +69,15 @@ func (is *IntOrString) UnmarshalJSON(data []byte) error {
// attempt to unmarshal into an integer
var i int
var intErr error
if intErr = json.Unmarshal(data, &i); intErr == nil && i != 0 {
if intErr = json.Unmarshal(data, &i); intErr == nil {
*is = IntOrString(strconv.Itoa(i))
return nil
}

// attempt to unmarshal into a string
var str string
var strErr error
if strErr = json.Unmarshal(data, &str); strErr == nil && str != "" {
if strErr = json.Unmarshal(data, &str); strErr == nil {
*is = IntOrString(str)
return nil
}
Expand Down

0 comments on commit c51bebf

Please sign in to comment.