github.com/mohanarpit/terraform@v0.6.16-0.20160909104007-291f29853544/builtin/providers/aws/resource_aws_cloudwatch_log_metric_filter.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"strings"
     7  
     8  	"github.com/hashicorp/terraform/helper/resource"
     9  	"github.com/hashicorp/terraform/helper/schema"
    10  
    11  	"github.com/aws/aws-sdk-go/aws"
    12  	"github.com/aws/aws-sdk-go/aws/awserr"
    13  	"github.com/aws/aws-sdk-go/service/cloudwatchlogs"
    14  )
    15  
    16  func resourceAwsCloudWatchLogMetricFilter() *schema.Resource {
    17  	return &schema.Resource{
    18  		Create: resourceAwsCloudWatchLogMetricFilterUpdate,
    19  		Read:   resourceAwsCloudWatchLogMetricFilterRead,
    20  		Update: resourceAwsCloudWatchLogMetricFilterUpdate,
    21  		Delete: resourceAwsCloudWatchLogMetricFilterDelete,
    22  
    23  		Schema: map[string]*schema.Schema{
    24  			"name": &schema.Schema{
    25  				Type:         schema.TypeString,
    26  				Required:     true,
    27  				ForceNew:     true,
    28  				ValidateFunc: validateLogMetricFilterName,
    29  			},
    30  
    31  			"pattern": &schema.Schema{
    32  				Type:         schema.TypeString,
    33  				Required:     true,
    34  				ValidateFunc: validateMaxLength(512),
    35  				StateFunc: func(v interface{}) string {
    36  					s, ok := v.(string)
    37  					if !ok {
    38  						return ""
    39  					}
    40  					return strings.TrimSpace(s)
    41  				},
    42  			},
    43  
    44  			"log_group_name": &schema.Schema{
    45  				Type:         schema.TypeString,
    46  				Required:     true,
    47  				ForceNew:     true,
    48  				ValidateFunc: validateLogGroupName,
    49  			},
    50  
    51  			"metric_transformation": &schema.Schema{
    52  				Type:     schema.TypeList,
    53  				Required: true,
    54  				MaxItems: 1,
    55  				Elem: &schema.Resource{
    56  					Schema: map[string]*schema.Schema{
    57  						"name": &schema.Schema{
    58  							Type:         schema.TypeString,
    59  							Required:     true,
    60  							ValidateFunc: validateLogMetricFilterTransformationName,
    61  						},
    62  						"namespace": &schema.Schema{
    63  							Type:         schema.TypeString,
    64  							Required:     true,
    65  							ValidateFunc: validateLogMetricFilterTransformationName,
    66  						},
    67  						"value": &schema.Schema{
    68  							Type:         schema.TypeString,
    69  							Required:     true,
    70  							ValidateFunc: validateMaxLength(100),
    71  						},
    72  					},
    73  				},
    74  			},
    75  		},
    76  	}
    77  }
    78  
    79  func resourceAwsCloudWatchLogMetricFilterUpdate(d *schema.ResourceData, meta interface{}) error {
    80  	conn := meta.(*AWSClient).cloudwatchlogsconn
    81  
    82  	input := cloudwatchlogs.PutMetricFilterInput{
    83  		FilterName:    aws.String(d.Get("name").(string)),
    84  		FilterPattern: aws.String(strings.TrimSpace(d.Get("pattern").(string))),
    85  		LogGroupName:  aws.String(d.Get("log_group_name").(string)),
    86  	}
    87  
    88  	transformations := d.Get("metric_transformation").([]interface{})
    89  	o := transformations[0].(map[string]interface{})
    90  	input.MetricTransformations = expandCloudWachLogMetricTransformations(o)
    91  
    92  	log.Printf("[DEBUG] Creating/Updating CloudWatch Log Metric Filter: %s", input)
    93  	_, err := conn.PutMetricFilter(&input)
    94  	if err != nil {
    95  		return fmt.Errorf("Creating/Updating CloudWatch Log Metric Filter failed: %s", err)
    96  	}
    97  
    98  	d.SetId(d.Get("name").(string))
    99  
   100  	log.Println("[INFO] CloudWatch Log Metric Filter created/updated")
   101  
   102  	return resourceAwsCloudWatchLogMetricFilterRead(d, meta)
   103  }
   104  
   105  func resourceAwsCloudWatchLogMetricFilterRead(d *schema.ResourceData, meta interface{}) error {
   106  	conn := meta.(*AWSClient).cloudwatchlogsconn
   107  
   108  	mf, err := lookupCloudWatchLogMetricFilter(conn, d.Get("name").(string),
   109  		d.Get("log_group_name").(string), nil)
   110  	if err != nil {
   111  		if _, ok := err.(*resource.NotFoundError); ok {
   112  			log.Printf("[WARN] Removing CloudWatch Log Metric Filter as it is gone")
   113  			d.SetId("")
   114  			return nil
   115  		}
   116  
   117  		return fmt.Errorf("Failed reading CloudWatch Log Metric Filter: %s", err)
   118  	}
   119  
   120  	log.Printf("[DEBUG] Found CloudWatch Log Metric Filter: %s", mf)
   121  
   122  	d.Set("name", mf.FilterName)
   123  	d.Set("pattern", mf.FilterPattern)
   124  	d.Set("metric_transformation", flattenCloudWachLogMetricTransformations(mf.MetricTransformations))
   125  
   126  	return nil
   127  }
   128  
   129  func lookupCloudWatchLogMetricFilter(conn *cloudwatchlogs.CloudWatchLogs,
   130  	name, logGroupName string, nextToken *string) (*cloudwatchlogs.MetricFilter, error) {
   131  
   132  	input := cloudwatchlogs.DescribeMetricFiltersInput{
   133  		FilterNamePrefix: aws.String(name),
   134  		LogGroupName:     aws.String(logGroupName),
   135  		NextToken:        nextToken,
   136  	}
   137  	log.Printf("[DEBUG] Reading CloudWatch Log Metric Filter: %s", input)
   138  	resp, err := conn.DescribeMetricFilters(&input)
   139  	if err != nil {
   140  		if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "ResourceNotFoundException" {
   141  			return nil, &resource.NotFoundError{
   142  				Message: fmt.Sprintf("CloudWatch Log Metric Filter %q / %q not found via"+
   143  					" initial DescribeMetricFilters call", name, logGroupName),
   144  				LastError:   err,
   145  				LastRequest: input,
   146  			}
   147  		}
   148  
   149  		return nil, fmt.Errorf("Failed describing CloudWatch Log Metric Filter: %s", err)
   150  	}
   151  
   152  	for _, mf := range resp.MetricFilters {
   153  		if *mf.FilterName == name {
   154  			return mf, nil
   155  		}
   156  	}
   157  
   158  	if resp.NextToken != nil {
   159  		return lookupCloudWatchLogMetricFilter(conn, name, logGroupName, resp.NextToken)
   160  	}
   161  
   162  	return nil, &resource.NotFoundError{
   163  		Message: fmt.Sprintf("CloudWatch Log Metric Filter %q / %q not found "+
   164  			"in given results from DescribeMetricFilters", name, logGroupName),
   165  		LastResponse: resp,
   166  		LastRequest:  input,
   167  	}
   168  }
   169  
   170  func resourceAwsCloudWatchLogMetricFilterDelete(d *schema.ResourceData, meta interface{}) error {
   171  	conn := meta.(*AWSClient).cloudwatchlogsconn
   172  
   173  	input := cloudwatchlogs.DeleteMetricFilterInput{
   174  		FilterName:   aws.String(d.Get("name").(string)),
   175  		LogGroupName: aws.String(d.Get("log_group_name").(string)),
   176  	}
   177  	log.Printf("[INFO] Deleting CloudWatch Log Metric Filter: %s", d.Id())
   178  	_, err := conn.DeleteMetricFilter(&input)
   179  	if err != nil {
   180  		return fmt.Errorf("Error deleting CloudWatch Log Metric Filter: %s", err)
   181  	}
   182  	log.Println("[INFO] CloudWatch Log Metric Filter deleted")
   183  
   184  	d.SetId("")
   185  
   186  	return nil
   187  }