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  }