github.com/anuaimi/terraform@v0.6.4-0.20150904235404-2bf9aec61da8/builtin/providers/cloudstack/resource_cloudstack_loadbalancer_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 TestAccCloudStackLoadBalancerRule_basic(t *testing.T) {
    14  	resource.Test(t, resource.TestCase{
    15  		PreCheck:     func() { testAccPreCheck(t) },
    16  		Providers:    testAccProviders,
    17  		CheckDestroy: testAccCheckCloudStackLoadBalancerRuleDestroy,
    18  		Steps: []resource.TestStep{
    19  			resource.TestStep{
    20  				Config: testAccCloudStackLoadBalancerRule_basic,
    21  				Check: resource.ComposeTestCheckFunc(
    22  					testAccCheckCloudStackLoadBalancerRuleExist("cloudstack_loadbalancer_rule.foo"),
    23  					resource.TestCheckResourceAttr(
    24  						"cloudstack_loadbalancer_rule.foo", "name", "terraform-lb"),
    25  					resource.TestCheckResourceAttr(
    26  						"cloudstack_loadbalancer_rule.foo", "algorithm", "roundrobin"),
    27  					resource.TestCheckResourceAttr(
    28  						"cloudstack_loadbalancer_rule.foo", "public_port", "80"),
    29  					resource.TestCheckResourceAttr(
    30  						"cloudstack_loadbalancer_rule.foo", "private_port", "80"),
    31  				),
    32  			},
    33  		},
    34  	})
    35  }
    36  
    37  func TestAccCloudStackLoadBalancerRule_update(t *testing.T) {
    38  	resource.Test(t, resource.TestCase{
    39  		PreCheck:     func() { testAccPreCheck(t) },
    40  		Providers:    testAccProviders,
    41  		CheckDestroy: testAccCheckCloudStackLoadBalancerRuleDestroy,
    42  		Steps: []resource.TestStep{
    43  			resource.TestStep{
    44  				Config: testAccCloudStackLoadBalancerRule_basic,
    45  				Check: resource.ComposeTestCheckFunc(
    46  					testAccCheckCloudStackLoadBalancerRuleExist("cloudstack_loadbalancer_rule.foo"),
    47  					resource.TestCheckResourceAttr(
    48  						"cloudstack_loadbalancer_rule.foo", "name", "terraform-lb"),
    49  					resource.TestCheckResourceAttr(
    50  						"cloudstack_loadbalancer_rule.foo", "algorithm", "roundrobin"),
    51  					resource.TestCheckResourceAttr(
    52  						"cloudstack_loadbalancer_rule.foo", "public_port", "80"),
    53  					resource.TestCheckResourceAttr(
    54  						"cloudstack_loadbalancer_rule.foo", "private_port", "80"),
    55  				),
    56  			},
    57  
    58  			resource.TestStep{
    59  				Config: testAccCloudStackLoadBalancerRule_update,
    60  				Check: resource.ComposeTestCheckFunc(
    61  					testAccCheckCloudStackLoadBalancerRuleExist("cloudstack_loadbalancer_rule.foo"),
    62  					resource.TestCheckResourceAttr(
    63  						"cloudstack_loadbalancer_rule.foo", "name", "terraform-lb-update"),
    64  					resource.TestCheckResourceAttr(
    65  						"cloudstack_loadbalancer_rule.foo", "algorithm", "leastconn"),
    66  					resource.TestCheckResourceAttr(
    67  						"cloudstack_loadbalancer_rule.foo", "public_port", "443"),
    68  					resource.TestCheckResourceAttr(
    69  						"cloudstack_loadbalancer_rule.foo", "private_port", "443"),
    70  				),
    71  			},
    72  		},
    73  	})
    74  }
    75  
    76  func testAccCheckCloudStackLoadBalancerRuleExist(n string) resource.TestCheckFunc {
    77  	return func(s *terraform.State) error {
    78  		rs, ok := s.RootModule().Resources[n]
    79  		if !ok {
    80  			return fmt.Errorf("Not found: %s", n)
    81  		}
    82  
    83  		if rs.Primary.ID == "" {
    84  			return fmt.Errorf("No loadbalancer rule ID is set")
    85  		}
    86  
    87  		for k, uuid := range rs.Primary.Attributes {
    88  			if !strings.Contains(k, "uuid") {
    89  				continue
    90  			}
    91  
    92  			cs := testAccProvider.Meta().(*cloudstack.CloudStackClient)
    93  			_, count, err := cs.LoadBalancer.GetLoadBalancerRuleByID(uuid)
    94  
    95  			if err != nil {
    96  				return err
    97  			}
    98  
    99  			if count == 0 {
   100  				return fmt.Errorf("Loadbalancer rule for %s not found", k)
   101  			}
   102  		}
   103  
   104  		return nil
   105  	}
   106  }
   107  
   108  func testAccCheckCloudStackLoadBalancerRuleDestroy(s *terraform.State) error {
   109  	cs := testAccProvider.Meta().(*cloudstack.CloudStackClient)
   110  
   111  	for _, rs := range s.RootModule().Resources {
   112  		if rs.Type != "cloudstack_loadbalancer_rule" {
   113  			continue
   114  		}
   115  
   116  		if rs.Primary.ID == "" {
   117  			return fmt.Errorf("No Loadbalancer rule ID is set")
   118  		}
   119  
   120  		for k, uuid := range rs.Primary.Attributes {
   121  			if !strings.Contains(k, "uuid") {
   122  				continue
   123  			}
   124  
   125  			_, _, err := cs.LoadBalancer.GetLoadBalancerRuleByID(uuid)
   126  			if err == nil {
   127  				return fmt.Errorf("Loadbalancer rule %s still exists", rs.Primary.ID)
   128  			}
   129  		}
   130  	}
   131  
   132  	return nil
   133  }
   134  
   135  var testAccCloudStackLoadBalancerRule_basic = fmt.Sprintf(`
   136  resource "cloudstack_vpc" "foobar" {
   137  	name = "terraform-vpc"
   138  	cidr = "%s"
   139  	vpc_offering = "%s"
   140  	zone = "%s"
   141  }
   142  
   143  resource "cloudstack_network" "foo" {
   144    name = "terraform-network"
   145    cidr = "%s"
   146    network_offering = "%s"
   147    vpc = "${cloudstack_vpc.foobar.name}"
   148    zone = "${cloudstack_vpc.foobar.zone}"
   149  }
   150  
   151  resource "cloudstack_ipaddress" "foo" {
   152    vpc = "${cloudstack_vpc.foobar.name}"
   153  }
   154  
   155  resource "cloudstack_instance" "foobar1" {
   156    name = "terraform-server1"
   157    display_name = "terraform"
   158    service_offering= "%s"
   159    network = "${cloudstack_network.foo.name}"
   160    template = "%s"
   161    zone = "${cloudstack_network.foo.zone}"
   162    user_data = "foobar\nfoo\nbar"
   163    expunge = true
   164  }
   165  
   166  resource "cloudstack_loadbalancer_rule" "foo" {
   167    name = "terraform-lb"
   168    ipaddress = "${cloudstack_ipaddress.foo.ipaddress}"
   169    algorithm = "roundrobin"
   170    network = "${cloudstack_network.foo.id}"
   171    public_port = 80
   172    private_port = 80
   173    members = ["${cloudstack_instance.foobar1.id}"]
   174  }`,
   175  	CLOUDSTACK_VPC_CIDR_1,
   176  	CLOUDSTACK_VPC_OFFERING,
   177  	CLOUDSTACK_ZONE,
   178  	CLOUDSTACK_VPC_NETWORK_CIDR,
   179  	CLOUDSTACK_VPC_NETWORK_OFFERING,
   180  	CLOUDSTACK_SERVICE_OFFERING_1,
   181  	CLOUDSTACK_TEMPLATE)
   182  
   183  var testAccCloudStackLoadBalancerRule_update = fmt.Sprintf(`
   184  resource "cloudstack_vpc" "foobar" {
   185      name = "terraform-vpc"
   186      cidr = "%s"
   187      vpc_offering = "%s"
   188      zone = "%s"
   189  }
   190  
   191  resource "cloudstack_network" "foo" {
   192    name = "terraform-network"
   193    cidr = "%s"
   194    network_offering = "%s"
   195    vpc = "${cloudstack_vpc.foobar.name}"
   196    zone = "${cloudstack_vpc.foobar.zone}"
   197  }
   198  
   199  resource "cloudstack_ipaddress" "foo" {
   200    vpc = "${cloudstack_vpc.foobar.name}"
   201  }
   202  
   203  resource "cloudstack_instance" "foobar1" {
   204    name = "terraform-server1"
   205    display_name = "terraform"
   206    service_offering= "%s"
   207    network = "${cloudstack_network.foo.name}"
   208    template = "%s"
   209    zone = "${cloudstack_network.foo.zone}"
   210    user_data = "foobar\nfoo\nbar"
   211    expunge = true
   212  }
   213  
   214  resource "cloudstack_instance" "foobar2" {
   215    name = "terraform-server2"
   216    display_name = "terraform"
   217    service_offering= "%s"
   218    network = "${cloudstack_network.foo.name}"
   219    template = "%s"
   220    zone = "${cloudstack_network.foo.zone}"
   221    user_data = "foobar\nfoo\nbar"
   222    expunge = true
   223  }
   224  
   225  resource "cloudstack_loadbalancer_rule" "foo" {
   226    name = "terraform-lb-update"
   227    ipaddress = "${cloudstack_ipaddress.foo.ipaddress}"
   228    algorithm = "leastconn"
   229    network = "${cloudstack_network.foo.id}"
   230    public_port = 443
   231    private_port = 443
   232    members = ["${cloudstack_instance.foobar2.id}", "${cloudstack_instance.foobar1.id}"]
   233  }`,
   234  	CLOUDSTACK_VPC_CIDR_1,
   235  	CLOUDSTACK_VPC_OFFERING,
   236  	CLOUDSTACK_ZONE,
   237  	CLOUDSTACK_VPC_NETWORK_CIDR,
   238  	CLOUDSTACK_VPC_NETWORK_OFFERING,
   239  	CLOUDSTACK_SERVICE_OFFERING_1,
   240  	CLOUDSTACK_TEMPLATE,
   241  	CLOUDSTACK_SERVICE_OFFERING_1,
   242  	CLOUDSTACK_TEMPLATE)