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