diff --git a/castai/resource_workload_scaling_policy.go b/castai/resource_workload_scaling_policy.go
index df6970d6..101705f5 100644
--- a/castai/resource_workload_scaling_policy.go
+++ b/castai/resource_workload_scaling_policy.go
@@ -102,6 +102,23 @@ func resourceWorkloadScalingPolicy() *schema.Resource {
Optional: true,
Description: `Defines the apply type to be used when downscaling.
- IMMEDIATE - pods are restarted immediately when new recommendation is generated.
+ - DEFERRED - pods are not restarted and recommendation values are applied during natural restarts only (new deployment, etc.)`,
+ ValidateDiagFunc: validation.ToDiagFunc(validation.StringInSlice([]string{"IMMEDIATE", "DEFERRED"}, false)),
+ },
+ },
+ },
+ },
+ "memory_event": {
+ Type: schema.TypeList,
+ Optional: true,
+ MaxItems: 1,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "apply_type": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: `Defines the apply type to be used when applying recommendation for memory related event.
+ - IMMEDIATE - pods are restarted immediately when new recommendation is generated.
- DEFERRED - pods are not restarted and recommendation values are applied during natural restarts only (new deployment, etc.)`,
ValidateDiagFunc: validation.ToDiagFunc(validation.StringInSlice([]string{"IMMEDIATE", "DEFERRED"}, false)),
},
@@ -199,6 +216,8 @@ func resourceWorkloadScalingPolicyCreate(ctx context.Context, d *schema.Resource
req.RecommendationPolicies.Downscaling = toDownscaling(toSection(d, "downscaling"))
+ req.RecommendationPolicies.MemoryEvent = toMemoryEvent(toSection(d, "memoryEvent"))
+
resp, err := client.WorkloadOptimizationAPICreateWorkloadScalingPolicyWithResponse(ctx, clusterID, req)
if checkErr := sdk.CheckOKResponse(resp, err); checkErr != nil {
return diag.FromErr(checkErr)
@@ -250,6 +269,9 @@ func resourceWorkloadScalingPolicyRead(ctx context.Context, d *schema.ResourceDa
if err := d.Set("downscaling", toDownscalingMap(sp.RecommendationPolicies.Downscaling)); err != nil {
return diag.FromErr(fmt.Errorf("setting downscaling: %w", err))
}
+ if err := d.Set("memoryEvent", toMemoryEventMap(sp.RecommendationPolicies.MemoryEvent)); err != nil {
+ return diag.FromErr(fmt.Errorf("setting memory event: %w", err))
+ }
return nil
}
@@ -263,6 +285,7 @@ func resourceWorkloadScalingPolicyUpdate(ctx context.Context, d *schema.Resource
"memory",
"startup",
"downscaling",
+ "memory_event",
) {
tflog.Info(ctx, "scaling policy up to date")
return nil
@@ -279,6 +302,7 @@ func resourceWorkloadScalingPolicyUpdate(ctx context.Context, d *schema.Resource
Memory: toWorkloadScalingPolicies(d.Get("memory").([]interface{})[0].(map[string]interface{})),
Startup: toStartup(toSection(d, "startup")),
Downscaling: toDownscaling(toSection(d, "downscaling")),
+ MemoryEvent: toMemoryEvent(toSection(d, "memory_event")),
},
}
@@ -486,3 +510,35 @@ func toDownscalingMap(s *sdk.WorkloadoptimizationV1DownscalingSettings) []map[st
return []map[string]any{m}
}
+
+func toMemoryEvent(memoryEvent map[string]any) *sdk.WorkloadoptimizationV1MemoryEventSettings {
+ if len(memoryEvent) == 0 {
+ return nil
+ }
+
+ result := &sdk.WorkloadoptimizationV1MemoryEventSettings{}
+
+ if v, ok := memoryEvent["apply_type"].(string); ok && v != "" {
+ result.ApplyType = lo.ToPtr(sdk.WorkloadoptimizationV1ApplyType(v))
+ }
+
+ return result
+}
+
+func toMemoryEventMap(s *sdk.WorkloadoptimizationV1MemoryEventSettings) []map[string]any {
+ if s == nil {
+ return nil
+ }
+
+ m := map[string]any{}
+
+ if s.ApplyType != nil {
+ m["apply_type"] = string(*s.ApplyType)
+ }
+
+ if len(m) == 0 {
+ return nil
+ }
+
+ return []map[string]any{m}
+}
diff --git a/castai/resource_workload_scaling_policy_test.go b/castai/resource_workload_scaling_policy_test.go
index c7fa2a90..2d621ebf 100644
--- a/castai/resource_workload_scaling_policy_test.go
+++ b/castai/resource_workload_scaling_policy_test.go
@@ -75,6 +75,7 @@ func TestAccResourceWorkloadScalingPolicy(t *testing.T) {
resource.TestCheckResourceAttr(resourceName, "memory.0.max", "512"),
resource.TestCheckResourceAttr(resourceName, "startup.0.period_seconds", "123"),
resource.TestCheckResourceAttr(resourceName, "downscaling.0.apply_type", "DEFERRED"),
+ resource.TestCheckResourceAttr(resourceName, "memory_event.0.apply_type", "DEFERRED"),
),
},
},
@@ -148,6 +149,9 @@ func scalingPolicyConfigUpdated(clusterName, projectID, name string) string {
downscaling {
apply_type = "DEFERRED"
}
+ downscaling {
+ apply_type = "DEFERRED"
+ }
}`, updatedName)
return ConfigCompose(testAccGKEClusterConfig(name, clusterName, projectID), cfg)
diff --git a/castai/sdk/api.gen.go b/castai/sdk/api.gen.go
index 14e5731d..4f7b641e 100644
--- a/castai/sdk/api.gen.go
+++ b/castai/sdk/api.gen.go
@@ -3500,6 +3500,11 @@ type WorkloadoptimizationV1ManagedBy string
// MANAGED - workload watched (metrics collected), CAST AI may perform actions on the workload.
type WorkloadoptimizationV1ManagementOption string
+// WorkloadoptimizationV1MemoryEventSettings defines model for workloadoptimization.v1.MemoryEventSettings.
+type WorkloadoptimizationV1MemoryEventSettings struct {
+ ApplyType *WorkloadoptimizationV1ApplyType `json:"applyType,omitempty"`
+}
+
// WorkloadoptimizationV1NewWorkloadScalingPolicy defines model for workloadoptimization.v1.NewWorkloadScalingPolicy.
type WorkloadoptimizationV1NewWorkloadScalingPolicy struct {
ApplyType WorkloadoptimizationV1ApplyType `json:"applyType"`
@@ -3561,9 +3566,10 @@ type WorkloadoptimizationV1RecommendationPolicies struct {
// Defines possible options for workload management.
// READ_ONLY - workload watched (metrics collected), but no actions may be performed by CAST AI.
// MANAGED - workload watched (metrics collected), CAST AI may perform actions on the workload.
- ManagementOption WorkloadoptimizationV1ManagementOption `json:"managementOption"`
- Memory WorkloadoptimizationV1ResourcePolicies `json:"memory"`
- Startup *WorkloadoptimizationV1StartupSettings `json:"startup,omitempty"`
+ ManagementOption WorkloadoptimizationV1ManagementOption `json:"managementOption"`
+ Memory WorkloadoptimizationV1ResourcePolicies `json:"memory"`
+ MemoryEvent *WorkloadoptimizationV1MemoryEventSettings `json:"memoryEvent,omitempty"`
+ Startup *WorkloadoptimizationV1StartupSettings `json:"startup,omitempty"`
}
// WorkloadoptimizationV1RecommendedPodCountChangedEvent defines model for workloadoptimization.v1.RecommendedPodCountChangedEvent.
@@ -3770,8 +3776,9 @@ type WorkloadoptimizationV1VPAConfig struct {
// Defines possible options for workload management.
// READ_ONLY - workload watched (metrics collected), but no actions may be performed by CAST AI.
// MANAGED - workload watched (metrics collected), CAST AI may perform actions on the workload.
- ManagementOption WorkloadoptimizationV1ManagementOption `json:"managementOption"`
- Memory WorkloadoptimizationV1ResourceConfig `json:"memory"`
+ ManagementOption WorkloadoptimizationV1ManagementOption `json:"managementOption"`
+ Memory WorkloadoptimizationV1ResourceConfig `json:"memory"`
+ MemoryEvent *WorkloadoptimizationV1MemoryEventSettings `json:"memoryEvent,omitempty"`
}
// WorkloadoptimizationV1VPAConfigUpdate defines model for workloadoptimization.v1.VPAConfigUpdate.
@@ -3784,6 +3791,7 @@ type WorkloadoptimizationV1VPAConfigUpdate struct {
// MANAGED - workload watched (metrics collected), CAST AI may perform actions on the workload.
ManagementOption *WorkloadoptimizationV1ManagementOption `json:"managementOption,omitempty"`
Memory *WorkloadoptimizationV1WorkloadResourceConfigUpdate `json:"memory,omitempty"`
+ MemoryEvent *WorkloadoptimizationV1MemoryEventSettings `json:"memoryEvent,omitempty"`
}
// WorkloadoptimizationV1Workload defines model for workloadoptimization.v1.Workload.
@@ -3841,8 +3849,9 @@ type WorkloadoptimizationV1WorkloadConfig struct {
// Defines possible options for workload management.
// READ_ONLY - workload watched (metrics collected), but no actions may be performed by CAST AI.
// MANAGED - workload watched (metrics collected), CAST AI may perform actions on the workload.
- ManagementOption WorkloadoptimizationV1ManagementOption `json:"managementOption"`
- Memory WorkloadoptimizationV1ResourceConfig `json:"memory"`
+ ManagementOption WorkloadoptimizationV1ManagementOption `json:"managementOption"`
+ Memory WorkloadoptimizationV1ResourceConfig `json:"memory"`
+ MemoryEvent *WorkloadoptimizationV1MemoryEventSettings `json:"memoryEvent,omitempty"`
}
// WorkloadoptimizationV1WorkloadConfigUpdate defines model for workloadoptimization.v1.WorkloadConfigUpdate.
@@ -3855,6 +3864,7 @@ type WorkloadoptimizationV1WorkloadConfigUpdate struct {
// MANAGED - workload watched (metrics collected), CAST AI may perform actions on the workload.
ManagementOption *WorkloadoptimizationV1ManagementOption `json:"managementOption,omitempty"`
Memory *WorkloadoptimizationV1WorkloadResourceConfigUpdate `json:"memory,omitempty"`
+ MemoryEvent *WorkloadoptimizationV1MemoryEventSettings `json:"memoryEvent,omitempty"`
}
// WorkloadoptimizationV1WorkloadConfigUpdateV2 defines model for workloadoptimization.v1.WorkloadConfigUpdateV2.
diff --git a/docs/resources/workload_scaling_policy.md b/docs/resources/workload_scaling_policy.md
index 3d4a9979..4c902ce1 100644
--- a/docs/resources/workload_scaling_policy.md
+++ b/docs/resources/workload_scaling_policy.md
@@ -62,6 +62,7 @@ resource "castai_workload_scaling_policy" "services" {
### Optional
- `downscaling` (Block List, Max: 1) (see [below for nested schema](#nestedblock--downscaling))
+- `memory_event` (Block List, Max: 1) (see [below for nested schema](#nestedblock--memory_event))
- `startup` (Block List, Max: 1) (see [below for nested schema](#nestedblock--startup))
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
@@ -107,6 +108,16 @@ Optional:
- DEFERRED - pods are not restarted and recommendation values are applied during natural restarts only (new deployment, etc.)
+
+### Nested Schema for `memory_event`
+
+Optional:
+
+- `apply_type` (String) Defines the apply type to be used when applying recommendation for memory related event.
+ - IMMEDIATE - pods are restarted immediately when new recommendation is generated.
+ - DEFERRED - pods are not restarted and recommendation values are applied during natural restarts only (new deployment, etc.)
+
+
### Nested Schema for `startup`
diff --git a/examples/resources/castai_workload_scaling_policy/resource.tf b/examples/resources/castai_workload_scaling_policy/resource.tf
index 9caeef24..64df008f 100644
--- a/examples/resources/castai_workload_scaling_policy/resource.tf
+++ b/examples/resources/castai_workload_scaling_policy/resource.tf
@@ -23,4 +23,7 @@ resource "castai_workload_scaling_policy" "services" {
downscaling {
apply_type = "DEFERRED"
}
+ downscaling {
+ apply_type = "IMMEDIATE"
+ }
}
\ No newline at end of file