-
Notifications
You must be signed in to change notification settings - Fork 786
/
datacenters.go
148 lines (131 loc) · 3.87 KB
/
datacenters.go
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package iks
import (
"fmt"
"github.com/IBM-Cloud/bluemix-go/client"
"strings"
)
type MachineType struct {
Name string
Memory string
NetworkSpeed string
Cores string
Os string
ServerType string
Storage string
SecondaryStorage string
SecondaryStorageEncrypted bool
Deprecated bool
CorrespondingMachineType string
IsTrusted bool
Gpus string
}
type VLAN struct {
ID string `json:"id"`
Type string `json:"type"`
Properties struct {
Name string `json:"name"`
Note string `json:"note"`
PrimaryRouter string `json:"primary_router"`
VlanNumber string `json:"vlan_number"`
VlanType string `json:"vlan_type"`
Location string `json:"location"`
LocalDiskStorageCapability string `json:"local_disk_storage_capability"`
SanStorageCapability string `json:"san_storage_capability"`
} `json:"properties"`
}
type MachineTypes interface {
GetMachineTypes(zone Zone, region Region) ([]MachineType, error)
GetMachineType(machinetypearg string, zone Zone, region Region) (*MachineType, error)
}
type VLANs interface {
GetVLANs(zone Zone, region Region) ([]VLAN, error)
GetVLAN(vlanarg string, zone Zone, region Region) (*VLAN, error)
}
type machineTypes struct {
*client.Client
machineTypes map[string][]MachineType
}
type vLANs struct {
*client.Client
VLANs map[string][]VLAN
}
func newMachineTypesAPI(c *client.Client) MachineTypes {
return &machineTypes{
Client: c,
machineTypes: nil,
}
}
func newVLANsAPI(c *client.Client) VLANs {
return &vLANs{
Client: c,
VLANs: nil,
}
}
func (v *machineTypes) fetch(zone Zone, region Region) error {
if v.machineTypes == nil {
v.machineTypes = make(map[string][]MachineType)
}
if _, ok := v.machineTypes[zone.ID]; !ok {
machineTypes := []MachineType{}
headers := make(map[string]string, 2)
headers["datacenter"] = zone.ID
headers["X-Region"] = region.Name
_, err := v.Client.Get("/v1/datacenters/"+zone.ID+"/machine-types", &machineTypes, headers)
if err != nil {
return err
}
v.machineTypes[zone.ID] = machineTypes
}
return nil
}
func (v *machineTypes) GetMachineTypes(zone Zone, region Region) ([]MachineType, error) {
if err := v.fetch(zone, region); err != nil {
return nil, err
}
return v.machineTypes[zone.ID], nil
}
func (v *machineTypes) GetMachineType(machinetypearg string, zone Zone, region Region) (*MachineType, error) {
if err := v.fetch(zone, region); err != nil {
return nil, err
}
for _, machineType := range v.machineTypes[zone.ID] {
if strings.Compare(machinetypearg, machineType.Name) == 0 {
return &machineType, nil
}
}
return nil, fmt.Errorf("no machine type %q not found in zone %q", machinetypearg, zone.ID)
}
func (v *vLANs) fetch(zone Zone, region Region) error {
if v.VLANs == nil {
v.VLANs = make(map[string][]VLAN)
}
if _, ok := v.VLANs[zone.ID]; !ok {
vLANs := []VLAN{}
headers := make(map[string]string, 2)
headers["datacenter"] = zone.ID
headers["X-Region"] = region.Name
_, err := v.Client.Get("/v1/datacenters/"+zone.ID+"/vlans", &vLANs, headers)
if err != nil {
return err
}
v.VLANs[zone.ID] = vLANs
}
return nil
}
func (v *vLANs) GetVLANs(zone Zone, region Region) ([]VLAN, error) {
if err := v.fetch(zone, region); err != nil {
return nil, err
}
return v.VLANs[zone.ID], nil
}
func (v *vLANs) GetVLAN(vlanarg string, zone Zone, region Region) (*VLAN, error) {
if err := v.fetch(zone, region); err != nil {
return nil, err
}
for _, vLAN := range v.VLANs[zone.ID] {
if strings.Compare(vlanarg, vLAN.ID) == 0 {
return &vLAN, nil
}
}
return nil, fmt.Errorf("no machine type %q not found in zone %q", vlanarg, zone.ID)
}