File: bare_metal_plans.go

package info (click to toggle)
golang-github-jamesclonk-vultr 2.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 560 kB
  • sloc: makefile: 35
file content (79 lines) | stat: -rw-r--r-- 1,922 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package lib

import (
	"fmt"
	"sort"
)

// BareMetalPlan is a bare metal-compatible plan on Vultr.
type BareMetalPlan struct {
	Deprecated bool   `json:"deprecated"`
	ID         int    `json:"METALPLANID,string"`
	Name       string `json:"name"`
	CPUs       int    `json:"cpu_count"`
	RAM        int    `json:"ram"`
	Disk       string `json:"disk"`
	Bandwidth  int    `json:"bandwidth_tb"`
	Price      int    `json:"price_per_month"`
	Regions    []int  `json:"available_locations"`
	Type       string `json:"type"`
}

type bareMetalPlans []BareMetalPlan

func (b bareMetalPlans) Len() int      { return len(b) }
func (b bareMetalPlans) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
func (b bareMetalPlans) Less(i, j int) bool {
	ba := b[i].Price
	bb := b[j].Price
	ra := b[i].RAM
	rb := b[j].RAM
	da := b[i].Disk
	db := b[j].Disk

	// sort order: price, vcpu, ram, disk
	if ba < bb {
		return true
	} else if ba > bb {
		return false
	}

	if b[i].CPUs < b[j].CPUs {
		return true
	} else if b[i].CPUs > b[j].CPUs {
		return false
	}

	if ra < rb {
		return true
	} else if ra > rb {
		return false
	}

	return da < db
}

// GetBareMetalPlans returns a list of all available bare metal plans on Vultr account.
func (c *Client) GetBareMetalPlans() ([]BareMetalPlan, error) {
	var bareMetalPlanMap map[string]BareMetalPlan
	if err := c.get(`plans/list_baremetal`, &bareMetalPlanMap); err != nil {
		return nil, err
	}

	var b bareMetalPlans
	for _, bareMetalPlan := range bareMetalPlanMap {
		b = append(b, bareMetalPlan)
	}

	sort.Sort(bareMetalPlans(b))
	return b, nil
}

// GetAvailableBareMetalPlansForRegion returns available bare metal plans for specified region.
func (c *Client) GetAvailableBareMetalPlansForRegion(id int) ([]int, error) {
	var bareMetalPlanIDs []int
	if err := c.get(fmt.Sprintf(`regions/availability?DCID=%v`, id), &bareMetalPlanIDs); err != nil {
		return nil, err
	}
	return bareMetalPlanIDs, nil
}