Skip to content

Commit 19b12d3

Browse files
test: Enhance cluster tests with memory and CPU configurations, integrating new state utilities for validation and conversion
1 parent e9d726e commit 19b12d3

File tree

8 files changed

+235
-56
lines changed

8 files changed

+235
-56
lines changed

minikube/generator/schema_builder.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,11 @@ var schemaOverrides map[string]SchemaOverride = map[string]SchemaOverride{
7171
ValidateDiagFunc: "state_utils.ResourceSizeValidator()",
7272
},
7373
"cpus": {
74-
Default: "2",
75-
Description: "Number of CPUs allocated to Kubernetes. Use \\\"max\\\" to use the maximum number of CPUs. Use \\\"no-limit\\\" to not specify a limit (Docker/Podman only)",
76-
Type: String,
74+
Default: "2",
75+
Description: "Number of CPUs allocated to Kubernetes. Use \\\"max\\\" to use the maximum number of CPUs. Use \\\"no-limit\\\" to not specify a limit (Docker/Podman only)",
76+
Type: String,
77+
StateFunc: "state_utils.CPUConverter()",
78+
ValidateDiagFunc: "state_utils.CPUValidator()",
7779
},
7880
// Customize the description to be the fullset of drivers
7981
"driver": {

minikube/resource_cluster.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,12 @@ func initialiseMinikubeClient(d *schema.ResourceData, m interface{}) (lib.Cluste
276276
return nil, err
277277
}
278278

279+
cpuStr := d.Get("cpus").(string)
280+
cpus, err := state_utils.GetCPUs(cpuStr)
281+
if err != nil {
282+
return nil, err
283+
}
284+
279285
diskStr := d.Get("disk_size").(string)
280286
diskMb, err := pkgutil.CalculateSizeInMB(diskStr)
281287
if err != nil {
@@ -371,22 +377,16 @@ func initialiseMinikubeClient(d *schema.ResourceData, m interface{}) (lib.Cluste
371377
vc = lib.ResolveSpecialWaitOptions(vc)
372378

373379
cc := config.ClusterConfig{
374-
Addons: addonConfig,
375-
APIServerPort: d.Get("apiserver_port").(int),
376-
Name: d.Get("cluster_name").(string),
377-
KeepContext: d.Get("keep_context").(bool),
378-
EmbedCerts: d.Get("embed_certs").(bool),
379-
MinikubeISO: state_utils.ReadSliceState(defaultIsos)[0],
380-
KicBaseImage: d.Get("base_image").(string),
381-
Network: d.Get("network").(string),
382-
Memory: memoryMb,
383-
CPUs: func() int {
384-
cpus, err := state_utils.GetCPUs(d.Get("cpus").(string))
385-
if err != nil {
386-
return 2 // Default to 2 CPUs if there's an error
387-
}
388-
return cpus
389-
}(),
380+
Addons: addonConfig,
381+
APIServerPort: d.Get("apiserver_port").(int),
382+
Name: d.Get("cluster_name").(string),
383+
KeepContext: d.Get("keep_context").(bool),
384+
EmbedCerts: d.Get("embed_certs").(bool),
385+
MinikubeISO: state_utils.ReadSliceState(defaultIsos)[0],
386+
KicBaseImage: d.Get("base_image").(string),
387+
Network: d.Get("network").(string),
388+
Memory: memoryMb,
389+
CPUs: cpus,
390390
DiskSize: diskMb,
391391
Driver: driver,
392392
ListenAddress: d.Get("listen_address").(string),

minikube/resource_cluster_test.go

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"time"
1616

1717
"github.com/scott-the-programmer/terraform-provider-minikube/minikube/lib"
18+
"github.com/scott-the-programmer/terraform-provider-minikube/minikube/state_utils"
1819

1920
"github.com/golang/mock/gomock"
2021
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
@@ -35,12 +36,14 @@ type mockClusterClientProperties struct {
3536
haNodes int
3637
workerNodes int
3738
diskSize int
39+
memory string
40+
cpu string
3841
}
3942

4043
func TestClusterCreation(t *testing.T) {
4144
resource.Test(t, resource.TestCase{
4245
IsUnitTest: true,
43-
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterCreation", 1, 0, 20000}))},
46+
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterCreation", 1, 0, 20000, "4096mb", "1"}))},
4447
Steps: []resource.TestStep{
4548
{
4649
Config: testUnitClusterConfig("some_driver", "TestClusterCreation"),
@@ -55,7 +58,7 @@ func TestClusterCreation(t *testing.T) {
5558
func TestClusterUpdate(t *testing.T) {
5659
resource.Test(t, resource.TestCase{
5760
IsUnitTest: true,
58-
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockUpdate(mockClusterClientProperties{t, "TestClusterUpdate", 1, 0, 20000}))},
61+
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockUpdate(mockClusterClientProperties{t, "TestClusterUpdate", 1, 0, 20000, "4096mb", "1"}))},
5962
Steps: []resource.TestStep{
6063
{
6164
Config: testUnitClusterConfig("some_driver", "TestClusterUpdate"),
@@ -73,7 +76,7 @@ func TestClusterUpdate(t *testing.T) {
7376
func TestClusterHA(t *testing.T) {
7477
resource.Test(t, resource.TestCase{
7578
IsUnitTest: true,
76-
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterCreationHA", 3, 5, 20000}))},
79+
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterCreationHA", 3, 5, 20000, "4096mb", "1"}))},
7780
Steps: []resource.TestStep{
7881
{
7982
Config: testUnitClusterHAConfig("some_driver", "TestClusterCreationHA"),
@@ -85,7 +88,7 @@ func TestClusterHA(t *testing.T) {
8588
func TestClusterDisk(t *testing.T) {
8689
resource.Test(t, resource.TestCase{
8790
IsUnitTest: true,
88-
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterCreationDisk", 1, 0, 20480}))},
91+
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterCreationDisk", 1, 0, 20480, "4096mb", "1"}))},
8992
Steps: []resource.TestStep{
9093
{
9194
Config: testUnitClusterDiskConfig("some_driver", "TestClusterCreationDisk"),
@@ -97,7 +100,7 @@ func TestClusterDisk(t *testing.T) {
97100
func TestClusterWait(t *testing.T) {
98101
resource.Test(t, resource.TestCase{
99102
IsUnitTest: true,
100-
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterCreationWait", 1, 0, 20000}))},
103+
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterCreationWait", 1, 0, 20000, "4096mb", "1"}))},
101104
Steps: []resource.TestStep{
102105
{
103106
Config: testUnitClusterWaitConfig("some_driver", "TestClusterCreationWait"),
@@ -329,7 +332,7 @@ func TestClusterCreation_HyperV(t *testing.T) {
329332
func TestClusterNoLimitMemory(t *testing.T) {
330333
resource.Test(t, resource.TestCase{
331334
IsUnitTest: true,
332-
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterNoLimitMemory", 1, 0, 20000}))},
335+
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterNoLimitMemory", 1, 0, 20000, "no-limit", "1"}))},
333336
Steps: []resource.TestStep{
334337
{
335338
Config: testUnitClusterNoLimitMemoryConfig("some_driver", "TestClusterNoLimitMemory"),
@@ -341,7 +344,7 @@ func TestClusterNoLimitMemory(t *testing.T) {
341344
func TestClusterMaxMemory(t *testing.T) {
342345
resource.Test(t, resource.TestCase{
343346
IsUnitTest: true,
344-
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterMaxMemory", 1, 0, 20000}))},
347+
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterMaxMemory", 1, 0, 20000, "max", "1"}))},
345348
Steps: []resource.TestStep{
346349
{
347350
Config: testUnitClusterMaxMemoryConfig("some_driver", "TestClusterMaxMemory"),
@@ -353,7 +356,7 @@ func TestClusterMaxMemory(t *testing.T) {
353356
func TestClusterNoLimitCPU(t *testing.T) {
354357
resource.Test(t, resource.TestCase{
355358
IsUnitTest: true,
356-
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterNoLimitCPU", 1, 0, 20000}))},
359+
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterNoLimitCPU", 1, 0, 20000, "4096mb", "no-limit"}))},
357360
Steps: []resource.TestStep{
358361
{
359362
Config: testUnitClusterNoLimitCPUConfig("some_driver", "TestClusterNoLimitCPU"),
@@ -365,7 +368,7 @@ func TestClusterNoLimitCPU(t *testing.T) {
365368
func TestClusterMaxCPU(t *testing.T) {
366369
resource.Test(t, resource.TestCase{
367370
IsUnitTest: true,
368-
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterMaxCPU", 1, 0, 20000}))},
371+
Providers: map[string]*schema.Provider{"minikube": NewProvider(mockSuccess(mockClusterClientProperties{t, "TestClusterMaxCPU", 1, 0, 20000, "4096mb", "max"}))},
369372
Steps: []resource.TestStep{
370373
{
371374
Config: testUnitClusterMaxCPUConfig("some_driver", "TestClusterMaxCPU"),
@@ -377,7 +380,7 @@ func TestClusterMaxCPU(t *testing.T) {
377380
func mockUpdate(props mockClusterClientProperties) schema.ConfigureContextFunc {
378381
ctrl := gomock.NewController(props.t)
379382

380-
mockClusterClient := getBaseMockClient(ctrl, props.name, props.haNodes, props.workerNodes, props.diskSize)
383+
mockClusterClient := getBaseMockClient(props.t, ctrl, props.name, props.haNodes, props.workerNodes, props.diskSize, props.memory, props.cpu)
381384

382385
gomock.InOrder(
383386
mockClusterClient.EXPECT().
@@ -414,7 +417,7 @@ func mockUpdate(props mockClusterClientProperties) schema.ConfigureContextFunc {
414417
func mockSuccess(props mockClusterClientProperties) schema.ConfigureContextFunc {
415418
ctrl := gomock.NewController(props.t)
416419

417-
mockClusterClient := getBaseMockClient(ctrl, props.name, props.haNodes, props.workerNodes, props.diskSize)
420+
mockClusterClient := getBaseMockClient(props.t, ctrl, props.name, props.haNodes, props.workerNodes, props.diskSize, props.memory, props.cpu)
418421

419422
mockClusterClient.EXPECT().
420423
GetAddons().
@@ -432,7 +435,7 @@ func mockSuccess(props mockClusterClientProperties) schema.ConfigureContextFunc
432435
return configureContext
433436
}
434437

435-
func getBaseMockClient(ctrl *gomock.Controller, clusterName string, haNodes int, workerNodes int, diskSize int) *lib.MockClusterClient {
438+
func getBaseMockClient(t *testing.T, ctrl *gomock.Controller, clusterName string, haNodes int, workerNodes int, diskSize int, memory string, cpu string) *lib.MockClusterClient {
436439
mockClusterClient := lib.NewMockClusterClient(ctrl)
437440

438441
os.Mkdir("test_output", 0755)
@@ -472,6 +475,16 @@ func getBaseMockClient(ctrl *gomock.Controller, clusterName string, haNodes int,
472475
Worker: true,
473476
}
474477

478+
mem, err := state_utils.GetMemory(memory)
479+
if err != nil {
480+
t.Fatalf("Failed to get memory: %v", err)
481+
}
482+
483+
c, err := state_utils.GetCPUs(cpu)
484+
if err != nil {
485+
t.Fatalf("Failed to get cpu: %v", err)
486+
}
487+
475488
cc := config.ClusterConfig{
476489
Name: "terraform-provider-minikube-acc",
477490
APIServerPort: clusterSchema["apiserver_port"].Default.(int),
@@ -480,8 +493,8 @@ func getBaseMockClient(ctrl *gomock.Controller, clusterName string, haNodes int,
480493
MinikubeISO: defaultIso,
481494
KicBaseImage: clusterSchema["base_image"].Default.(string),
482495
Network: clusterSchema["network"].Default.(string),
483-
Memory: 4096,
484-
CPUs: 2,
496+
Memory: mem,
497+
CPUs: c,
485498
DiskSize: diskSize,
486499
Driver: "some_driver",
487500
ListenAddress: clusterSchema["listen_address"].Default.(string),

minikube/schema_cluster.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ var (
198198
ForceNew: true,
199199

200200
Default: "2",
201+
StateFunc: state_utils.CPUConverter(),
202+
ValidateDiagFunc: state_utils.CPUValidator(),
201203
},
202204

203205
"cri_socket": {

minikube/state_utils/cpu.go

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package state_utils
22

33
import (
4-
"github.com/scott-the-programmer/terraform-provider-minikube/minikube/lib"
4+
"errors"
5+
"fmt"
56
"runtime"
67
"strconv"
7-
"fmt"
8+
9+
"github.com/hashicorp/go-cty/cty"
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
12+
"github.com/scott-the-programmer/terraform-provider-minikube/minikube/lib"
813
)
914

1015
func GetCPUs(cpuStr string) (int, error) {
@@ -22,3 +27,59 @@ func GetCPUs(cpuStr string) (int, error) {
2227
}
2328
return cpus, nil
2429
}
30+
31+
func CPUConverter() schema.SchemaStateFunc {
32+
return func(val interface{}) string {
33+
result, err := CPUConverterImpl(val)
34+
if err != nil {
35+
panic(err)
36+
}
37+
return result
38+
}
39+
}
40+
41+
func CPUConverterImpl(val interface{}) (string, error) {
42+
cpuStr, ok := val.(string)
43+
if !ok {
44+
return "", errors.New("cpu value is not a string")
45+
}
46+
47+
cpus, err := GetCPUs(cpuStr)
48+
if err != nil {
49+
return "", err
50+
}
51+
52+
return strconv.Itoa(cpus), nil
53+
}
54+
55+
func CPUValidator() schema.SchemaValidateDiagFunc {
56+
return schema.SchemaValidateDiagFunc(func(val interface{}, path cty.Path) diag.Diagnostics {
57+
err := CPUValidatorImpl(val)
58+
if err != nil {
59+
return diag.FromErr(err)
60+
}
61+
return nil
62+
})
63+
}
64+
65+
func CPUValidatorImpl(val interface{}) error {
66+
cpuStr, ok := val.(string)
67+
if !ok {
68+
return errors.New("cpu value is not a string")
69+
}
70+
71+
if cpuStr == lib.Max || cpuStr == lib.NoLimit {
72+
return nil
73+
}
74+
75+
cpus, err := strconv.Atoi(cpuStr)
76+
if err != nil {
77+
return fmt.Errorf("invalid CPU value: %v", err)
78+
}
79+
80+
if cpus <= 0 {
81+
return fmt.Errorf("CPU count must be positive: %d", cpus)
82+
}
83+
84+
return nil
85+
}

0 commit comments

Comments
 (0)