github.com/profects/terraform@v0.9.0-beta1.0.20170227135739-92d4809db30d/builtin/providers/pagerduty/resource_pagerduty_service_integration.go (about) 1 package pagerduty 2 3 import ( 4 "fmt" 5 "log" 6 7 pagerduty "github.com/PagerDuty/go-pagerduty" 8 "github.com/hashicorp/terraform/helper/schema" 9 ) 10 11 func resourcePagerDutyServiceIntegration() *schema.Resource { 12 return &schema.Resource{ 13 Create: resourcePagerDutyServiceIntegrationCreate, 14 Read: resourcePagerDutyServiceIntegrationRead, 15 Update: resourcePagerDutyServiceIntegrationUpdate, 16 Delete: resourcePagerDutyServiceIntegrationDelete, 17 Importer: &schema.ResourceImporter{ 18 State: resourcePagerDutyServiceIntegrationImport, 19 }, 20 Schema: map[string]*schema.Schema{ 21 "name": { 22 Type: schema.TypeString, 23 Optional: true, 24 }, 25 "service": { 26 Type: schema.TypeString, 27 Optional: true, 28 }, 29 "type": { 30 Type: schema.TypeString, 31 Required: true, 32 ForceNew: true, 33 ValidateFunc: validateValueFunc([]string{ 34 "aws_cloudwatch_inbound_integration", 35 "cloudkick_inbound_integration", 36 "event_transformer_api_inbound_integration", 37 "generic_email_inbound_integration", 38 "generic_events_api_inbound_integration", 39 "keynote_inbound_integration", 40 "nagios_inbound_integration", 41 "pingdom_inbound_integration", 42 "sql_monitor_inbound_integration", 43 }), 44 }, 45 "vendor": { 46 Type: schema.TypeString, 47 ForceNew: true, 48 Optional: true, 49 }, 50 "integration_key": { 51 Type: schema.TypeString, 52 Optional: true, 53 Computed: true, 54 }, 55 "integration_email": { 56 Type: schema.TypeString, 57 Optional: true, 58 Computed: true, 59 }, 60 }, 61 } 62 } 63 64 func buildServiceIntegrationStruct(d *schema.ResourceData) *pagerduty.Integration { 65 serviceIntegration := pagerduty.Integration{ 66 Name: d.Get("name").(string), 67 Type: d.Get("type").(string), 68 Service: &pagerduty.APIObject{ 69 Type: "service_reference", 70 ID: d.Get("service").(string), 71 }, 72 APIObject: pagerduty.APIObject{ 73 ID: d.Id(), 74 Type: "service_integration", 75 }, 76 } 77 78 if attr, ok := d.GetOk("integration_key"); ok { 79 serviceIntegration.IntegrationKey = attr.(string) 80 } 81 82 if attr, ok := d.GetOk("integration_email"); ok { 83 serviceIntegration.IntegrationEmail = attr.(string) 84 } 85 86 if attr, ok := d.GetOk("vendor"); ok { 87 serviceIntegration.Vendor = &pagerduty.APIObject{ 88 ID: attr.(string), 89 Type: "vendor_reference", 90 } 91 } 92 93 return &serviceIntegration 94 } 95 96 func resourcePagerDutyServiceIntegrationCreate(d *schema.ResourceData, meta interface{}) error { 97 client := meta.(*pagerduty.Client) 98 99 serviceIntegration := buildServiceIntegrationStruct(d) 100 101 log.Printf("[INFO] Creating PagerDuty service integration %s", serviceIntegration.Name) 102 103 service := d.Get("service").(string) 104 105 serviceIntegration, err := client.CreateIntegration(service, *serviceIntegration) 106 107 if err != nil { 108 return err 109 } 110 111 d.SetId(serviceIntegration.ID) 112 113 return resourcePagerDutyServiceIntegrationRead(d, meta) 114 } 115 116 func resourcePagerDutyServiceIntegrationRead(d *schema.ResourceData, meta interface{}) error { 117 client := meta.(*pagerduty.Client) 118 119 log.Printf("[INFO] Reading PagerDuty service integration %s", d.Id()) 120 121 service := d.Get("service").(string) 122 123 o := &pagerduty.GetIntegrationOptions{} 124 125 serviceIntegration, err := client.GetIntegration(service, d.Id(), *o) 126 127 if err != nil { 128 if isNotFound(err) { 129 d.SetId("") 130 return nil 131 } 132 return err 133 } 134 135 d.Set("name", serviceIntegration.Name) 136 d.Set("type", serviceIntegration.Type) 137 d.Set("service", serviceIntegration.Service.ID) 138 d.Set("vendor", serviceIntegration.Vendor.ID) 139 d.Set("integration_key", serviceIntegration.IntegrationKey) 140 d.Set("integration_email", serviceIntegration.IntegrationEmail) 141 142 return nil 143 } 144 145 func resourcePagerDutyServiceIntegrationUpdate(d *schema.ResourceData, meta interface{}) error { 146 client := meta.(*pagerduty.Client) 147 148 serviceIntegration := buildServiceIntegrationStruct(d) 149 150 service := d.Get("service").(string) 151 152 log.Printf("[INFO] Updating PagerDuty service integration %s", d.Id()) 153 154 if _, err := client.UpdateIntegration(service, *serviceIntegration); err != nil { 155 return err 156 } 157 158 return nil 159 } 160 161 func resourcePagerDutyServiceIntegrationDelete(d *schema.ResourceData, meta interface{}) error { 162 client := meta.(*pagerduty.Client) 163 164 service := d.Get("service").(string) 165 166 log.Printf("[INFO] Removing PagerDuty service integration %s", d.Id()) 167 168 if err := client.DeleteIntegration(service, d.Id()); err != nil { 169 if isNotFound(err) { 170 d.SetId("") 171 return nil 172 } 173 return err 174 } 175 176 d.SetId("") 177 178 return nil 179 } 180 181 func resourcePagerDutyServiceIntegrationImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { 182 client := meta.(*pagerduty.Client) 183 184 resp, err := client.ListServices(pagerduty.ListServiceOptions{}) 185 if err != nil { 186 return []*schema.ResourceData{}, err 187 } 188 189 var serviceID string 190 191 for _, service := range resp.Services { 192 for _, integration := range service.Integrations { 193 if integration.ID == d.Id() { 194 serviceID = service.ID 195 } 196 } 197 } 198 199 if serviceID == "" { 200 return []*schema.ResourceData{}, fmt.Errorf("Error importing pagerduty_service_integration. Could not locate a service ID for the integration") 201 } 202 203 d.Set("service", serviceID) 204 205 return []*schema.ResourceData{d}, nil 206 }