Skip to content

Commit a104d77

Browse files
feat(kubernetes): node group utility network access (#247)
1 parent 25f7f66 commit a104d77

7 files changed

Lines changed: 107 additions & 54 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ See updating [Changelog example here](https://keepachangelog.com/en/1.0.0/)
1010
### Added
1111
- client functions `NewDefaultHTTPClient` and `NewDefaultHTTPTransport` to provide HTTP client default properties
1212
- kubernetes: experimental support for deleting nodes from node groups
13-
- kubernetes: consts for `scaling-up` and `scaling-down` node-group states
13+
- kubernetes: consts for `scaling-up` and `scaling-down` node group states
14+
- kubernetes: `utility_network_access` field to node group for configuring utility network access on the given group
1415

1516
### Changed
1617
- `service.GetKubernetesNodeGroup` method to return `upcloud.KubernetesNodeGroupDetails` type which is extended version of the previous `upcloud.KubernetesNodeGroup`

upcloud/kubernetes.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,17 @@ type KubernetesCluster struct {
4848
}
4949

5050
type KubernetesNodeGroup struct {
51-
AntiAffinity bool `json:"anti_affinity,omitempty"`
52-
Count int `json:"count,omitempty"`
53-
KubeletArgs []KubernetesKubeletArg `json:"kubelet_args,omitempty"`
54-
Labels []Label `json:"labels,omitempty"`
55-
Name string `json:"name,omitempty"`
56-
Plan string `json:"plan,omitempty"`
57-
SSHKeys []string `json:"ssh_keys,omitempty"`
58-
State KubernetesNodeGroupState `json:"state,omitempty"`
59-
Storage string `json:"storage,omitempty"`
60-
Taints []KubernetesTaint `json:"taints,omitempty"`
51+
AntiAffinity bool `json:"anti_affinity,omitempty"`
52+
Count int `json:"count,omitempty"`
53+
KubeletArgs []KubernetesKubeletArg `json:"kubelet_args,omitempty"`
54+
Labels []Label `json:"labels,omitempty"`
55+
Name string `json:"name,omitempty"`
56+
Plan string `json:"plan,omitempty"`
57+
SSHKeys []string `json:"ssh_keys,omitempty"`
58+
State KubernetesNodeGroupState `json:"state,omitempty"`
59+
Storage string `json:"storage,omitempty"`
60+
Taints []KubernetesTaint `json:"taints,omitempty"`
61+
UtilityNetworkAccess bool `json:"utility_network_access,omitempty"`
6162
}
6263

6364
type KubernetesNodeGroupDetails struct {

upcloud/kubernetes_test.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ const exampleKubernetesClusterJSON string = `{
4242
"value": "sometaintvalue"
4343
}
4444
],
45-
"ssh_keys": ["somekey"]
45+
"ssh_keys": ["somekey"],
46+
"utility_network_access": true
4647
},
4748
{
4849
"name": "upcloud-go-sdk-unit-test",
@@ -68,7 +69,8 @@ const exampleKubernetesClusterJSON string = `{
6869
"value": "sometaintvalue"
6970
}
7071
],
71-
"ssh_keys": ["somekey"]
72+
"ssh_keys": ["somekey"],
73+
"utility_network_access": true
7274
}
7375
]
7476
}`
@@ -189,6 +191,7 @@ func exampleKubernetesNodeGroup(antiAffinity bool) KubernetesNodeGroup {
189191
Value: "sometaintvalue",
190192
},
191193
},
192-
SSHKeys: []string{"somekey"},
194+
SSHKeys: []string{"somekey"},
195+
UtilityNetworkAccess: true,
193196
}
194197
}

upcloud/request/kubernetes.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -116,15 +116,16 @@ func (r *GetKubernetesNodeGroupRequest) RequestURL() string {
116116
}
117117

118118
type KubernetesNodeGroup struct {
119-
Count int `json:"count,omitempty"`
120-
Labels []upcloud.Label `json:"labels,omitempty"`
121-
Name string `json:"name,omitempty"`
122-
Plan string `json:"plan,omitempty"`
123-
SSHKeys []string `json:"ssh_keys,omitempty"`
124-
Storage string `json:"storage,omitempty"`
125-
KubeletArgs []upcloud.KubernetesKubeletArg `json:"kubelet_args,omitempty"`
126-
Taints []upcloud.KubernetesTaint `json:"taints,omitempty"`
127-
AntiAffinity bool `json:"anti_affinity,omitempty"`
119+
Count int `json:"count,omitempty"`
120+
Labels []upcloud.Label `json:"labels,omitempty"`
121+
Name string `json:"name,omitempty"`
122+
Plan string `json:"plan,omitempty"`
123+
SSHKeys []string `json:"ssh_keys,omitempty"`
124+
Storage string `json:"storage,omitempty"`
125+
KubeletArgs []upcloud.KubernetesKubeletArg `json:"kubelet_args,omitempty"`
126+
Taints []upcloud.KubernetesTaint `json:"taints,omitempty"`
127+
AntiAffinity bool `json:"anti_affinity,omitempty"`
128+
UtilityNetworkAccess *bool `json:"utility_network_access,omitempty"`
128129
}
129130

130131
type CreateKubernetesNodeGroupRequest struct {

upcloud/request/kubernetes_test.go

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,42 @@ const exampleCreateKubernetesClusterRequestJSON string = `{
3636
"value": "sometaintvalue"
3737
}
3838
],
39-
"name": "name",
39+
"name": "withExplicitUtilityTrue",
4040
"plan": "plan",
4141
"ssh_keys": [
4242
"key",
4343
"key"
44-
]
44+
],
45+
"utility_network_access": true
46+
},
47+
{
48+
"count": 1,
49+
"labels": [
50+
{
51+
"key": "managedBy",
52+
"value": "upcloud-go-sdk-unit-test"
53+
}
54+
],
55+
"kubelet_args": [
56+
{
57+
"key": "somekubeletkey",
58+
"value": "somekubeletvalue"
59+
}
60+
],
61+
"taints": [
62+
{
63+
"effect": "NoExecute",
64+
"key": "sometaintkey",
65+
"value": "sometaintvalue"
66+
}
67+
],
68+
"name": "withExplicitUtilityFalse",
69+
"plan": "plan",
70+
"ssh_keys": [
71+
"key",
72+
"key"
73+
],
74+
"utility_network_access": false
4575
},
4676
{
4777
"count": 1,
@@ -64,7 +94,7 @@ const exampleCreateKubernetesClusterRequestJSON string = `{
6494
"value": "sometaintvalue"
6595
}
6696
],
67-
"name": "name",
97+
"name": "withoutExplicitUtility",
6898
"plan": "plan",
6999
"ssh_keys": [
70100
"key",
@@ -347,7 +377,7 @@ func TestDeleteKubernetesNodeGroupRequest(t *testing.T) {
347377

348378
func exampleGetKubernetesClustersWithFiltersRequest() GetKubernetesClustersWithFiltersRequest {
349379
return GetKubernetesClustersWithFiltersRequest{
350-
Filters: []KubernetesFilter{
380+
Filters: []QueryFilter{
351381
FilterLabelKey{"managedBy"},
352382
FilterLabel{Label: upcloud.Label{
353383
Key: "managedBy",
@@ -363,17 +393,18 @@ func exampleCreateKubernetesClusterRequest() CreateKubernetesClusterRequest {
363393
Network: "00000000-0000-0000-0000-000000000000",
364394
NetworkCIDR: "172.16.0.1/24",
365395
NodeGroups: []KubernetesNodeGroup{
366-
exampleKubernetesNodeGroup(),
367-
exampleKubernetesNodeGroup(),
396+
exampleKubernetesNodeGroup("withExplicitUtilityTrue", upcloud.BoolPtr(true)),
397+
exampleKubernetesNodeGroup("withExplicitUtilityFalse", upcloud.BoolPtr(false)),
398+
exampleKubernetesNodeGroup("withoutExplicitUtility", nil),
368399
},
369400
Zone: "zone",
370401
Plan: "production",
371402
PrivateNodeGroups: false,
372403
}
373404
}
374405

375-
func exampleKubernetesNodeGroup() KubernetesNodeGroup {
376-
return KubernetesNodeGroup{
406+
func exampleKubernetesNodeGroup(name string, utilityNetworkAccess *bool) KubernetesNodeGroup {
407+
ng := KubernetesNodeGroup{
377408
Count: 1,
378409
Labels: []upcloud.Label{
379410
{
@@ -394,11 +425,17 @@ func exampleKubernetesNodeGroup() KubernetesNodeGroup {
394425
Value: "sometaintvalue",
395426
},
396427
},
397-
Name: "name",
428+
Name: name,
398429
Plan: "plan",
399430
SSHKeys: []string{
400431
"key",
401432
"key",
402433
},
403434
}
435+
436+
if utilityNetworkAccess != nil {
437+
ng.UtilityNetworkAccess = utilityNetworkAccess
438+
}
439+
440+
return ng
404441
}

upcloud/service/kubernetes.go

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,19 @@ type Kubernetes interface {
2626
GetKubernetesPlans(ctx context.Context, r *request.GetKubernetesPlansRequest) ([]upcloud.KubernetesPlan, error)
2727
}
2828

29-
// GetKubernetesClusters retrieves a list of Kubernetes clusters (EXPERIMENTAL).
29+
// GetKubernetesClusters retrieves a list of Kubernetes clusters.
3030
func (s *Service) GetKubernetesClusters(ctx context.Context, r *request.GetKubernetesClustersRequest) ([]upcloud.KubernetesCluster, error) {
3131
clusters := make([]upcloud.KubernetesCluster, 0)
3232
return clusters, s.get(ctx, r.RequestURL(), &clusters)
3333
}
3434

35-
// GetKubernetesCluster retrieves details of a Kubernetes cluster (EXPERIMENTAL).
35+
// GetKubernetesCluster retrieves details of a Kubernetes cluster.
3636
func (s *Service) GetKubernetesCluster(ctx context.Context, r *request.GetKubernetesClusterRequest) (*upcloud.KubernetesCluster, error) {
3737
kubernetesCluster := upcloud.KubernetesCluster{}
3838
return &kubernetesCluster, s.get(ctx, r.RequestURL(), &kubernetesCluster)
3939
}
4040

41-
// CreateKubernetesCluster creates a new Kubernetes cluster (EXPERIMENTAL).
41+
// CreateKubernetesCluster creates a new Kubernetes cluster.
4242
func (s *Service) CreateKubernetesCluster(ctx context.Context, r *request.CreateKubernetesClusterRequest) (*upcloud.KubernetesCluster, error) {
4343
if r == nil || len(r.Network) == 0 {
4444
return nil, fmt.Errorf("bad request")
@@ -57,7 +57,7 @@ func (s *Service) CreateKubernetesCluster(ctx context.Context, r *request.Create
5757
return &cluster, s.create(ctx, r, &cluster)
5858
}
5959

60-
// DeleteKubernetesCluster deletes an existing Kubernetes cluster (EXPERIMENTAL).
60+
// DeleteKubernetesCluster deletes an existing Kubernetes cluster.
6161
func (s *Service) DeleteKubernetesCluster(ctx context.Context, r *request.DeleteKubernetesClusterRequest) error {
6262
return s.delete(ctx, r)
6363
}
@@ -91,7 +91,7 @@ func (s *Service) WaitForKubernetesClusterState(ctx context.Context, r *request.
9191
}
9292
}
9393

94-
// GetKubernetesKubeconfig retrieves kubeconfig of a Kubernetes cluster (EXPERIMENTAL).
94+
// GetKubernetesKubeconfig retrieves kubeconfig of a Kubernetes cluster.
9595
func (s *Service) GetKubernetesKubeconfig(ctx context.Context, r *request.GetKubernetesKubeconfigRequest) (string, error) {
9696
// TODO: should timeout be part of GetKubernetesKubeconfigRequest ?
9797
const timeout time.Duration = 10 * time.Minute
@@ -112,47 +112,47 @@ func (s *Service) GetKubernetesKubeconfig(ctx context.Context, r *request.GetKub
112112
return data.Kubeconfig, err
113113
}
114114

115-
// GetKubernetesVersions retrieves a list of Kubernetes cluster versions (EXPERIMENTAL).
115+
// GetKubernetesVersions retrieves a list of Kubernetes cluster versions.
116116
func (s *Service) GetKubernetesVersions(ctx context.Context, r *request.GetKubernetesVersionsRequest) ([]string, error) {
117117
versions := make([]string, 0)
118118
return versions, s.get(ctx, r.RequestURL(), &versions)
119119
}
120120

121-
// GetKubernetesNodeGroups retrieves a list of Kubernetes cluster node groups (EXPERIMENTAL).
121+
// GetKubernetesNodeGroups retrieves a list of Kubernetes cluster node groups.
122122
func (s *Service) GetKubernetesNodeGroups(ctx context.Context, r *request.GetKubernetesNodeGroupsRequest) ([]upcloud.KubernetesNodeGroup, error) {
123123
ng := make([]upcloud.KubernetesNodeGroup, 0)
124124
return ng, s.get(ctx, r.RequestURL(), &ng)
125125
}
126126

127-
// GetKubernetesNodeGroup retrieves details of a node group (EXPERIMENTAL).
127+
// GetKubernetesNodeGroup retrieves details of a node group.
128128
func (s *Service) GetKubernetesNodeGroup(ctx context.Context, r *request.GetKubernetesNodeGroupRequest) (*upcloud.KubernetesNodeGroupDetails, error) {
129129
ng := upcloud.KubernetesNodeGroupDetails{}
130130
return &ng, s.get(ctx, r.RequestURL(), &ng)
131131
}
132132

133-
// CreateKubernetesNodeGroup creates a new node group (EXPERIMENTAL).
133+
// CreateKubernetesNodeGroup creates a new node group.
134134
func (s *Service) CreateKubernetesNodeGroup(ctx context.Context, r *request.CreateKubernetesNodeGroupRequest) (*upcloud.KubernetesNodeGroup, error) {
135135
ng := upcloud.KubernetesNodeGroup{}
136136
return &ng, s.create(ctx, r, &ng)
137137
}
138138

139-
// ModifyKubernetesNodeGroup modifies an existing node group (EXPERIMENTAL).
139+
// ModifyKubernetesNodeGroup modifies an existing node group.
140140
func (s *Service) ModifyKubernetesNodeGroup(ctx context.Context, r *request.ModifyKubernetesNodeGroupRequest) (*upcloud.KubernetesNodeGroup, error) {
141141
ng := upcloud.KubernetesNodeGroup{}
142142
return &ng, s.modify(ctx, r, &ng)
143143
}
144144

145-
// DeleteKubernetesNodeGroup deletes an existing node group (EXPERIMENTAL).
145+
// DeleteKubernetesNodeGroup deletes an existing node group.
146146
func (s *Service) DeleteKubernetesNodeGroup(ctx context.Context, r *request.DeleteKubernetesNodeGroupRequest) error {
147147
return s.delete(ctx, r)
148148
}
149149

150-
// DeleteKubernetesNodeGroupNode deletes an existing node from the node group (EXPERIMENTAL).
150+
// DeleteKubernetesNodeGroupNode deletes an existing node from the node group.
151151
func (s *Service) DeleteKubernetesNodeGroupNode(ctx context.Context, r *request.DeleteKubernetesNodeGroupNodeRequest) error {
152152
return s.delete(ctx, r)
153153
}
154154

155-
// GetKubernetesPlans retrieves a list of Kubernetes plans (EXPERIMENTAL).
155+
// GetKubernetesPlans retrieves a list of Kubernetes plans.
156156
func (s *Service) GetKubernetesPlans(ctx context.Context, r *request.GetKubernetesPlansRequest) ([]upcloud.KubernetesPlan, error) {
157157
plans := make([]upcloud.KubernetesPlan, 0)
158158
return plans, s.get(ctx, r.RequestURL(), &plans)

upcloud/service/kubernetes_test.go

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ const exampleClusterResponse = `
3232
"anti_affinity": false,
3333
"kubelet_args":[],
3434
"labels":[],
35-
"ssh_keys":[]
35+
"ssh_keys":[],
36+
"utility_network_access": true
3637
},
3738
{
3839
"name":"my-group2",
@@ -61,7 +62,8 @@ const exampleClusterResponse = `
6162
],
6263
"ssh_keys":[
6364
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO3fnjc8UrsYDNU8365mL3lnOPQJg18V42Lt8U/8Sm+r testy_test"
64-
]
65+
],
66+
"utility_network_access": false
6567
}
6668
]
6769
}
@@ -95,7 +97,8 @@ const exampleNodeGroupResponse = `
9597
],
9698
"ssh_keys": [
9799
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO3fnjc8UrsYDNU8365mL3lnOPQJg18V42Lt8U/8Sm+r testy_test"
98-
]
100+
],
101+
"utility_network_access": true
99102
}
100103
`
101104

@@ -117,7 +120,8 @@ const exampleNodeGroupDetailsResponse = `
117120
"state": "terminating",
118121
"uuid": "00b56302-e211-40d9-83fa-177f0171e75a"
119122
}
120-
]
123+
],
124+
"utility_network_access": true
121125
}`
122126

123127
const exampleNetworkResponse = `
@@ -173,6 +177,7 @@ func TestGetKubernetesClusters(t *testing.T) {
173177
assert.Len(t, res[0].NodeGroups[0].Labels, 0)
174178
assert.Len(t, res[0].NodeGroups[0].KubeletArgs, 0)
175179
assert.Len(t, res[0].NodeGroups[0].Taints, 0)
180+
assert.Equal(t, true, res[0].NodeGroups[0].UtilityNetworkAccess)
176181

177182
// Check second group properties
178183
assert.Equal(t, "my-group2", res[0].NodeGroups[1].Name)
@@ -182,6 +187,7 @@ func TestGetKubernetesClusters(t *testing.T) {
182187
assert.Len(t, res[0].NodeGroups[1].Labels, 1)
183188
assert.Len(t, res[0].NodeGroups[1].KubeletArgs, 1)
184189
assert.Len(t, res[0].NodeGroups[1].Taints, 1)
190+
assert.Equal(t, false, res[0].NodeGroups[1].UtilityNetworkAccess)
185191
}
186192

187193
func TestGetKubernetesClusterDetails(t *testing.T) {
@@ -231,11 +237,12 @@ func TestCreateKubernetesCluster(t *testing.T) {
231237
Zone: "de-fra1",
232238
NodeGroups: []request.KubernetesNodeGroup{
233239
{
234-
Name: "my-group1",
235-
Plan: "2xCPU-4GB",
236-
Count: 2,
237-
Storage: "01000000-0000-4000-8000-000160010100",
238-
AntiAffinity: false,
240+
Name: "my-group1",
241+
Plan: "2xCPU-4GB",
242+
Count: 2,
243+
Storage: "01000000-0000-4000-8000-000160010100",
244+
AntiAffinity: false,
245+
UtilityNetworkAccess: upcloud.BoolPtr(true),
239246
},
240247
{
241248
Name: "my-group2",
@@ -265,6 +272,7 @@ func TestCreateKubernetesCluster(t *testing.T) {
265272
SSHKeys: []string{
266273
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO3fnjc8UrsYDNU8365mL3lnOPQJg18V42Lt8U/8Sm+r testy_test",
267274
},
275+
UtilityNetworkAccess: upcloud.BoolPtr(false),
268276
},
269277
},
270278
})
@@ -393,10 +401,12 @@ func TestCreateKubernetesNodeGroup(t *testing.T) {
393401
SSHKeys: []string{
394402
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO3fnjc8UrsYDNU8365mL3lnOPQJg18V42Lt8U/8Sm+r testy_test",
395403
},
404+
UtilityNetworkAccess: upcloud.BoolPtr(true),
396405
},
397406
})
398407
assert.NoError(t, err)
399408
assert.Equal(t, "my-test-group", res.Name)
409+
assert.Equal(t, true, res.UtilityNetworkAccess)
400410
}
401411

402412
func TestModifyKubernetesNodeGroup(t *testing.T) {

0 commit comments

Comments
 (0)