github.com/chalford/terraform@v0.3.7-0.20150113080010-a78c69a8c81f/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  }`,
   209  	CLOUDSTACK_SERVICE_OFFERING_1,
   210  	CLOUDSTACK_NETWORK_1,
   211  	CLOUDSTACK_TEMPLATE,
   212  	CLOUDSTACK_ZONE,
   213  	CLOUDSTACK_PUBLIC_IPADDRESS)