Skip to content

Commit 046b42c

Browse files
authored
add support for new doks cluster options (#1421)
* add support for new doks cluster options * fix wrong attribute in test case
1 parent 55d6d19 commit 046b42c

6 files changed

Lines changed: 244 additions & 11 deletions

File tree

digitalocean/kubernetes/datasource_kubernetes_cluster.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,36 @@ func DataSourceDigitalOceanKubernetesCluster() *schema.Resource {
7676
},
7777
},
7878

79+
amdGpuDevicePluginField: {
80+
Type: schema.TypeList,
81+
Computed: true,
82+
Optional: true,
83+
MaxItems: 1,
84+
Elem: &schema.Resource{
85+
Schema: map[string]*schema.Schema{
86+
"enabled": {
87+
Type: schema.TypeBool,
88+
Computed: true,
89+
},
90+
},
91+
},
92+
},
93+
94+
amdGpuDeviceMetricsExporterPlugin: {
95+
Type: schema.TypeList,
96+
Computed: true,
97+
Optional: true,
98+
MaxItems: 1,
99+
Elem: &schema.Resource{
100+
Schema: map[string]*schema.Schema{
101+
"enabled": {
102+
Type: schema.TypeBool,
103+
Computed: true,
104+
},
105+
},
106+
},
107+
},
108+
79109
"version": {
80110
Type: schema.TypeString,
81111
Computed: true,

digitalocean/kubernetes/datasource_kubernetes_cluster_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ data "digitalocean_kubernetes_cluster" "foobar" {
5555
resource.TestCheckResourceAttr("data.digitalocean_kubernetes_cluster.foobar", "cluster_autoscaler_configuration.0.scale_down_unneeded_time", "1m30s"),
5656
resource.TestCheckResourceAttr("data.digitalocean_kubernetes_cluster.foobar", "cluster_autoscaler_configuration.0.expanders.0", "priority"),
5757
resource.TestCheckResourceAttr("data.digitalocean_kubernetes_cluster.foobar", "routing_agent.0.enabled", "true"),
58+
resource.TestCheckResourceAttr("data.digitalocean_kubernetes_cluster.foobar", "amd_gpu_device_plugin.0.enabled", "true"),
59+
resource.TestCheckResourceAttr("data.digitalocean_kubernetes_cluster.foobar", "amd_gpu_device_metrics_exporter_plugin.0.enabled", "true"),
5860
),
5961
},
6062
},
@@ -94,6 +96,14 @@ resource "digitalocean_kubernetes_cluster" "foo" {
9496
routing_agent {
9597
enabled = true
9698
}
99+
100+
amd_gpu_device_plugin {
101+
enabled = true
102+
}
103+
104+
amd_gpu_device_metrics_exporter_plugin {
105+
enabled = true
106+
}
97107
}`, version, rName)
98108
}
99109

digitalocean/kubernetes/kubernetes.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,62 @@ func flattenRoutingAgentOpts(opts *godo.KubernetesRoutingAgent) []map[string]int
289289
return result
290290
}
291291

292+
func expandAmdGpuDevicePluginOpts(raw []interface{}) *godo.KubernetesAmdGpuDevicePlugin {
293+
if len(raw) == 0 || raw[0] == nil {
294+
return &godo.KubernetesAmdGpuDevicePlugin{}
295+
}
296+
297+
amdGpuDevicePluginObj := raw[0].(map[string]interface{})
298+
299+
amdGpuDevicePlugin := &godo.KubernetesAmdGpuDevicePlugin{
300+
Enabled: godo.PtrTo(amdGpuDevicePluginObj["enabled"].(bool)),
301+
}
302+
303+
return amdGpuDevicePlugin
304+
}
305+
306+
func flattenAmdGpuDevicePluginOpts(opts *godo.KubernetesAmdGpuDevicePlugin) []map[string]interface{} {
307+
result := make([]map[string]interface{}, 0)
308+
if opts == nil {
309+
return result
310+
}
311+
312+
item := make(map[string]interface{})
313+
item["enabled"] = opts.Enabled
314+
315+
result = append(result, item)
316+
317+
return result
318+
}
319+
320+
func expandAmdGpuDeviceMetricsExporterPluginOpts(raw []interface{}) *godo.KubernetesAmdGpuDeviceMetricsExporterPlugin {
321+
if len(raw) == 0 || raw[0] == nil {
322+
return &godo.KubernetesAmdGpuDeviceMetricsExporterPlugin{}
323+
}
324+
325+
amdGpuDeviceMetricsExporterPluginObj := raw[0].(map[string]interface{})
326+
327+
amdGpuDeviceMetricsExporterPlugin := &godo.KubernetesAmdGpuDeviceMetricsExporterPlugin{
328+
Enabled: godo.PtrTo(amdGpuDeviceMetricsExporterPluginObj["enabled"].(bool)),
329+
}
330+
331+
return amdGpuDeviceMetricsExporterPlugin
332+
}
333+
334+
func flattenAmdGpuDeviceMetricsExporterPluginOpts(opts *godo.KubernetesAmdGpuDeviceMetricsExporterPlugin) []map[string]interface{} {
335+
result := make([]map[string]interface{}, 0)
336+
if opts == nil {
337+
return result
338+
}
339+
340+
item := make(map[string]interface{})
341+
item["enabled"] = opts.Enabled
342+
343+
result = append(result, item)
344+
345+
return result
346+
}
347+
292348
func flattenMaintPolicyOpts(opts *godo.KubernetesMaintenancePolicy) []map[string]interface{} {
293349
result := make([]map[string]interface{}, 0)
294350
item := make(map[string]interface{})

digitalocean/kubernetes/resource_kubernetes_cluster.go

Lines changed: 60 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ var (
2424
)
2525

2626
const (
27-
controlPlaneFirewallField = "control_plane_firewall"
28-
routingAgentField = "routing_agent"
27+
controlPlaneFirewallField = "control_plane_firewall"
28+
routingAgentField = "routing_agent"
29+
amdGpuDevicePluginField = "amd_gpu_device_plugin"
30+
amdGpuDeviceMetricsExporterPlugin = "amd_gpu_device_metrics_exporter_plugin"
2931
)
3032

3133
func ResourceDigitalOceanKubernetesCluster() *schema.Resource {
@@ -263,6 +265,35 @@ func ResourceDigitalOceanKubernetesCluster() *schema.Resource {
263265
},
264266
},
265267
},
268+
amdGpuDevicePluginField: {
269+
Type: schema.TypeList,
270+
Optional: true,
271+
Computed: true,
272+
MaxItems: 1,
273+
Elem: &schema.Resource{
274+
Schema: map[string]*schema.Schema{
275+
"enabled": {
276+
Type: schema.TypeBool,
277+
Required: true,
278+
},
279+
},
280+
},
281+
},
282+
283+
amdGpuDeviceMetricsExporterPlugin: {
284+
Type: schema.TypeList,
285+
Optional: true,
286+
Computed: true,
287+
MaxItems: 1,
288+
Elem: &schema.Resource{
289+
Schema: map[string]*schema.Schema{
290+
"enabled": {
291+
Type: schema.TypeBool,
292+
Required: true,
293+
},
294+
},
295+
},
296+
},
266297
},
267298

268299
Timeouts: &schema.ResourceTimeout{
@@ -404,6 +435,14 @@ func resourceDigitalOceanKubernetesClusterCreate(ctx context.Context, d *schema.
404435
opts.RoutingAgent = expandRoutingAgentOpts(routingAgent.([]interface{}))
405436
}
406437

438+
if amdGpuDevicePlugin, ok := d.GetOk(amdGpuDevicePluginField); ok {
439+
opts.AmdGpuDevicePlugin = expandAmdGpuDevicePluginOpts(amdGpuDevicePlugin.([]interface{}))
440+
}
441+
442+
if amdGpuDeviceMetricsExporterPlugin, ok := d.GetOk(amdGpuDeviceMetricsExporterPlugin); ok {
443+
opts.AmdGpuDeviceMetricsExporterPlugin = expandAmdGpuDeviceMetricsExporterPluginOpts(amdGpuDeviceMetricsExporterPlugin.([]interface{}))
444+
}
445+
407446
cluster, _, err := client.Kubernetes.Create(context.Background(), opts)
408447
if err != nil {
409448
return diag.Errorf("Error creating Kubernetes cluster: %s", err)
@@ -475,6 +514,14 @@ func digitaloceanKubernetesClusterRead(
475514
return diag.Errorf("[DEBUG] Error setting %s - error: %#v", routingAgentField, err)
476515
}
477516

517+
if err := d.Set(amdGpuDevicePluginField, flattenAmdGpuDevicePluginOpts(cluster.AmdGpuDevicePlugin)); err != nil {
518+
return diag.Errorf("[DEBUG] Error setting %s - error: %#v", amdGpuDevicePluginField, err)
519+
}
520+
521+
if err := d.Set(amdGpuDeviceMetricsExporterPlugin, flattenAmdGpuDeviceMetricsExporterPluginOpts(cluster.AmdGpuDeviceMetricsExporterPlugin)); err != nil {
522+
return diag.Errorf("[DEBUG] Error setting %s - error: %#v", amdGpuDeviceMetricsExporterPlugin, err)
523+
}
524+
478525
if err := d.Set("maintenance_policy", flattenMaintPolicyOpts(cluster.MaintenancePolicy)); err != nil {
479526
return diag.Errorf("[DEBUG] Error setting maintenance_policy - error: %#v", err)
480527
}
@@ -537,17 +584,19 @@ func resourceDigitalOceanKubernetesClusterUpdate(ctx context.Context, d *schema.
537584
client := meta.(*config.CombinedConfig).GodoClient()
538585

539586
// Figure out the changes and then call the appropriate API methods
540-
if d.HasChanges("name", "tags", "auto_upgrade", "surge_upgrade", "maintenance_policy", "ha", controlPlaneFirewallField, "cluster_autoscaler_configuration", routingAgentField) {
587+
if d.HasChanges("name", "tags", "auto_upgrade", "surge_upgrade", "maintenance_policy", "ha", controlPlaneFirewallField, "cluster_autoscaler_configuration", routingAgentField, amdGpuDevicePluginField, amdGpuDeviceMetricsExporterPlugin) {
541588

542589
opts := &godo.KubernetesClusterUpdateRequest{
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.GetChange("cluster_autoscaler_configuration")),
590+
Name: d.Get("name").(string),
591+
Tags: tag.ExpandTags(d.Get("tags").(*schema.Set).List()),
592+
AutoUpgrade: godo.PtrTo(d.Get("auto_upgrade").(bool)),
593+
SurgeUpgrade: d.Get("surge_upgrade").(bool),
594+
HA: godo.PtrTo(d.Get("ha").(bool)),
595+
ControlPlaneFirewall: expandControlPlaneFirewallOpts(d.Get(controlPlaneFirewallField).([]interface{})),
596+
RoutingAgent: expandRoutingAgentOpts(d.Get(routingAgentField).([]interface{})),
597+
AmdGpuDevicePlugin: expandAmdGpuDevicePluginOpts(d.Get(amdGpuDevicePluginField).([]interface{})),
598+
AmdGpuDeviceMetricsExporterPlugin: expandAmdGpuDeviceMetricsExporterPluginOpts(d.Get(amdGpuDeviceMetricsExporterPlugin).([]interface{})),
599+
ClusterAutoscalerConfiguration: expandCAConfigOptsForUpdate(d.GetChange("cluster_autoscaler_configuration")),
551600
}
552601

553602
if maint, ok := d.GetOk("maintenance_policy"); ok {

digitalocean/kubernetes/resource_kubernetes_cluster_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ func TestAccDigitalOceanKubernetesCluster_Basic(t *testing.T) {
9797
resource.TestCheckResourceAttrSet("digitalocean_kubernetes_cluster.foobar", "cluster_autoscaler_configuration.0.scale_down_utilization_threshold"),
9898
resource.TestCheckResourceAttrSet("digitalocean_kubernetes_cluster.foobar", "cluster_autoscaler_configuration.0.scale_down_unneeded_time"),
9999
resource.TestCheckResourceAttr("digitalocean_kubernetes_cluster.foobar", "routing_agent.0.enabled", "false"),
100+
resource.TestCheckResourceAttr("digitalocean_kubernetes_cluster.foobar", "amd_gpu_device_plugin.0.enabled", "false"),
101+
resource.TestCheckResourceAttr("digitalocean_kubernetes_cluster.foobar", "amd_gpu_device_metrics_exporter_plugin.0.enabled", "false"),
100102
),
101103
},
102104
// Update: remove default node_pool taints
@@ -933,6 +935,46 @@ func TestAccDigitalOceanKubernetesCluster_RoutingAgentEnabled(t *testing.T) {
933935
})
934936
}
935937

938+
func TestAccDigitalOceanKubernetesCluster_AmdGpuDevicePluginEnabled(t *testing.T) {
939+
rName := acceptance.RandomTestName()
940+
var k8s godo.KubernetesCluster
941+
942+
resource.ParallelTest(t, resource.TestCase{
943+
PreCheck: func() { acceptance.TestAccPreCheck(t) },
944+
ProviderFactories: acceptance.TestAccProviderFactories,
945+
CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy,
946+
Steps: []resource.TestStep{
947+
{
948+
Config: testAccDigitalOceanKubernetesConfigAmdGpuDevicePluginEnabled(testClusterVersionPrevious, rName),
949+
Check: resource.ComposeAggregateTestCheckFunc(
950+
testAccCheckDigitalOceanKubernetesClusterExists("digitalocean_kubernetes_cluster.foobar", &k8s),
951+
resource.TestCheckResourceAttr("digitalocean_kubernetes_cluster.foobar", "amd_gpu_device_plugin.0.enabled", "true"),
952+
),
953+
},
954+
},
955+
})
956+
}
957+
958+
func TestAccDigitalOceanKubernetesCluster_AmdGpuDeviceMetricsExporterPluginEnabled(t *testing.T) {
959+
rName := acceptance.RandomTestName()
960+
var k8s godo.KubernetesCluster
961+
962+
resource.ParallelTest(t, resource.TestCase{
963+
PreCheck: func() { acceptance.TestAccPreCheck(t) },
964+
ProviderFactories: acceptance.TestAccProviderFactories,
965+
CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy,
966+
Steps: []resource.TestStep{
967+
{
968+
Config: testAccDigitalOceanKubernetesConfigAmdGpuDeviceMetricsExporterPluginEnabled(testClusterVersionPrevious, rName),
969+
Check: resource.ComposeAggregateTestCheckFunc(
970+
testAccCheckDigitalOceanKubernetesClusterExists("digitalocean_kubernetes_cluster.foobar", &k8s),
971+
resource.TestCheckResourceAttr("digitalocean_kubernetes_cluster.foobar", "amd_gpu_device_metrics_exporter_plugin.0.enabled", "true"),
972+
),
973+
},
974+
},
975+
})
976+
}
977+
936978
func testAccDigitalOceanKubernetesConfigBasic(testClusterVersion string, rName string) string {
937979
return fmt.Sprintf(`%s
938980
@@ -1230,6 +1272,44 @@ resource "digitalocean_kubernetes_cluster" "foobar" {
12301272
`, testClusterVersion, rName)
12311273
}
12321274

1275+
func testAccDigitalOceanKubernetesConfigAmdGpuDevicePluginEnabled(testClusterVersion string, rName string) string {
1276+
return fmt.Sprintf(`%s
1277+
1278+
resource "digitalocean_kubernetes_cluster" "foobar" {
1279+
name = "%s"
1280+
region = "nyc1"
1281+
version = data.digitalocean_kubernetes_versions.test.latest_version
1282+
amd_gpu_device_plugin {
1283+
enabled = true
1284+
}
1285+
node_pool {
1286+
name = "default"
1287+
size = "s-1vcpu-2gb"
1288+
node_count = 1
1289+
}
1290+
}
1291+
`, testClusterVersion, rName)
1292+
}
1293+
1294+
func testAccDigitalOceanKubernetesConfigAmdGpuDeviceMetricsExporterPluginEnabled(testClusterVersion string, rName string) string {
1295+
return fmt.Sprintf(`%s
1296+
1297+
resource "digitalocean_kubernetes_cluster" "foobar" {
1298+
name = "%s"
1299+
region = "nyc1"
1300+
version = data.digitalocean_kubernetes_versions.test.latest_version
1301+
amd_gpu_device_metrics_exporter_plugin {
1302+
enabled = true
1303+
}
1304+
node_pool {
1305+
name = "default"
1306+
size = "s-1vcpu-2gb"
1307+
node_count = 1
1308+
}
1309+
}
1310+
`, testClusterVersion, rName)
1311+
}
1312+
12331313
func testAccCheckDigitalOceanKubernetesClusterExists(n string, cluster *godo.KubernetesCluster) resource.TestCheckFunc {
12341314
return func(s *terraform.State) error {
12351315
rs, ok := s.RootModule().Resources[n]

docs/resources/kubernetes_cluster.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,10 @@ The following arguments are supported:
175175
* `kubeconfig_expire_seconds` - (Optional) The duration in seconds that the returned Kubernetes credentials will be valid. If not set or 0, the credentials will have a 7 day expiry.
176176
* `routing_agent` - (Optional) Block containing options for the routing-agent component. If not specified, the routing-agent component will not be installed in the cluster.
177177
- `enabled` - (Required) Boolean flag whether the routing-agent should be enabled or not.
178+
* `amd_gpu_device_plugin` - (Optional) Block containing options for the AMD GPU device plugin component. If not specified, the component will be enabled by default for clusters with AMD GPU nodes.
179+
- `enabled` - (Required) Boolean flag whether the component should be enabled or not.
180+
`amd_gpu_device_metrics_exporter_plugin` - (Optional) Block containing options for the AMD GPU device metrics exporter component. If not specified, the component will not be installed in the cluster.
181+
- `enabled` - (Required) Boolean flag whether the component should be enabled or not.
178182
* `cluster_autoscaler_configuration` - (Optional) Block containing options for cluster auto-scaling.
179183
- `scale_down_utilization_threshold` - (Optional) Float setting the Node utilization level, defined as sum of requested resources divided by capacity, in which a node can be considered for scale down.
180184
- `scale_down_unneeded_time` - (Optional) String setting how long a node should be unneeded before it's eligible for scale down.
@@ -221,6 +225,10 @@ In addition to the arguments listed above, the following additional attributes a
221225
- `start_time` The hour in UTC when maintenance updates will be applied, in 24 hour format (e.g. “16:00”).
222226
* `routing_agent` - Block containing options for the routing-agent component.
223227
- `enabled` - Boolean flag whether the routing-agent is enabled or not.
228+
* `amd_gpu_device_plugin` - Block containing options for the AMD GPU device plugin component. If not specified, the component will be enabled by default for clusters with AMD GPU nodes.
229+
- `enabled` - Boolean flag whether the component is enabled or not.
230+
* `amd_gpu_device_metrics_exporter_plugin` - Block containing options for the AMD GPU device metrics exporter component.
231+
- `enabled` - Boolean flag whether the component is enabled or not.
224232

225233
## Import
226234

0 commit comments

Comments
 (0)