github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/aws/resource_aws_placement_group.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "log" 6 "time" 7 8 "github.com/aws/aws-sdk-go/aws" 9 "github.com/aws/aws-sdk-go/aws/awserr" 10 "github.com/aws/aws-sdk-go/service/ec2" 11 "github.com/hashicorp/terraform/helper/resource" 12 "github.com/hashicorp/terraform/helper/schema" 13 ) 14 15 func resourceAwsPlacementGroup() *schema.Resource { 16 return &schema.Resource{ 17 Create: resourceAwsPlacementGroupCreate, 18 Read: resourceAwsPlacementGroupRead, 19 Delete: resourceAwsPlacementGroupDelete, 20 Importer: &schema.ResourceImporter{ 21 State: schema.ImportStatePassthrough, 22 }, 23 24 Schema: map[string]*schema.Schema{ 25 "name": &schema.Schema{ 26 Type: schema.TypeString, 27 Required: true, 28 ForceNew: true, 29 }, 30 "strategy": &schema.Schema{ 31 Type: schema.TypeString, 32 Required: true, 33 ForceNew: true, 34 }, 35 }, 36 } 37 } 38 39 func resourceAwsPlacementGroupCreate(d *schema.ResourceData, meta interface{}) error { 40 conn := meta.(*AWSClient).ec2conn 41 42 name := d.Get("name").(string) 43 input := ec2.CreatePlacementGroupInput{ 44 GroupName: aws.String(name), 45 Strategy: aws.String(d.Get("strategy").(string)), 46 } 47 log.Printf("[DEBUG] Creating EC2 Placement group: %s", input) 48 _, err := conn.CreatePlacementGroup(&input) 49 if err != nil { 50 return err 51 } 52 53 wait := resource.StateChangeConf{ 54 Pending: []string{"pending"}, 55 Target: []string{"available"}, 56 Timeout: 5 * time.Minute, 57 MinTimeout: 1 * time.Second, 58 Refresh: func() (interface{}, string, error) { 59 out, err := conn.DescribePlacementGroups(&ec2.DescribePlacementGroupsInput{ 60 GroupNames: []*string{aws.String(name)}, 61 }) 62 63 if err != nil { 64 return out, "", err 65 } 66 67 if len(out.PlacementGroups) == 0 { 68 return out, "", fmt.Errorf("Placement group not found (%q)", name) 69 } 70 pg := out.PlacementGroups[0] 71 72 return out, *pg.State, nil 73 }, 74 } 75 76 _, err = wait.WaitForState() 77 if err != nil { 78 return err 79 } 80 81 log.Printf("[DEBUG] EC2 Placement group created: %q", name) 82 83 d.SetId(name) 84 85 return resourceAwsPlacementGroupRead(d, meta) 86 } 87 88 func resourceAwsPlacementGroupRead(d *schema.ResourceData, meta interface{}) error { 89 conn := meta.(*AWSClient).ec2conn 90 input := ec2.DescribePlacementGroupsInput{ 91 GroupNames: []*string{aws.String(d.Id())}, 92 } 93 out, err := conn.DescribePlacementGroups(&input) 94 if err != nil { 95 return err 96 } 97 pg := out.PlacementGroups[0] 98 99 log.Printf("[DEBUG] Received EC2 Placement Group: %s", pg) 100 101 d.Set("name", pg.GroupName) 102 d.Set("strategy", pg.Strategy) 103 104 return nil 105 } 106 107 func resourceAwsPlacementGroupDelete(d *schema.ResourceData, meta interface{}) error { 108 conn := meta.(*AWSClient).ec2conn 109 110 log.Printf("[DEBUG] Deleting EC2 Placement Group %q", d.Id()) 111 _, err := conn.DeletePlacementGroup(&ec2.DeletePlacementGroupInput{ 112 GroupName: aws.String(d.Id()), 113 }) 114 if err != nil { 115 return err 116 } 117 118 wait := resource.StateChangeConf{ 119 Pending: []string{"deleting"}, 120 Target: []string{"deleted"}, 121 Timeout: 5 * time.Minute, 122 MinTimeout: 1 * time.Second, 123 Refresh: func() (interface{}, string, error) { 124 out, err := conn.DescribePlacementGroups(&ec2.DescribePlacementGroupsInput{ 125 GroupNames: []*string{aws.String(d.Id())}, 126 }) 127 128 if err != nil { 129 awsErr := err.(awserr.Error) 130 if awsErr.Code() == "InvalidPlacementGroup.Unknown" { 131 return out, "deleted", nil 132 } 133 return out, "", awsErr 134 } 135 136 if len(out.PlacementGroups) == 0 { 137 return out, "deleted", nil 138 } 139 140 pg := out.PlacementGroups[0] 141 142 return out, *pg.State, nil 143 }, 144 } 145 146 _, err = wait.WaitForState() 147 if err != nil { 148 return err 149 } 150 151 d.SetId("") 152 return nil 153 }