From 685f277e332ec3038ebc6091b12b8b1113898064 Mon Sep 17 00:00:00 2001 From: Zhenhua Hu Date: Mon, 18 Sep 2023 22:13:16 +0800 Subject: [PATCH] `azurerm_network_interface` - Support `auxiliary_mode`, `auxiliary_sku` (#22979) * add code * resolve comments 0817 * resolve comments 0818 * resolve comments 0906 * resolve comments 0914 --- .../network/network_interface_resource.go | 51 +++++++++++ .../network_interface_resource_test.go | 84 +++++++++++++++++++ .../docs/r/network_interface.html.markdown | 8 ++ 3 files changed, 143 insertions(+) diff --git a/internal/services/network/network_interface_resource.go b/internal/services/network/network_interface_resource.go index 51ee2b8925d2..4e1d0d22db4e 100644 --- a/internal/services/network/network_interface_resource.go +++ b/internal/services/network/network_interface_resource.go @@ -126,6 +126,20 @@ func resourceNetworkInterface() *pluginsdk.Resource { }, // Optional + "auxiliary_mode": { + Type: pluginsdk.TypeString, + Optional: true, + ValidateFunc: validation.StringInSlice(networkinterfaces.PossibleValuesForNetworkInterfaceAuxiliaryMode(), false), + RequiredWith: []string{"auxiliary_sku"}, + }, + + "auxiliary_sku": { + Type: pluginsdk.TypeString, + Optional: true, + ValidateFunc: validation.StringInSlice(networkinterfaces.PossibleValuesForNetworkInterfaceAuxiliarySku(), false), + RequiredWith: []string{"auxiliary_mode"}, + }, + "dns_servers": { Type: pluginsdk.TypeList, Optional: true, @@ -232,6 +246,14 @@ func resourceNetworkInterfaceCreate(d *pluginsdk.ResourceData, meta interface{}) locks.ByName(id.NetworkInterfaceName, networkInterfaceResourceName) defer locks.UnlockByName(id.NetworkInterfaceName, networkInterfaceResourceName) + if auxiliaryMode, hasAuxiliaryMode := d.GetOk("auxiliary_mode"); hasAuxiliaryMode { + properties.AuxiliaryMode = pointer.To(networkinterfaces.NetworkInterfaceAuxiliaryMode(auxiliaryMode.(string))) + } + + if auxiliarySku, hasAuxiliarySku := d.GetOk("auxiliary_sku"); hasAuxiliarySku { + properties.AuxiliarySku = pointer.To(networkinterfaces.NetworkInterfaceAuxiliarySku(auxiliarySku.(string))) + } + dns, hasDns := d.GetOk("dns_servers") nameLabel, hasNameLabel := d.GetOk("internal_dns_name_label") if hasDns || hasNameLabel { @@ -325,6 +347,22 @@ func resourceNetworkInterfaceUpdate(d *pluginsdk.ResourceData, meta interface{}) }, } + if d.HasChange("auxiliary_mode") { + if auxiliaryMode, hasAuxiliaryMode := d.GetOk("auxiliary_mode"); hasAuxiliaryMode { + update.Properties.AuxiliaryMode = pointer.To(networkinterfaces.NetworkInterfaceAuxiliaryMode(auxiliaryMode.(string))) + } + } else { + update.Properties.AuxiliaryMode = existing.Model.Properties.AuxiliaryMode + } + + if d.HasChange("auxiliary_sku") { + if auxiliarySku, hasAuxiliarySku := d.GetOk("auxiliary_sku"); hasAuxiliarySku { + update.Properties.AuxiliarySku = pointer.To(networkinterfaces.NetworkInterfaceAuxiliarySku(auxiliarySku.(string))) + } + } else { + update.Properties.AuxiliarySku = existing.Model.Properties.AuxiliarySku + } + if d.HasChange("dns_servers") { dnsServersRaw := d.Get("dns_servers").([]interface{}) dnsServers := expandNetworkInterfaceDnsServers(dnsServersRaw) @@ -462,6 +500,19 @@ func resourceNetworkInterfaceRead(d *pluginsdk.ResourceData, meta interface{}) e return fmt.Errorf("setting `applied_dns_servers`: %+v", err) } + auxiliaryMode := "" + if props.AuxiliaryMode != nil && *props.AuxiliaryMode != networkinterfaces.NetworkInterfaceAuxiliaryModeNone { + auxiliaryMode = string(*props.AuxiliaryMode) + } + + d.Set("auxiliary_mode", auxiliaryMode) + + auxiliarySku := "" + if props.AuxiliarySku != nil && *props.AuxiliarySku != networkinterfaces.NetworkInterfaceAuxiliarySkuNone { + auxiliarySku = string(*props.AuxiliarySku) + } + + d.Set("auxiliary_sku", auxiliarySku) d.Set("enable_ip_forwarding", props.EnableIPForwarding) d.Set("enable_accelerated_networking", props.EnableAcceleratedNetworking) d.Set("internal_dns_name_label", internalDnsNameLabel) diff --git a/internal/services/network/network_interface_resource_test.go b/internal/services/network/network_interface_resource_test.go index d4b9b3dc1ba5..510abc6e25e3 100644 --- a/internal/services/network/network_interface_resource_test.go +++ b/internal/services/network/network_interface_resource_test.go @@ -44,6 +44,34 @@ func TestAccNetworkInterface_disappears(t *testing.T) { }) } +func TestAccNetworkInterface_auxiliary(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_network_interface", "test") + r := NetworkInterfaceResource{} + data.ResourceTest(t, r, []acceptance.TestStep{ + { + Config: r.auxiliaryNone(data), + Check: acceptance.ComposeTestCheckFunc( + check.That(data.ResourceName).ExistsInAzure(r), + ), + }, + data.ImportStep(), + { + Config: r.auxiliaryAcceleratedConnections(data), + Check: acceptance.ComposeTestCheckFunc( + check.That(data.ResourceName).ExistsInAzure(r), + ), + }, + data.ImportStep(), + { + Config: r.auxiliaryNone(data), + Check: acceptance.ComposeTestCheckFunc( + check.That(data.ResourceName).ExistsInAzure(r), + ), + }, + data.ImportStep(), + }) +} + func TestAccNetworkInterface_dnsServers(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_network_interface", "test") r := NetworkInterfaceResource{} @@ -388,6 +416,62 @@ resource "azurerm_network_interface" "test" { `, r.template(data), data.RandomInteger) } +func (r NetworkInterfaceResource) auxiliaryNone(data acceptance.TestData) string { + // Auxiliary Mode Nic is enabled in specific regions (https://learn.microsoft.com/en-us/azure/networking/nva-accelerated-connections#supported-regions) for now + // To not affect other testcases of `Network`, hard-code to that for now + data.Locations.Primary = "westus" + + return fmt.Sprintf(` +%s + +resource "azurerm_network_interface" "test" { + name = "acctestni-%d" + location = "%s" + resource_group_name = azurerm_resource_group.test.name + enable_accelerated_networking = true + + ip_configuration { + name = "primary" + subnet_id = azurerm_subnet.test.id + private_ip_address_allocation = "Dynamic" + } + + tags = { + fastpathenabled = "true" + } +} +`, r.template(data), data.RandomInteger, data.Locations.Primary) +} + +func (r NetworkInterfaceResource) auxiliaryAcceleratedConnections(data acceptance.TestData) string { + // Auxiliary Mode Nic is enabled in specific regions (https://learn.microsoft.com/en-us/azure/networking/nva-accelerated-connections#supported-regions) for now + // To not affect other testcases of `Network`, hard-code to that for now + data.Locations.Primary = "westus" + + return fmt.Sprintf(` +%s + +resource "azurerm_network_interface" "test" { + name = "acctestni-%d" + location = "%s" + resource_group_name = azurerm_resource_group.test.name + auxiliary_mode = "AcceleratedConnections" + auxiliary_sku = "A2" + enable_accelerated_networking = true + + ip_configuration { + name = "primary" + subnet_id = azurerm_subnet.test.id + private_ip_address_allocation = "Dynamic" + } + + tags = { + fastpathenabled = "true" + } +} +`, r.template(data), data.RandomInteger, data.Locations.Primary) +} + func (r NetworkInterfaceResource) withMultipleParameters(data acceptance.TestData) string { return fmt.Sprintf(` %s diff --git a/website/docs/r/network_interface.html.markdown b/website/docs/r/network_interface.html.markdown index f5387f3f578b..a99bf6e523c0 100644 --- a/website/docs/r/network_interface.html.markdown +++ b/website/docs/r/network_interface.html.markdown @@ -60,6 +60,14 @@ The following arguments are supported: --- +* `auxiliary_mode` - (Optional) Specifies the auxiliary mode used to enable network high-performance feature on Network Virtual Appliances (NVAs). This feature offers competitive performance in Connections Per Second (CPS) optimization, along with improvements to handling large amounts of simultaneous connections. Possible values are `AcceleratedConnections` and `Floating`. + +-> **Note:** `auxiliary_mode` is in **Preview** and requires that the preview is enabled - [more information can be found in the Azure documentation](https://learn.microsoft.com/azure/networking/nva-accelerated-connections#prerequisites). + +* `auxiliary_sku` - (Optional) Specifies the SKU used for the network high-performance feature on Network Virtual Appliances (NVAs). Possible values are `A1`, `A2`, `A4` and `A8`. + +-> **Note:** `auxiliary_sku` is in **Preview** and requires that the preview is enabled - [more information can be found in the Azure documentation](https://learn.microsoft.com/azure/networking/nva-accelerated-connections#prerequisites). + * `dns_servers` - (Optional) A list of IP Addresses defining the DNS Servers which should be used for this Network Interface. -> **Note:** Configuring DNS Servers on the Network Interface will override the DNS Servers defined on the Virtual Network.