Skip to content

Commit 37a13ee

Browse files
authored
feat(kubernetes): node group CRUD operations (#195)
1 parent 782ff3b commit 37a13ee

15 files changed

Lines changed: 460 additions & 55 deletions

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ See updating [Changelog example here](https://keepachangelog.com/en/1.0.0/)
55

66
## [Unreleased]
77

8+
### Added
9+
- kubernetes: experimental support for node group CRUD operations
10+
811
## [5.2.0]
912

1013
### Added

upcloud/request/kubernetes.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package request
22

33
import (
4+
"encoding/json"
45
"fmt"
56
"time"
67

@@ -104,3 +105,71 @@ type GetKubernetesVersionsRequest struct{}
104105
func (r *GetKubernetesVersionsRequest) RequestURL() string {
105106
return fmt.Sprintf("%s/versions", kubernetesClusterBasePath)
106107
}
108+
109+
type GetKubernetesNodeGroupsRequest struct {
110+
ClusterUUID string
111+
}
112+
113+
func (r *GetKubernetesNodeGroupsRequest) RequestURL() string {
114+
return fmt.Sprintf("%s/%s/node-groups", kubernetesClusterBasePath, r.ClusterUUID)
115+
}
116+
117+
type GetKubernetesNodeGroupRequest struct {
118+
ClusterUUID string
119+
Name string
120+
}
121+
122+
func (r *GetKubernetesNodeGroupRequest) RequestURL() string {
123+
return fmt.Sprintf("%s/%s/node-groups/%s", kubernetesClusterBasePath, r.ClusterUUID, r.Name)
124+
}
125+
126+
type KubernetesNodeGroup struct {
127+
Count int `json:"count,omitempty"`
128+
Labels []upcloud.Label `json:"labels,omitempty"`
129+
Name string `json:"name,omitempty"`
130+
Plan string `json:"plan,omitempty"`
131+
SSHKeys []string `json:"ssh_keys,omitempty"`
132+
Storage string `json:"storage,omitempty"`
133+
KubeletArgs []upcloud.KubernetesKubeletArg `json:"kubelet_args,omitempty"`
134+
Taints []upcloud.KubernetesTaint `json:"taints,omitempty"`
135+
}
136+
137+
type CreateKubernetesNodeGroupRequest struct {
138+
ClusterUUID string `json:"-"`
139+
NodeGroup KubernetesNodeGroup
140+
}
141+
142+
func (r *CreateKubernetesNodeGroupRequest) MarshalJSON() ([]byte, error) {
143+
return json.Marshal(r.NodeGroup)
144+
}
145+
146+
func (r *CreateKubernetesNodeGroupRequest) RequestURL() string {
147+
return fmt.Sprintf("%s/%s/node-groups", kubernetesClusterBasePath, r.ClusterUUID)
148+
}
149+
150+
type ModifyKubernetesNodeGroup struct {
151+
Count int `json:"count,omitempty"`
152+
}
153+
154+
type ModifyKubernetesNodeGroupRequest struct {
155+
ClusterUUID string `json:"-"`
156+
Name string `json:"-"`
157+
NodeGroup ModifyKubernetesNodeGroup
158+
}
159+
160+
func (r *ModifyKubernetesNodeGroupRequest) MarshalJSON() ([]byte, error) {
161+
return json.Marshal(r.NodeGroup)
162+
}
163+
164+
func (r *ModifyKubernetesNodeGroupRequest) RequestURL() string {
165+
return fmt.Sprintf("%s/%s/node-groups/%s", kubernetesClusterBasePath, r.ClusterUUID, r.Name)
166+
}
167+
168+
type DeleteKubernetesNodeGroupRequest struct {
169+
ClusterUUID string
170+
Name string
171+
}
172+
173+
func (r *DeleteKubernetesNodeGroupRequest) RequestURL() string {
174+
return fmt.Sprintf("%s/%s/node-groups/%s", kubernetesClusterBasePath, r.ClusterUUID, r.Name)
175+
}

upcloud/request/kubernetes_test.go

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,115 @@ func TestKubernetes(t *testing.T) {
223223
})
224224
}
225225

226+
func TestGetKubernetesNodeGroupsRequest(t *testing.T) {
227+
t.Parallel()
228+
r := GetKubernetesNodeGroupsRequest{ClusterUUID: "id"}
229+
assert.Equal(t, fmt.Sprintf("%s/id/node-groups", kubernetesClusterBasePath), r.RequestURL())
230+
}
231+
232+
func TestGetKubernetesNodeGroupRequest(t *testing.T) {
233+
t.Parallel()
234+
r := GetKubernetesNodeGroupRequest{ClusterUUID: "id", Name: "nid"}
235+
assert.Equal(t, fmt.Sprintf("%s/id/node-groups/nid", kubernetesClusterBasePath), r.RequestURL())
236+
}
237+
238+
func TestCreateKubernetesNodeGroupRequest(t *testing.T) {
239+
t.Parallel()
240+
const expectedJSON string = `
241+
{
242+
"count": 4,
243+
"kubelet_args": [
244+
{
245+
"key": "log-flush-frequency",
246+
"value": "5s"
247+
}
248+
],
249+
"labels": [
250+
{
251+
"key": "environment",
252+
"value": "development"
253+
}
254+
],
255+
"name": "small",
256+
"plan": "K8S-2xCPU-4GB",
257+
"ssh_keys": [
258+
"ssh-rsa AAAA.."
259+
],
260+
"storage": "01000000-0000-4000-8000-000160010100",
261+
"taints": [
262+
{
263+
"effect": "NoSchedule",
264+
"key": "environment",
265+
"value": "development"
266+
}
267+
]
268+
}
269+
`
270+
r := CreateKubernetesNodeGroupRequest{
271+
ClusterUUID: "id",
272+
NodeGroup: KubernetesNodeGroup{
273+
Count: 4,
274+
Labels: []upcloud.Label{
275+
{
276+
Key: "environment",
277+
Value: "development",
278+
},
279+
},
280+
Name: "small",
281+
Plan: "K8S-2xCPU-4GB",
282+
SSHKeys: []string{"ssh-rsa AAAA.."},
283+
Storage: "01000000-0000-4000-8000-000160010100",
284+
KubeletArgs: []upcloud.KubernetesKubeletArg{
285+
{
286+
Key: "log-flush-frequency",
287+
Value: "5s",
288+
},
289+
},
290+
Taints: []upcloud.KubernetesTaint{
291+
{
292+
Effect: "NoSchedule",
293+
Key: "environment",
294+
Value: "development",
295+
},
296+
},
297+
},
298+
}
299+
assert.Equal(t, fmt.Sprintf("%s/id/node-groups", kubernetesClusterBasePath), r.RequestURL())
300+
gotJS, err := json.Marshal(&r)
301+
if !assert.NoError(t, err) {
302+
return
303+
}
304+
assert.JSONEq(t, expectedJSON, string(gotJS))
305+
}
306+
307+
func TestModifyKubernetesNodeGroupRequest(t *testing.T) {
308+
t.Parallel()
309+
const expectedJSON string = `
310+
{
311+
"count": 4
312+
}
313+
`
314+
r := ModifyKubernetesNodeGroupRequest{
315+
ClusterUUID: "id",
316+
Name: "nid",
317+
NodeGroup: ModifyKubernetesNodeGroup{
318+
Count: 4,
319+
},
320+
}
321+
assert.Equal(t, fmt.Sprintf("%s/id/node-groups/nid", kubernetesClusterBasePath), r.RequestURL())
322+
gotJS, err := json.Marshal(&r)
323+
if !assert.NoError(t, err) {
324+
return
325+
}
326+
assert.JSONEq(t, expectedJSON, string(gotJS))
327+
}
328+
329+
func TestDeleteKubernetesNodeGroupRequest(t *testing.T) {
330+
t.Parallel()
331+
r := DeleteKubernetesNodeGroupRequest{ClusterUUID: "id", Name: "nid"}
332+
assert.Equal(t, fmt.Sprintf("%s/id/node-groups/nid", kubernetesClusterBasePath), r.RequestURL())
333+
}
334+
226335
func exampleGetKubernetesClustersWithFiltersRequest() GetKubernetesClustersWithFiltersRequest {
227336
return GetKubernetesClustersWithFiltersRequest{
228337
Filters: []KubernetesFilter{

upcloud/service/fixtures/create_kubernetes_cluster.yaml

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ interactions:
1010
Content-Type:
1111
- application/json
1212
User-Agent:
13-
- upcloud-go-api-ctx/4.9.0
14-
url: https://api.upcloud.com/1.3/network/03e6deb5-5f39-4df5-8c8e-a74186aba000
13+
- upcloud-go-api/5.2.0
14+
url: https://api.upcloud.com/1.3/network/03e4970d-7791-4b80-a892-682ae0faf46b
1515
method: GET
1616
response:
1717
body: |
@@ -28,19 +28,20 @@ interactions:
2828
}
2929
]
3030
},
31+
"labels" : [],
3132
"name" : "upcloud-go-sdk-test",
3233
"type" : "private",
33-
"uuid" : "03e6deb5-5f39-4df5-8c8e-a74186aba000",
34+
"uuid" : "03e4970d-7791-4b80-a892-682ae0faf46b",
3435
"zone" : "de-fra1"
3536
}
3637
}
3738
headers:
3839
Content-Length:
39-
- "461"
40+
- "482"
4041
Content-Type:
4142
- application/json; charset=UTF-8
4243
Date:
43-
- Mon, 24 Oct 2022 12:17:08 GMT
44+
- Tue, 03 Jan 2023 14:16:39 GMT
4445
Server:
4546
- Apache
4647
Strict-Transport-Security:
@@ -49,15 +50,15 @@ interactions:
4950
code: 200
5051
duration: ""
5152
- request:
52-
body: '{"name":"go-sdk-test-ctx","network":"03e6deb5-5f39-4df5-8c8e-a74186aba000","network_cidr":"176.16.1.0/24","node_groups":[{"count":2,"labels":[{"key":"managedBy","value":"go-sdk"}],"name":"testgroup","plan":"K8S-2xCPU-4GB","ssh_keys":["ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO3fnjc8UrsYDNU8365mL3lnOPQJg18V42Lt8U/8Sm+r testy_test"]}],"zone":"de-fra1"}'
53+
body: '{"name":"go-sdk-test-ctx","network":"03e4970d-7791-4b80-a892-682ae0faf46b","network_cidr":"176.16.1.0/24","node_groups":[{"count":2,"labels":[{"key":"managedBy","value":"go-sdk"}],"name":"testgroup","plan":"K8S-2xCPU-4GB","ssh_keys":["ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO3fnjc8UrsYDNU8365mL3lnOPQJg18V42Lt8U/8Sm+r testy_test"]}],"zone":"de-fra1"}'
5354
form: {}
5455
headers:
5556
Accept:
5657
- application/json
5758
Content-Type:
5859
- application/json
5960
User-Agent:
60-
- upcloud-go-api-ctx/4.9.0
61+
- upcloud-go-api/5.2.0
6162
url: https://api.upcloud.com/1.3/kubernetes
6263
method: POST
6364
response:
@@ -66,7 +67,7 @@ interactions:
6667
Content-Length:
6768
- "0"
6869
Date:
69-
- Mon, 24 Oct 2022 12:17:08 GMT
70+
- Tue, 03 Jan 2023 14:16:40 GMT
7071
Location:
7172
- /1.3/kubernetes/
7273
Strict-Transport-Security:
@@ -75,7 +76,7 @@ interactions:
7576
code: 307
7677
duration: ""
7778
- request:
78-
body: '{"name":"go-sdk-test-ctx","network":"03e6deb5-5f39-4df5-8c8e-a74186aba000","network_cidr":"176.16.1.0/24","node_groups":[{"count":2,"labels":[{"key":"managedBy","value":"go-sdk"}],"name":"testgroup","plan":"K8S-2xCPU-4GB","ssh_keys":["ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO3fnjc8UrsYDNU8365mL3lnOPQJg18V42Lt8U/8Sm+r testy_test"]}],"zone":"de-fra1"}'
79+
body: '{"name":"go-sdk-test-ctx","network":"03e4970d-7791-4b80-a892-682ae0faf46b","network_cidr":"176.16.1.0/24","node_groups":[{"count":2,"labels":[{"key":"managedBy","value":"go-sdk"}],"name":"testgroup","plan":"K8S-2xCPU-4GB","ssh_keys":["ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO3fnjc8UrsYDNU8365mL3lnOPQJg18V42Lt8U/8Sm+r testy_test"]}],"zone":"de-fra1"}'
7980
form: {}
8081
headers:
8182
Accept:
@@ -85,22 +86,22 @@ interactions:
8586
Referer:
8687
- https://api.upcloud.com/1.3/kubernetes
8788
User-Agent:
88-
- upcloud-go-api-ctx/4.9.0
89+
- upcloud-go-api/5.2.0
8990
url: https://api.upcloud.com/1.3/kubernetes/
9091
method: POST
9192
response:
92-
body: '{"name":"go-sdk-test-ctx","network":"03e6deb5-5f39-4df5-8c8e-a74186aba000","network_cidr":"176.16.1.0/24","node_groups":[{"count":2,"labels":[{"key":"managedBy","value":"go-sdk"}],"name":"testgroup","plan":"K8S-2xCPU-4GB","ssh_keys":["ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO3fnjc8UrsYDNU8365mL3lnOPQJg18V42Lt8U/8Sm+r testy_test"]}],"state":"pending","uuid":"0d102e85-52e3-43cf-960b-9d46ec46ac4e","zone":"de-fra1"}'
93+
body: '{"name":"go-sdk-test-ctx","network":"03e4970d-7791-4b80-a892-682ae0faf46b","network_cidr":"176.16.1.0/24","node_groups":[{"count":2,"labels":[{"key":"managedBy","value":"go-sdk"}],"name":"testgroup","plan":"K8S-2xCPU-4GB","ssh_keys":["ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO3fnjc8UrsYDNU8365mL3lnOPQJg18V42Lt8U/8Sm+r testy_test"]}],"state":"pending","uuid":"0dca7a18-98e1-4e2d-aea5-ef5dd5fa450e","zone":"de-fra1"}'
9394
headers:
9495
Content-Length:
9596
- "412"
9697
Content-Type:
9798
- application/json; charset=utf-8
9899
Date:
99-
- Mon, 24 Oct 2022 12:17:10 GMT
100+
- Tue, 03 Jan 2023 14:16:41 GMT
100101
Strict-Transport-Security:
101102
- max-age=63072000
102103
X-Request-Id:
103-
- 238cd682-8012-4655-8e81-d2ed23d7f4dc
104+
- 50caa53d-d788-4c2e-8d11-3adffe9f6f24
104105
status: 201 Created
105106
code: 201
106107
duration: ""

upcloud/service/fixtures/create_kubernetes_private_network.yaml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ interactions:
1010
Content-Type:
1111
- application/json
1212
User-Agent:
13-
- upcloud-go-api-ctx/4.9.0
13+
- upcloud-go-api/5.2.0
1414
url: https://api.upcloud.com/1.3/network/
1515
method: POST
1616
response:
@@ -28,19 +28,20 @@ interactions:
2828
}
2929
]
3030
},
31+
"labels" : [],
3132
"name" : "upcloud-go-sdk-test",
3233
"type" : "private",
33-
"uuid" : "03e6deb5-5f39-4df5-8c8e-a74186aba000",
34+
"uuid" : "03e4970d-7791-4b80-a892-682ae0faf46b",
3435
"zone" : "de-fra1"
3536
}
3637
}
3738
headers:
3839
Content-Length:
39-
- "461"
40+
- "482"
4041
Content-Type:
4142
- application/json; charset=UTF-8
4243
Date:
43-
- Mon, 24 Oct 2022 12:17:06 GMT
44+
- Tue, 03 Jan 2023 14:16:39 GMT
4445
Server:
4546
- Apache
4647
Strict-Transport-Security:

upcloud/service/fixtures/delete_kubernetes_cluster.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,22 @@ interactions:
1010
Content-Type:
1111
- application/json
1212
User-Agent:
13-
- upcloud-go-api-ctx/4.9.0
14-
url: https://api.upcloud.com/1.3/kubernetes/0d102e85-52e3-43cf-960b-9d46ec46ac4e
13+
- upcloud-go-api/5.2.0
14+
url: https://api.upcloud.com/1.3/kubernetes/0dca7a18-98e1-4e2d-aea5-ef5dd5fa450e
1515
method: DELETE
1616
response:
17-
body: '{"message":"deletion started for cluster 0d102e85-52e3-43cf-960b-9d46ec46ac4e"}'
17+
body: '{"message":"deletion started for cluster 0dca7a18-98e1-4e2d-aea5-ef5dd5fa450e"}'
1818
headers:
1919
Content-Length:
2020
- "79"
2121
Content-Type:
2222
- application/json; charset=utf-8
2323
Date:
24-
- Mon, 24 Oct 2022 12:20:27 GMT
24+
- Tue, 03 Jan 2023 14:20:04 GMT
2525
Strict-Transport-Security:
2626
- max-age=63072000
2727
X-Request-Id:
28-
- e81a3e4b-20e6-4029-8709-a83e5185ceed
28+
- b30177de-4573-4ca1-ae98-869d2bdab1af
2929
status: 202 Accepted
3030
code: 202
3131
duration: ""

upcloud/service/fixtures/delete_kubernetes_private_network.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ interactions:
1010
Content-Type:
1111
- application/json
1212
User-Agent:
13-
- upcloud-go-api-ctx/4.9.0
14-
url: https://api.upcloud.com/1.3/network/03e6deb5-5f39-4df5-8c8e-a74186aba000
13+
- upcloud-go-api/5.2.0
14+
url: https://api.upcloud.com/1.3/network/03e4970d-7791-4b80-a892-682ae0faf46b
1515
method: DELETE
1616
response:
1717
body: ""
1818
headers:
1919
Date:
20-
- Mon, 24 Oct 2022 12:26:30 GMT
20+
- Tue, 03 Jan 2023 14:25:10 GMT
2121
Server:
2222
- Apache
2323
Strict-Transport-Security:

0 commit comments

Comments
 (0)