github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/cloudstack/resource_cloudstack_port_forward_test.go (about) 1 package cloudstack 2 3 import ( 4 "fmt" 5 "strings" 6 "testing" 7 8 "github.com/hashicorp/terraform/helper/resource" 9 "github.com/hashicorp/terraform/terraform" 10 "github.com/xanzy/go-cloudstack/cloudstack" 11 ) 12 13 func TestAccCloudStackPortForward_basic(t *testing.T) { 14 resource.Test(t, resource.TestCase{ 15 PreCheck: func() { testAccPreCheck(t) }, 16 Providers: testAccProviders, 17 CheckDestroy: testAccCheckCloudStackPortForwardDestroy, 18 Steps: []resource.TestStep{ 19 resource.TestStep{ 20 Config: testAccCloudStackPortForward_basic, 21 Check: resource.ComposeTestCheckFunc( 22 testAccCheckCloudStackPortForwardsExist("cloudstack_port_forward.foo"), 23 resource.TestCheckResourceAttr( 24 "cloudstack_port_forward.foo", "ip_address_id", CLOUDSTACK_PUBLIC_IPADDRESS), 25 resource.TestCheckResourceAttr( 26 "cloudstack_port_forward.foo", "forward.#", "1"), 27 ), 28 }, 29 }, 30 }) 31 } 32 33 func TestAccCloudStackPortForward_update(t *testing.T) { 34 resource.Test(t, resource.TestCase{ 35 PreCheck: func() { testAccPreCheck(t) }, 36 Providers: testAccProviders, 37 CheckDestroy: testAccCheckCloudStackPortForwardDestroy, 38 Steps: []resource.TestStep{ 39 resource.TestStep{ 40 Config: testAccCloudStackPortForward_basic, 41 Check: resource.ComposeTestCheckFunc( 42 testAccCheckCloudStackPortForwardsExist("cloudstack_port_forward.foo"), 43 resource.TestCheckResourceAttr( 44 "cloudstack_port_forward.foo", "ip_address_id", CLOUDSTACK_PUBLIC_IPADDRESS), 45 resource.TestCheckResourceAttr( 46 "cloudstack_port_forward.foo", "forward.#", "1"), 47 ), 48 }, 49 50 resource.TestStep{ 51 Config: testAccCloudStackPortForward_update, 52 Check: resource.ComposeTestCheckFunc( 53 testAccCheckCloudStackPortForwardsExist("cloudstack_port_forward.foo"), 54 resource.TestCheckResourceAttr( 55 "cloudstack_port_forward.foo", "ip_address_id", CLOUDSTACK_PUBLIC_IPADDRESS), 56 resource.TestCheckResourceAttr( 57 "cloudstack_port_forward.foo", "forward.#", "2"), 58 ), 59 }, 60 }, 61 }) 62 } 63 64 func testAccCheckCloudStackPortForwardsExist(n string) resource.TestCheckFunc { 65 return func(s *terraform.State) error { 66 rs, ok := s.RootModule().Resources[n] 67 if !ok { 68 return fmt.Errorf("Not found: %s", n) 69 } 70 71 if rs.Primary.ID == "" { 72 return fmt.Errorf("No port forward ID is set") 73 } 74 75 for k, id := range rs.Primary.Attributes { 76 if !strings.Contains(k, "uuid") { 77 continue 78 } 79 80 cs := testAccProvider.Meta().(*cloudstack.CloudStackClient) 81 _, count, err := cs.Firewall.GetPortForwardingRuleByID(id) 82 83 if err != nil { 84 return err 85 } 86 87 if count == 0 { 88 return fmt.Errorf("Port forward for %s not found", k) 89 } 90 } 91 92 return nil 93 } 94 } 95 96 func testAccCheckCloudStackPortForwardDestroy(s *terraform.State) error { 97 cs := testAccProvider.Meta().(*cloudstack.CloudStackClient) 98 99 for _, rs := range s.RootModule().Resources { 100 if rs.Type != "cloudstack_port_forward" { 101 continue 102 } 103 104 if rs.Primary.ID == "" { 105 return fmt.Errorf("No port forward ID is set") 106 } 107 108 for k, id := range rs.Primary.Attributes { 109 if !strings.Contains(k, "uuid") { 110 continue 111 } 112 113 _, _, err := cs.Firewall.GetPortForwardingRuleByID(id) 114 if err == nil { 115 return fmt.Errorf("Port forward %s still exists", rs.Primary.ID) 116 } 117 } 118 } 119 120 return nil 121 } 122 123 var testAccCloudStackPortForward_basic = fmt.Sprintf(` 124 resource "cloudstack_instance" "foobar" { 125 name = "terraform-test" 126 service_offering= "%s" 127 network_id = "%s" 128 template = "%s" 129 zone = "%s" 130 expunge = true 131 } 132 133 resource "cloudstack_port_forward" "foo" { 134 ip_address_id = "%s" 135 136 forward { 137 protocol = "tcp" 138 private_port = 443 139 public_port = 8443 140 virtual_machine_id = "${cloudstack_instance.foobar.id}" 141 } 142 }`, 143 CLOUDSTACK_SERVICE_OFFERING_1, 144 CLOUDSTACK_NETWORK_1, 145 CLOUDSTACK_TEMPLATE, 146 CLOUDSTACK_ZONE, 147 CLOUDSTACK_PUBLIC_IPADDRESS) 148 149 var testAccCloudStackPortForward_update = fmt.Sprintf(` 150 resource "cloudstack_instance" "foobar" { 151 name = "terraform-test" 152 service_offering= "%s" 153 network_id = "%s" 154 template = "%s" 155 zone = "%s" 156 expunge = true 157 } 158 159 resource "cloudstack_port_forward" "foo" { 160 ip_address_id = "%s" 161 162 forward { 163 protocol = "tcp" 164 private_port = 443 165 public_port = 8443 166 virtual_machine_id = "${cloudstack_instance.foobar.id}" 167 } 168 169 forward { 170 protocol = "tcp" 171 private_port = 80 172 public_port = 8080 173 virtual_machine_id = "${cloudstack_instance.foobar.id}" 174 } 175 }`, 176 CLOUDSTACK_SERVICE_OFFERING_1, 177 CLOUDSTACK_NETWORK_1, 178 CLOUDSTACK_TEMPLATE, 179 CLOUDSTACK_ZONE, 180 CLOUDSTACK_PUBLIC_IPADDRESS)