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)