github.com/armen/terraform@v0.5.2-0.20150529052519-caa8117a08f1/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", "ipaddress", CLOUDSTACK_PUBLIC_IPADDRESS), 25 resource.TestCheckResourceAttr( 26 "cloudstack_port_forward.foo", "forward.1537694805.protocol", "tcp"), 27 resource.TestCheckResourceAttr( 28 "cloudstack_port_forward.foo", "forward.1537694805.private_port", "443"), 29 resource.TestCheckResourceAttr( 30 "cloudstack_port_forward.foo", "forward.1537694805.public_port", "8443"), 31 resource.TestCheckResourceAttr( 32 "cloudstack_port_forward.foo", "forward.1537694805.virtual_machine", "terraform-test"), 33 ), 34 }, 35 }, 36 }) 37 } 38 39 func TestAccCloudStackPortForward_update(t *testing.T) { 40 resource.Test(t, resource.TestCase{ 41 PreCheck: func() { testAccPreCheck(t) }, 42 Providers: testAccProviders, 43 CheckDestroy: testAccCheckCloudStackPortForwardDestroy, 44 Steps: []resource.TestStep{ 45 resource.TestStep{ 46 Config: testAccCloudStackPortForward_basic, 47 Check: resource.ComposeTestCheckFunc( 48 testAccCheckCloudStackPortForwardsExist("cloudstack_port_forward.foo"), 49 resource.TestCheckResourceAttr( 50 "cloudstack_port_forward.foo", "ipaddress", CLOUDSTACK_PUBLIC_IPADDRESS), 51 resource.TestCheckResourceAttr( 52 "cloudstack_port_forward.foo", "forward.#", "1"), 53 resource.TestCheckResourceAttr( 54 "cloudstack_port_forward.foo", "forward.1537694805.protocol", "tcp"), 55 resource.TestCheckResourceAttr( 56 "cloudstack_port_forward.foo", "forward.1537694805.private_port", "443"), 57 resource.TestCheckResourceAttr( 58 "cloudstack_port_forward.foo", "forward.1537694805.public_port", "8443"), 59 resource.TestCheckResourceAttr( 60 "cloudstack_port_forward.foo", "forward.1537694805.virtual_machine", "terraform-test"), 61 ), 62 }, 63 64 resource.TestStep{ 65 Config: testAccCloudStackPortForward_update, 66 Check: resource.ComposeTestCheckFunc( 67 testAccCheckCloudStackPortForwardsExist("cloudstack_port_forward.foo"), 68 resource.TestCheckResourceAttr( 69 "cloudstack_port_forward.foo", "ipaddress", CLOUDSTACK_PUBLIC_IPADDRESS), 70 resource.TestCheckResourceAttr( 71 "cloudstack_port_forward.foo", "forward.#", "2"), 72 resource.TestCheckResourceAttr( 73 "cloudstack_port_forward.foo", "forward.8416686.protocol", "tcp"), 74 resource.TestCheckResourceAttr( 75 "cloudstack_port_forward.foo", "forward.8416686.private_port", "80"), 76 resource.TestCheckResourceAttr( 77 "cloudstack_port_forward.foo", "forward.8416686.public_port", "8080"), 78 resource.TestCheckResourceAttr( 79 "cloudstack_port_forward.foo", "forward.8416686.virtual_machine", "terraform-test"), 80 resource.TestCheckResourceAttr( 81 "cloudstack_port_forward.foo", "forward.1537694805.protocol", "tcp"), 82 resource.TestCheckResourceAttr( 83 "cloudstack_port_forward.foo", "forward.1537694805.private_port", "443"), 84 resource.TestCheckResourceAttr( 85 "cloudstack_port_forward.foo", "forward.1537694805.public_port", "8443"), 86 resource.TestCheckResourceAttr( 87 "cloudstack_port_forward.foo", "forward.1537694805.virtual_machine", "terraform-test"), 88 ), 89 }, 90 }, 91 }) 92 } 93 94 func testAccCheckCloudStackPortForwardsExist(n string) resource.TestCheckFunc { 95 return func(s *terraform.State) error { 96 rs, ok := s.RootModule().Resources[n] 97 if !ok { 98 return fmt.Errorf("Not found: %s", n) 99 } 100 101 if rs.Primary.ID == "" { 102 return fmt.Errorf("No port forward ID is set") 103 } 104 105 for k, uuid := range rs.Primary.Attributes { 106 if !strings.Contains(k, "uuid") { 107 continue 108 } 109 110 cs := testAccProvider.Meta().(*cloudstack.CloudStackClient) 111 _, count, err := cs.Firewall.GetPortForwardingRuleByID(uuid) 112 113 if err != nil { 114 return err 115 } 116 117 if count == 0 { 118 return fmt.Errorf("Port forward for %s not found", k) 119 } 120 } 121 122 return nil 123 } 124 } 125 126 func testAccCheckCloudStackPortForwardDestroy(s *terraform.State) error { 127 cs := testAccProvider.Meta().(*cloudstack.CloudStackClient) 128 129 for _, rs := range s.RootModule().Resources { 130 if rs.Type != "cloudstack_port_forward" { 131 continue 132 } 133 134 if rs.Primary.ID == "" { 135 return fmt.Errorf("No port forward ID is set") 136 } 137 138 for k, uuid := range rs.Primary.Attributes { 139 if !strings.Contains(k, "uuid") { 140 continue 141 } 142 143 p := cs.Firewall.NewDeletePortForwardingRuleParams(uuid) 144 _, err := cs.Firewall.DeletePortForwardingRule(p) 145 146 if err != nil { 147 return err 148 } 149 } 150 } 151 152 return nil 153 } 154 155 var testAccCloudStackPortForward_basic = fmt.Sprintf(` 156 resource "cloudstack_instance" "foobar" { 157 name = "terraform-test" 158 service_offering= "%s" 159 network = "%s" 160 template = "%s" 161 zone = "%s" 162 expunge = true 163 } 164 165 resource "cloudstack_port_forward" "foo" { 166 ipaddress = "%s" 167 168 forward { 169 protocol = "tcp" 170 private_port = 443 171 public_port = 8443 172 virtual_machine = "${cloudstack_instance.foobar.name}" 173 } 174 }`, 175 CLOUDSTACK_SERVICE_OFFERING_1, 176 CLOUDSTACK_NETWORK_1, 177 CLOUDSTACK_TEMPLATE, 178 CLOUDSTACK_ZONE, 179 CLOUDSTACK_PUBLIC_IPADDRESS) 180 181 var testAccCloudStackPortForward_update = fmt.Sprintf(` 182 resource "cloudstack_instance" "foobar" { 183 name = "terraform-test" 184 service_offering= "%s" 185 network = "%s" 186 template = "%s" 187 zone = "%s" 188 expunge = true 189 } 190 191 resource "cloudstack_port_forward" "foo" { 192 ipaddress = "%s" 193 194 forward { 195 protocol = "tcp" 196 private_port = 443 197 public_port = 8443 198 virtual_machine = "${cloudstack_instance.foobar.name}" 199 } 200 201 forward { 202 protocol = "tcp" 203 private_port = 80 204 public_port = 8080 205 virtual_machine = "${cloudstack_instance.foobar.name}" 206 } 207 }`, 208 CLOUDSTACK_SERVICE_OFFERING_1, 209 CLOUDSTACK_NETWORK_1, 210 CLOUDSTACK_TEMPLATE, 211 CLOUDSTACK_ZONE, 212 CLOUDSTACK_PUBLIC_IPADDRESS)