terraform-provider-greenhost/digitalocean/resource_digitalocean_float...

209 lines
5.6 KiB
Go

package digitalocean
import (
"context"
"fmt"
"regexp"
"testing"
"github.com/digitalocean/godo"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
)
func init() {
resource.AddTestSweepers("digitalocean_floating_ip", &resource.Sweeper{
Name: "digitalocean_floating_ip",
F: testSweepFloatingIps,
})
}
func testSweepFloatingIps(region string) error {
meta, err := sharedConfigForRegion(region)
if err != nil {
return err
}
client := meta.(*CombinedConfig).godoClient()
ips, _, err := client.FloatingIPs.List(context.Background(), nil)
if err != nil {
return err
}
for _, ip := range ips {
if _, err := client.FloatingIPs.Delete(context.Background(), ip.IP); err != nil {
return err
}
}
return nil
}
func TestAccDigitalOceanFloatingIP_Region(t *testing.T) {
var floatingIP godo.FloatingIP
expectedURNRegEx, _ := regexp.Compile(`do:floatingip:(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$`)
resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProviderFactories: testAccProviderFactories,
CheckDestroy: testAccCheckDigitalOceanFloatingIPDestroy,
Steps: []resource.TestStep{
{
Config: testAccCheckDigitalOceanFloatingIPConfig_region,
Check: resource.ComposeTestCheckFunc(
testAccCheckDigitalOceanFloatingIPExists("digitalocean_floating_ip.foobar", &floatingIP),
resource.TestCheckResourceAttr(
"digitalocean_floating_ip.foobar", "region", "nyc3"),
resource.TestMatchResourceAttr("digitalocean_floating_ip.foobar", "urn", expectedURNRegEx),
),
},
},
})
}
func TestAccDigitalOceanFloatingIP_Droplet(t *testing.T) {
var floatingIP godo.FloatingIP
rInt := acctest.RandInt()
resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProviderFactories: testAccProviderFactories,
CheckDestroy: testAccCheckDigitalOceanFloatingIPDestroy,
Steps: []resource.TestStep{
{
Config: testAccCheckDigitalOceanFloatingIPConfig_droplet(rInt),
Check: resource.ComposeTestCheckFunc(
testAccCheckDigitalOceanFloatingIPExists("digitalocean_floating_ip.foobar", &floatingIP),
resource.TestCheckResourceAttr(
"digitalocean_floating_ip.foobar", "region", "nyc3"),
),
},
{
Config: testAccCheckDigitalOceanFloatingIPConfig_Reassign(rInt),
Check: resource.ComposeTestCheckFunc(
testAccCheckDigitalOceanFloatingIPExists("digitalocean_floating_ip.foobar", &floatingIP),
resource.TestCheckResourceAttr(
"digitalocean_floating_ip.foobar", "region", "nyc3"),
),
},
{
Config: testAccCheckDigitalOceanFloatingIPConfig_Unassign(rInt),
Check: resource.ComposeTestCheckFunc(
testAccCheckDigitalOceanFloatingIPExists("digitalocean_floating_ip.foobar", &floatingIP),
resource.TestCheckResourceAttr(
"digitalocean_floating_ip.foobar", "region", "nyc3"),
),
},
},
})
}
func testAccCheckDigitalOceanFloatingIPDestroy(s *terraform.State) error {
client := testAccProvider.Meta().(*CombinedConfig).godoClient()
for _, rs := range s.RootModule().Resources {
if rs.Type != "digitalocean_floating_ip" {
continue
}
// Try to find the key
_, _, err := client.FloatingIPs.Get(context.Background(), rs.Primary.ID)
if err == nil {
return fmt.Errorf("Floating IP still exists")
}
}
return nil
}
func testAccCheckDigitalOceanFloatingIPExists(n string, floatingIP *godo.FloatingIP) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]
if !ok {
return fmt.Errorf("Not found: %s", n)
}
if rs.Primary.ID == "" {
return fmt.Errorf("No Record ID is set")
}
client := testAccProvider.Meta().(*CombinedConfig).godoClient()
// Try to find the FloatingIP
foundFloatingIP, _, err := client.FloatingIPs.Get(context.Background(), rs.Primary.ID)
if err != nil {
return err
}
if foundFloatingIP.IP != rs.Primary.ID {
return fmt.Errorf("Record not found")
}
*floatingIP = *foundFloatingIP
return nil
}
}
var testAccCheckDigitalOceanFloatingIPConfig_region = `
resource "digitalocean_floating_ip" "foobar" {
region = "nyc3"
}`
func testAccCheckDigitalOceanFloatingIPConfig_droplet(rInt int) string {
return fmt.Sprintf(`
resource "digitalocean_droplet" "foobar" {
name = "foobar-%d"
size = "1gb"
image = "centos-7-x64"
region = "nyc3"
ipv6 = true
private_networking = true
}
resource "digitalocean_floating_ip" "foobar" {
droplet_id = "${digitalocean_droplet.foobar.id}"
region = "${digitalocean_droplet.foobar.region}"
}`, rInt)
}
func testAccCheckDigitalOceanFloatingIPConfig_Reassign(rInt int) string {
return fmt.Sprintf(`
resource "digitalocean_droplet" "baz" {
name = "baz-%d"
size = "1gb"
image = "centos-7-x64"
region = "nyc3"
ipv6 = true
private_networking = true
}
resource "digitalocean_floating_ip" "foobar" {
droplet_id = "${digitalocean_droplet.baz.id}"
region = "${digitalocean_droplet.baz.region}"
}`, rInt)
}
func testAccCheckDigitalOceanFloatingIPConfig_Unassign(rInt int) string {
return fmt.Sprintf(`
resource "digitalocean_droplet" "baz" {
name = "baz-%d"
size = "1gb"
image = "centos-7-x64"
region = "nyc3"
ipv6 = true
private_networking = true
}
resource "digitalocean_floating_ip" "foobar" {
region = "nyc3"
}`, rInt)
}