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