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 }