2014-07-03 00:55:28 +02:00
|
|
|
package aws
|
|
|
|
|
|
|
|
import (
|
2014-07-17 00:51:50 +02:00
|
|
|
"strings"
|
|
|
|
|
2015-02-26 16:33:33 +01:00
|
|
|
"github.com/hashicorp/aws-sdk-go/aws"
|
2015-03-12 22:49:38 +01:00
|
|
|
"github.com/hashicorp/aws-sdk-go/gen/ec2"
|
2015-03-02 16:44:06 +01:00
|
|
|
"github.com/hashicorp/aws-sdk-go/gen/elb"
|
2015-02-26 16:33:33 +01:00
|
|
|
"github.com/hashicorp/aws-sdk-go/gen/rds"
|
2014-10-21 19:49:27 +02:00
|
|
|
"github.com/hashicorp/terraform/helper/schema"
|
2014-07-03 00:55:28 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
// Takes the result of flatmap.Expand for an array of listeners and
|
|
|
|
// returns ELB API compatible objects
|
2014-07-25 00:50:18 +02:00
|
|
|
func expandListeners(configured []interface{}) ([]elb.Listener, error) {
|
2014-07-03 00:55:28 +02:00
|
|
|
listeners := make([]elb.Listener, 0, len(configured))
|
|
|
|
|
|
|
|
// Loop over our configured listeners and create
|
2015-03-12 22:49:38 +01:00
|
|
|
// an array of aws-sdk-go compatabile objects
|
2014-10-10 08:58:48 +02:00
|
|
|
for _, lRaw := range configured {
|
|
|
|
data := lRaw.(map[string]interface{})
|
2014-07-25 00:50:18 +02:00
|
|
|
|
2014-07-03 00:55:28 +02:00
|
|
|
l := elb.Listener{
|
2015-03-02 16:44:06 +01:00
|
|
|
InstancePort: aws.Integer(data["instance_port"].(int)),
|
|
|
|
InstanceProtocol: aws.String(data["instance_protocol"].(string)),
|
|
|
|
LoadBalancerPort: aws.Integer(data["lb_port"].(int)),
|
|
|
|
Protocol: aws.String(data["lb_protocol"].(string)),
|
2014-07-03 00:55:28 +02:00
|
|
|
}
|
|
|
|
|
2014-10-10 08:58:48 +02:00
|
|
|
if v, ok := data["ssl_certificate_id"]; ok {
|
2015-03-02 16:44:06 +01:00
|
|
|
l.SSLCertificateID = aws.String(v.(string))
|
2014-08-11 01:09:05 +02:00
|
|
|
}
|
|
|
|
|
2014-07-03 00:55:28 +02:00
|
|
|
listeners = append(listeners, l)
|
|
|
|
}
|
|
|
|
|
2014-07-25 00:50:18 +02:00
|
|
|
return listeners, nil
|
2014-07-03 00:55:28 +02:00
|
|
|
}
|
2014-07-03 01:57:57 +02:00
|
|
|
|
2014-07-08 22:33:59 +02:00
|
|
|
// Takes the result of flatmap.Expand for an array of ingress/egress
|
|
|
|
// security group rules and returns EC2 API compatible objects
|
2015-03-18 14:47:59 +01:00
|
|
|
func expandIPPerms(
|
|
|
|
group ec2.SecurityGroup, configured []interface{}) []ec2.IPPermission {
|
|
|
|
vpc := group.VPCID != nil
|
|
|
|
|
2015-03-12 22:49:38 +01:00
|
|
|
perms := make([]ec2.IPPermission, len(configured))
|
2015-03-09 16:02:27 +01:00
|
|
|
for i, mRaw := range configured {
|
2015-03-12 22:49:38 +01:00
|
|
|
var perm ec2.IPPermission
|
2015-03-09 16:02:27 +01:00
|
|
|
m := mRaw.(map[string]interface{})
|
|
|
|
|
|
|
|
perm.FromPort = aws.Integer(m["from_port"].(int))
|
|
|
|
perm.ToPort = aws.Integer(m["to_port"].(int))
|
|
|
|
perm.IPProtocol = aws.String(m["protocol"].(string))
|
|
|
|
|
|
|
|
var groups []string
|
|
|
|
if raw, ok := m["security_groups"]; ok {
|
|
|
|
list := raw.(*schema.Set).List()
|
|
|
|
for _, v := range list {
|
|
|
|
groups = append(groups, v.(string))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if v, ok := m["self"]; ok && v.(bool) {
|
2015-03-18 14:47:59 +01:00
|
|
|
if vpc {
|
|
|
|
groups = append(groups, *group.GroupID)
|
|
|
|
} else {
|
|
|
|
groups = append(groups, *group.GroupName)
|
|
|
|
}
|
2015-03-09 16:02:27 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if len(groups) > 0 {
|
2015-03-12 22:49:38 +01:00
|
|
|
perm.UserIDGroupPairs = make([]ec2.UserIDGroupPair, len(groups))
|
2015-03-09 16:02:27 +01:00
|
|
|
for i, name := range groups {
|
|
|
|
ownerId, id := "", name
|
|
|
|
if items := strings.Split(id, "/"); len(items) > 1 {
|
|
|
|
ownerId, id = items[0], items[1]
|
|
|
|
}
|
|
|
|
|
2015-03-12 22:49:38 +01:00
|
|
|
perm.UserIDGroupPairs[i] = ec2.UserIDGroupPair{
|
2015-03-09 16:02:27 +01:00
|
|
|
GroupID: aws.String(id),
|
|
|
|
UserID: aws.String(ownerId),
|
|
|
|
}
|
2015-03-18 14:47:59 +01:00
|
|
|
if !vpc {
|
|
|
|
perm.UserIDGroupPairs[i].GroupID = nil
|
|
|
|
perm.UserIDGroupPairs[i].GroupName = aws.String(id)
|
|
|
|
perm.UserIDGroupPairs[i].UserID = nil
|
|
|
|
}
|
2015-03-09 16:02:27 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if raw, ok := m["cidr_blocks"]; ok {
|
|
|
|
list := raw.([]interface{})
|
2015-03-12 22:49:38 +01:00
|
|
|
perm.IPRanges = make([]ec2.IPRange, len(list))
|
2015-03-09 16:02:27 +01:00
|
|
|
for i, v := range list {
|
2015-03-12 22:49:38 +01:00
|
|
|
perm.IPRanges[i] = ec2.IPRange{aws.String(v.(string))}
|
2015-03-09 16:02:27 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
perms[i] = perm
|
|
|
|
}
|
|
|
|
|
|
|
|
return perms
|
|
|
|
}
|
|
|
|
|
2014-10-22 23:22:30 +02:00
|
|
|
// Takes the result of flatmap.Expand for an array of parameters and
|
|
|
|
// returns Parameter API compatible objects
|
|
|
|
func expandParameters(configured []interface{}) ([]rds.Parameter, error) {
|
|
|
|
parameters := make([]rds.Parameter, 0, len(configured))
|
|
|
|
|
|
|
|
// Loop over our configured parameters and create
|
2015-03-12 22:49:38 +01:00
|
|
|
// an array of aws-sdk-go compatabile objects
|
2014-10-22 23:22:30 +02:00
|
|
|
for _, pRaw := range configured {
|
|
|
|
data := pRaw.(map[string]interface{})
|
|
|
|
|
|
|
|
p := rds.Parameter{
|
2015-02-26 16:33:33 +01:00
|
|
|
ApplyMethod: aws.String(data["apply_method"].(string)),
|
|
|
|
ParameterName: aws.String(data["name"].(string)),
|
|
|
|
ParameterValue: aws.String(data["value"].(string)),
|
2014-10-22 23:22:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
parameters = append(parameters, p)
|
|
|
|
}
|
|
|
|
|
|
|
|
return parameters, nil
|
|
|
|
}
|
|
|
|
|
2014-07-30 16:15:22 +02:00
|
|
|
// Flattens a health check into something that flatmap.Flatten()
|
|
|
|
// can handle
|
2015-03-02 16:44:06 +01:00
|
|
|
func flattenHealthCheck(check *elb.HealthCheck) []map[string]interface{} {
|
2014-07-30 16:15:22 +02:00
|
|
|
result := make([]map[string]interface{}, 0, 1)
|
|
|
|
|
|
|
|
chk := make(map[string]interface{})
|
2015-03-02 16:44:06 +01:00
|
|
|
chk["unhealthy_threshold"] = *check.UnhealthyThreshold
|
|
|
|
chk["healthy_threshold"] = *check.HealthyThreshold
|
|
|
|
chk["target"] = *check.Target
|
|
|
|
chk["timeout"] = *check.Timeout
|
|
|
|
chk["interval"] = *check.Interval
|
2014-07-30 16:15:22 +02:00
|
|
|
|
|
|
|
result = append(result, chk)
|
|
|
|
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
2014-07-10 20:15:58 +02:00
|
|
|
// Flattens an array of UserSecurityGroups into a []string
|
2015-03-13 15:42:50 +01:00
|
|
|
func flattenSecurityGroups(list []ec2.UserIDGroupPair) []string {
|
2015-03-09 16:02:27 +01:00
|
|
|
result := make([]string, 0, len(list))
|
|
|
|
for _, g := range list {
|
|
|
|
result = append(result, *g.GroupID)
|
|
|
|
}
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
2014-07-16 23:02:47 +02:00
|
|
|
// Flattens an array of Instances into a []string
|
|
|
|
func flattenInstances(list []elb.Instance) []string {
|
|
|
|
result := make([]string, 0, len(list))
|
|
|
|
for _, i := range list {
|
2015-03-02 16:44:06 +01:00
|
|
|
result = append(result, *i.InstanceID)
|
|
|
|
}
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
|
|
|
// Expands an array of String Instance IDs into a []Instances
|
|
|
|
func expandInstanceString(list []interface{}) []elb.Instance {
|
|
|
|
result := make([]elb.Instance, 0, len(list))
|
|
|
|
for _, i := range list {
|
|
|
|
result = append(result, elb.Instance{aws.String(i.(string))})
|
2014-07-16 23:02:47 +02:00
|
|
|
}
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
2014-10-11 01:35:52 +02:00
|
|
|
// Flattens an array of Listeners into a []map[string]interface{}
|
2015-03-02 16:44:06 +01:00
|
|
|
func flattenListeners(list []elb.ListenerDescription) []map[string]interface{} {
|
2014-10-11 01:35:52 +02:00
|
|
|
result := make([]map[string]interface{}, 0, len(list))
|
|
|
|
for _, i := range list {
|
2015-03-02 16:44:06 +01:00
|
|
|
l := map[string]interface{}{
|
|
|
|
"instance_port": *i.Listener.InstancePort,
|
|
|
|
"instance_protocol": strings.ToLower(*i.Listener.InstanceProtocol),
|
|
|
|
"lb_port": *i.Listener.LoadBalancerPort,
|
|
|
|
"lb_protocol": strings.ToLower(*i.Listener.Protocol),
|
|
|
|
}
|
|
|
|
// SSLCertificateID is optional, and may be nil
|
|
|
|
if i.Listener.SSLCertificateID != nil {
|
|
|
|
l["ssl_certificate_id"] = *i.Listener.SSLCertificateID
|
|
|
|
}
|
|
|
|
result = append(result, l)
|
2014-10-11 01:35:52 +02:00
|
|
|
}
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
2014-10-23 02:03:57 +02:00
|
|
|
// Flattens an array of Parameters into a []map[string]interface{}
|
2014-10-22 23:22:30 +02:00
|
|
|
func flattenParameters(list []rds.Parameter) []map[string]interface{} {
|
|
|
|
result := make([]map[string]interface{}, 0, len(list))
|
|
|
|
for _, i := range list {
|
|
|
|
result = append(result, map[string]interface{}{
|
2015-02-26 16:33:33 +01:00
|
|
|
"name": strings.ToLower(*i.ParameterName),
|
|
|
|
"value": strings.ToLower(*i.ParameterValue),
|
2014-11-24 21:22:18 +01:00
|
|
|
})
|
2014-10-22 23:22:30 +02:00
|
|
|
}
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
2014-07-03 01:57:57 +02:00
|
|
|
// Takes the result of flatmap.Expand for an array of strings
|
|
|
|
// and returns a []string
|
|
|
|
func expandStringList(configured []interface{}) []string {
|
|
|
|
vs := make([]string, 0, len(configured))
|
|
|
|
for _, v := range configured {
|
|
|
|
vs = append(vs, v.(string))
|
|
|
|
}
|
|
|
|
return vs
|
|
|
|
}
|