Skip to content

Commit 8eebb2c

Browse files
allow customizing cluster autoscaler expanders in kubernetes clusters (#1391)
1 parent 1bd3153 commit 8eebb2c

5 files changed

Lines changed: 83 additions & 11 deletions

File tree

digitalocean/kubernetes/datasource_kubernetes_cluster.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,13 @@ func DataSourceDigitalOceanKubernetesCluster() *schema.Resource {
152152
Type: schema.TypeString,
153153
Optional: true,
154154
},
155+
"expanders": {
156+
Type: schema.TypeList,
157+
Optional: true,
158+
Elem: &schema.Schema{
159+
Type: schema.TypeString,
160+
},
161+
},
155162
},
156163
},
157164
},

digitalocean/kubernetes/datasource_kubernetes_cluster_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ data "digitalocean_kubernetes_cluster" "foobar" {
5353
resource.TestCheckResourceAttrSet("data.digitalocean_kubernetes_cluster.foobar", "maintenance_policy.0.duration"),
5454
resource.TestCheckResourceAttr("data.digitalocean_kubernetes_cluster.foobar", "cluster_autoscaler_configuration.0.scale_down_utilization_threshold", "0.5"),
5555
resource.TestCheckResourceAttr("data.digitalocean_kubernetes_cluster.foobar", "cluster_autoscaler_configuration.0.scale_down_unneeded_time", "1m30s"),
56+
resource.TestCheckResourceAttr("data.digitalocean_kubernetes_cluster.foobar", "cluster_autoscaler_configuration.0.expanders.0", "priority"),
5657
resource.TestCheckResourceAttr("data.digitalocean_kubernetes_cluster.foobar", "routing_agent.0.enabled", "true"),
5758
),
5859
},
@@ -87,6 +88,7 @@ resource "digitalocean_kubernetes_cluster" "foo" {
8788
cluster_autoscaler_configuration {
8889
scale_down_utilization_threshold = 0.5
8990
scale_down_unneeded_time = "1m30s"
91+
expanders = ["priority"]
9092
}
9193
9294
routing_agent {

digitalocean/kubernetes/kubernetes.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,45 @@ func expandCAConfigOpts(config []interface{}) *godo.KubernetesClusterAutoscalerC
452452
caConfig.ScaleDownUnneededTime = godo.PtrTo(v.(string))
453453
}
454454

455+
if v, ok := configMap["expanders"]; ok {
456+
caConfig.Expanders = []string{}
457+
for _, e := range v.([]interface{}) {
458+
caConfig.Expanders = append(caConfig.Expanders, e.(string))
459+
}
460+
}
461+
462+
return caConfig
463+
}
464+
465+
func expandCAConfigOptsForUpdate(config []interface{}) *godo.KubernetesClusterAutoscalerConfiguration {
466+
caConfig := &godo.KubernetesClusterAutoscalerConfiguration{
467+
// in terraform, the updated resource should be the source of truth, so if a field is removed (set to null)
468+
// we should remove it from the DO resource rather than skip updating this field
469+
ScaleDownUtilizationThreshold: godo.PtrTo(0.0),
470+
ScaleDownUnneededTime: godo.PtrTo(""),
471+
Expanders: []string{},
472+
}
473+
474+
if len(config) == 0 {
475+
return caConfig
476+
}
477+
478+
configMap := config[0].(map[string]interface{})
479+
480+
if v, ok := configMap["scale_down_utilization_threshold"]; ok {
481+
caConfig.ScaleDownUtilizationThreshold = godo.PtrTo(v.(float64))
482+
}
483+
484+
if v, ok := configMap["scale_down_unneeded_time"]; ok {
485+
caConfig.ScaleDownUnneededTime = godo.PtrTo(v.(string))
486+
}
487+
488+
if v, ok := configMap["expanders"]; ok {
489+
for _, e := range v.([]interface{}) {
490+
caConfig.Expanders = append(caConfig.Expanders, e.(string))
491+
}
492+
}
493+
455494
return caConfig
456495
}
457496

@@ -464,6 +503,7 @@ func flattenCAConfigOpts(opts *godo.KubernetesClusterAutoscalerConfiguration) []
464503
item := make(map[string]interface{})
465504
item["scale_down_utilization_threshold"] = opts.ScaleDownUtilizationThreshold
466505
item["scale_down_unneeded_time"] = opts.ScaleDownUnneededTime
506+
item["expanders"] = opts.Expanders
467507
result = append(result, item)
468508

469509
return result

digitalocean/kubernetes/resource_kubernetes_cluster.go

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,13 @@ func ResourceDigitalOceanKubernetesCluster() *schema.Resource {
177177
Type: schema.TypeString,
178178
Optional: true,
179179
},
180+
"expanders": {
181+
Type: schema.TypeList,
182+
Optional: true,
183+
Elem: &schema.Schema{
184+
Type: schema.TypeString,
185+
},
186+
},
180187
},
181188
},
182189
},
@@ -533,13 +540,14 @@ func resourceDigitalOceanKubernetesClusterUpdate(ctx context.Context, d *schema.
533540
if d.HasChanges("name", "tags", "auto_upgrade", "surge_upgrade", "maintenance_policy", "ha", controlPlaneFirewallField, "cluster_autoscaler_configuration", routingAgentField) {
534541

535542
opts := &godo.KubernetesClusterUpdateRequest{
536-
Name: d.Get("name").(string),
537-
Tags: tag.ExpandTags(d.Get("tags").(*schema.Set).List()),
538-
AutoUpgrade: godo.PtrTo(d.Get("auto_upgrade").(bool)),
539-
SurgeUpgrade: d.Get("surge_upgrade").(bool),
540-
HA: godo.PtrTo(d.Get("ha").(bool)),
541-
ControlPlaneFirewall: expandControlPlaneFirewallOpts(d.Get(controlPlaneFirewallField).([]interface{})),
542-
RoutingAgent: expandRoutingAgentOpts(d.Get(routingAgentField).([]interface{})),
543+
Name: d.Get("name").(string),
544+
Tags: tag.ExpandTags(d.Get("tags").(*schema.Set).List()),
545+
AutoUpgrade: godo.PtrTo(d.Get("auto_upgrade").(bool)),
546+
SurgeUpgrade: d.Get("surge_upgrade").(bool),
547+
HA: godo.PtrTo(d.Get("ha").(bool)),
548+
ControlPlaneFirewall: expandControlPlaneFirewallOpts(d.Get(controlPlaneFirewallField).([]interface{})),
549+
RoutingAgent: expandRoutingAgentOpts(d.Get(routingAgentField).([]interface{})),
550+
ClusterAutoscalerConfiguration: expandCAConfigOptsForUpdate(d.Get("cluster_autoscaler_configuration").([]interface{})),
543551
}
544552

545553
if maint, ok := d.GetOk("maintenance_policy"); ok {
@@ -550,10 +558,6 @@ func resourceDigitalOceanKubernetesClusterUpdate(ctx context.Context, d *schema.
550558
opts.MaintenancePolicy = maintPolicy
551559
}
552560

553-
if caConfig, ok := d.GetOk("cluster_autoscaler_configuration"); ok {
554-
opts.ClusterAutoscalerConfiguration = expandCAConfigOpts(caConfig.([]interface{}))
555-
}
556-
557561
_, resp, err := client.Kubernetes.Update(context.Background(), d.Id(), opts)
558562
if err != nil {
559563
if resp != nil && resp.StatusCode == 404 {

digitalocean/kubernetes/resource_kubernetes_cluster_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,14 @@ func TestAccDigitalOceanKubernetesCluster_ClusterAutoscalerConfiguration(t *test
436436
`
437437

438438
updatedClusterAutoscalerConfiguration := `
439+
cluster_autoscaler_configuration {
440+
scale_down_utilization_threshold = 0.8
441+
scale_down_unneeded_time = "2m"
442+
expanders = ["priority"]
443+
}
444+
`
445+
446+
updatedClusterAutoscalerConfigurationUnsetExpanders := `
439447
cluster_autoscaler_configuration {
440448
scale_down_utilization_threshold = 0.8
441449
scale_down_unneeded_time = "2m"
@@ -471,6 +479,17 @@ func TestAccDigitalOceanKubernetesCluster_ClusterAutoscalerConfiguration(t *test
471479
resource.TestCheckResourceAttr("digitalocean_kubernetes_cluster.foobar", "name", rName),
472480
resource.TestCheckResourceAttr("digitalocean_kubernetes_cluster.foobar", "cluster_autoscaler_configuration.0.scale_down_utilization_threshold", "0.8"),
473481
resource.TestCheckResourceAttr("digitalocean_kubernetes_cluster.foobar", "cluster_autoscaler_configuration.0.scale_down_unneeded_time", "2m"),
482+
resource.TestCheckResourceAttr("digitalocean_kubernetes_cluster.foobar", "cluster_autoscaler_configuration.0.expanders.0", "priority"),
483+
),
484+
},
485+
{
486+
Config: testAccDigitalOceanKubernetesConfigClusterAutoscalerConfiguration(testClusterVersionLatest, rName, updatedClusterAutoscalerConfigurationUnsetExpanders),
487+
Check: resource.ComposeAggregateTestCheckFunc(
488+
testAccCheckDigitalOceanKubernetesClusterExists("digitalocean_kubernetes_cluster.foobar", &k8s),
489+
resource.TestCheckResourceAttr("digitalocean_kubernetes_cluster.foobar", "name", rName),
490+
resource.TestCheckResourceAttr("digitalocean_kubernetes_cluster.foobar", "cluster_autoscaler_configuration.0.scale_down_utilization_threshold", "0.8"),
491+
resource.TestCheckResourceAttr("digitalocean_kubernetes_cluster.foobar", "cluster_autoscaler_configuration.0.scale_down_unneeded_time", "2m"),
492+
resource.TestCheckNoResourceAttr("digitalocean_kubernetes_cluster.foobar", "cluster_autoscaler_configuration.0.expanders.0"),
474493
),
475494
},
476495
},

0 commit comments

Comments
 (0)