-
Notifications
You must be signed in to change notification settings - Fork 3
/
agent_pool.go
204 lines (171 loc) · 5.63 KB
/
agent_pool.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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
package scalr
import (
"context"
"errors"
"fmt"
"net/url"
"strings"
)
// Compile-time proof of interface implementation.
var _ AgentPools = (*agentPools)(nil)
// AgentPools describes all the Agent Pool related methods that the
// Scalr IACP API supports.
type AgentPools interface {
List(ctx context.Context, options AgentPoolListOptions) (*AgentPoolList, error)
Read(ctx context.Context, agentPoolID string) (*AgentPool, error)
Create(ctx context.Context, options AgentPoolCreateOptions) (*AgentPool, error)
Update(ctx context.Context, agentPoolID string, options AgentPoolUpdateOptions) (*AgentPool, error)
Delete(ctx context.Context, agentPoolID string) error
}
// agentPools implements AgentPools.
type agentPools struct {
client *Client
}
// AgentPoolList represents a list of agent pools.
type AgentPoolList struct {
*Pagination
Items []*AgentPool
}
// AgentPool represents a Scalr agent pool.
type AgentPool struct {
ID string `jsonapi:"primary,agent-pools"`
Name string `jsonapi:"attr,name"`
VcsEnabled bool `jsonapi:"attr,vcs-enabled"`
// Relations
// The agent pool's scope
Account *Account `jsonapi:"relation,account"`
Environment *Environment `jsonapi:"relation,environment"`
// Workspaces this pool is connected to
Workspaces []*Workspace `jsonapi:"relation,workspaces"`
// Connected agents
Agents []*Agent `jsonapi:"relation,agents"`
}
// AgentPoolCreateOptions represents the options for creating a new AgentPool.
type AgentPoolCreateOptions struct {
ID string `jsonapi:"primary,agent-pools"`
Name *string `jsonapi:"attr,name"`
VcsEnabled *bool `jsonapi:"attr,vcs-enabled,omitempty"`
// The agent pool's scope
Account *Account `jsonapi:"relation,account"`
Environment *Environment `jsonapi:"relation,environment,omitempty"`
// Workspaces this pool is connected to
Workspaces []*Workspace `jsonapi:"relation,workspaces,omitempty"`
}
func (o AgentPoolCreateOptions) valid() error {
if o.Account == nil {
return errors.New("account is required")
}
if !validStringID(&o.Account.ID) {
return fmt.Errorf("invalid value for account ID: '%s'", o.Account.ID)
}
if o.Environment != nil && !validStringID(&o.Environment.ID) {
return fmt.Errorf("invalid value for environment ID: '%s'", o.Environment.ID)
}
if len(o.Workspaces) != 0 {
for i, ws := range o.Workspaces {
if !validStringID(&ws.ID) {
return fmt.Errorf("%d: invalid value for workspace ID: '%s'", i, ws.ID)
}
}
}
if o.Name == nil {
return errors.New("name is required")
}
if strings.TrimSpace(*o.Name) == "" {
return fmt.Errorf("invalid value for agent pool name: '%s'", *o.Name)
}
return nil
}
// AgentPoolListOptions represents the options for listing agent pools.
type AgentPoolListOptions struct {
ListOptions
Account *string `url:"filter[account],omitempty"`
Environment *string `url:"filter[environment],omitempty"`
Name string `url:"filter[name],omitempty"`
AgentPool string `url:"filter[agent-pool],omitempty"`
VcsEnabled *bool `url:"filter[vcs-enabled],omitempty"`
Include string `url:"include,omitempty"`
}
// List all the agent pools.
func (s *agentPools) List(ctx context.Context, options AgentPoolListOptions) (*AgentPoolList, error) {
req, err := s.client.newRequest("GET", "agent-pools", &options)
if err != nil {
return nil, err
}
apl := &AgentPoolList{}
err = s.client.do(ctx, req, apl)
if err != nil {
return nil, err
}
return apl, nil
}
// Create is used to create a new AgentPool.
func (s *agentPools) Create(ctx context.Context, options AgentPoolCreateOptions) (*AgentPool, error) {
if err := options.valid(); err != nil {
return nil, err
}
// Make sure we don't send a user provided ID.
options.ID = ""
req, err := s.client.newRequest("POST", "agent-pools", &options)
if err != nil {
return nil, err
}
agentPool := &AgentPool{}
err = s.client.do(ctx, req, agentPool)
if err != nil {
return nil, err
}
return agentPool, nil
}
// Read an agent pool by its ID.
func (s *agentPools) Read(ctx context.Context, agentPoolID string) (*AgentPool, error) {
if !validStringID(&agentPoolID) {
return nil, fmt.Errorf("invalid value for agent pool ID: '%s'", agentPoolID)
}
u := fmt.Sprintf("agent-pools/%s", url.QueryEscape(agentPoolID))
req, err := s.client.newRequest("GET", u, nil)
if err != nil {
return nil, err
}
agentPool := &AgentPool{}
err = s.client.do(ctx, req, agentPool)
if err != nil {
return nil, err
}
return agentPool, nil
}
// AgentPoolUpdateOptions represents the options for updating an agent pool.
type AgentPoolUpdateOptions struct {
ID string `jsonapi:"primary,agent-pools"`
Name *string `jsonapi:"attr,name,omitempty"`
// Workspaces this pool is connected to
Workspaces []*Workspace `jsonapi:"relation,workspaces"`
}
// Update settings of an existing agent pool.
func (s *agentPools) Update(ctx context.Context, agentPoolID string, options AgentPoolUpdateOptions) (*AgentPool, error) {
// Make sure we don't send a user provided ID.
options.ID = ""
u := fmt.Sprintf("agent-pools/%s", url.QueryEscape(agentPoolID))
req, err := s.client.newRequest("PATCH", u, &options)
if err != nil {
return nil, err
}
agentPool := &AgentPool{}
err = s.client.do(ctx, req, agentPool)
if err != nil {
return nil, err
}
return agentPool, nil
}
// Delete an agent pool by its ID.
func (s *agentPools) Delete(ctx context.Context, agentPoolID string) error {
if !validStringID(&agentPoolID) {
return errors.New("invalid value for agent pool ID")
}
u := fmt.Sprintf("agent-pools/%s", url.QueryEscape(agentPoolID))
req, err := s.client.newRequest("DELETE", u, nil)
if err != nil {
return err
}
return s.client.do(ctx, req, nil)
}