github.com/koding/terraform@v0.6.4-0.20170608090606-5d7e0339779d/builtin/providers/aws/resource_aws_ssm_maintenance_window_task.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 resourceAwsSsmMaintenanceWindowTask() *schema.Resource { 13 return &schema.Resource{ 14 Create: resourceAwsSsmMaintenanceWindowTaskCreate, 15 Read: resourceAwsSsmMaintenanceWindowTaskRead, 16 Delete: resourceAwsSsmMaintenanceWindowTaskDelete, 17 18 Schema: map[string]*schema.Schema{ 19 "window_id": { 20 Type: schema.TypeString, 21 Required: true, 22 ForceNew: true, 23 }, 24 25 "max_concurrency": { 26 Type: schema.TypeString, 27 Required: true, 28 ForceNew: true, 29 }, 30 31 "max_errors": { 32 Type: schema.TypeString, 33 Required: true, 34 ForceNew: true, 35 }, 36 37 "task_type": { 38 Type: schema.TypeString, 39 Required: true, 40 ForceNew: true, 41 }, 42 43 "task_arn": { 44 Type: schema.TypeString, 45 Required: true, 46 ForceNew: true, 47 }, 48 49 "service_role_arn": { 50 Type: schema.TypeString, 51 Required: true, 52 ForceNew: true, 53 }, 54 55 "targets": { 56 Type: schema.TypeList, 57 Required: true, 58 ForceNew: true, 59 Elem: &schema.Resource{ 60 Schema: map[string]*schema.Schema{ 61 "key": { 62 Type: schema.TypeString, 63 Required: true, 64 }, 65 "values": { 66 Type: schema.TypeList, 67 Required: true, 68 Elem: &schema.Schema{Type: schema.TypeString}, 69 }, 70 }, 71 }, 72 }, 73 74 "priority": { 75 Type: schema.TypeInt, 76 Optional: true, 77 ForceNew: true, 78 }, 79 80 "logging_info": { 81 Type: schema.TypeList, 82 MaxItems: 1, 83 Optional: true, 84 ForceNew: true, 85 Elem: &schema.Resource{ 86 Schema: map[string]*schema.Schema{ 87 "s3_bucket_name": { 88 Type: schema.TypeString, 89 Required: true, 90 }, 91 "s3_region": { 92 Type: schema.TypeString, 93 Required: true, 94 }, 95 "s3_bucket_prefix": { 96 Type: schema.TypeString, 97 Optional: true, 98 }, 99 }, 100 }, 101 }, 102 103 "task_parameters": { 104 Type: schema.TypeList, 105 Optional: true, 106 ForceNew: true, 107 Elem: &schema.Resource{ 108 Schema: map[string]*schema.Schema{ 109 "name": { 110 Type: schema.TypeString, 111 Required: true, 112 }, 113 "values": { 114 Type: schema.TypeList, 115 Required: true, 116 Elem: &schema.Schema{Type: schema.TypeString}, 117 }, 118 }, 119 }, 120 }, 121 }, 122 } 123 } 124 125 func expandAwsSsmMaintenanceWindowLoggingInfo(config []interface{}) *ssm.LoggingInfo { 126 127 loggingConfig := config[0].(map[string]interface{}) 128 129 loggingInfo := &ssm.LoggingInfo{ 130 S3BucketName: aws.String(loggingConfig["s3_bucket_name"].(string)), 131 S3Region: aws.String(loggingConfig["s3_region"].(string)), 132 } 133 134 if s := loggingConfig["s3_bucket_prefix"].(string); s != "" { 135 loggingInfo.S3KeyPrefix = aws.String(s) 136 } 137 138 return loggingInfo 139 } 140 141 func flattenAwsSsmMaintenanceWindowLoggingInfo(loggingInfo *ssm.LoggingInfo) []interface{} { 142 143 result := make(map[string]interface{}) 144 result["s3_bucket_name"] = *loggingInfo.S3BucketName 145 result["s3_region"] = *loggingInfo.S3Region 146 147 if loggingInfo.S3KeyPrefix != nil { 148 result["s3_bucket_prefix"] = *loggingInfo.S3KeyPrefix 149 } 150 151 return []interface{}{result} 152 } 153 154 func expandAwsSsmTaskParameters(config []interface{}) map[string]*ssm.MaintenanceWindowTaskParameterValueExpression { 155 params := make(map[string]*ssm.MaintenanceWindowTaskParameterValueExpression) 156 for _, v := range config { 157 paramConfig := v.(map[string]interface{}) 158 params[paramConfig["name"].(string)] = &ssm.MaintenanceWindowTaskParameterValueExpression{ 159 Values: expandStringList(paramConfig["values"].([]interface{})), 160 } 161 } 162 return params 163 } 164 165 func flattenAwsSsmTaskParameters(taskParameters map[string]*ssm.MaintenanceWindowTaskParameterValueExpression) []interface{} { 166 result := make([]interface{}, 0, len(taskParameters)) 167 for k, v := range taskParameters { 168 taskParam := map[string]interface{}{ 169 "name": k, 170 "values": flattenStringList(v.Values), 171 } 172 result = append(result, taskParam) 173 } 174 175 return result 176 } 177 178 func resourceAwsSsmMaintenanceWindowTaskCreate(d *schema.ResourceData, meta interface{}) error { 179 ssmconn := meta.(*AWSClient).ssmconn 180 181 log.Printf("[INFO] Registering SSM Maintenance Window Task") 182 183 params := &ssm.RegisterTaskWithMaintenanceWindowInput{ 184 WindowId: aws.String(d.Get("window_id").(string)), 185 MaxConcurrency: aws.String(d.Get("max_concurrency").(string)), 186 MaxErrors: aws.String(d.Get("max_errors").(string)), 187 TaskType: aws.String(d.Get("task_type").(string)), 188 ServiceRoleArn: aws.String(d.Get("service_role_arn").(string)), 189 TaskArn: aws.String(d.Get("task_arn").(string)), 190 Targets: expandAwsSsmTargets(d), 191 } 192 193 if v, ok := d.GetOk("priority"); ok { 194 params.Priority = aws.Int64(int64(v.(int))) 195 } 196 197 if v, ok := d.GetOk("logging_info"); ok { 198 params.LoggingInfo = expandAwsSsmMaintenanceWindowLoggingInfo(v.([]interface{})) 199 } 200 201 if v, ok := d.GetOk("task_parameters"); ok { 202 params.TaskParameters = expandAwsSsmTaskParameters(v.([]interface{})) 203 } 204 205 resp, err := ssmconn.RegisterTaskWithMaintenanceWindow(params) 206 if err != nil { 207 return err 208 } 209 210 d.SetId(*resp.WindowTaskId) 211 212 return resourceAwsSsmMaintenanceWindowTaskRead(d, meta) 213 } 214 215 func resourceAwsSsmMaintenanceWindowTaskRead(d *schema.ResourceData, meta interface{}) error { 216 ssmconn := meta.(*AWSClient).ssmconn 217 218 params := &ssm.DescribeMaintenanceWindowTasksInput{ 219 WindowId: aws.String(d.Get("window_id").(string)), 220 } 221 222 resp, err := ssmconn.DescribeMaintenanceWindowTasks(params) 223 if err != nil { 224 return err 225 } 226 227 found := false 228 for _, t := range resp.Tasks { 229 if *t.WindowTaskId == d.Id() { 230 found = true 231 232 d.Set("window_id", t.WindowId) 233 d.Set("max_concurrency", t.MaxConcurrency) 234 d.Set("max_errors", t.MaxErrors) 235 d.Set("task_type", t.Type) 236 d.Set("service_role_arn", t.ServiceRoleArn) 237 d.Set("task_arn", t.TaskArn) 238 d.Set("priority", t.Priority) 239 240 if t.LoggingInfo != nil { 241 if err := d.Set("logging_info", flattenAwsSsmMaintenanceWindowLoggingInfo(t.LoggingInfo)); err != nil { 242 return fmt.Errorf("[DEBUG] Error setting logging_info error: %#v", err) 243 } 244 } 245 246 if t.TaskParameters != nil { 247 if err := d.Set("task_parameters", flattenAwsSsmTaskParameters(t.TaskParameters)); err != nil { 248 return fmt.Errorf("[DEBUG] Error setting task_parameters error: %#v", err) 249 } 250 } 251 252 if err := d.Set("targets", flattenAwsSsmTargets(t.Targets)); err != nil { 253 return fmt.Errorf("[DEBUG] Error setting targets error: %#v", err) 254 } 255 } 256 } 257 258 if !found { 259 log.Printf("[INFO] Maintenance Window Target not found. Removing from state") 260 d.SetId("") 261 return nil 262 } 263 264 return nil 265 } 266 267 func resourceAwsSsmMaintenanceWindowTaskDelete(d *schema.ResourceData, meta interface{}) error { 268 ssmconn := meta.(*AWSClient).ssmconn 269 270 log.Printf("[INFO] Deregistering SSM Maintenance Window Task: %s", d.Id()) 271 272 params := &ssm.DeregisterTaskFromMaintenanceWindowInput{ 273 WindowId: aws.String(d.Get("window_id").(string)), 274 WindowTaskId: aws.String(d.Id()), 275 } 276 277 _, err := ssmconn.DeregisterTaskFromMaintenanceWindow(params) 278 if err != nil { 279 return err 280 } 281 282 return nil 283 }