github.com/ezbercih/terraform@v0.1.1-0.20140729011846-3c33865e0839/builtin/providers/aws/resource_aws_launch_configuration.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	"github.com/hashicorp/terraform/flatmap"
     8  	"github.com/hashicorp/terraform/helper/config"
     9  	"github.com/hashicorp/terraform/helper/diff"
    10  	"github.com/hashicorp/terraform/terraform"
    11  	"github.com/mitchellh/goamz/autoscaling"
    12  )
    13  
    14  func resource_aws_launch_configuration_create(
    15  	s *terraform.ResourceState,
    16  	d *terraform.ResourceDiff,
    17  	meta interface{}) (*terraform.ResourceState, error) {
    18  	p := meta.(*ResourceProvider)
    19  	autoscalingconn := p.autoscalingconn
    20  
    21  	// Merge the diff into the state so that we have all the attributes
    22  	// properly.
    23  	rs := s.MergeDiff(d)
    24  
    25  	var err error
    26  	createLaunchConfigurationOpts := autoscaling.CreateLaunchConfiguration{}
    27  
    28  	if rs.Attributes["image_id"] != "" {
    29  		createLaunchConfigurationOpts.ImageId = rs.Attributes["image_id"]
    30  	}
    31  
    32  	if rs.Attributes["instance_type"] != "" {
    33  		createLaunchConfigurationOpts.InstanceType = rs.Attributes["instance_type"]
    34  	}
    35  
    36  	if rs.Attributes["instance_id"] != "" {
    37  		createLaunchConfigurationOpts.InstanceId = rs.Attributes["instance_id"]
    38  	}
    39  
    40  	if rs.Attributes["key_name"] != "" {
    41  		createLaunchConfigurationOpts.KeyName = rs.Attributes["key_name"]
    42  	}
    43  
    44  	if err != nil {
    45  		return nil, fmt.Errorf("Error parsing configuration: %s", err)
    46  	}
    47  
    48  	if _, ok := rs.Attributes["security_groups.#"]; ok {
    49  		createLaunchConfigurationOpts.SecurityGroups = expandStringList(flatmap.Expand(
    50  			rs.Attributes, "security_groups").([]interface{}))
    51  	}
    52  
    53  	createLaunchConfigurationOpts.Name = rs.Attributes["name"]
    54  
    55  	log.Printf("[DEBUG] autoscaling create launch configuration: %#v", createLaunchConfigurationOpts)
    56  	_, err = autoscalingconn.CreateLaunchConfiguration(&createLaunchConfigurationOpts)
    57  	if err != nil {
    58  		return nil, fmt.Errorf("Error creating launch configuration: %s", err)
    59  	}
    60  
    61  	rs.ID = rs.Attributes["name"]
    62  
    63  	log.Printf("[INFO] launch configuration ID: %s", rs.ID)
    64  
    65  	g, err := resource_aws_launch_configuration_retrieve(rs.ID, autoscalingconn)
    66  	if err != nil {
    67  		return rs, err
    68  	}
    69  
    70  	return resource_aws_launch_configuration_update_state(rs, g)
    71  }
    72  
    73  func resource_aws_launch_configuration_update(
    74  	s *terraform.ResourceState,
    75  	d *terraform.ResourceDiff,
    76  	meta interface{}) (*terraform.ResourceState, error) {
    77  	panic("Update for AWS Launch Configuration is not supported")
    78  
    79  	return nil, nil
    80  }
    81  
    82  func resource_aws_launch_configuration_destroy(
    83  	s *terraform.ResourceState,
    84  	meta interface{}) error {
    85  	p := meta.(*ResourceProvider)
    86  	autoscalingconn := p.autoscalingconn
    87  
    88  	log.Printf("[DEBUG] Launch Configuration destroy: %v", s.ID)
    89  
    90  	_, err := autoscalingconn.DeleteLaunchConfiguration(&autoscaling.DeleteLaunchConfiguration{Name: s.ID})
    91  
    92  	if err != nil {
    93  		autoscalingerr, ok := err.(*autoscaling.Error)
    94  		if ok && autoscalingerr.Code == "InvalidConfiguration.NotFound" {
    95  			return nil
    96  		}
    97  		return err
    98  	}
    99  
   100  	return nil
   101  }
   102  
   103  func resource_aws_launch_configuration_refresh(
   104  	s *terraform.ResourceState,
   105  	meta interface{}) (*terraform.ResourceState, error) {
   106  	p := meta.(*ResourceProvider)
   107  	autoscalingconn := p.autoscalingconn
   108  
   109  	g, err := resource_aws_launch_configuration_retrieve(s.ID, autoscalingconn)
   110  
   111  	if err != nil {
   112  		return s, err
   113  	}
   114  
   115  	return resource_aws_launch_configuration_update_state(s, g)
   116  }
   117  
   118  func resource_aws_launch_configuration_diff(
   119  	s *terraform.ResourceState,
   120  	c *terraform.ResourceConfig,
   121  	meta interface{}) (*terraform.ResourceDiff, error) {
   122  
   123  	b := &diff.ResourceBuilder{
   124  		Attrs: map[string]diff.AttrType{
   125  			"image_id":        diff.AttrTypeCreate,
   126  			"instance_id":     diff.AttrTypeCreate,
   127  			"instance_type":   diff.AttrTypeCreate,
   128  			"key_name":        diff.AttrTypeCreate,
   129  			"name":            diff.AttrTypeCreate,
   130  			"security_groups": diff.AttrTypeCreate,
   131  		},
   132  
   133  		ComputedAttrs: []string{
   134  			"key_name",
   135  		},
   136  	}
   137  
   138  	return b.Diff(s, c)
   139  }
   140  
   141  func resource_aws_launch_configuration_update_state(
   142  	s *terraform.ResourceState,
   143  	lc *autoscaling.LaunchConfiguration) (*terraform.ResourceState, error) {
   144  
   145  	s.Attributes["image_id"] = lc.ImageId
   146  	s.Attributes["instance_type"] = lc.InstanceType
   147  	s.Attributes["key_name"] = lc.KeyName
   148  	s.Attributes["name"] = lc.Name
   149  
   150  	// Flatten our group values
   151  	toFlatten := make(map[string]interface{})
   152  
   153  	if len(lc.SecurityGroups) > 0 && lc.SecurityGroups[0].SecurityGroup != "" {
   154  		toFlatten["security_groups"] = flattenAutoscalingSecurityGroups(lc.SecurityGroups)
   155  	}
   156  
   157  	for k, v := range flatmap.Flatten(toFlatten) {
   158  		s.Attributes[k] = v
   159  	}
   160  
   161  	return s, nil
   162  }
   163  
   164  // Returns a single group by it's ID
   165  func resource_aws_launch_configuration_retrieve(id string, autoscalingconn *autoscaling.AutoScaling) (*autoscaling.LaunchConfiguration, error) {
   166  	describeOpts := autoscaling.DescribeLaunchConfigurations{
   167  		Names: []string{id},
   168  	}
   169  
   170  	log.Printf("[DEBUG] launch configuration describe configuration: %#v", describeOpts)
   171  
   172  	describConfs, err := autoscalingconn.DescribeLaunchConfigurations(&describeOpts)
   173  
   174  	if err != nil {
   175  		return nil, fmt.Errorf("Error retrieving launch configuration: %s", err)
   176  	}
   177  
   178  	// Verify AWS returned our launch configuration
   179  	if len(describConfs.LaunchConfigurations) != 1 ||
   180  		describConfs.LaunchConfigurations[0].Name != id {
   181  		if err != nil {
   182  			return nil, fmt.Errorf("Unable to find launch configuration: %#v", describConfs.LaunchConfigurations)
   183  		}
   184  	}
   185  
   186  	l := describConfs.LaunchConfigurations[0]
   187  
   188  	return &l, nil
   189  }
   190  
   191  func resource_aws_launch_configuration_validation() *config.Validator {
   192  	return &config.Validator{
   193  		Required: []string{
   194  			"name",
   195  			"image_id",
   196  			"instance_type",
   197  		},
   198  		Optional: []string{
   199  			"key_name",
   200  			"security_groups.*",
   201  		},
   202  	}
   203  }