github.com/subuk/terraform@v0.6.14-0.20160317140351-de1567c2e732/builtin/providers/aws/resource_aws_cloudwatch_event_target.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "log" 6 "regexp" 7 8 "github.com/hashicorp/terraform/helper/schema" 9 10 "github.com/aws/aws-sdk-go/aws" 11 "github.com/aws/aws-sdk-go/aws/awserr" 12 events "github.com/aws/aws-sdk-go/service/cloudwatchevents" 13 ) 14 15 func resourceAwsCloudWatchEventTarget() *schema.Resource { 16 return &schema.Resource{ 17 Create: resourceAwsCloudWatchEventTargetCreate, 18 Read: resourceAwsCloudWatchEventTargetRead, 19 Update: resourceAwsCloudWatchEventTargetUpdate, 20 Delete: resourceAwsCloudWatchEventTargetDelete, 21 22 Schema: map[string]*schema.Schema{ 23 "rule": &schema.Schema{ 24 Type: schema.TypeString, 25 Required: true, 26 ForceNew: true, 27 ValidateFunc: validateCloudWatchEventRuleName, 28 }, 29 30 "target_id": &schema.Schema{ 31 Type: schema.TypeString, 32 Required: true, 33 ForceNew: true, 34 ValidateFunc: validateCloudWatchEventTargetId, 35 }, 36 37 "arn": &schema.Schema{ 38 Type: schema.TypeString, 39 Required: true, 40 }, 41 42 "input": &schema.Schema{ 43 Type: schema.TypeString, 44 Optional: true, 45 ConflictsWith: []string{"input_path"}, 46 // We could be normalizing the JSON here, 47 // but for built-in targets input may not be JSON 48 }, 49 50 "input_path": &schema.Schema{ 51 Type: schema.TypeString, 52 Optional: true, 53 ConflictsWith: []string{"input"}, 54 }, 55 }, 56 } 57 } 58 59 func resourceAwsCloudWatchEventTargetCreate(d *schema.ResourceData, meta interface{}) error { 60 conn := meta.(*AWSClient).cloudwatcheventsconn 61 62 rule := d.Get("rule").(string) 63 targetId := d.Get("target_id").(string) 64 65 input := buildPutTargetInputStruct(d) 66 log.Printf("[DEBUG] Creating CloudWatch Event Target: %s", input) 67 out, err := conn.PutTargets(input) 68 if err != nil { 69 return fmt.Errorf("Creating CloudWatch Event Target failed: %s", err) 70 } 71 72 if len(out.FailedEntries) > 0 { 73 return fmt.Errorf("Creating CloudWatch Event Target failed: %s", 74 out.FailedEntries) 75 } 76 77 id := rule + "-" + targetId 78 d.SetId(id) 79 80 log.Printf("[INFO] CloudWatch Event Target %q created", d.Id()) 81 82 return resourceAwsCloudWatchEventTargetRead(d, meta) 83 } 84 85 func resourceAwsCloudWatchEventTargetRead(d *schema.ResourceData, meta interface{}) error { 86 conn := meta.(*AWSClient).cloudwatcheventsconn 87 88 t, err := findEventTargetById( 89 d.Get("target_id").(string), 90 d.Get("rule").(string), 91 nil, conn) 92 if err != nil { 93 if regexp.MustCompile(" not found$").MatchString(err.Error()) { 94 log.Printf("[WARN] Removing CloudWatch Event Target %q because it's gone.", d.Id()) 95 d.SetId("") 96 return nil 97 } 98 if awsErr, ok := err.(awserr.Error); ok { 99 // This should never happen, but it's useful 100 // for recovering from https://github.com/hashicorp/terraform/issues/5389 101 if awsErr.Code() == "ValidationException" { 102 log.Printf("[WARN] Removing CloudWatch Event Target %q because it never existed.", d.Id()) 103 d.SetId("") 104 return nil 105 } 106 } 107 return err 108 } 109 log.Printf("[DEBUG] Found Event Target: %s", t) 110 111 d.Set("arn", t.Arn) 112 d.Set("target_id", t.Id) 113 d.Set("input", t.Input) 114 d.Set("input_path", t.InputPath) 115 116 return nil 117 } 118 119 func findEventTargetById(id, rule string, nextToken *string, conn *events.CloudWatchEvents) ( 120 *events.Target, error) { 121 input := events.ListTargetsByRuleInput{ 122 Rule: aws.String(rule), 123 NextToken: nextToken, 124 Limit: aws.Int64(100), // Set limit to allowed maximum to prevent API throttling 125 } 126 log.Printf("[DEBUG] Reading CloudWatch Event Target: %s", input) 127 out, err := conn.ListTargetsByRule(&input) 128 if err != nil { 129 return nil, err 130 } 131 132 for _, t := range out.Targets { 133 if *t.Id == id { 134 return t, nil 135 } 136 } 137 138 if out.NextToken != nil { 139 return findEventTargetById(id, rule, nextToken, conn) 140 } 141 142 return nil, fmt.Errorf("CloudWatch Event Target %q (%q) not found", id, rule) 143 } 144 145 func resourceAwsCloudWatchEventTargetUpdate(d *schema.ResourceData, meta interface{}) error { 146 conn := meta.(*AWSClient).cloudwatcheventsconn 147 148 input := buildPutTargetInputStruct(d) 149 log.Printf("[DEBUG] Updating CloudWatch Event Target: %s", input) 150 _, err := conn.PutTargets(input) 151 if err != nil { 152 return fmt.Errorf("Updating CloudWatch Event Target failed: %s", err) 153 } 154 155 return resourceAwsCloudWatchEventTargetRead(d, meta) 156 } 157 158 func resourceAwsCloudWatchEventTargetDelete(d *schema.ResourceData, meta interface{}) error { 159 conn := meta.(*AWSClient).cloudwatcheventsconn 160 161 input := events.RemoveTargetsInput{ 162 Ids: []*string{aws.String(d.Get("target_id").(string))}, 163 Rule: aws.String(d.Get("rule").(string)), 164 } 165 log.Printf("[INFO] Deleting CloudWatch Event Target: %s", input) 166 _, err := conn.RemoveTargets(&input) 167 if err != nil { 168 return fmt.Errorf("Error deleting CloudWatch Event Target: %s", err) 169 } 170 log.Println("[INFO] CloudWatch Event Target deleted") 171 172 d.SetId("") 173 174 return nil 175 } 176 177 func buildPutTargetInputStruct(d *schema.ResourceData) *events.PutTargetsInput { 178 e := &events.Target{ 179 Arn: aws.String(d.Get("arn").(string)), 180 Id: aws.String(d.Get("target_id").(string)), 181 } 182 183 if v, ok := d.GetOk("input"); ok { 184 e.Input = aws.String(v.(string)) 185 } 186 if v, ok := d.GetOk("input_path"); ok { 187 e.InputPath = aws.String(v.(string)) 188 } 189 190 input := events.PutTargetsInput{ 191 Rule: aws.String(d.Get("rule").(string)), 192 Targets: []*events.Target{e}, 193 } 194 195 return &input 196 }