-
Notifications
You must be signed in to change notification settings - Fork 30
/
rightsizing.go
134 lines (111 loc) · 3.98 KB
/
rightsizing.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
package azure
import (
"context"
"encoding/json"
"io/ioutil"
"net/http"
"github.com/spotinst/spotinst-sdk-go/spotinst"
"github.com/spotinst/spotinst-sdk-go/spotinst/client"
"github.com/spotinst/spotinst-sdk-go/spotinst/util/uritemplates"
)
type Filter struct {
Attribute *Attribute `json:"attribute,omitempty"`
Namespaces []string `json:"namespaces,omitempty"`
forceSendFields []string
nullFields []string
}
type Attribute struct {
Key *string `json:"key,omitempty"`
Operator *string `json:"operator,omitempty"`
Type *string `json:"type,omitempty"`
Value *string `json:"value,omitempty"`
forceSendFields []string
nullFields []string
}
// ResourceSuggestion represents a single resource suggestion.
type ResourceSuggestion struct {
ResourceName *string `json:"resourceName,omitempty"`
ResourceType *string `json:"resourceType,omitempty"`
Namespace *string `json:"namespace,omitempty"`
SuggestedCPU *float64 `json:"suggestedCPU,omitempty"`
RequestedCPU *float64 `json:"requestedCPU,omitempty"`
SuggestedMemory *float64 `json:"suggestedMemory,omitempty"`
RequestedMemory *float64 `json:"requestedMemory,omitempty"`
Containers []*ContainerResourceSuggestion `json:"containers,omitempty"`
}
// ContainerResourceSuggestion represents a resource suggestion for a
// single container.
type ContainerResourceSuggestion struct {
Name *string `json:"name,omitempty"`
SuggestedCPU *float64 `json:"suggestedCpu,omitempty"`
RequestedCPU *float64 `json:"requestedCpu,omitempty"`
SuggestedMemory *float64 `json:"suggestedMemory,omitempty"`
RequestedMemory *float64 `json:"requestedMemory,omitempty"`
}
// ListResourceSuggestionsInput represents the input of `ListResourceSuggestions` function.
type ListResourceSuggestionsInput struct {
OceanID *string `json:"oceanId,omitempty"`
Namespace *string `json:"namespace,omitempty"`
Filter *Filter `json:"filter,omitempty"`
}
// ListResourceSuggestionsOutput represents the output of `ListResourceSuggestions` function.
type ListResourceSuggestionsOutput struct {
Suggestions []*ResourceSuggestion `json:"suggestions,omitempty"`
}
// region Unmarshallers
func resourceSuggestionFromJSON(in []byte) (*ResourceSuggestion, error) {
b := new(ResourceSuggestion)
if err := json.Unmarshal(in, b); err != nil {
return nil, err
}
return b, nil
}
func resourceSuggestionsFromJSON(in []byte) ([]*ResourceSuggestion, error) {
var rw client.Response
if err := json.Unmarshal(in, &rw); err != nil {
return nil, err
}
out := make([]*ResourceSuggestion, len(rw.Response.Items))
for i, rb := range rw.Response.Items {
b, err := resourceSuggestionFromJSON(rb)
if err != nil {
return nil, err
}
out[i] = b
}
return out, nil
}
func resourceSuggestionsFromHTTPResponse(resp *http.Response) ([]*ResourceSuggestion, error) {
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
return resourceSuggestionsFromJSON(body)
}
// endregion
// region API request
// ListResourceSuggestions returns a list of right-sizing resource suggestions
// for an Ocean cluster.
func (s *ServiceOp) ListResourceSuggestions(ctx context.Context, input *ListResourceSuggestionsInput) (*ListResourceSuggestionsOutput, error) {
path, err := uritemplates.Expand("/ocean/azure/k8s/cluster/{oceanId}/rightSizing/suggestion", uritemplates.Values{
"oceanId": spotinst.StringValue(input.OceanID),
})
if err != nil {
return nil, err
}
r := client.NewRequest(http.MethodPost, path)
// We do NOT need the ID anymore, so let's drop it.
input.OceanID = nil
r.Obj = input
resp, err := client.RequireOK(s.Client.Do(ctx, r))
if err != nil {
return nil, err
}
defer resp.Body.Close()
rs, err := resourceSuggestionsFromHTTPResponse(resp)
if err != nil {
return nil, err
}
return &ListResourceSuggestionsOutput{Suggestions: rs}, nil
}
//endregion