github.com/mohanarpit/terraform@v0.6.16-0.20160909104007-291f29853544/builtin/providers/aws/resource_aws_load_balancer_listener_policy_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  	"testing"
     7  
     8  	"github.com/aws/aws-sdk-go/aws"
     9  	"github.com/aws/aws-sdk-go/aws/awserr"
    10  	"github.com/aws/aws-sdk-go/service/elb"
    11  
    12  	"github.com/hashicorp/terraform/helper/resource"
    13  	"github.com/hashicorp/terraform/terraform"
    14  )
    15  
    16  func TestAccAWSLoadBalancerListenerPolicy_basic(t *testing.T) {
    17  	resource.Test(t, resource.TestCase{
    18  		PreCheck:     func() { testAccPreCheck(t) },
    19  		Providers:    testAccProviders,
    20  		CheckDestroy: testAccCheckAWSLoadBalancerListenerPolicyDestroy,
    21  		Steps: []resource.TestStep{
    22  			resource.TestStep{
    23  				Config: testAccAWSLoadBalancerListenerPolicyConfig_basic0,
    24  				Check: resource.ComposeTestCheckFunc(
    25  					testAccCheckAWSLoadBalancerPolicyState("aws_elb.test-lb", "aws_load_balancer_policy.magic-cookie-sticky"),
    26  					testAccCheckAWSLoadBalancerListenerPolicyState("test-aws-policies-lb", int64(80), "magic-cookie-sticky-policy", true),
    27  				),
    28  			},
    29  			resource.TestStep{
    30  				Config: testAccAWSLoadBalancerListenerPolicyConfig_basic1,
    31  				Check: resource.ComposeTestCheckFunc(
    32  					testAccCheckAWSLoadBalancerPolicyState("aws_elb.test-lb", "aws_load_balancer_policy.magic-cookie-sticky"),
    33  					testAccCheckAWSLoadBalancerListenerPolicyState("test-aws-policies-lb", int64(80), "magic-cookie-sticky-policy", true),
    34  				),
    35  			},
    36  			resource.TestStep{
    37  				Config: testAccAWSLoadBalancerListenerPolicyConfig_basic2,
    38  				Check: resource.ComposeTestCheckFunc(
    39  					testAccCheckAWSLoadBalancerListenerPolicyState("test-aws-policies-lb", int64(80), "magic-cookie-sticky-policy", false),
    40  				),
    41  			},
    42  		},
    43  	})
    44  }
    45  
    46  func policyInListenerPolicies(str string, list []string) bool {
    47  	for _, v := range list {
    48  		if v == str {
    49  			return true
    50  		}
    51  	}
    52  	return false
    53  }
    54  
    55  func testAccCheckAWSLoadBalancerListenerPolicyDestroy(s *terraform.State) error {
    56  	conn := testAccProvider.Meta().(*AWSClient).elbconn
    57  
    58  	for _, rs := range s.RootModule().Resources {
    59  		switch {
    60  		case rs.Type == "aws_load_balancer_policy":
    61  			loadBalancerName, policyName := resourceAwsLoadBalancerListenerPoliciesParseId(rs.Primary.ID)
    62  			out, err := conn.DescribeLoadBalancerPolicies(
    63  				&elb.DescribeLoadBalancerPoliciesInput{
    64  					LoadBalancerName: aws.String(loadBalancerName),
    65  					PolicyNames:      []*string{aws.String(policyName)},
    66  				})
    67  			if err != nil {
    68  				if ec2err, ok := err.(awserr.Error); ok && (ec2err.Code() == "PolicyNotFound" || ec2err.Code() == "LoadBalancerNotFound") {
    69  					continue
    70  				}
    71  				return err
    72  			}
    73  			if len(out.PolicyDescriptions) > 0 {
    74  				return fmt.Errorf("Policy still exists")
    75  			}
    76  		case rs.Type == "aws_load_listener_policy":
    77  			loadBalancerName, _ := resourceAwsLoadBalancerListenerPoliciesParseId(rs.Primary.ID)
    78  			out, err := conn.DescribeLoadBalancers(
    79  				&elb.DescribeLoadBalancersInput{
    80  					LoadBalancerNames: []*string{aws.String(loadBalancerName)},
    81  				})
    82  			if err != nil {
    83  				if ec2err, ok := err.(awserr.Error); ok && (ec2err.Code() == "LoadBalancerNotFound") {
    84  					continue
    85  				}
    86  				return err
    87  			}
    88  			policyNames := []string{}
    89  			for k, _ := range rs.Primary.Attributes {
    90  				if strings.HasPrefix(k, "policy_names.") && strings.HasSuffix(k, ".name") {
    91  					value_key := fmt.Sprintf("%s.value", strings.TrimSuffix(k, ".name"))
    92  					policyNames = append(policyNames, rs.Primary.Attributes[value_key])
    93  				}
    94  			}
    95  			for _, policyName := range policyNames {
    96  				for _, listener := range out.LoadBalancerDescriptions[0].ListenerDescriptions {
    97  					policyStrings := []string{}
    98  					for _, pol := range listener.PolicyNames {
    99  						policyStrings = append(policyStrings, *pol)
   100  					}
   101  					if policyInListenerPolicies(policyName, policyStrings) {
   102  						return fmt.Errorf("Policy still exists and is assigned")
   103  					}
   104  				}
   105  			}
   106  		default:
   107  			continue
   108  		}
   109  	}
   110  	return nil
   111  }
   112  
   113  func testAccCheckAWSLoadBalancerListenerPolicyState(loadBalancerName string, loadBalancerListenerPort int64, loadBalancerListenerPolicyName string, assigned bool) resource.TestCheckFunc {
   114  	return func(s *terraform.State) error {
   115  		elbconn := testAccProvider.Meta().(*AWSClient).elbconn
   116  
   117  		loadBalancerDescription, err := elbconn.DescribeLoadBalancers(&elb.DescribeLoadBalancersInput{
   118  			LoadBalancerNames: []*string{aws.String(loadBalancerName)},
   119  		})
   120  		if err != nil {
   121  			return err
   122  		}
   123  
   124  		for _, listener := range loadBalancerDescription.LoadBalancerDescriptions[0].ListenerDescriptions {
   125  			if *listener.Listener.LoadBalancerPort != loadBalancerListenerPort {
   126  				continue
   127  			}
   128  			policyStrings := []string{}
   129  			for _, pol := range listener.PolicyNames {
   130  				policyStrings = append(policyStrings, *pol)
   131  			}
   132  			if policyInListenerPolicies(loadBalancerListenerPolicyName, policyStrings) != assigned {
   133  				if assigned {
   134  					return fmt.Errorf("Policy no longer assigned %s not in %+v", loadBalancerListenerPolicyName, policyStrings)
   135  				} else {
   136  					return fmt.Errorf("Policy exists and is assigned")
   137  				}
   138  			}
   139  		}
   140  
   141  		return nil
   142  	}
   143  }
   144  
   145  const testAccAWSLoadBalancerListenerPolicyConfig_basic0 = `
   146  resource "aws_elb" "test-lb" {
   147    name = "test-aws-policies-lb"
   148    availability_zones = ["us-west-2a"]
   149  
   150    listener {
   151      instance_port = 80
   152      instance_protocol = "http"
   153      lb_port = 80
   154      lb_protocol = "http"
   155    }
   156  
   157    tags {
   158      Name = "tf-acc-test"
   159    }
   160  }
   161  
   162  resource "aws_load_balancer_policy" "magic-cookie-sticky" {
   163    load_balancer_name = "${aws_elb.test-lb.name}"
   164    policy_name = "magic-cookie-sticky-policy"
   165    policy_type_name = "AppCookieStickinessPolicyType"
   166    policy_attribute = {
   167      name = "CookieName"
   168      value = "magic_cookie"
   169    }
   170  }
   171  
   172  resource "aws_load_balancer_listener_policy" "test-lb-listener-policies-80" {
   173    load_balancer_name = "${aws_elb.test-lb.name}"
   174    load_balancer_port = 80
   175    policy_names = [
   176      "${aws_load_balancer_policy.magic-cookie-sticky.policy_name}",
   177    ]
   178  }
   179  `
   180  
   181  const testAccAWSLoadBalancerListenerPolicyConfig_basic1 = `
   182  resource "aws_elb" "test-lb" {
   183    name = "test-aws-policies-lb"
   184    availability_zones = ["us-west-2a"]
   185  
   186    listener {
   187      instance_port = 80
   188      instance_protocol = "http"
   189      lb_port = 80
   190      lb_protocol = "http"
   191    }
   192  
   193    tags {
   194      Name = "tf-acc-test"
   195    }
   196  }
   197  
   198  resource "aws_load_balancer_policy" "magic-cookie-sticky" {
   199    load_balancer_name = "${aws_elb.test-lb.name}"
   200    policy_name = "magic-cookie-sticky-policy"
   201    policy_type_name = "AppCookieStickinessPolicyType"
   202    policy_attribute = {
   203      name = "CookieName"
   204      value = "unicorn_cookie"
   205    }
   206  }
   207  
   208  resource "aws_load_balancer_listener_policy" "test-lb-listener-policies-80" {
   209    load_balancer_name = "${aws_elb.test-lb.name}"
   210    load_balancer_port = 80
   211    policy_names = [
   212      "${aws_load_balancer_policy.magic-cookie-sticky.policy_name}"
   213    ]
   214  }
   215  `
   216  
   217  const testAccAWSLoadBalancerListenerPolicyConfig_basic2 = `
   218  resource "aws_elb" "test-lb" {
   219    name = "test-aws-policies-lb"
   220    availability_zones = ["us-west-2a"]
   221  
   222    listener {
   223      instance_port = 80
   224      instance_protocol = "http"
   225      lb_port = 80
   226      lb_protocol = "http"
   227    }
   228  
   229    tags {
   230      Name = "tf-acc-test"
   231    }
   232  }
   233  `