Skip to content

Commit 1e63fe9

Browse files
prevent equivalent disk_size values from causing cluster replacement (#177)
1 parent ac9ee40 commit 1e63fe9

File tree

7 files changed

+108
-77
lines changed

7 files changed

+108
-77
lines changed

minikube/generator/schema_builder.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,15 @@ var schemaOverrides map[string]SchemaOverride = map[string]SchemaOverride{
6060
Default: "4g",
6161
Description: "Amount of RAM to allocate to Kubernetes (format: <number>[<unit>(case-insensitive)], where unit = b, k, kb, m, mb, g or gb)",
6262
Type: String,
63-
StateFunc: "state_utils.MemoryConverter()",
64-
ValidateDiagFunc: "state_utils.MemoryValidator()",
63+
StateFunc: "state_utils.ResourceSizeConverter()",
64+
ValidateDiagFunc: "state_utils.ResourceSizeValidator()",
65+
},
66+
"disk_size": {
67+
Default: "20000mb",
68+
Description: "Disk size allocated to the minikube VM (format: <number>[<unit>(case-insensitive)], where unit = b, k, kb, m, mb, g or gb)",
69+
Type: String,
70+
StateFunc: "state_utils.ResourceSizeConverter()",
71+
ValidateDiagFunc: "state_utils.ResourceSizeValidator()",
6572
},
6673
"cpus": {
6774
Default: "2",

minikube/generator/schema_builder_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -366,8 +366,8 @@ func TestOverride(t *testing.T) {
366366
ForceNew: true,
367367
368368
Default: "4g",
369-
StateFunc: state_utils.MemoryConverter(),
370-
ValidateDiagFunc: state_utils.MemoryValidator(),
369+
StateFunc: state_utils.ResourceSizeConverter(),
370+
ValidateDiagFunc: state_utils.ResourceSizeValidator(),
371371
},
372372
373373
}

minikube/resource_cluster_test.go

+35-10
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,13 @@ type mockClusterClientProperties struct {
3434
name string
3535
haNodes int
3636
workerNodes int
37+
diskSize int
3738
}
3839

3940
func TestClusterCreation(t *testing.T) {
4041
resource.Test(t, resource.TestCase{
4142
IsUnitTest: true,
42-
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterCreation", 1, 0}))},
43+
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterCreation", 1, 0, 20000}))},
4344
Steps: []resource.TestStep{
4445
{
4546
Config: testUnitClusterConfig("some_driver", "TestClusterCreation"),
@@ -54,13 +55,13 @@ func TestClusterCreation(t *testing.T) {
5455
func TestClusterUpdate(t *testing.T) {
5556
resource.Test(t, resource.TestCase{
5657
IsUnitTest: true,
57-
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockUpdate(mockClusterClientProperties{t, "TestClusterCreation", 1, 0}))},
58+
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockUpdate(mockClusterClientProperties{t, "TestClusterUpdate", 1, 0, 20000}))},
5859
Steps: []resource.TestStep{
5960
{
60-
Config: testUnitClusterConfig("some_driver", "TestClusterCreation"),
61+
Config: testUnitClusterConfig("some_driver", "TestClusterUpdate"),
6162
},
6263
{
63-
Config: testUnitClusterConfig_Update("some_driver", "TestClusterCreation"),
64+
Config: testUnitClusterConfig_Update("some_driver", "TestClusterUpdate"),
6465
Check: resource.ComposeTestCheckFunc(
6566
resource.TestCheckResourceAttr("minikube_cluster.new", "addons.2", "ingress"),
6667
),
@@ -72,18 +73,31 @@ func TestClusterUpdate(t *testing.T) {
7273
func TestClusterHA(t *testing.T) {
7374
resource.Test(t, resource.TestCase{
7475
IsUnitTest: true,
75-
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterCreationHA", 3, 5}))},
76+
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterCreationHA", 3, 5, 20000}))},
7677
Steps: []resource.TestStep{
7778
{
7879
Config: testUnitClusterHAConfig("some_driver", "TestClusterCreationHA"),
7980
},
8081
},
8182
})
8283
}
84+
85+
func TestClusterDisk(t *testing.T) {
86+
resource.Test(t, resource.TestCase{
87+
IsUnitTest: true,
88+
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterCreationDisk", 1, 0, 20480}))},
89+
Steps: []resource.TestStep{
90+
{
91+
Config: testUnitClusterDiskConfig("some_driver", "TestClusterCreationDisk"),
92+
},
93+
},
94+
})
95+
}
96+
8397
func TestClusterWait(t *testing.T) {
8498
resource.Test(t, resource.TestCase{
8599
IsUnitTest: true,
86-
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterCreationWait", 1, 0}))},
100+
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterCreationWait", 1, 0, 20000}))},
87101
Steps: []resource.TestStep{
88102
{
89103
Config: testUnitClusterWaitConfig("some_driver", "TestClusterCreationWait"),
@@ -315,7 +329,7 @@ func TestClusterCreation_HyperV(t *testing.T) {
315329
func mockUpdate(props mockClusterClientProperties) schema.ConfigureContextFunc {
316330
ctrl := gomock.NewController(props.t)
317331

318-
mockClusterClient := getBaseMockClient(ctrl, props.name, props.haNodes, props.workerNodes)
332+
mockClusterClient := getBaseMockClient(ctrl, props.name, props.haNodes, props.workerNodes, props.diskSize)
319333

320334
gomock.InOrder(
321335
mockClusterClient.EXPECT().
@@ -352,7 +366,7 @@ func mockUpdate(props mockClusterClientProperties) schema.ConfigureContextFunc {
352366
func mockSuccess(props mockClusterClientProperties) schema.ConfigureContextFunc {
353367
ctrl := gomock.NewController(props.t)
354368

355-
mockClusterClient := getBaseMockClient(ctrl, props.name, props.haNodes, props.workerNodes)
369+
mockClusterClient := getBaseMockClient(ctrl, props.name, props.haNodes, props.workerNodes, props.diskSize)
356370

357371
mockClusterClient.EXPECT().
358372
GetAddons().
@@ -370,7 +384,7 @@ func mockSuccess(props mockClusterClientProperties) schema.ConfigureContextFunc
370384
return configureContext
371385
}
372386

373-
func getBaseMockClient(ctrl *gomock.Controller, clusterName string, haNodes int, workerNodes int) *lib.MockClusterClient {
387+
func getBaseMockClient(ctrl *gomock.Controller, clusterName string, haNodes int, workerNodes int, diskSize int) *lib.MockClusterClient {
374388
mockClusterClient := lib.NewMockClusterClient(ctrl)
375389

376390
os.Mkdir("test_output", 0755)
@@ -420,7 +434,7 @@ func getBaseMockClient(ctrl *gomock.Controller, clusterName string, haNodes int,
420434
Network: clusterSchema["network"].Default.(string),
421435
Memory: 4096,
422436
CPUs: 2,
423-
DiskSize: 20000,
437+
DiskSize: diskSize,
424438
Driver: "some_driver",
425439
ListenAddress: clusterSchema["listen_address"].Default.(string),
426440
HyperkitVpnKitSock: clusterSchema["hyperkit_vpnkit_sock"].Default.(string),
@@ -535,6 +549,17 @@ func testUnitClusterConfig(driver string, clusterName string) string {
535549
`, driver, clusterName)
536550
}
537551

552+
func testUnitClusterDiskConfig(driver string, clusterName string) string {
553+
return fmt.Sprintf(`
554+
resource "minikube_cluster" "new" {
555+
driver = "%s"
556+
cluster_name = "%s"
557+
558+
disk_size = "20g"
559+
}
560+
`, driver, clusterName)
561+
}
562+
538563
func testUnitClusterHAConfig(driver string, clusterName string) string {
539564
return fmt.Sprintf(`
540565
resource "minikube_cluster" "new" {

minikube/schema_cluster.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -252,12 +252,14 @@ var (
252252

253253
"disk_size": {
254254
Type: schema.TypeString,
255-
Description: "Disk size allocated to the minikube VM (format: <number>[<unit>], where unit = b, k, m or g).",
255+
Description: "Disk size allocated to the minikube VM (format: <number>[<unit>(case-insensitive)], where unit = b, k, kb, m, mb, g or gb)",
256256

257257
Optional: true,
258258
ForceNew: true,
259259

260260
Default: "20000mb",
261+
StateFunc: state_utils.ResourceSizeConverter(),
262+
ValidateDiagFunc: state_utils.ResourceSizeValidator(),
261263
},
262264

263265
"dns_domain": {
@@ -672,8 +674,8 @@ var (
672674
ForceNew: true,
673675

674676
Default: "4g",
675-
StateFunc: state_utils.MemoryConverter(),
676-
ValidateDiagFunc: state_utils.MemoryValidator(),
677+
StateFunc: state_utils.ResourceSizeConverter(),
678+
ValidateDiagFunc: state_utils.ResourceSizeValidator(),
677679
},
678680

679681
"mount": {

minikube/state_utils/memory.go

-45
This file was deleted.

minikube/state_utils/resource_size.go

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package state_utils
2+
3+
import (
4+
"errors"
5+
"strconv"
6+
7+
"github.com/hashicorp/go-cty/cty"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
11+
pkgutil "k8s.io/minikube/pkg/util"
12+
)
13+
14+
func ResourceSizeConverter() schema.SchemaStateFunc {
15+
return func(val interface{}) string {
16+
size, ok := val.(string)
17+
if !ok {
18+
panic(errors.New("resource size is not a string"))
19+
}
20+
sizeMb, err := pkgutil.CalculateSizeInMB(size)
21+
if err != nil {
22+
panic(errors.New("invalid resource size value"))
23+
}
24+
25+
return strconv.Itoa(sizeMb) + "mb"
26+
}
27+
}
28+
29+
func ResourceSizeValidator() schema.SchemaValidateDiagFunc {
30+
return schema.SchemaValidateDiagFunc(func(val interface{}, path cty.Path) diag.Diagnostics {
31+
size, ok := val.(string)
32+
if !ok {
33+
diag := diag.FromErr(errors.New("resource size is not a string"))
34+
return diag
35+
}
36+
_, err := pkgutil.CalculateSizeInMB(size)
37+
if err != nil {
38+
diag := diag.FromErr(errors.New("invalid resource size value"))
39+
return diag
40+
}
41+
return nil
42+
})
43+
}

minikube/state_utils/memory_test.go renamed to minikube/state_utils/resource_size_test.go

+14-15
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ import (
77
"github.com/stretchr/testify/require"
88
)
99

10-
func TestMemoryConverter(t *testing.T) {
11-
converter := MemoryConverter()
10+
func TestResourceSizeConverter(t *testing.T) {
11+
converter := ResourceSizeConverter()
1212

13-
t.Run("ValidMemoryFlagG", func(t *testing.T) {
13+
t.Run("ValidSizeFlagG", func(t *testing.T) {
1414
result := converter("2G")
1515
assert.Equal(t, "2048mb", result)
1616
})
1717

18-
t.Run("ValidMemoryFlagGb", func(t *testing.T) {
18+
t.Run("ValidSizeFlagGb", func(t *testing.T) {
1919
result := converter("2Gb")
2020
assert.Equal(t, "2048mb", result)
2121
})
@@ -26,37 +26,36 @@ func TestMemoryConverter(t *testing.T) {
2626
assert.Equal(t, resultm, resultg)
2727
})
2828

29-
t.Run("InvalidMemoryFlag", func(t *testing.T) {
30-
assert.PanicsWithError(t, "memory flag is not a string", func() {
29+
t.Run("InvalidSizeFlag", func(t *testing.T) {
30+
assert.PanicsWithError(t, "resource size is not a string", func() {
3131
converter(123)
3232
})
3333
})
3434

35-
t.Run("InvalidMemoryValue", func(t *testing.T) {
36-
assert.PanicsWithError(t, "invalid memory value", func() {
35+
t.Run("InvalidSizeValue", func(t *testing.T) {
36+
assert.PanicsWithError(t, "invalid resource size value", func() {
3737
converter("invalid")
3838
})
3939
})
4040
}
4141

42-
func TestMemoryValidator(t *testing.T) {
43-
validator := MemoryValidator()
42+
func TestResourceSizeValidator(t *testing.T) {
43+
validator := ResourceSizeValidator()
4444

45-
t.Run("ValidMemoryFlag", func(t *testing.T) {
45+
t.Run("ValidSizeFlag", func(t *testing.T) {
4646
diags := validator("2G", nil)
4747
assert.Empty(t, diags)
4848
})
4949

50-
t.Run("InvalidMemoryFlag", func(t *testing.T) {
50+
t.Run("InvalidSizeFlag", func(t *testing.T) {
5151
diags := validator(123, nil)
5252
require.Len(t, diags, 1)
53-
assert.Equal(t, diags[0].Summary, "memory flag is not a string")
53+
assert.Equal(t, diags[0].Summary, "resource size is not a string")
5454
})
5555

56-
t.Run("InvalidMemoryValue", func(t *testing.T) {
56+
t.Run("InvalidSizeValue", func(t *testing.T) {
5757
diags := validator("invalid", nil)
5858
require.Len(t, diags, 1)
5959
assert.True(t, diags.HasError())
6060
})
61-
6261
}

0 commit comments

Comments
 (0)