github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/aws/resource_aws_load_balancer_backend_server_policy.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "strconv" 6 "strings" 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 "github.com/hashicorp/terraform/helper/schema" 12 ) 13 14 func resourceAwsLoadBalancerBackendServerPolicies() *schema.Resource { 15 return &schema.Resource{ 16 Create: resourceAwsLoadBalancerBackendServerPoliciesCreate, 17 Read: resourceAwsLoadBalancerBackendServerPoliciesRead, 18 Update: resourceAwsLoadBalancerBackendServerPoliciesCreate, 19 Delete: resourceAwsLoadBalancerBackendServerPoliciesDelete, 20 21 Schema: map[string]*schema.Schema{ 22 "load_balancer_name": &schema.Schema{ 23 Type: schema.TypeString, 24 Required: true, 25 }, 26 27 "policy_names": &schema.Schema{ 28 Type: schema.TypeSet, 29 Elem: &schema.Schema{Type: schema.TypeString}, 30 Optional: true, 31 Set: schema.HashString, 32 }, 33 34 "instance_port": &schema.Schema{ 35 Type: schema.TypeInt, 36 Required: true, 37 }, 38 }, 39 } 40 } 41 42 func resourceAwsLoadBalancerBackendServerPoliciesCreate(d *schema.ResourceData, meta interface{}) error { 43 elbconn := meta.(*AWSClient).elbconn 44 45 loadBalancerName := d.Get("load_balancer_name") 46 47 policyNames := []*string{} 48 if v, ok := d.GetOk("policy_names"); ok { 49 policyNames = expandStringList(v.(*schema.Set).List()) 50 } 51 52 setOpts := &elb.SetLoadBalancerPoliciesForBackendServerInput{ 53 LoadBalancerName: aws.String(loadBalancerName.(string)), 54 InstancePort: aws.Int64(int64(d.Get("instance_port").(int))), 55 PolicyNames: policyNames, 56 } 57 58 if _, err := elbconn.SetLoadBalancerPoliciesForBackendServer(setOpts); err != nil { 59 return fmt.Errorf("Error setting LoadBalancerPoliciesForBackendServer: %s", err) 60 } 61 62 d.SetId(fmt.Sprintf("%s:%s", *setOpts.LoadBalancerName, strconv.FormatInt(*setOpts.InstancePort, 10))) 63 return resourceAwsLoadBalancerBackendServerPoliciesRead(d, meta) 64 } 65 66 func resourceAwsLoadBalancerBackendServerPoliciesRead(d *schema.ResourceData, meta interface{}) error { 67 elbconn := meta.(*AWSClient).elbconn 68 69 loadBalancerName, instancePort := resourceAwsLoadBalancerBackendServerPoliciesParseId(d.Id()) 70 71 describeElbOpts := &elb.DescribeLoadBalancersInput{ 72 LoadBalancerNames: []*string{aws.String(loadBalancerName)}, 73 } 74 75 describeResp, err := elbconn.DescribeLoadBalancers(describeElbOpts) 76 77 if err != nil { 78 if ec2err, ok := err.(awserr.Error); ok { 79 if ec2err.Code() == "LoadBalancerNotFound" { 80 d.SetId("") 81 return fmt.Errorf("LoadBalancerNotFound: %s", err) 82 } 83 } 84 return fmt.Errorf("Error retrieving ELB description: %s", err) 85 } 86 87 if len(describeResp.LoadBalancerDescriptions) != 1 { 88 return fmt.Errorf("Unable to find ELB: %#v", describeResp.LoadBalancerDescriptions) 89 } 90 91 lb := describeResp.LoadBalancerDescriptions[0] 92 93 policyNames := []*string{} 94 for _, backendServer := range lb.BackendServerDescriptions { 95 if instancePort != strconv.Itoa(int(*backendServer.InstancePort)) { 96 continue 97 } 98 99 for _, name := range backendServer.PolicyNames { 100 policyNames = append(policyNames, name) 101 } 102 } 103 104 d.Set("load_balancer_name", loadBalancerName) 105 d.Set("instance_port", instancePort) 106 d.Set("policy_names", flattenStringList(policyNames)) 107 108 return nil 109 } 110 111 func resourceAwsLoadBalancerBackendServerPoliciesDelete(d *schema.ResourceData, meta interface{}) error { 112 elbconn := meta.(*AWSClient).elbconn 113 114 loadBalancerName, instancePort := resourceAwsLoadBalancerBackendServerPoliciesParseId(d.Id()) 115 116 instancePortInt, err := strconv.ParseInt(instancePort, 10, 64) 117 if err != nil { 118 return fmt.Errorf("Error parsing instancePort as integer: %s", err) 119 } 120 121 setOpts := &elb.SetLoadBalancerPoliciesForBackendServerInput{ 122 LoadBalancerName: aws.String(loadBalancerName), 123 InstancePort: aws.Int64(instancePortInt), 124 PolicyNames: []*string{}, 125 } 126 127 if _, err := elbconn.SetLoadBalancerPoliciesForBackendServer(setOpts); err != nil { 128 return fmt.Errorf("Error setting LoadBalancerPoliciesForBackendServer: %s", err) 129 } 130 131 d.SetId("") 132 return nil 133 } 134 135 func resourceAwsLoadBalancerBackendServerPoliciesParseId(id string) (string, string) { 136 parts := strings.SplitN(id, ":", 2) 137 return parts[0], parts[1] 138 }