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 }