Skip to content

Commit d1039b2

Browse files
authored
Support new fields for LKE-E node pool (#701)
* lke-e node pool * lint
1 parent 2babc86 commit d1039b2

File tree

7 files changed

+1675
-0
lines changed

7 files changed

+1675
-0
lines changed

lke_node_pools.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,16 @@ const (
1414
LKELinodeNotReady LKELinodeStatus = "not_ready"
1515
)
1616

17+
// LKENodePoolUpdateStrategy constants start with LKENodePool and include
18+
// LKE Node Pool upgrade strategy values
19+
type LKENodePoolUpdateStrategy string
20+
21+
// LKENodePoolUpdateStrategy constants describe the available upgrade strategies for LKE Enterprise only
22+
const (
23+
LKENodePoolRollingUpdate LKENodePoolUpdateStrategy = "rolling_update"
24+
LKENodePoolOnRecycle LKENodePoolUpdateStrategy = "on_recycle"
25+
)
26+
1727
// LKENodePoolDisk represents a Node disk in an LKENodePool object
1828
type LKENodePoolDisk struct {
1929
Size int `json:"size"`
@@ -67,6 +77,11 @@ type LKENodePool struct {
6777

6878
// NOTE: Disk encryption may not currently be available to all users.
6979
DiskEncryption InstanceDiskEncryption `json:"disk_encryption,omitempty"`
80+
81+
// K8sVersion and UpdateStrategy are only for LKE Enterprise to support node pool upgrades.
82+
// It may not currently be available to all users and is under v4beta.
83+
K8sVersion *string `json:"k8s_version,omitempty"`
84+
UpdateStrategy *LKENodePoolUpdateStrategy `json:"update_strategy,omitempty"`
7085
}
7186

7287
// LKENodePoolCreateOptions fields are those accepted by CreateLKENodePool
@@ -79,6 +94,11 @@ type LKENodePoolCreateOptions struct {
7994
Taints []LKENodePoolTaint `json:"taints"`
8095

8196
Autoscaler *LKENodePoolAutoscaler `json:"autoscaler,omitempty"`
97+
98+
// K8sVersion and UpdateStrategy only works for LKE Enterprise to support node pool upgrades.
99+
// It may not currently be available to all users and is under v4beta.
100+
K8sVersion *string `json:"k8s_version,omitempty"`
101+
UpdateStrategy *LKENodePoolUpdateStrategy `json:"update_strategy,omitempty"`
82102
}
83103

84104
// LKENodePoolUpdateOptions fields are those accepted by UpdateLKENodePoolUpdate
@@ -89,6 +109,11 @@ type LKENodePoolUpdateOptions struct {
89109
Taints *[]LKENodePoolTaint `json:"taints,omitempty"`
90110

91111
Autoscaler *LKENodePoolAutoscaler `json:"autoscaler,omitempty"`
112+
113+
// K8sVersion and UpdateStrategy only works for LKE Enterprise to support node pool upgrades.
114+
// It may not currently be available to all users and is under v4beta.
115+
K8sVersion *string `json:"k8s_version,omitempty"`
116+
UpdateStrategy *LKENodePoolUpdateStrategy `json:"update_strategy,omitempty"`
92117
}
93118

94119
// GetCreateOptions converts a LKENodePool to LKENodePoolCreateOptions for
@@ -100,6 +125,8 @@ func (l LKENodePool) GetCreateOptions() (o LKENodePoolCreateOptions) {
100125
o.Labels = l.Labels
101126
o.Taints = l.Taints
102127
o.Autoscaler = &l.Autoscaler
128+
o.K8sVersion = l.K8sVersion
129+
o.UpdateStrategy = l.UpdateStrategy
103130
return
104131
}
105132

@@ -110,6 +137,8 @@ func (l LKENodePool) GetUpdateOptions() (o LKENodePoolUpdateOptions) {
110137
o.Labels = &l.Labels
111138
o.Taints = &l.Taints
112139
o.Autoscaler = &l.Autoscaler
140+
o.K8sVersion = l.K8sVersion
141+
o.UpdateStrategy = l.UpdateStrategy
113142
return
114143
}
115144

test/integration/fixtures/TestLKENodeEnterprisePoolNode_Get.yaml

Lines changed: 747 additions & 0 deletions
Large diffs are not rendered by default.

test/integration/fixtures/TestLKENodeEnterprisePoolNode_Update.yaml

Lines changed: 747 additions & 0 deletions
Large diffs are not rendered by default.

test/integration/lke_node_pools_test.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,3 +312,76 @@ func setupLKENodePool(t *testing.T, fixturesYaml string, nodePoolCreateOpts *lin
312312
}
313313
return client, lkeCluster, pool, teardown, err
314314
}
315+
316+
func TestLKEEnterpriseNodePoolK8sUpgrade_Get(t *testing.T) {
317+
testLKENodePoolCreateOpts.K8sVersion = linodego.Pointer("v1.31.1+lke1")
318+
testLKENodePoolCreateOpts.UpdateStrategy = linodego.Pointer(linodego.LKENodePoolRollingUpdate)
319+
320+
_, _, nodePool, teardown, err := setupLKEEnterpriseNodePool(t, "fixtures/TestLKENodeEnterprisePoolNode_Get", &testLKENodePoolCreateOpts)
321+
if err != nil {
322+
t.Error(err)
323+
}
324+
defer teardown()
325+
326+
if diff := cmp.Diff(testLKENodePoolCreateOpts.K8sVersion, nodePool.K8sVersion); diff != "" {
327+
t.Errorf("unexpected k8s version:\n%s", diff)
328+
}
329+
330+
if diff := cmp.Diff(testLKENodePoolCreateOpts.UpdateStrategy, nodePool.UpdateStrategy); diff != "" {
331+
t.Errorf("unexpected update strategy:\n%s", diff)
332+
}
333+
}
334+
335+
func TestLKEEnterpriseNodePoolK8sUpgrade_Update(t *testing.T) {
336+
testLKENodePoolCreateOpts.K8sVersion = linodego.Pointer("v1.31.1+lke1")
337+
testLKENodePoolCreateOpts.UpdateStrategy = linodego.Pointer(linodego.LKENodePoolRollingUpdate)
338+
339+
client, lkeCluster, nodePool, teardown, err := setupLKEEnterpriseNodePool(t, "fixtures/TestLKENodeEnterprisePoolNode_Update", &testLKENodePoolCreateOpts)
340+
if err != nil {
341+
t.Error(err)
342+
}
343+
defer teardown()
344+
345+
updated, err := client.UpdateLKENodePool(context.TODO(), lkeCluster.ID, nodePool.ID, linodego.LKENodePoolUpdateOptions{
346+
UpdateStrategy: linodego.Pointer(linodego.LKENodePoolOnRecycle),
347+
})
348+
if err != nil {
349+
t.Errorf("Failed to update LKE node pool update strategy: %v", err.Error())
350+
}
351+
352+
updatedNodePool, err := client.GetLKENodePool(context.TODO(), lkeCluster.ID, nodePool.ID)
353+
if err != nil {
354+
t.Errorf("Failed to get updated LKE node pool update strategy: %v", err.Error())
355+
}
356+
357+
if diff := cmp.Diff(updated.UpdateStrategy, updatedNodePool.UpdateStrategy); diff != "" {
358+
t.Errorf("unexpected update strategy:\n%s", diff)
359+
}
360+
}
361+
362+
func setupLKEEnterpriseNodePool(t *testing.T, fixturesYaml string, nodePoolCreateOpts *linodego.LKENodePoolCreateOptions) (*linodego.Client, *linodego.LKECluster, *linodego.LKENodePool, func(), error) {
363+
t.Helper()
364+
var fixtureTeardown func()
365+
client, lkeCluster, fixtureTeardown, err := setupLKECluster(t, []clusterModifier{func(createOpts *linodego.LKEClusterCreateOptions) {
366+
createOpts.Tier = "enterprise"
367+
createOpts.Region = "us-lax"
368+
createOpts.K8sVersion = "v1.31.1+lke1"
369+
}}, fixturesYaml)
370+
if err != nil {
371+
t.Errorf("Error creating LKE enterprise cluster, got error %v", err)
372+
}
373+
374+
pool, err := client.CreateLKENodePool(context.Background(), lkeCluster.ID, *nodePoolCreateOpts)
375+
if err != nil {
376+
t.Errorf("Error creating Node Pool under LKE-E, got error %v", err)
377+
}
378+
379+
teardown := func() {
380+
// delete the LKENodePool to exercise the code
381+
if err := client.DeleteLKENodePool(context.Background(), lkeCluster.ID, pool.ID); err != nil {
382+
t.Errorf("Expected to delete a LKE Node Pool, but got %v", err)
383+
}
384+
fixtureTeardown()
385+
}
386+
return client, lkeCluster, pool, teardown, err
387+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"id": 12345,
3+
"type": "g6-standard-2",
4+
"count": 2,
5+
"disks": [
6+
{
7+
"size": 1000,
8+
"type": "ext4"
9+
}],
10+
"labels": {},
11+
"taints": [],
12+
"tags": ["testing"],
13+
"disk_encryption": "enabled",
14+
"k8s_version": "v1.31.1+lke1",
15+
"update_strategy": "on_recycle"
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"id": 12345,
3+
"type": "g6-standard-2",
4+
"count": 2,
5+
"disks": [
6+
{
7+
"size": 1000,
8+
"type": "ext4"
9+
}],
10+
"labels": {},
11+
"taints": [],
12+
"tags": ["testing"],
13+
"disk_encryption": "enabled",
14+
"k8s_version": "v1.31.1+lke1",
15+
"update_strategy": "rolling_update"
16+
}

test/unit/lke_node_pools_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,3 +178,50 @@ func TestLKENodePoolNode_Delete(t *testing.T) {
178178
err := base.Client.DeleteLKENodePoolNode(context.Background(), 123, "abc123")
179179
assert.NoError(t, err)
180180
}
181+
182+
func TestLKEEnterpriseNodePool_Create(t *testing.T) {
183+
fixtureData, err := fixtures.GetFixture("lke_e_node_pool_create")
184+
assert.NoError(t, err)
185+
186+
var base ClientBaseCase
187+
base.SetUp(t)
188+
defer base.TearDown(t)
189+
190+
createOptions := linodego.LKENodePoolCreateOptions{
191+
Count: 2,
192+
Type: "g6-standard-2",
193+
Tags: []string{"testing"},
194+
K8sVersion: linodego.Pointer("v1.31.1+lke1"),
195+
UpdateStrategy: linodego.Pointer(linodego.LKENodePoolOnRecycle),
196+
}
197+
198+
base.MockPost("lke/clusters/123/pools", fixtureData)
199+
200+
nodePool, err := base.Client.CreateLKENodePool(context.Background(), 123, createOptions)
201+
assert.NoError(t, err)
202+
assert.Equal(t, "g6-standard-2", nodePool.Type)
203+
assert.Equal(t, 2, nodePool.Count)
204+
assert.Equal(t, "v1.31.1+lke1", *nodePool.K8sVersion)
205+
assert.Equal(t, "on_recycle", string(*nodePool.UpdateStrategy))
206+
}
207+
208+
func TestLKEEnterpriseNodePool_Update(t *testing.T) {
209+
fixtureData, err := fixtures.GetFixture("lke_e_node_pool_update")
210+
assert.NoError(t, err)
211+
212+
var base ClientBaseCase
213+
base.SetUp(t)
214+
defer base.TearDown(t)
215+
216+
updateOptions := linodego.LKENodePoolUpdateOptions{
217+
K8sVersion: linodego.Pointer("v1.31.1+lke1"),
218+
UpdateStrategy: linodego.Pointer(linodego.LKENodePoolRollingUpdate),
219+
}
220+
221+
base.MockPut("lke/clusters/123/pools/12345", fixtureData)
222+
223+
nodePool, err := base.Client.UpdateLKENodePool(context.Background(), 123, 12345, updateOptions)
224+
assert.NoError(t, err)
225+
assert.Equal(t, "v1.31.1+lke1", *nodePool.K8sVersion)
226+
assert.Equal(t, "rolling_update", string(*nodePool.UpdateStrategy))
227+
}

0 commit comments

Comments
 (0)