github.com/nathanielks/terraform@v0.6.1-0.20170509030759-13e1a62319dc/builtin/providers/aws/resource_aws_ssm_maintenance_window_target.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "log" 6 7 "github.com/aws/aws-sdk-go/aws" 8 "github.com/aws/aws-sdk-go/service/ssm" 9 "github.com/hashicorp/terraform/helper/schema" 10 ) 11 12 func resourceAwsSsmMaintenanceWindowTarget() *schema.Resource { 13 return &schema.Resource{ 14 Create: resourceAwsSsmMaintenanceWindowTargetCreate, 15 Read: resourceAwsSsmMaintenanceWindowTargetRead, 16 Delete: resourceAwsSsmMaintenanceWindowTargetDelete, 17 18 Schema: map[string]*schema.Schema{ 19 "window_id": { 20 Type: schema.TypeString, 21 Required: true, 22 ForceNew: true, 23 }, 24 25 "resource_type": { 26 Type: schema.TypeString, 27 Required: true, 28 ForceNew: true, 29 }, 30 31 "targets": { 32 Type: schema.TypeList, 33 Required: true, 34 ForceNew: true, 35 MaxItems: 1, 36 Elem: &schema.Resource{ 37 Schema: map[string]*schema.Schema{ 38 "key": { 39 Type: schema.TypeString, 40 Required: true, 41 }, 42 "values": { 43 Type: schema.TypeList, 44 Required: true, 45 Elem: &schema.Schema{Type: schema.TypeString}, 46 }, 47 }, 48 }, 49 }, 50 51 "owner_information": { 52 Type: schema.TypeString, 53 ForceNew: true, 54 Optional: true, 55 }, 56 }, 57 } 58 } 59 60 func expandAwsSsmMaintenanceWindowTargets(d *schema.ResourceData) []*ssm.Target { 61 var targets []*ssm.Target 62 63 targetConfig := d.Get("targets").([]interface{}) 64 65 for _, tConfig := range targetConfig { 66 config := tConfig.(map[string]interface{}) 67 68 target := &ssm.Target{ 69 Key: aws.String(config["key"].(string)), 70 Values: expandStringList(config["values"].([]interface{})), 71 } 72 73 targets = append(targets, target) 74 } 75 76 return targets 77 } 78 79 func flattenAwsSsmMaintenanceWindowTargets(targets []*ssm.Target) []map[string]interface{} { 80 if len(targets) == 0 { 81 return nil 82 } 83 84 result := make([]map[string]interface{}, 0, len(targets)) 85 target := targets[0] 86 87 t := make(map[string]interface{}) 88 t["key"] = *target.Key 89 t["values"] = flattenStringList(target.Values) 90 91 result = append(result, t) 92 93 return result 94 } 95 96 func resourceAwsSsmMaintenanceWindowTargetCreate(d *schema.ResourceData, meta interface{}) error { 97 ssmconn := meta.(*AWSClient).ssmconn 98 99 log.Printf("[INFO] Registering SSM Maintenance Window Target") 100 101 params := &ssm.RegisterTargetWithMaintenanceWindowInput{ 102 WindowId: aws.String(d.Get("window_id").(string)), 103 ResourceType: aws.String(d.Get("resource_type").(string)), 104 Targets: expandAwsSsmMaintenanceWindowTargets(d), 105 } 106 107 if v, ok := d.GetOk("owner_information"); ok { 108 params.OwnerInformation = aws.String(v.(string)) 109 } 110 111 resp, err := ssmconn.RegisterTargetWithMaintenanceWindow(params) 112 if err != nil { 113 return err 114 } 115 116 d.SetId(*resp.WindowTargetId) 117 118 return resourceAwsSsmMaintenanceWindowTargetRead(d, meta) 119 } 120 121 func resourceAwsSsmMaintenanceWindowTargetRead(d *schema.ResourceData, meta interface{}) error { 122 ssmconn := meta.(*AWSClient).ssmconn 123 124 params := &ssm.DescribeMaintenanceWindowTargetsInput{ 125 WindowId: aws.String(d.Get("window_id").(string)), 126 Filters: []*ssm.MaintenanceWindowFilter{ 127 { 128 Key: aws.String("WindowTargetId"), 129 Values: []*string{aws.String(d.Id())}, 130 }, 131 }, 132 } 133 134 resp, err := ssmconn.DescribeMaintenanceWindowTargets(params) 135 if err != nil { 136 return err 137 } 138 139 found := false 140 for _, t := range resp.Targets { 141 if *t.WindowTargetId == d.Id() { 142 found = true 143 144 d.Set("owner_information", t.OwnerInformation) 145 d.Set("window_id", t.WindowId) 146 d.Set("resource_type", t.ResourceType) 147 148 if err := d.Set("targets", flattenAwsSsmMaintenanceWindowTargets(t.Targets)); err != nil { 149 return fmt.Errorf("[DEBUG] Error setting targets error: %#v", err) 150 } 151 } 152 } 153 154 if !found { 155 log.Printf("[INFO] Maintenance Window Target not found. Removing from state") 156 d.SetId("") 157 return nil 158 } 159 160 return nil 161 } 162 163 func resourceAwsSsmMaintenanceWindowTargetDelete(d *schema.ResourceData, meta interface{}) error { 164 ssmconn := meta.(*AWSClient).ssmconn 165 166 log.Printf("[INFO] Deregistering SSM Maintenance Window Target: %s", d.Id()) 167 168 params := &ssm.DeregisterTargetFromMaintenanceWindowInput{ 169 WindowId: aws.String(d.Get("window_id").(string)), 170 WindowTargetId: aws.String(d.Id()), 171 } 172 173 _, err := ssmconn.DeregisterTargetFromMaintenanceWindow(params) 174 if err != nil { 175 return err 176 } 177 178 return nil 179 }