Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

azurerm_kubernetes_cluster - Support in-place update of network_profile.network_policy #26176

Merged
merged 7 commits into from
Jun 10, 2024
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,106 @@ func TestAccKubernetesCluster_advancedNetworkingAzureCiliumPolicyUpdate(t *testi
})
}

func TestAccKubernetesCluster_advancedNetworkingAzureAzurePolicyUpdate(t *testing.T) {
jkroepke marked this conversation as resolved.
Show resolved Hide resolved
data := acceptance.BuildTestData(t, "azurerm_kubernetes_cluster", "test")
r := KubernetesClusterResource{}

data.ResourceTest(t, r, []acceptance.TestStep{
{
Config: r.advancedNetworkingWithOptionalPolicyConfig(data, ""),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
),
},
data.ImportStep(),
{
Config: r.advancedNetworkingWithOptionalPolicyConfig(data, "azure"),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
check.That(data.ResourceName).Key("network_profile.0.network_policy").Exists(),
check.That(data.ResourceName).Key("network_profile.0.network_policy").HasValue("azure"),
),
},
data.ImportStep(),
})
}
jkroepke marked this conversation as resolved.
Show resolved Hide resolved

func TestAccKubernetesCluster_advancedNetworkingAzureCalicoPolicyUpdate(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_kubernetes_cluster", "test")
r := KubernetesClusterResource{}

data.ResourceTest(t, r, []acceptance.TestStep{
{
Config: r.advancedNetworkingWithOptionalPolicyConfig(data, ""),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
),
},
data.ImportStep(),
{
Config: r.advancedNetworkingWithOptionalPolicyConfig(data, "calico"),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
check.That(data.ResourceName).Key("network_profile.0.network_policy").Exists(),
check.That(data.ResourceName).Key("network_profile.0.network_policy").HasValue("calico"),
),
},
})
}
jkroepke marked this conversation as resolved.
Show resolved Hide resolved

func TestAccKubernetesCluster_advancedNetworkingAzureInPlacePolicyUpdate(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_kubernetes_cluster", "test")
r := KubernetesClusterResource{}

data.ResourceTest(t, r, []acceptance.TestStep{
{
Config: r.advancedNetworkingWithOptionalPolicyConfig(data, "calico"),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
check.That(data.ResourceName).Key("network_profile.0.network_policy").Exists(),
check.That(data.ResourceName).Key("network_profile.0.network_policy").HasValue("calico"),
),
},
data.ImportStep(),
{
Config: r.advancedNetworkingWithOptionalPolicyConfig(data, "azure"),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
check.That(data.ResourceName).Key("network_profile.0.network_policy").Exists(),
check.That(data.ResourceName).Key("network_profile.0.network_policy").HasValue("azure"),
),
},
data.ImportStep(),
})
}
jkroepke marked this conversation as resolved.
Show resolved Hide resolved

func TestAccKubernetesCluster_advancedNetworkingAzurePolicyRemove(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_kubernetes_cluster", "test")
r := KubernetesClusterResource{}

data.ResourceTest(t, r, []acceptance.TestStep{
{
Config: r.advancedNetworkingWithOptionalPolicyConfig(data, "calico"),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
check.That(data.ResourceName).Key("network_profile.0.network_policy").Exists(),
check.That(data.ResourceName).Key("network_profile.0.network_policy").HasValue("calico"),
),
},
data.ImportStep(),
{
Config: r.advancedNetworkingWithOptionalPolicyConfig(data, ""),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
check.That(data.ResourceName).Key("network_profile.0.network_policy").Exists(),
// network_policy is a computed value. If omitted, the current value from API is taken.
check.That(data.ResourceName).Key("network_profile.0.network_policy").HasValue("calico"),
),
},
data.ImportStep(),
})
}
jkroepke marked this conversation as resolved.
Show resolved Hide resolved

func TestAccKubernetesCluster_advancedNetworkingAzureCalicoPolicyComplete(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_kubernetes_cluster", "test")
r := KubernetesClusterResource{}
Expand Down Expand Up @@ -1603,6 +1703,63 @@ resource "azurerm_kubernetes_cluster" "test" {
`, data.Locations.Primary, data.RandomInteger)
}

func (KubernetesClusterResource) advancedNetworkingWithOptionalPolicyConfig(data acceptance.TestData, networkPolicy string) string {
if networkPolicy != "" {
networkPolicy = fmt.Sprintf("network_policy = %q", networkPolicy)
}

return fmt.Sprintf(`
provider "azurerm" {
features {}
}

resource "azurerm_resource_group" "test" {
name = "acctestRG-aks-%[2]d"
location = "%[1]s"
}

resource "azurerm_virtual_network" "test" {
name = "acctestvirtnet%[2]d"
address_space = ["10.1.0.0/16"]
location = azurerm_resource_group.test.location
resource_group_name = azurerm_resource_group.test.name
}

resource "azurerm_subnet" "test" {
name = "acctestsubnet%[2]d"
resource_group_name = azurerm_resource_group.test.name
virtual_network_name = azurerm_virtual_network.test.name
address_prefixes = ["10.1.0.0/24"]
}

resource "azurerm_kubernetes_cluster" "test" {
name = "acctestaks%[2]d"
location = azurerm_resource_group.test.location
resource_group_name = azurerm_resource_group.test.name
dns_prefix = "acctestaks%[2]d"

default_node_pool {
name = "default"
node_count = 2
vm_size = "Standard_DS2_v2"
vnet_subnet_id = azurerm_subnet.test.id
upgrade_settings {
max_surge = "10%%"
}
}

identity {
type = "SystemAssigned"
}

network_profile {
network_plugin = "azure"
%[3]s
}
}
`, data.Locations.Primary, data.RandomInteger, networkPolicy)
}

jkroepke marked this conversation as resolved.
Show resolved Hide resolved
func (KubernetesClusterResource) advancedNetworkingWithCiliumPolicyConfig(data acceptance.TestData) string {
return fmt.Sprintf(`
provider "azurerm" {
Expand Down
12 changes: 11 additions & 1 deletion internal/services/containers/kubernetes_cluster_resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,17 @@ func resourceKubernetesCluster() *pluginsdk.Resource {
return !strings.EqualFold(new.(string), string(managedclusters.NetworkPluginModeOverlay))
}),
pluginsdk.ForceNewIfChange("network_profile.0.network_policy", func(ctx context.Context, old, new, meta interface{}) bool {
return old.(string) != "" || new.(string) != string(managedclusters.NetworkPolicyCilium)
// Follow scenarios are not supported as in-place update:
// * Switch from Cilium
// * Switch from network policy to non Cilium network policy
// * Remove network policy property does not uninstall the network policy, forcing new cluster.
//
// Omit network_policy does not uninstall the network policy, since it requires an explicit 'none' value.
// And an uninstallation of network policy engine is not GA yet.
// Once it is GA, an additional logic is needed to handle the uninstallation of network policy.
return old.(string) != string(managedclusters.NetworkPolicyCilium) ||
old.(string) != "" && new.(string) != string(managedclusters.NetworkPolicyCilium) ||
old.(string) != "" && new.(string) == ""
jkroepke marked this conversation as resolved.
Show resolved Hide resolved
}),
pluginsdk.ForceNewIfChange("custom_ca_trust_certificates_base64", func(ctx context.Context, old, new, meta interface{}) bool {
return len(old.([]interface{})) > 0 && len(new.([]interface{})) == 0
Expand Down
Loading