github.com/econnell/terraform@v0.5.4-0.20150722160631-78eb236786a4/builtin/providers/aws/resource_aws_ecs_task_definition.go (about) 1 package aws 2 3 import ( 4 "bytes" 5 "crypto/sha1" 6 "encoding/hex" 7 "fmt" 8 "log" 9 10 "github.com/aws/aws-sdk-go/aws" 11 "github.com/aws/aws-sdk-go/aws/awsutil" 12 "github.com/aws/aws-sdk-go/service/ecs" 13 "github.com/hashicorp/terraform/helper/hashcode" 14 "github.com/hashicorp/terraform/helper/schema" 15 ) 16 17 func resourceAwsEcsTaskDefinition() *schema.Resource { 18 return &schema.Resource{ 19 Create: resourceAwsEcsTaskDefinitionCreate, 20 Read: resourceAwsEcsTaskDefinitionRead, 21 Update: resourceAwsEcsTaskDefinitionUpdate, 22 Delete: resourceAwsEcsTaskDefinitionDelete, 23 24 Schema: map[string]*schema.Schema{ 25 "arn": &schema.Schema{ 26 Type: schema.TypeString, 27 Computed: true, 28 }, 29 30 "family": &schema.Schema{ 31 Type: schema.TypeString, 32 Required: true, 33 ForceNew: true, 34 }, 35 36 "revision": &schema.Schema{ 37 Type: schema.TypeInt, 38 Computed: true, 39 }, 40 41 "container_definitions": &schema.Schema{ 42 Type: schema.TypeString, 43 Required: true, 44 StateFunc: func(v interface{}) string { 45 hash := sha1.Sum([]byte(v.(string))) 46 return hex.EncodeToString(hash[:]) 47 }, 48 }, 49 50 "volume": &schema.Schema{ 51 Type: schema.TypeSet, 52 Optional: true, 53 Elem: &schema.Resource{ 54 Schema: map[string]*schema.Schema{ 55 "name": &schema.Schema{ 56 Type: schema.TypeString, 57 Required: true, 58 }, 59 60 "host_path": &schema.Schema{ 61 Type: schema.TypeString, 62 Required: true, 63 }, 64 }, 65 }, 66 Set: resourceAwsEcsTaskDefinitionVolumeHash, 67 }, 68 }, 69 } 70 } 71 72 func resourceAwsEcsTaskDefinitionCreate(d *schema.ResourceData, meta interface{}) error { 73 conn := meta.(*AWSClient).ecsconn 74 75 rawDefinitions := d.Get("container_definitions").(string) 76 definitions, err := expandEcsContainerDefinitions(rawDefinitions) 77 if err != nil { 78 return err 79 } 80 81 input := ecs.RegisterTaskDefinitionInput{ 82 ContainerDefinitions: definitions, 83 Family: aws.String(d.Get("family").(string)), 84 } 85 86 if v, ok := d.GetOk("volume"); ok { 87 volumes, err := expandEcsVolumes(v.(*schema.Set).List()) 88 if err != nil { 89 return err 90 } 91 input.Volumes = volumes 92 } 93 94 log.Printf("[DEBUG] Registering ECS task definition: %s", awsutil.StringValue(input)) 95 out, err := conn.RegisterTaskDefinition(&input) 96 if err != nil { 97 return err 98 } 99 100 taskDefinition := *out.TaskDefinition 101 102 log.Printf("[DEBUG] ECS task definition registered: %q (rev. %d)", 103 *taskDefinition.TaskDefinitionARN, *taskDefinition.Revision) 104 105 d.SetId(*taskDefinition.Family) 106 d.Set("arn", *taskDefinition.TaskDefinitionARN) 107 108 return resourceAwsEcsTaskDefinitionRead(d, meta) 109 } 110 111 func resourceAwsEcsTaskDefinitionRead(d *schema.ResourceData, meta interface{}) error { 112 conn := meta.(*AWSClient).ecsconn 113 114 log.Printf("[DEBUG] Reading task definition %s", d.Id()) 115 out, err := conn.DescribeTaskDefinition(&ecs.DescribeTaskDefinitionInput{ 116 TaskDefinition: aws.String(d.Get("arn").(string)), 117 }) 118 if err != nil { 119 return err 120 } 121 log.Printf("[DEBUG] Received task definition %s", awsutil.StringValue(out)) 122 123 taskDefinition := out.TaskDefinition 124 125 d.SetId(*taskDefinition.Family) 126 d.Set("arn", *taskDefinition.TaskDefinitionARN) 127 d.Set("family", *taskDefinition.Family) 128 d.Set("revision", *taskDefinition.Revision) 129 d.Set("container_definitions", taskDefinition.ContainerDefinitions) 130 d.Set("volumes", flattenEcsVolumes(taskDefinition.Volumes)) 131 132 return nil 133 } 134 135 func resourceAwsEcsTaskDefinitionUpdate(d *schema.ResourceData, meta interface{}) error { 136 oldArn := d.Get("arn").(string) 137 138 log.Printf("[DEBUG] Creating new revision of task definition %q", d.Id()) 139 err := resourceAwsEcsTaskDefinitionCreate(d, meta) 140 if err != nil { 141 return err 142 } 143 log.Printf("[DEBUG] New revision of %q created: %q", d.Id(), d.Get("arn").(string)) 144 145 log.Printf("[DEBUG] Deregistering old revision of task definition %q: %q", d.Id(), oldArn) 146 conn := meta.(*AWSClient).ecsconn 147 _, err = conn.DeregisterTaskDefinition(&ecs.DeregisterTaskDefinitionInput{ 148 TaskDefinition: aws.String(oldArn), 149 }) 150 if err != nil { 151 return err 152 } 153 log.Printf("[DEBUG] Old revision of task definition deregistered: %q", oldArn) 154 155 return resourceAwsEcsTaskDefinitionRead(d, meta) 156 } 157 158 func resourceAwsEcsTaskDefinitionDelete(d *schema.ResourceData, meta interface{}) error { 159 conn := meta.(*AWSClient).ecsconn 160 161 _, err := conn.DeregisterTaskDefinition(&ecs.DeregisterTaskDefinitionInput{ 162 TaskDefinition: aws.String(d.Get("arn").(string)), 163 }) 164 if err != nil { 165 return err 166 } 167 168 log.Printf("[DEBUG] Task definition %q deregistered.", d.Get("arn").(string)) 169 170 return nil 171 } 172 173 func resourceAwsEcsTaskDefinitionVolumeHash(v interface{}) int { 174 var buf bytes.Buffer 175 m := v.(map[string]interface{}) 176 buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) 177 buf.WriteString(fmt.Sprintf("%s-", m["host_path"].(string))) 178 179 return hashcode.String(buf.String()) 180 }