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  }