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  }