github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/aws/resource_aws_load_balancer_policy_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"strconv"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/aws/aws-sdk-go/aws"
    10  	"github.com/aws/aws-sdk-go/aws/awserr"
    11  	"github.com/aws/aws-sdk-go/service/elb"
    12  
    13  	"github.com/hashicorp/terraform/helper/acctest"
    14  	"github.com/hashicorp/terraform/helper/resource"
    15  	"github.com/hashicorp/terraform/terraform"
    16  )
    17  
    18  func TestAccAWSLoadBalancerPolicy_basic(t *testing.T) {
    19  	rInt := acctest.RandInt()
    20  	resource.Test(t, resource.TestCase{
    21  		PreCheck:     func() { testAccPreCheck(t) },
    22  		Providers:    testAccProviders,
    23  		CheckDestroy: testAccCheckAWSLoadBalancerPolicyDestroy,
    24  		Steps: []resource.TestStep{
    25  			{
    26  				Config: testAccAWSLoadBalancerPolicyConfig_basic(rInt),
    27  				Check: resource.ComposeTestCheckFunc(
    28  					testAccCheckAWSLoadBalancerPolicyState("aws_elb.test-lb", "aws_load_balancer_policy.test-policy"),
    29  				),
    30  			},
    31  		},
    32  	})
    33  }
    34  
    35  func TestAccAWSLoadBalancerPolicy_updateWhileAssigned(t *testing.T) {
    36  	rInt := acctest.RandInt()
    37  	resource.Test(t, resource.TestCase{
    38  		PreCheck:     func() { testAccPreCheck(t) },
    39  		Providers:    testAccProviders,
    40  		CheckDestroy: testAccCheckAWSLoadBalancerPolicyDestroy,
    41  		Steps: []resource.TestStep{
    42  			{
    43  				Config: testAccAWSLoadBalancerPolicyConfig_updateWhileAssigned0(rInt),
    44  				Check: resource.ComposeTestCheckFunc(
    45  					testAccCheckAWSLoadBalancerPolicyState("aws_elb.test-lb", "aws_load_balancer_policy.test-policy"),
    46  				),
    47  			},
    48  			{
    49  				Config: testAccAWSLoadBalancerPolicyConfig_updateWhileAssigned1(rInt),
    50  				Check: resource.ComposeTestCheckFunc(
    51  					testAccCheckAWSLoadBalancerPolicyState("aws_elb.test-lb", "aws_load_balancer_policy.test-policy"),
    52  				),
    53  			},
    54  		},
    55  	})
    56  }
    57  
    58  func testAccCheckAWSLoadBalancerPolicyDestroy(s *terraform.State) error {
    59  	conn := testAccProvider.Meta().(*AWSClient).elbconn
    60  
    61  	for _, rs := range s.RootModule().Resources {
    62  		if rs.Type != "aws_load_balancer_policy" {
    63  			continue
    64  		}
    65  
    66  		loadBalancerName, policyName := resourceAwsLoadBalancerPolicyParseId(rs.Primary.ID)
    67  		out, err := conn.DescribeLoadBalancerPolicies(
    68  			&elb.DescribeLoadBalancerPoliciesInput{
    69  				LoadBalancerName: aws.String(loadBalancerName),
    70  				PolicyNames:      []*string{aws.String(policyName)},
    71  			})
    72  		if err != nil {
    73  			if ec2err, ok := err.(awserr.Error); ok && (ec2err.Code() == "PolicyNotFound" || ec2err.Code() == "LoadBalancerNotFound") {
    74  				continue
    75  			}
    76  			return err
    77  		}
    78  
    79  		if len(out.PolicyDescriptions) > 0 {
    80  			return fmt.Errorf("Policy still exists")
    81  		}
    82  	}
    83  	return nil
    84  }
    85  
    86  func testAccCheckAWSLoadBalancerPolicyState(elbResource string, policyResource string) resource.TestCheckFunc {
    87  	return func(s *terraform.State) error {
    88  		rs, ok := s.RootModule().Resources[elbResource]
    89  		if !ok {
    90  			return fmt.Errorf("Not found: %s", elbResource)
    91  		}
    92  
    93  		if rs.Primary.ID == "" {
    94  			return fmt.Errorf("No ID is set")
    95  		}
    96  
    97  		policy, ok := s.RootModule().Resources[policyResource]
    98  		if !ok {
    99  			return fmt.Errorf("Not found: %s", policyResource)
   100  		}
   101  
   102  		elbconn := testAccProvider.Meta().(*AWSClient).elbconn
   103  		loadBalancerName, policyName := resourceAwsLoadBalancerPolicyParseId(policy.Primary.ID)
   104  		loadBalancerPolicies, err := elbconn.DescribeLoadBalancerPolicies(&elb.DescribeLoadBalancerPoliciesInput{
   105  			LoadBalancerName: aws.String(loadBalancerName),
   106  			PolicyNames:      []*string{aws.String(policyName)},
   107  		})
   108  
   109  		if err != nil {
   110  			return err
   111  		}
   112  
   113  		for _, loadBalancerPolicy := range loadBalancerPolicies.PolicyDescriptions {
   114  			if *loadBalancerPolicy.PolicyName == policyName {
   115  				if *loadBalancerPolicy.PolicyTypeName != policy.Primary.Attributes["policy_type_name"] {
   116  					return fmt.Errorf("PolicyTypeName does not match")
   117  				}
   118  				policyAttributeCount, err := strconv.Atoi(policy.Primary.Attributes["policy_attribute.#"])
   119  				if err != nil {
   120  					return err
   121  				}
   122  				if len(loadBalancerPolicy.PolicyAttributeDescriptions) != policyAttributeCount {
   123  					return fmt.Errorf("PolicyAttributeDescriptions length mismatch")
   124  				}
   125  				policyAttributes := make(map[string]string)
   126  				for k, v := range policy.Primary.Attributes {
   127  					if strings.HasPrefix(k, "policy_attribute.") && strings.HasSuffix(k, ".name") {
   128  						key := v
   129  						value_key := fmt.Sprintf("%s.value", strings.TrimSuffix(k, ".name"))
   130  						policyAttributes[key] = policy.Primary.Attributes[value_key]
   131  					}
   132  				}
   133  				for _, policyAttribute := range loadBalancerPolicy.PolicyAttributeDescriptions {
   134  					if *policyAttribute.AttributeValue != policyAttributes[*policyAttribute.AttributeName] {
   135  						return fmt.Errorf("PollicyAttribute Value mismatch %s != %s: %s", *policyAttribute.AttributeValue, policyAttributes[*policyAttribute.AttributeName], policyAttributes)
   136  					}
   137  				}
   138  			}
   139  		}
   140  
   141  		return nil
   142  	}
   143  }
   144  
   145  func testAccAWSLoadBalancerPolicyConfig_basic(rInt int) string {
   146  	return fmt.Sprintf(`
   147  	resource "aws_elb" "test-lb" {
   148  		name = "test-lb-%d"
   149  		availability_zones = ["us-west-2a"]
   150  
   151  		listener {
   152  			instance_port = 80
   153  			instance_protocol = "http"
   154  			lb_port = 80
   155  			lb_protocol = "http"
   156  		}
   157  
   158  		tags {
   159  			Name = "tf-acc-test"
   160  		}
   161  	}
   162  
   163  	resource "aws_load_balancer_policy" "test-policy" {
   164  		load_balancer_name = "${aws_elb.test-lb.name}"
   165  		policy_name = "test-policy-%d"
   166  		policy_type_name = "AppCookieStickinessPolicyType"
   167  		policy_attribute = {
   168  			name = "CookieName"
   169  			value = "magic_cookie"
   170  		}
   171  	}`, rInt, rInt)
   172  }
   173  
   174  func testAccAWSLoadBalancerPolicyConfig_updateWhileAssigned0(rInt int) string {
   175  	return fmt.Sprintf(`
   176  	resource "aws_elb" "test-lb" {
   177  		name = "test-lb-%d"
   178  		availability_zones = ["us-west-2a"]
   179  
   180  		listener {
   181  			instance_port = 80
   182  			instance_protocol = "http"
   183  			lb_port = 80
   184  			lb_protocol = "http"
   185  		}
   186  
   187  		tags {
   188  			Name = "tf-acc-test"
   189  		}
   190  	}
   191  
   192  	resource "aws_load_balancer_policy" "test-policy" {
   193  		load_balancer_name = "${aws_elb.test-lb.name}"
   194  		policy_name = "test-policy-%d"
   195  		policy_type_name = "AppCookieStickinessPolicyType"
   196  		policy_attribute = {
   197  			name = "CookieName"
   198  			value = "magic_cookie"
   199  		}
   200  	}
   201  
   202  	resource "aws_load_balancer_listener_policy" "test-lb-test-policy-80" {
   203  		load_balancer_name = "${aws_elb.test-lb.name}"
   204  		load_balancer_port = 80
   205  		policy_names = [
   206  			"${aws_load_balancer_policy.test-policy.policy_name}"
   207  		]
   208  	}`, rInt, rInt)
   209  }
   210  
   211  func testAccAWSLoadBalancerPolicyConfig_updateWhileAssigned1(rInt int) string {
   212  	return fmt.Sprintf(`
   213  	resource "aws_elb" "test-lb" {
   214  		name = "test-lb-%d"
   215  		availability_zones = ["us-west-2a"]
   216  
   217  		listener {
   218  			instance_port = 80
   219  			instance_protocol = "http"
   220  			lb_port = 80
   221  			lb_protocol = "http"
   222  		}
   223  
   224  		tags {
   225  			Name = "tf-acc-test"
   226  		}
   227  	}
   228  
   229  	resource "aws_load_balancer_policy" "test-policy" {
   230  		load_balancer_name = "${aws_elb.test-lb.name}"
   231  		policy_name = "test-policy-%d"
   232  		policy_type_name = "AppCookieStickinessPolicyType"
   233  		policy_attribute = {
   234  			name = "CookieName"
   235  			value = "unicorn_cookie"
   236  		}
   237  	}
   238  
   239  	resource "aws_load_balancer_listener_policy" "test-lb-test-policy-80" {
   240  		load_balancer_name = "${aws_elb.test-lb.name}"
   241  		load_balancer_port = 80
   242  		policy_names = [
   243  			"${aws_load_balancer_policy.test-policy.policy_name}"
   244  		]
   245  	}`, rInt, rInt)
   246  }