package azurerm import ( "fmt" "os" "testing" "github.com/Azure/azure-sdk-for-go/arm/network" "github.com/hashicorp/terraform/helper/acctest" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" ) func TestAccAzureRMLoadBalancerNatPool_basic(t *testing.T) { var lb network.LoadBalancer ri := acctest.RandInt() natPoolName := fmt.Sprintf("NatPool-%d", ri) subscriptionID := os.Getenv("ARM_SUBSCRIPTION_ID") natPool_id := fmt.Sprintf( "/subscriptions/%s/resourceGroups/acctestrg-%d/providers/Microsoft.Network/loadBalancers/arm-test-loadbalancer-%d/inboundNatPools/%s", subscriptionID, ri, ri, natPoolName) resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testCheckAzureRMLoadBalancerDestroy, Steps: []resource.TestStep{ { Config: testAccAzureRMLoadBalancerNatPool_basic(ri, natPoolName), Check: resource.ComposeTestCheckFunc( testCheckAzureRMLoadBalancerExists("azurerm_lb.test", &lb), testCheckAzureRMLoadBalancerNatPoolExists(natPoolName, &lb), resource.TestCheckResourceAttr( "azurerm_lb_nat_pool.test", "id", natPool_id), ), }, }, }) } func TestAccAzureRMLoadBalancerNatPool_removal(t *testing.T) { var lb network.LoadBalancer ri := acctest.RandInt() natPoolName := fmt.Sprintf("NatPool-%d", ri) resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testCheckAzureRMLoadBalancerDestroy, Steps: []resource.TestStep{ { Config: testAccAzureRMLoadBalancerNatPool_basic(ri, natPoolName), Check: resource.ComposeTestCheckFunc( testCheckAzureRMLoadBalancerExists("azurerm_lb.test", &lb), testCheckAzureRMLoadBalancerNatPoolExists(natPoolName, &lb), ), }, { Config: testAccAzureRMLoadBalancerNatPool_removal(ri), Check: resource.ComposeTestCheckFunc( testCheckAzureRMLoadBalancerExists("azurerm_lb.test", &lb), testCheckAzureRMLoadBalancerNatPoolNotExists(natPoolName, &lb), ), }, }, }) } func TestAccAzureRMLoadBalancerNatPool_update(t *testing.T) { var lb network.LoadBalancer ri := acctest.RandInt() natPoolName := fmt.Sprintf("NatPool-%d", ri) natPool2Name := fmt.Sprintf("NatPool-%d", acctest.RandInt()) resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testCheckAzureRMLoadBalancerDestroy, Steps: []resource.TestStep{ { Config: testAccAzureRMLoadBalancerNatPool_multiplePools(ri, natPoolName, natPool2Name), Check: resource.ComposeTestCheckFunc( testCheckAzureRMLoadBalancerExists("azurerm_lb.test", &lb), testCheckAzureRMLoadBalancerNatPoolExists(natPoolName, &lb), testCheckAzureRMLoadBalancerNatPoolExists(natPool2Name, &lb), resource.TestCheckResourceAttr("azurerm_lb_nat_pool.test2", "backend_port", "3390"), ), }, { Config: testAccAzureRMLoadBalancerNatPool_multiplePoolsUpdate(ri, natPoolName, natPool2Name), Check: resource.ComposeTestCheckFunc( testCheckAzureRMLoadBalancerExists("azurerm_lb.test", &lb), testCheckAzureRMLoadBalancerNatPoolExists(natPoolName, &lb), testCheckAzureRMLoadBalancerNatPoolExists(natPool2Name, &lb), resource.TestCheckResourceAttr("azurerm_lb_nat_pool.test2", "backend_port", "3391"), ), }, }, }) } func TestAccAzureRMLoadBalancerNatPool_reapply(t *testing.T) { var lb network.LoadBalancer ri := acctest.RandInt() natPoolName := fmt.Sprintf("NatPool-%d", ri) deleteNatPoolState := func(s *terraform.State) error { return s.Remove("azurerm_lb_nat_pool.test") } resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testCheckAzureRMLoadBalancerDestroy, Steps: []resource.TestStep{ { Config: testAccAzureRMLoadBalancerNatPool_basic(ri, natPoolName), Check: resource.ComposeTestCheckFunc( testCheckAzureRMLoadBalancerExists("azurerm_lb.test", &lb), testCheckAzureRMLoadBalancerNatPoolExists(natPoolName, &lb), deleteNatPoolState, ), ExpectNonEmptyPlan: true, }, { Config: testAccAzureRMLoadBalancerNatPool_basic(ri, natPoolName), Check: resource.ComposeTestCheckFunc( testCheckAzureRMLoadBalancerExists("azurerm_lb.test", &lb), testCheckAzureRMLoadBalancerNatPoolExists(natPoolName, &lb), ), }, }, }) } func TestAccAzureRMLoadBalancerNatPool_disappears(t *testing.T) { var lb network.LoadBalancer ri := acctest.RandInt() natPoolName := fmt.Sprintf("NatPool-%d", ri) resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testCheckAzureRMLoadBalancerDestroy, Steps: []resource.TestStep{ { Config: testAccAzureRMLoadBalancerNatPool_basic(ri, natPoolName), Check: resource.ComposeTestCheckFunc( testCheckAzureRMLoadBalancerExists("azurerm_lb.test", &lb), testCheckAzureRMLoadBalancerNatPoolExists(natPoolName, &lb), testCheckAzureRMLoadBalancerNatPoolDisappears(natPoolName, &lb), ), ExpectNonEmptyPlan: true, }, }, }) } func testCheckAzureRMLoadBalancerNatPoolExists(natPoolName string, lb *network.LoadBalancer) resource.TestCheckFunc { return func(s *terraform.State) error { _, _, exists := findLoadBalancerNatPoolByName(lb, natPoolName) if !exists { return fmt.Errorf("A NAT Pool with name %q cannot be found.", natPoolName) } return nil } } func testCheckAzureRMLoadBalancerNatPoolNotExists(natPoolName string, lb *network.LoadBalancer) resource.TestCheckFunc { return func(s *terraform.State) error { _, _, exists := findLoadBalancerNatPoolByName(lb, natPoolName) if exists { return fmt.Errorf("A NAT Pool with name %q has been found.", natPoolName) } return nil } } func testCheckAzureRMLoadBalancerNatPoolDisappears(natPoolName string, lb *network.LoadBalancer) resource.TestCheckFunc { return func(s *terraform.State) error { conn := testAccProvider.Meta().(*ArmClient).loadBalancerClient _, i, exists := findLoadBalancerNatPoolByName(lb, natPoolName) if !exists { return fmt.Errorf("A Nat Pool with name %q cannot be found.", natPoolName) } currentPools := *lb.LoadBalancerPropertiesFormat.InboundNatPools pools := append(currentPools[:i], currentPools[i+1:]...) lb.LoadBalancerPropertiesFormat.InboundNatPools = &pools id, err := parseAzureResourceID(*lb.ID) if err != nil { return err } _, err = conn.CreateOrUpdate(id.ResourceGroup, *lb.Name, *lb, make(chan struct{})) if err != nil { return fmt.Errorf("Error Creating/Updating LoadBalancer %s", err) } _, err = conn.Get(id.ResourceGroup, *lb.Name, "") return err } } func testAccAzureRMLoadBalancerNatPool_basic(rInt int, natPoolName string) string { return fmt.Sprintf(` resource "azurerm_resource_group" "test" { name = "acctestrg-%d" location = "West US" } resource "azurerm_public_ip" "test" { name = "test-ip-%d" location = "West US" resource_group_name = "${azurerm_resource_group.test.name}" public_ip_address_allocation = "static" } resource "azurerm_lb" "test" { name = "arm-test-loadbalancer-%d" location = "West US" resource_group_name = "${azurerm_resource_group.test.name}" frontend_ip_configuration { name = "one-%d" public_ip_address_id = "${azurerm_public_ip.test.id}" } } resource "azurerm_lb_nat_pool" "test" { location = "West US" resource_group_name = "${azurerm_resource_group.test.name}" loadbalancer_id = "${azurerm_lb.test.id}" name = "%s" protocol = "Tcp" frontend_port_start = 80 frontend_port_end = 81 backend_port = 3389 frontend_ip_configuration_name = "one-%d" } `, rInt, rInt, rInt, rInt, natPoolName, rInt) } func testAccAzureRMLoadBalancerNatPool_removal(rInt int) string { return fmt.Sprintf(` resource "azurerm_resource_group" "test" { name = "acctestrg-%d" location = "West US" } resource "azurerm_public_ip" "test" { name = "test-ip-%d" location = "West US" resource_group_name = "${azurerm_resource_group.test.name}" public_ip_address_allocation = "static" } resource "azurerm_lb" "test" { name = "arm-test-loadbalancer-%d" location = "West US" resource_group_name = "${azurerm_resource_group.test.name}" frontend_ip_configuration { name = "one-%d" public_ip_address_id = "${azurerm_public_ip.test.id}" } } `, rInt, rInt, rInt, rInt) } func testAccAzureRMLoadBalancerNatPool_multiplePools(rInt int, natPoolName, natPool2Name string) string { return fmt.Sprintf(` resource "azurerm_resource_group" "test" { name = "acctestrg-%d" location = "West US" } resource "azurerm_public_ip" "test" { name = "test-ip-%d" location = "West US" resource_group_name = "${azurerm_resource_group.test.name}" public_ip_address_allocation = "static" } resource "azurerm_lb" "test" { name = "arm-test-loadbalancer-%d" location = "West US" resource_group_name = "${azurerm_resource_group.test.name}" frontend_ip_configuration { name = "one-%d" public_ip_address_id = "${azurerm_public_ip.test.id}" } } resource "azurerm_lb_nat_pool" "test" { location = "West US" resource_group_name = "${azurerm_resource_group.test.name}" loadbalancer_id = "${azurerm_lb.test.id}" name = "%s" protocol = "Tcp" frontend_port_start = 80 frontend_port_end = 81 backend_port = 3389 frontend_ip_configuration_name = "one-%d" } resource "azurerm_lb_nat_pool" "test2" { location = "West US" resource_group_name = "${azurerm_resource_group.test.name}" loadbalancer_id = "${azurerm_lb.test.id}" name = "%s" protocol = "Tcp" frontend_port_start = 82 frontend_port_end = 83 backend_port = 3390 frontend_ip_configuration_name = "one-%d" } `, rInt, rInt, rInt, rInt, natPoolName, rInt, natPool2Name, rInt) } func testAccAzureRMLoadBalancerNatPool_multiplePoolsUpdate(rInt int, natPoolName, natPool2Name string) string { return fmt.Sprintf(` resource "azurerm_resource_group" "test" { name = "acctestrg-%d" location = "West US" } resource "azurerm_public_ip" "test" { name = "test-ip-%d" location = "West US" resource_group_name = "${azurerm_resource_group.test.name}" public_ip_address_allocation = "static" } resource "azurerm_lb" "test" { name = "arm-test-loadbalancer-%d" location = "West US" resource_group_name = "${azurerm_resource_group.test.name}" frontend_ip_configuration { name = "one-%d" public_ip_address_id = "${azurerm_public_ip.test.id}" } } resource "azurerm_lb_nat_pool" "test" { location = "West US" resource_group_name = "${azurerm_resource_group.test.name}" loadbalancer_id = "${azurerm_lb.test.id}" name = "%s" protocol = "Tcp" frontend_port_start = 80 frontend_port_end = 81 backend_port = 3389 frontend_ip_configuration_name = "one-%d" } resource "azurerm_lb_nat_pool" "test2" { location = "West US" resource_group_name = "${azurerm_resource_group.test.name}" loadbalancer_id = "${azurerm_lb.test.id}" name = "%s" protocol = "Tcp" frontend_port_start = 82 frontend_port_end = 83 backend_port = 3391 frontend_ip_configuration_name = "one-%d" } `, rInt, rInt, rInt, rInt, natPoolName, rInt, natPool2Name, rInt) }