diff --git a/internal/services/containers/kubernetes_cluster_other_resource_test.go b/internal/services/containers/kubernetes_cluster_other_resource_test.go index 4d8c35ae5ee1..4121fc81efb2 100644 --- a/internal/services/containers/kubernetes_cluster_other_resource_test.go +++ b/internal/services/containers/kubernetes_cluster_other_resource_test.go @@ -1174,6 +1174,35 @@ func TestAccKubernetesCluster_customCaTrustCerts(t *testing.T) { }) } +func TestAccKubernetesCluster_aiToolchainOperatorProfileToggle(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_kubernetes_cluster", "test") + r := KubernetesClusterResource{} + + data.ResourceTest(t, r, []acceptance.TestStep{ + { + Config: r.aiToolchainOperatorProfile(data, true), + Check: acceptance.ComposeTestCheckFunc( + check.That(data.ResourceName).ExistsInAzure(r), + ), + }, + data.ImportStep(), + { + Config: r.aiToolchainOperatorProfile(data, false), + Check: acceptance.ComposeTestCheckFunc( + check.That(data.ResourceName).ExistsInAzure(r), + ), + }, + data.ImportStep(), + { + Config: r.aiToolchainOperatorProfile(data, true), + Check: acceptance.ComposeTestCheckFunc( + check.That(data.ResourceName).ExistsInAzure(r), + ), + }, + data.ImportStep(), + }) +} + func (KubernetesClusterResource) sameSize(data acceptance.TestData) string { return fmt.Sprintf(` provider "azurerm" { @@ -3576,3 +3605,39 @@ resource "azurerm_kubernetes_cluster" "test" { } `, data.Locations.Primary, data.RandomInteger, certsString) } + +func (KubernetesClusterResource) aiToolchainOperatorProfile(data acceptance.TestData, enabled bool) string { + return fmt.Sprintf(` +provider "azurerm" { + features {} +} + +resource "azurerm_resource_group" "test" { + name = "acctestRG-aks-%[1]d" + location = "%[2]s" +} + +resource "azurerm_kubernetes_cluster" "test" { + name = "acctestaks%[1]d" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + dns_prefix = "acctestaks%[1]d" + kubernetes_version = "1.32.4" + + ai_toolchain_operator_enabled = %[3]t + + default_node_pool { + name = "default" + node_count = 1 + vm_size = "Standard_DS2_v2" + upgrade_settings { + max_surge = "10%%" + } + } + + identity { + type = "SystemAssigned" + } +} + `, data.RandomInteger, data.Locations.Primary, enabled) +} diff --git a/internal/services/containers/kubernetes_cluster_resource.go b/internal/services/containers/kubernetes_cluster_resource.go index ac8a71e6cae7..58f460f298aa 100644 --- a/internal/services/containers/kubernetes_cluster_resource.go +++ b/internal/services/containers/kubernetes_cluster_resource.go @@ -1642,6 +1642,12 @@ func resourceKubernetesCluster() *pluginsdk.Resource { }, }, + "ai_toolchain_operator_enabled": { + Type: pluginsdk.TypeBool, + Optional: true, + Default: false, + }, + "workload_identity_enabled": { Type: pluginsdk.TypeBool, Optional: true, @@ -1890,6 +1896,12 @@ func resourceKubernetesClusterCreate(d *pluginsdk.ResourceData, meta interface{} }, Tags: tags.Expand(t), } + + if d.Get("ai_toolchain_operator_enabled").(bool) { + parameters.Properties.AiToolchainOperatorProfile = &managedclusters.ManagedClusterAIToolchainOperatorProfile{ + Enabled: pointer.To(true), + } + } managedClusterIdentityRaw := d.Get("identity").([]interface{}) kubernetesClusterIdentityRaw := d.Get("kubelet_identity").([]interface{}) servicePrincipalProfileRaw := d.Get("service_principal").([]interface{}) @@ -2435,6 +2447,13 @@ func resourceKubernetesClusterUpdate(d *pluginsdk.ResourceData, meta interface{} } } + if d.HasChange("ai_toolchain_operator_enabled") { + updateCluster = true + existing.Model.Properties.AiToolchainOperatorProfile = &managedclusters.ManagedClusterAIToolchainOperatorProfile{ + Enabled: pointer.To(d.Get("ai_toolchain_operator_enabled").(bool)), + } + } + if d.HasChanges("workload_identity_enabled") { updateCluster = true workloadIdentity := d.Get("workload_identity_enabled").(bool) @@ -2956,6 +2975,12 @@ func resourceKubernetesClusterRead(d *pluginsdk.ResourceData, meta interface{}) return fmt.Errorf("setting `workload_autoscaler_profile`: %+v", err) } + aiToolchainOperatorEnabled := false + if props.AiToolchainOperatorProfile != nil { + aiToolchainOperatorEnabled = pointer.From(props.AiToolchainOperatorProfile.Enabled) + } + d.Set("ai_toolchain_operator_enabled", aiToolchainOperatorEnabled) + if props.SecurityProfile != nil && props.SecurityProfile.ImageCleaner != nil { if props.SecurityProfile.ImageCleaner.Enabled != nil { d.Set("image_cleaner_enabled", props.SecurityProfile.ImageCleaner.Enabled) diff --git a/website/docs/r/kubernetes_cluster.html.markdown b/website/docs/r/kubernetes_cluster.html.markdown index 53fd04f4a9f1..67d129f0ba62 100644 --- a/website/docs/r/kubernetes_cluster.html.markdown +++ b/website/docs/r/kubernetes_cluster.html.markdown @@ -227,6 +227,8 @@ resource "azurerm_kubernetes_cluster" "example" { * `workload_autoscaler_profile` - (Optional) A `workload_autoscaler_profile` block defined below. +* `ai_toolchain_operator_enabled` - (Optional) Specifies whether the AI Toolchain Operator should be enabled for the Cluster. Defaults to `false`. + * `workload_identity_enabled` - (Optional) Specifies whether Azure AD Workload Identity should be enabled for the Cluster. Defaults to `false`. -> **Note:** To enable Azure AD Workload Identity `oidc_issuer_enabled` must be set to `true`.