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  }