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