diff --git a/castai/resource_node_template.go b/castai/resource_node_template.go index b4bdab92..012d6e99 100644 --- a/castai/resource_node_template.go +++ b/castai/resource_node_template.go @@ -219,10 +219,11 @@ func resourceNodeTemplate() *schema.Resource { Description: "Max Memory (Mib) per node.", }, FieldNodeTemplateStorageOptimized: { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "Storage optimized instance constraint - will only pick storage optimized nodes if true", + Type: schema.TypeString, + Optional: true, + Default: "", + Description: "Storage optimized instance constraint - will only pick storage optimized nodes if enabled. Supported values include: `true`, `false` or empty string.", + ValidateDiagFunc: validation.ToDiagFunc(validation.StringInSlice([]string{"", "true", "false"}, false)), }, FieldNodeTemplateIsGpuOnly: { Type: schema.TypeBool, @@ -231,10 +232,11 @@ func resourceNodeTemplate() *schema.Resource { Description: "GPU instance constraint - will only pick nodes with GPU if true", }, FieldNodeTemplateComputeOptimized: { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "Compute optimized instance constraint - will only pick compute optimized nodes if true.", + Type: schema.TypeString, + Optional: true, + Default: "", + Description: "Compute optimized instance constraint - will only pick compute optimized nodes if enabled. Supported values include: `true`, `false` or empty string.", + ValidateDiagFunc: validation.ToDiagFunc(validation.StringInSlice([]string{"", "true", "false"}, false)), }, FieldNodeTemplateInstanceFamilies: { Type: schema.TypeList, @@ -567,10 +569,18 @@ func flattenConstraints(c *sdk.NodetemplatesV1TemplateConstraints) ([]map[string out[FieldNodeTemplateInstanceFamilies] = flattenInstanceFamilies(c.InstanceFamilies) } if c.ComputeOptimized != nil { - out[FieldNodeTemplateComputeOptimized] = c.ComputeOptimized + if lo.FromPtr(c.ComputeOptimized) { + out[FieldNodeTemplateComputeOptimized] = "true" + } else { + out[FieldNodeTemplateComputeOptimized] = "false" + } } if c.StorageOptimized != nil { - out[FieldNodeTemplateStorageOptimized] = c.StorageOptimized + if lo.FromPtr(c.StorageOptimized) { + out[FieldNodeTemplateStorageOptimized] = "true" + } else { + out[FieldNodeTemplateStorageOptimized] = "false" + } } if c.Spot != nil { out[FieldNodeTemplateSpot] = c.Spot @@ -1035,8 +1045,19 @@ func toTemplateConstraints(obj map[string]any) *sdk.NodetemplatesV1TemplateConst } out := &sdk.NodetemplatesV1TemplateConstraints{} - if v, ok := obj[FieldNodeTemplateComputeOptimized].(bool); ok { - out.ComputeOptimized = toPtr(v) + if v, ok := obj[FieldNodeTemplateComputeOptimized].(string); ok { + var boolV *bool + + switch v { + case "true": + boolV = toPtr(true) + case "false": + boolV = toPtr(false) + default: + boolV = nil + } + + out.ComputeOptimized = boolV } if v, ok := obj[FieldNodeTemplateFallbackRestoreRateSeconds].(int); ok { out.FallbackRestoreRateSeconds = toPtr(int32(v)) @@ -1075,8 +1096,19 @@ func toTemplateConstraints(obj map[string]any) *sdk.NodetemplatesV1TemplateConst out.Spot = toPtr(!v) } } - if v, ok := obj[FieldNodeTemplateStorageOptimized].(bool); ok { - out.StorageOptimized = toPtr(v) + if v, ok := obj[FieldNodeTemplateStorageOptimized].(string); ok { + var boolV *bool + + switch v { + case "true": + boolV = toPtr(true) + case "false": + boolV = toPtr(false) + default: + boolV = nil + } + + out.StorageOptimized = boolV } if v, ok := obj[FieldNodeTemplateUseSpotFallbacks].(bool); ok { out.UseSpotFallbacks = toPtr(v)