Add support for teams in escalation policies & vendor support

This commit is contained in:
Alexander Hellbom 2016-10-20 06:53:51 +02:00
parent b40ba1042f
commit 4c45c790c3
25 changed files with 670 additions and 470 deletions

View File

@ -1,172 +0,0 @@
package pagerduty
import (
"encoding/json"
"log"
"strconv"
pagerduty "github.com/PagerDuty/go-pagerduty"
"github.com/hashicorp/terraform/helper/hashcode"
"github.com/hashicorp/terraform/helper/schema"
)
func dataSourcePagerDutyOnCall() *schema.Resource {
return &schema.Resource{
Read: dataSourcePagerDutyOnCallRead,
Schema: map[string]*schema.Schema{
"time_zone": &schema.Schema{
Type: schema.TypeString,
Optional: true,
},
"include": &schema.Schema{
Type: schema.TypeList,
Optional: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"user_ids": &schema.Schema{
Type: schema.TypeList,
Optional: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"escalation_policy_ids": &schema.Schema{
Type: schema.TypeList,
Optional: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"schedule_ids": &schema.Schema{
Type: schema.TypeList,
Optional: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"since": &schema.Schema{
Type: schema.TypeString,
Optional: true,
},
"until": &schema.Schema{
Type: schema.TypeString,
Optional: true,
},
"earliest": &schema.Schema{
Type: schema.TypeBool,
Optional: true,
},
"oncalls": &schema.Schema{
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"escalation_level": &schema.Schema{
Type: schema.TypeInt,
Computed: true,
},
"start": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"end": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"user": &schema.Schema{
Type: schema.TypeMap,
Computed: true,
},
"schedule": &schema.Schema{
Type: schema.TypeMap,
Computed: true,
},
"escalation_policy": &schema.Schema{
Type: schema.TypeMap,
Computed: true,
},
},
},
},
},
}
}
func dataSourcePagerDutyOnCallRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*pagerduty.Client)
o := &pagerduty.ListOnCallOptions{}
if attr, ok := d.GetOk("time_zone"); ok {
o.TimeZone = attr.(string)
}
if attr, ok := d.GetOk("include"); ok {
includes := make([]string, 0, len(attr.([]interface{})))
for _, include := range attr.([]interface{}) {
includes = append(includes, include.(string))
}
o.Includes = includes
}
if attr, ok := d.GetOk("user_ids"); ok {
userIDs := make([]string, 0, len(attr.([]interface{})))
for _, user := range attr.([]interface{}) {
userIDs = append(userIDs, user.(string))
}
o.UserIDs = userIDs
}
if attr, ok := d.GetOk("escalation_policy_ids"); ok {
escalationPolicyIDs := make([]string, 0, len(attr.([]interface{})))
for _, escalationPolicy := range attr.([]interface{}) {
escalationPolicyIDs = append(escalationPolicyIDs, escalationPolicy.(string))
}
o.EscalationPolicyIDs = escalationPolicyIDs
}
if attr, ok := d.GetOk("since"); ok {
o.Since = attr.(string)
}
if attr, ok := d.GetOk("until"); ok {
o.Until = attr.(string)
}
if attr, ok := d.GetOk("earliest"); ok {
o.Earliest = attr.(bool)
}
log.Printf("[INFO] Reading On Calls with options: %v", *o)
resp, err := client.ListOnCalls(*o)
if err != nil {
return err
}
data := flattenOnCalls(resp.OnCalls)
id, err := json.Marshal(data)
if err != nil {
return err
}
d.SetId(strconv.Itoa(hashcode.String(string(id))))
if err := d.Set("oncalls", data); err != nil {
return err
}
return nil
}

View File

@ -1,58 +0,0 @@
package pagerduty
import (
"fmt"
"strconv"
"testing"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/terraform"
)
func TestAccPagerDutyOnCall_Basic(t *testing.T) {
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckPagerDutyScheduleDestroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccPagerDutyOnCallsConfig,
Check: resource.ComposeTestCheckFunc(
testAccPagerDutyOnCalls("data.pagerduty_on_call.foo"),
),
},
},
})
}
func testAccPagerDutyOnCalls(n string) resource.TestCheckFunc {
return func(s *terraform.State) error {
r := s.RootModule().Resources[n]
a := r.Primary.Attributes
var size int
var err error
if size, err = strconv.Atoi(a["oncalls.#"]); err != nil {
return err
}
if size == 0 {
return fmt.Errorf("Expected at least one on call in the list. Found: %d", size)
}
for i := range make([]string, size) {
escalationLevel := a[fmt.Sprintf("oncalls.%d.escalation_level", i)]
if escalationLevel == "" {
return fmt.Errorf("Expected the on call to have an escalation_level set")
}
}
return nil
}
}
const testAccPagerDutyOnCallsConfig = `
data "pagerduty_on_call" "foo" {}
`

View File

@ -0,0 +1,78 @@
package pagerduty
import (
"fmt"
"log"
"regexp"
pagerduty "github.com/PagerDuty/go-pagerduty"
"github.com/hashicorp/terraform/helper/schema"
)
func dataSourcePagerDutyVendor() *schema.Resource {
return &schema.Resource{
Read: dataSourcePagerDutyVendorRead,
Schema: map[string]*schema.Schema{
"name_regex": &schema.Schema{
Type: schema.TypeString,
Required: true,
},
"name": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"type": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
},
}
}
func dataSourcePagerDutyVendorRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*pagerduty.Client)
log.Printf("[INFO] Reading PagerDuty vendors")
resp, err := getVendors(client)
if err != nil {
return err
}
r := regexp.MustCompile("(?i)" + d.Get("name_regex").(string))
var vendors []pagerduty.Vendor
var vendorNames []string
for _, v := range resp {
if r.MatchString(v.Name) {
vendors = append(vendors, v)
vendorNames = append(vendorNames, v.Name)
}
}
if len(vendors) == 0 {
return fmt.Errorf("Unable to locate any vendor using the regex string: %s", r.String())
} else if len(vendors) > 1 {
return fmt.Errorf("Your query returned more than one result using the regex string: %#v. Found vendors: %#v", r.String(), vendorNames)
}
vendor := vendors[0]
genericServiceType := vendor.GenericServiceType
switch {
case genericServiceType == "email":
genericServiceType = "generic_email_inbound_integration"
case genericServiceType == "api":
genericServiceType = "generic_events_api_inbound_integration"
}
d.SetId(vendor.ID)
d.Set("name", vendor.Name)
d.Set("type", genericServiceType)
return nil
}

View File

@ -0,0 +1,57 @@
package pagerduty
import (
"fmt"
"testing"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/terraform"
)
func TestAccPagerDutyVendor_Basic(t *testing.T) {
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckPagerDutyScheduleDestroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccPagerDutyVendorsConfig,
Check: resource.ComposeTestCheckFunc(
testAccPagerDutyVendors("data.pagerduty_vendor.datadog"),
),
},
},
})
}
func testAccPagerDutyVendors(n string) resource.TestCheckFunc {
return func(s *terraform.State) error {
r := s.RootModule().Resources[n]
a := r.Primary.Attributes
if a["id"] == "" {
return fmt.Errorf("Expected to get a vendor ID from PagerDuty")
}
if a["id"] != "PAM4FGS" {
return fmt.Errorf("Expected the Datadog Vendor ID to be: PAM4FGS, but got: %s", a["id"])
}
if a["name"] != "Datadog" {
return fmt.Errorf("Expected the Datadog Vendor Name to be: Datadog, but got: %s", a["name"])
}
if a["type"] != "generic_events_api_inbound_integration" {
return fmt.Errorf("Expected the Datadog Vendor Type to be: generic_events_api_inbound_integration, but got: %s", a["type"])
}
return nil
}
}
const testAccPagerDutyVendorsConfig = `
data "pagerduty_vendor" "datadog" {
name_regex = "Datadog"
}
`

View File

@ -8,6 +8,7 @@ import (
func TestAccPagerDutyTeam_import(t *testing.T) {
resourceName := "pagerduty_team.foo"
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,

View File

@ -19,7 +19,7 @@ func Provider() terraform.ResourceProvider {
},
DataSourcesMap: map[string]*schema.Resource{
"pagerduty_on_call": dataSourcePagerDutyOnCall(),
"pagerduty_vendor": dataSourcePagerDutyVendor(),
},
ResourcesMap: map[string]*schema.Resource{
@ -36,10 +36,7 @@ func Provider() terraform.ResourceProvider {
}
func providerConfigure(data *schema.ResourceData) (interface{}, error) {
config := Config{
Token: data.Get("token").(string),
}
config := Config{Token: data.Get("token").(string)}
log.Println("[INFO] Initializing PagerDuty client")
return config.Client()
}

View File

@ -30,6 +30,13 @@ func resourcePagerDutyEscalationPolicy() *schema.Resource {
Type: schema.TypeInt,
Optional: true,
},
"teams": &schema.Schema{
Type: schema.TypeList,
Optional: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"rule": &schema.Schema{
Type: schema.TypeList,
Required: true,
@ -70,36 +77,40 @@ func resourcePagerDutyEscalationPolicy() *schema.Resource {
func buildEscalationPolicyStruct(d *schema.ResourceData) *pagerduty.EscalationPolicy {
escalationRules := d.Get("rule").([]interface{})
policy := pagerduty.EscalationPolicy{
escalationPolicy := pagerduty.EscalationPolicy{
Name: d.Get("name").(string),
EscalationRules: expandRules(escalationRules),
EscalationRules: expandEscalationRules(escalationRules),
}
if attr, ok := d.GetOk("description"); ok {
policy.Description = attr.(string)
escalationPolicy.Description = attr.(string)
}
if attr, ok := d.GetOk("num_loops"); ok {
policy.NumLoops = uint(attr.(int))
escalationPolicy.NumLoops = uint(attr.(int))
}
return &policy
if attr, ok := d.GetOk("teams"); ok {
escalationPolicy.Teams = expandTeams(attr.([]interface{}))
}
return &escalationPolicy
}
func resourcePagerDutyEscalationPolicyCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*pagerduty.Client)
e := buildEscalationPolicyStruct(d)
escalationPolicy := buildEscalationPolicyStruct(d)
log.Printf("[INFO] Creating PagerDuty escalation policy: %s", e.Name)
log.Printf("[INFO] Creating PagerDuty escalation policy: %s", escalationPolicy.Name)
e, err := client.CreateEscalationPolicy(*e)
escalationPolicy, err := client.CreateEscalationPolicy(*escalationPolicy)
if err != nil {
return err
}
d.SetId(e.ID)
d.SetId(escalationPolicy.ID)
return resourcePagerDutyEscalationPolicyRead(d, meta)
}
@ -109,17 +120,20 @@ func resourcePagerDutyEscalationPolicyRead(d *schema.ResourceData, meta interfac
log.Printf("[INFO] Reading PagerDuty escalation policy: %s", d.Id())
e, err := client.GetEscalationPolicy(d.Id(), &pagerduty.GetEscalationPolicyOptions{})
o := &pagerduty.GetEscalationPolicyOptions{}
escalationPolicy, err := client.GetEscalationPolicy(d.Id(), o)
if err != nil {
return err
}
d.Set("name", e.Name)
d.Set("description", e.Description)
d.Set("num_loops", e.NumLoops)
d.Set("name", escalationPolicy.Name)
d.Set("teams", escalationPolicy.Teams)
d.Set("description", escalationPolicy.Description)
d.Set("num_loops", escalationPolicy.NumLoops)
if err := d.Set("rule", flattenRules(e.EscalationRules)); err != nil {
if err := d.Set("rule", flattenEscalationRules(escalationPolicy.EscalationRules)); err != nil {
return err
}
@ -129,13 +143,11 @@ func resourcePagerDutyEscalationPolicyRead(d *schema.ResourceData, meta interfac
func resourcePagerDutyEscalationPolicyUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*pagerduty.Client)
e := buildEscalationPolicyStruct(d)
escalationPolicy := buildEscalationPolicyStruct(d)
log.Printf("[INFO] Updating PagerDuty escalation policy: %s", d.Id())
e, err := client.UpdateEscalationPolicy(d.Id(), e)
if err != nil {
if _, err := client.UpdateEscalationPolicy(d.Id(), escalationPolicy); err != nil {
return err
}
@ -147,9 +159,7 @@ func resourcePagerDutyEscalationPolicyDelete(d *schema.ResourceData, meta interf
log.Printf("[INFO] Deleting PagerDuty escalation policy: %s", d.Id())
err := client.DeleteEscalationPolicy(d.Id())
if err != nil {
if err := client.DeleteEscalationPolicy(d.Id()); err != nil {
return err
}

View File

@ -25,6 +25,10 @@ func TestAccPagerDutyEscalationPolicy_Basic(t *testing.T) {
"pagerduty_escalation_policy.foo", "description", "foo"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "num_loops", "1"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "rule.#", "1"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "rule.0.escalation_delay_in_minutes", "10"),
),
},
resource.TestStep{
@ -37,6 +41,60 @@ func TestAccPagerDutyEscalationPolicy_Basic(t *testing.T) {
"pagerduty_escalation_policy.foo", "description", "bar"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "num_loops", "2"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "rule.#", "2"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "rule.0.escalation_delay_in_minutes", "10"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "rule.1.escalation_delay_in_minutes", "20"),
),
},
},
})
}
func TestAccPagerDutyEscalationPolicyWithTeams_Basic(t *testing.T) {
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckPagerDutyEscalationPolicyDestroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccCheckPagerDutyEscalationPolicyWithTeamsConfig,
Check: resource.ComposeTestCheckFunc(
testAccCheckPagerDutyEscalationPolicyExists("pagerduty_escalation_policy.foo"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "name", "foo"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "description", "foo"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "num_loops", "1"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "rule.#", "1"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "rule.0.escalation_delay_in_minutes", "10"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "teams.#", "1"),
),
},
resource.TestStep{
Config: testAccCheckPagerDutyEscalationPolicyWithTeamsConfigUpdated,
Check: resource.ComposeTestCheckFunc(
testAccCheckPagerDutyEscalationPolicyExists("pagerduty_escalation_policy.foo"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "name", "bar"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "description", "bar"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "num_loops", "2"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "rule.#", "2"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "rule.0.escalation_delay_in_minutes", "10"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "rule.1.escalation_delay_in_minutes", "20"),
resource.TestCheckResourceAttr(
"pagerduty_escalation_policy.foo", "teams.#", "0"),
),
},
},
@ -145,3 +203,75 @@ resource "pagerduty_escalation_policy" "foo" {
}
}
`
const testAccCheckPagerDutyEscalationPolicyWithTeamsConfig = `
resource "pagerduty_user" "foo" {
name = "foo"
email = "foo@bar.com"
color = "green"
role = "user"
job_title = "foo"
description = "foo"
}
resource "pagerduty_team" "foo" {
name = "foo"
description = "foo"
}
resource "pagerduty_escalation_policy" "foo" {
name = "foo"
description = "foo"
num_loops = 1
teams = ["${pagerduty_team.foo.id}"]
rule {
escalation_delay_in_minutes = 10
target {
type = "user_reference"
id = "${pagerduty_user.foo.id}"
}
}
}
`
const testAccCheckPagerDutyEscalationPolicyWithTeamsConfigUpdated = `
resource "pagerduty_user" "foo" {
name = "foo"
email = "foo@bar.com"
color = "green"
role = "user"
job_title = "foo"
description = "foo"
}
resource "pagerduty_team" "foo" {
name = "foo"
description = "foo"
}
resource "pagerduty_escalation_policy" "foo" {
name = "bar"
description = "bar"
num_loops = 2
rule {
escalation_delay_in_minutes = 10
target {
type = "user_reference"
id = "${pagerduty_user.foo.id}"
}
}
rule {
escalation_delay_in_minutes = 20
target {
type = "user_reference"
id = "${pagerduty_user.foo.id}"
}
}
}
`

View File

@ -109,36 +109,36 @@ func resourcePagerDutySchedule() *schema.Resource {
}
}
func buildScheduleStruct(d *schema.ResourceData) (*pagerduty.Schedule, error) {
func buildScheduleStruct(d *schema.ResourceData) *pagerduty.Schedule {
scheduleLayers := d.Get("layer").([]interface{})
schedule := pagerduty.Schedule{
Name: d.Get("name").(string),
TimeZone: d.Get("time_zone").(string),
ScheduleLayers: expandLayers(scheduleLayers),
ScheduleLayers: expandScheduleLayers(scheduleLayers),
}
if attr, ok := d.GetOk("description"); ok {
schedule.Description = attr.(string)
}
return &schedule, nil
return &schedule
}
func resourcePagerDutyScheduleCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*pagerduty.Client)
s, _ := buildScheduleStruct(d)
schedule := buildScheduleStruct(d)
log.Printf("[INFO] Creating PagerDuty schedule: %s", s.Name)
log.Printf("[INFO] Creating PagerDuty schedule: %s", schedule.Name)
e, err := client.CreateSchedule(*s)
schedule, err := client.CreateSchedule(*schedule)
if err != nil {
return err
}
d.SetId(e.ID)
d.SetId(schedule.ID)
return resourcePagerDutyScheduleRead(d, meta)
}
@ -148,17 +148,17 @@ func resourcePagerDutyScheduleRead(d *schema.ResourceData, meta interface{}) err
log.Printf("[INFO] Reading PagerDuty schedule: %s", d.Id())
s, err := client.GetSchedule(d.Id(), pagerduty.GetScheduleOptions{})
schedule, err := client.GetSchedule(d.Id(), pagerduty.GetScheduleOptions{})
if err != nil {
return err
}
d.Set("name", s.Name)
d.Set("time_zone", s.TimeZone)
d.Set("description", s.Description)
d.Set("name", schedule.Name)
d.Set("time_zone", schedule.TimeZone)
d.Set("description", schedule.Description)
if err := d.Set("layer", flattenLayers(s.ScheduleLayers)); err != nil {
if err := d.Set("layer", flattenScheduleLayers(schedule.ScheduleLayers)); err != nil {
return err
}
@ -168,13 +168,11 @@ func resourcePagerDutyScheduleRead(d *schema.ResourceData, meta interface{}) err
func resourcePagerDutyScheduleUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*pagerduty.Client)
e, _ := buildScheduleStruct(d)
schedule := buildScheduleStruct(d)
log.Printf("[INFO] Updating PagerDuty schedule: %s", d.Id())
e, err := client.UpdateSchedule(d.Id(), *e)
if err != nil {
if _, err := client.UpdateSchedule(d.Id(), *schedule); err != nil {
return err
}
@ -186,9 +184,7 @@ func resourcePagerDutyScheduleDelete(d *schema.ResourceData, meta interface{}) e
log.Printf("[INFO] Deleting PagerDuty schedule: %s", d.Id())
err := client.DeleteSchedule(d.Id())
if err != nil {
if err := client.DeleteSchedule(d.Id()); err != nil {
return err
}

View File

@ -3,7 +3,7 @@ package pagerduty
import (
"log"
"github.com/PagerDuty/go-pagerduty"
pagerduty "github.com/PagerDuty/go-pagerduty"
"github.com/hashicorp/terraform/helper/schema"
)
@ -77,14 +77,14 @@ func buildServiceStruct(d *schema.ResourceData) *pagerduty.Service {
service.AcknowledgementTimeout = &acknowledgementTimeout
}
policy := &pagerduty.EscalationPolicy{
escalationPolicy := &pagerduty.EscalationPolicy{
APIObject: pagerduty.APIObject{
ID: d.Get("escalation_policy").(string),
Type: "escalation_policy",
Type: "escalation_policy_reference",
},
}
service.EscalationPolicy = *policy
service.EscalationPolicy = *escalationPolicy
return &service
}
@ -92,17 +92,17 @@ func buildServiceStruct(d *schema.ResourceData) *pagerduty.Service {
func resourcePagerDutyServiceCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*pagerduty.Client)
s := buildServiceStruct(d)
service := buildServiceStruct(d)
log.Printf("[INFO] Creating PagerDuty service %s", s.Name)
log.Printf("[INFO] Creating PagerDuty service %s", service.Name)
s, err := client.CreateService(*s)
service, err := client.CreateService(*service)
if err != nil {
return err
}
d.SetId(s.ID)
d.SetId(service.ID)
return nil
}
@ -112,20 +112,22 @@ func resourcePagerDutyServiceRead(d *schema.ResourceData, meta interface{}) erro
log.Printf("[INFO] Reading PagerDuty service %s", d.Id())
s, err := client.GetService(d.Id(), &pagerduty.GetServiceOptions{})
o := &pagerduty.GetServiceOptions{}
service, err := client.GetService(d.Id(), o)
if err != nil {
return err
}
d.Set("name", s.Name)
d.Set("status", s.Status)
d.Set("created_at", s.CreateAt)
d.Set("escalation_policy", s.EscalationPolicy.ID)
d.Set("description", s.Description)
d.Set("auto_resolve_timeout", s.AutoResolveTimeout)
d.Set("last_incident_timestamp", s.LastIncidentTimestamp)
d.Set("acknowledgement_timeout", s.AcknowledgementTimeout)
d.Set("name", service.Name)
d.Set("status", service.Status)
d.Set("created_at", service.CreateAt)
d.Set("escalation_policy", service.EscalationPolicy.ID)
d.Set("description", service.Description)
d.Set("auto_resolve_timeout", service.AutoResolveTimeout)
d.Set("last_incident_timestamp", service.LastIncidentTimestamp)
d.Set("acknowledgement_timeout", service.AcknowledgementTimeout)
return nil
}
@ -133,13 +135,11 @@ func resourcePagerDutyServiceRead(d *schema.ResourceData, meta interface{}) erro
func resourcePagerDutyServiceUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*pagerduty.Client)
s := buildServiceStruct(d)
service := buildServiceStruct(d)
log.Printf("[INFO] Updating PagerDuty service %s", d.Id())
s, err := client.UpdateService(*s)
if err != nil {
if _, err := client.UpdateService(*service); err != nil {
return err
}
@ -151,9 +151,7 @@ func resourcePagerDutyServiceDelete(d *schema.ResourceData, meta interface{}) er
log.Printf("[INFO] Deleting PagerDuty service %s", d.Id())
err := client.DeleteService(d.Id())
if err != nil {
if err := client.DeleteService(d.Id()); err != nil {
return err
}

View File

@ -3,7 +3,7 @@ package pagerduty
import (
"log"
"github.com/PagerDuty/go-pagerduty"
pagerduty "github.com/PagerDuty/go-pagerduty"
"github.com/hashicorp/terraform/helper/schema"
)
@ -12,7 +12,6 @@ func resourcePagerDutyServiceIntegration() *schema.Resource {
Create: resourcePagerDutyServiceIntegrationCreate,
Read: resourcePagerDutyServiceIntegrationRead,
Update: resourcePagerDutyServiceIntegrationUpdate,
// NOTE: It's currently not possible to delete integrations via the API.
// Therefore it needs to be manually removed from the Web UI.
Delete: resourcePagerDutyServiceIntegrationDelete,
@ -28,6 +27,7 @@ func resourcePagerDutyServiceIntegration() *schema.Resource {
"type": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: validateValueFunc([]string{
"aws_cloudwatch_inbound_integration",
"cloudkick_inbound_integration",
@ -40,12 +40,19 @@ func resourcePagerDutyServiceIntegration() *schema.Resource {
"sql_monitor_inbound_integration",
}),
},
"vendor": &schema.Schema{
Type: schema.TypeString,
ForceNew: true,
Optional: true,
},
"integration_key": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"integration_email": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
},
@ -53,37 +60,53 @@ func resourcePagerDutyServiceIntegration() *schema.Resource {
}
func buildServiceIntegrationStruct(d *schema.ResourceData) *pagerduty.Integration {
service := pagerduty.Integration{
Type: d.Get("type").(string),
serviceIntegration := pagerduty.Integration{
Name: d.Get("name").(string),
Type: d.Get("type").(string),
Service: &pagerduty.APIObject{
Type: "service",
Type: "service_reference",
ID: d.Get("service").(string),
},
APIObject: pagerduty.APIObject{
ID: d.Id(),
ID: d.Id(),
Type: "service_integration",
},
}
return &service
if attr, ok := d.GetOk("integration_key"); ok {
serviceIntegration.IntegrationKey = attr.(string)
}
if attr, ok := d.GetOk("integration_email"); ok {
serviceIntegration.IntegrationEmail = attr.(string)
}
if attr, ok := d.GetOk("vendor"); ok {
serviceIntegration.Vendor = &pagerduty.APIObject{
ID: attr.(string),
Type: "vendor_reference",
}
}
return &serviceIntegration
}
func resourcePagerDutyServiceIntegrationCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*pagerduty.Client)
i := buildServiceIntegrationStruct(d)
serviceIntegration := buildServiceIntegrationStruct(d)
log.Printf("[INFO] Creating PagerDuty service integration %s", i.Name)
log.Printf("[INFO] Creating PagerDuty service integration %s", serviceIntegration.Name)
service := d.Get("service").(string)
s, err := client.CreateIntegration(service, *i)
serviceIntegration, err := client.CreateIntegration(service, *serviceIntegration)
if err != nil {
return err
}
d.SetId(s.ID)
d.SetId(serviceIntegration.ID)
return resourcePagerDutyServiceIntegrationRead(d, meta)
}
@ -95,17 +118,20 @@ func resourcePagerDutyServiceIntegrationRead(d *schema.ResourceData, meta interf
service := d.Get("service").(string)
i, err := client.GetIntegration(service, d.Id(), pagerduty.GetIntegrationOptions{})
o := &pagerduty.GetIntegrationOptions{}
serviceIntegration, err := client.GetIntegration(service, d.Id(), *o)
if err != nil {
return err
}
d.Set("name", i.Name)
d.Set("type", i.Type)
d.Set("service", i.Service)
d.Set("integration_key", i.IntegrationKey)
d.Set("integration_email", i.IntegrationEmail)
d.Set("name", serviceIntegration.Name)
d.Set("type", serviceIntegration.Type)
d.Set("service", serviceIntegration.Service)
d.Set("vendor", serviceIntegration.Vendor)
d.Set("integration_key", serviceIntegration.IntegrationKey)
d.Set("integration_email", serviceIntegration.IntegrationEmail)
return nil
}
@ -113,15 +139,13 @@ func resourcePagerDutyServiceIntegrationRead(d *schema.ResourceData, meta interf
func resourcePagerDutyServiceIntegrationUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*pagerduty.Client)
s := buildServiceIntegrationStruct(d)
serviceIntegration := buildServiceIntegrationStruct(d)
service := d.Get("service").(string)
log.Printf("[INFO] Updating PagerDuty service integration %s", d.Id())
s, err := client.UpdateIntegration(service, *s)
if err != nil {
if _, err := client.UpdateIntegration(service, *serviceIntegration); err != nil {
return err
}

View File

@ -23,6 +23,8 @@ func TestAccPagerDutyServiceIntegration_Basic(t *testing.T) {
"pagerduty_service_integration.foo", "name", "foo"),
resource.TestCheckResourceAttr(
"pagerduty_service_integration.foo", "type", "generic_events_api_inbound_integration"),
resource.TestCheckResourceAttr(
"pagerduty_service_integration.foo", "vendor", "PAM4FGS"),
),
},
resource.TestStep{
@ -33,6 +35,8 @@ func TestAccPagerDutyServiceIntegration_Basic(t *testing.T) {
"pagerduty_service_integration.foo", "name", "bar"),
resource.TestCheckResourceAttr(
"pagerduty_service_integration.foo", "type", "generic_events_api_inbound_integration"),
resource.TestCheckResourceAttr(
"pagerduty_service_integration.foo", "vendor", "PAM4FGS"),
),
},
},
@ -76,7 +80,6 @@ func testAccCheckPagerDutyServiceIntegrationExists(n string) resource.TestCheckF
found, err := client.GetIntegration(service.Primary.ID, rs.Primary.ID, pagerduty.GetIntegrationOptions{})
if err != nil {
return fmt.Errorf("Service integration not found: %v", rs.Primary.ID)
// return err
}
if found.ID != rs.Primary.ID {
@ -91,10 +94,6 @@ const testAccCheckPagerDutyServiceIntegrationConfig = `
resource "pagerduty_user" "foo" {
name = "foo"
email = "foo@bar.com"
color = "green"
role = "user"
job_title = "foo"
description = "foo"
}
resource "pagerduty_escalation_policy" "foo" {
@ -120,10 +119,15 @@ resource "pagerduty_service" "foo" {
escalation_policy = "${pagerduty_escalation_policy.foo.id}"
}
data "pagerduty_vendor" "datadog" {
name_regex = "datadog"
}
resource "pagerduty_service_integration" "foo" {
name = "foo"
type = "generic_events_api_inbound_integration"
service = "${pagerduty_service.foo.id}"
vendor = "${data.pagerduty_vendor.datadog.id}"
}
`
@ -160,9 +164,14 @@ resource "pagerduty_service" "foo" {
escalation_policy = "${pagerduty_escalation_policy.foo.id}"
}
data "pagerduty_vendor" "datadog" {
name_regex = "datadog"
}
resource "pagerduty_service_integration" "foo" {
name = "bar"
type = "generic_events_api_inbound_integration"
service = "${pagerduty_service.foo.id}"
vendor = "${data.pagerduty_vendor.datadog.id}"
}
`

View File

@ -45,17 +45,17 @@ func buildTeamStruct(d *schema.ResourceData) *pagerduty.Team {
func resourcePagerDutyTeamCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*pagerduty.Client)
t := buildTeamStruct(d)
team := buildTeamStruct(d)
log.Printf("[INFO] Creating PagerDuty team %s", t.Name)
log.Printf("[INFO] Creating PagerDuty team %s", team.Name)
t, err := client.CreateTeam(t)
team, err := client.CreateTeam(team)
if err != nil {
return err
}
d.SetId(t.ID)
d.SetId(team.ID)
return nil
@ -66,14 +66,14 @@ func resourcePagerDutyTeamRead(d *schema.ResourceData, meta interface{}) error {
log.Printf("[INFO] Reading PagerDuty team %s", d.Id())
t, err := client.GetTeam(d.Id())
team, err := client.GetTeam(d.Id())
if err != nil {
return err
}
d.Set("name", t.Name)
d.Set("description", t.Description)
d.Set("name", team.Name)
d.Set("description", team.Description)
return nil
}
@ -81,13 +81,11 @@ func resourcePagerDutyTeamRead(d *schema.ResourceData, meta interface{}) error {
func resourcePagerDutyTeamUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*pagerduty.Client)
t := buildTeamStruct(d)
team := buildTeamStruct(d)
log.Printf("[INFO] Updating PagerDuty team %s", d.Id())
t, err := client.UpdateTeam(d.Id(), t)
if err != nil {
if _, err := client.UpdateTeam(d.Id(), team); err != nil {
return err
}
@ -99,9 +97,7 @@ func resourcePagerDutyTeamDelete(d *schema.ResourceData, meta interface{}) error
log.Printf("[INFO] Deleting PagerDuty team %s", d.Id())
err := client.DeleteTeam(d.Id())
if err != nil {
if err := client.DeleteTeam(d.Id()); err != nil {
return err
}

View File

@ -115,17 +115,17 @@ func buildUserStruct(d *schema.ResourceData) *pagerduty.User {
func resourcePagerDutyUserCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*pagerduty.Client)
u := buildUserStruct(d)
user := buildUserStruct(d)
log.Printf("[INFO] Creating PagerDuty user %s", u.Name)
log.Printf("[INFO] Creating PagerDuty user %s", user.Name)
u, err := client.CreateUser(*u)
user, err := client.CreateUser(*user)
if err != nil {
return err
}
d.SetId(u.ID)
d.SetId(user.ID)
return resourcePagerDutyUserUpdate(d, meta)
}
@ -135,21 +135,23 @@ func resourcePagerDutyUserRead(d *schema.ResourceData, meta interface{}) error {
log.Printf("[INFO] Reading PagerDuty user %s", d.Id())
u, err := client.GetUser(d.Id(), pagerduty.GetUserOptions{})
o := &pagerduty.GetUserOptions{}
user, err := client.GetUser(d.Id(), *o)
if err != nil {
return err
}
d.Set("name", u.Name)
d.Set("email", u.Email)
d.Set("time_zone", u.Timezone)
d.Set("color", u.Color)
d.Set("role", u.Role)
d.Set("avatar_url", u.AvatarURL)
d.Set("description", u.Description)
d.Set("job_title", u.JobTitle)
d.Set("teams", u.Teams)
d.Set("name", user.Name)
d.Set("email", user.Email)
d.Set("time_zone", user.Timezone)
d.Set("color", user.Color)
d.Set("role", user.Role)
d.Set("avatar_url", user.AvatarURL)
d.Set("description", user.Description)
d.Set("job_title", user.JobTitle)
d.Set("teams", user.Teams)
return nil
}
@ -157,13 +159,11 @@ func resourcePagerDutyUserRead(d *schema.ResourceData, meta interface{}) error {
func resourcePagerDutyUserUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*pagerduty.Client)
u := buildUserStruct(d)
user := buildUserStruct(d)
log.Printf("[INFO] Updating PagerDuty user %s", d.Id())
u, err := client.UpdateUser(*u)
if err != nil {
if _, err := client.UpdateUser(*user); err != nil {
return err
}
@ -218,9 +218,7 @@ func resourcePagerDutyUserDelete(d *schema.ResourceData, meta interface{}) error
log.Printf("[INFO] Deleting PagerDuty user %s", d.Id())
err := client.DeleteUser(d.Id())
if err != nil {
if err := client.DeleteUser(d.Id()); err != nil {
return err
}

View File

@ -3,7 +3,7 @@ package pagerduty
import pagerduty "github.com/PagerDuty/go-pagerduty"
// Expands an array of escalation rules into []pagerduty.EscalationRules
func expandRules(list []interface{}) []pagerduty.EscalationRule {
func expandEscalationRules(list []interface{}) []pagerduty.EscalationRule {
result := make([]pagerduty.EscalationRule, 0, len(list))
for _, r := range list {
@ -32,7 +32,7 @@ func expandRules(list []interface{}) []pagerduty.EscalationRule {
}
// Flattens an array of []pagerduty.EscalationRule into a map[string]interface{}
func flattenRules(list []pagerduty.EscalationRule) []map[string]interface{} {
func flattenEscalationRules(list []pagerduty.EscalationRule) []map[string]interface{} {
result := make([]map[string]interface{}, 0, len(list))
for _, i := range list {
@ -58,7 +58,7 @@ func flattenRules(list []pagerduty.EscalationRule) []map[string]interface{} {
}
// Expands an array of schedules into []pagerduty.Schedule
func expandLayers(list []interface{}) []pagerduty.ScheduleLayer {
func expandScheduleLayers(list []interface{}) []pagerduty.ScheduleLayer {
result := make([]pagerduty.ScheduleLayer, 0, len(list))
for _, l := range list {
@ -106,8 +106,24 @@ func expandLayers(list []interface{}) []pagerduty.ScheduleLayer {
return result
}
// Expands an array of teams into []pagerduty.APIReference
func expandTeams(list []interface{}) []pagerduty.APIReference {
result := make([]pagerduty.APIReference, 0, len(list))
for _, l := range list {
team := &pagerduty.APIReference{
ID: l.(string),
Type: "team_reference",
}
result = append(result, *team)
}
return result
}
// Flattens an array of []pagerduty.ScheduleLayer into a map[string]interface{}
func flattenLayers(list []pagerduty.ScheduleLayer) []map[string]interface{} {
func flattenScheduleLayers(list []pagerduty.ScheduleLayer) []map[string]interface{} {
result := make([]map[string]interface{}, 0, len(list))
for _, i := range list {
@ -152,42 +168,6 @@ func flattenLayers(list []pagerduty.ScheduleLayer) []map[string]interface{} {
return resultReversed
}
// Flattens an array of []pagerduty.User into a map[string]interface{}
func flattenOnCalls(list []pagerduty.OnCall) []map[string]interface{} {
result := make([]map[string]interface{}, 0, len(list))
for _, i := range list {
r := make(map[string]interface{})
r["escalation_level"] = i.EscalationLevel
r["start"] = i.Start
r["end"] = i.End
user := make(map[string]interface{}, 1)
user["id"] = i.User.ID
user["type"] = i.User.Type
user["name"] = i.User.Summary
user["summary"] = i.User.Summary
schedule := make(map[string]interface{}, 1)
schedule["id"] = i.Schedule.ID
schedule["type"] = i.Schedule.Type
schedule["summary"] = i.Schedule.Summary
policy := make(map[string]interface{}, 1)
policy["id"] = i.EscalationPolicy.ID
policy["type"] = i.EscalationPolicy.Type
policy["summary"] = i.EscalationPolicy.Summary
r["user"] = user
r["schedule"] = schedule
r["escalation_policy"] = policy
result = append(result, r)
}
return result
}
// Takes the result of flatmap.Expand for an array of strings
// and returns a []string
func expandStringList(configured []interface{}) []string {

View File

@ -3,6 +3,7 @@ package pagerduty
import (
"fmt"
pagerduty "github.com/PagerDuty/go-pagerduty"
"github.com/hashicorp/terraform/helper/schema"
)
@ -11,16 +12,57 @@ func validateValueFunc(values []string) schema.SchemaValidateFunc {
return func(v interface{}, k string) (we []string, errors []error) {
value := v.(string)
valid := false
for _, role := range values {
if value == role {
for _, val := range values {
if value == val {
valid = true
break
}
}
if !valid {
errors = append(errors, fmt.Errorf("%s is an invalid value for argument %s. Must be one of %v", value, k, values))
errors = append(errors, fmt.Errorf("%#v is an invalid value for argument %s. Must be one of %#v", value, k, values))
}
return
}
}
// getVendors retrieves all PagerDuty vendors and returns a list of []pagerduty.Vendor
func getVendors(client *pagerduty.Client) ([]pagerduty.Vendor, error) {
var offset uint
var totalCount int
var vendors []pagerduty.Vendor
for {
o := &pagerduty.ListVendorOptions{
APIListObject: pagerduty.APIListObject{
Limit: 100,
Total: 1,
Offset: offset,
},
}
resp, err := client.ListVendors(*o)
if err != nil {
return nil, err
}
for _, v := range resp.Vendors {
totalCount++
vendors = append(vendors, v)
}
rOffset := uint(resp.Offset)
returnedCount := uint(len(resp.Vendors))
rTotal := uint(resp.Total)
if resp.More && uint(totalCount) != uint(rTotal) {
offset = returnedCount + rOffset
continue
}
break
}
return vendors, nil
}

73
vendor/github.com/PagerDuty/go-pagerduty/vendor.go generated vendored Normal file
View File

@ -0,0 +1,73 @@
package pagerduty
import (
"fmt"
"net/http"
"github.com/google/go-querystring/query"
)
// Vendor represents a specific type of integration. AWS Cloudwatch, Splunk, Datadog, etc are all examples of vendors that can be integrated in PagerDuty by making an integration.
type Vendor struct {
APIObject
Name string `json:"name,omitempty"`
LogoURL string `json:"logo_url,omitempty"`
LongName string `json:"long_name,omitempty"`
WebsiteURL string `json:"website_url,omitempty"`
Description string `json:"description,omitempty"`
Connectable bool `json:"connectable,omitempty"`
ThumbnailURL string `json:"thumbnail_url,omitempty"`
GenericServiceType string `json:"generic_service_type,omitempty"`
IntegrationGuideURL string `json:"integration_guide_url,omitempty"`
}
// ListVendorResponse is the data structure returned from calling the ListVendors API endpoint.
type ListVendorResponse struct {
APIListObject
Vendors []Vendor
}
// ListVendorOptions is the data structure used when calling the ListVendors API endpoint.
type ListVendorOptions struct {
APIListObject
}
// ListVendors lists existing vendors.
func (c *Client) ListVendors(o ListVendorOptions) (*ListVendorResponse, error) {
v, err := query.Values(o)
if err != nil {
return nil, err
}
resp, err := c.get("/vendors?" + v.Encode())
if err != nil {
return nil, err
}
var result ListVendorResponse
return &result, c.decodeJSON(resp, &result)
}
// GetVendor gets details about an existing vendor.
func (c *Client) GetVendor(id string) (*Vendor, error) {
resp, err := c.get("/vendors/" + id)
return getVendorFromResponse(c, resp, err)
}
func getVendorFromResponse(c *Client, resp *http.Response, err error) (*Vendor, error) {
if err != nil {
return nil, err
}
var target map[string]Vendor
if dErr := c.decodeJSON(resp, &target); dErr != nil {
return nil, fmt.Errorf("Could not decode JSON response: %v", dErr)
}
rootNode := "vendor"
t, nodeOK := target[rootNode]
if !nodeOK {
return nil, fmt.Errorf("JSON response does not have %s field", rootNode)
}
return &t, nil
}

6
vendor/vendor.json vendored
View File

@ -296,10 +296,10 @@
"revision": "0290933f5e8afd933f2823fce32bf2847e6ea603"
},
{
"checksumSHA1": "QH+vxSOfdjdSBQBCTXoahGFRY0g=",
"checksumSHA1": "O9o5S7D0E1PaN5ARQ72xLfOrIa0=",
"path": "github.com/PagerDuty/go-pagerduty",
"revision": "21b2c2f0311f017d2c1d964e17a6037767bd8cbc",
"revisionTime": "2016-10-18T05:48:56Z"
"revision": "f4d5289481b2c05f2b23f81a64dff86aca960962",
"revisionTime": "2016-10-22T00:40:41Z"
},
{
"path": "github.com/Unknwon/com",

View File

@ -1,59 +0,0 @@
---
layout: "pagerduty"
page_title: "PagerDuty: pagerduty_on_call"
sidebar_current: "docs-pagerduty-datasource-on_call"
description: |-
Get information about who's on call.
---
# pagerduty\_on_call
Use this data source to get all of the users [on call][1] in a given schedule.
## Example Usage
```
resource "pagerduty_schedule" "foo" {
name = "Daily Engineering Rotation"
time_zone = "America/New_York"
layer {
name = "Night Shift"
start = "2015-11-06T20:00:00-05:00"
rotation_virtual_start = "2015-11-06T20:00:00-05:00"
rotation_turn_length_seconds = 86400
users = ["${pagerduty_user.foo.id}"]
restriction {
type = "daily_restriction"
start_time_of_day = "08:00:00"
duration_seconds = 32400
}
}
}
data "pagerduty_on_call" "on_call" {}
resource "pagerduty_team" "on_call" {
name = "On call"
description = "Primarily used by ${data.pagerduty_on_call.oncalls.0.id}"
}
```
## Argument Reference
The following arguments are supported:
* `time_zone` - (Optional) Time zone in which dates in the result will be rendered.
* `include` - (Optional) List of of additional details to include. Can be `escalation_policies`, `users`, `schedules`.
* `user_ids` - (Optional) Filters the results, showing only on-calls for the specified user IDs.
* `escalation_policy_ids` - (Optional) Filters the results, showing only on-calls for the specified escalation policy IDs.
* `user_ids` - (Optional) Filters the results, showing only on-calls for the specified schedule IDs.
* `since` - (Optional) The start of the time range over which you want to search. If an on-call period overlaps with the range, it will be included in the result. Defaults to current time. The search range cannot exceed 3 months.
* `until` - (Optional) The end of the time range over which you want to search. If an on-call period overlaps with the range, it will be included in the result. Defaults to current time. The search range cannot exceed 3 months, and the until time cannot be before the since time.
* `earliest` - (Optional) This will filter on-calls such that only the earliest on-call for each combination of escalation policy, escalation level, and user is returned. This is useful for determining when the "next" on-calls are for a given set of filters.
## Attributes Reference
* `oncalls` - A list of on-call entries during a given time range.
[1]: https://v2.developer.pagerduty.com/v2/page/api-reference#!/On-Calls/get_oncalls

View File

@ -0,0 +1,65 @@
---
layout: "pagerduty"
page_title: "PagerDuty: pagerduty_vendor"
sidebar_current: "docs-pagerduty-datasource-vendor"
description: |-
Get information about a vendor that you can use for a service integration (e.g Amazon Cloudwatch, Splunk, Datadog).
---
# pagerduty\_vendor
Use this data source to get information about a specific [vendor][1] that you can use for a service integration (e.g Amazon Cloudwatch, Splunk, Datadog).
## Example Usage
```
data "pagerduty_vendor" "datadog" {
name_regex = "^Datadog$"
}
resource "pagerduty_user" "example" {
name = "Earline Greenholt"
email = "125.greenholt.earline@graham.name"
teams = ["${pagerduty_team.example.id}"]
}
resource "pagerduty_escalation_policy" "foo" {
name = "Engineering Escalation Policy"
num_loops = 2
rule {
escalation_delay_in_minutes = 10
target {
type = "user"
id = "${pagerduty_user.example.id}"
}
}
}
resource "pagerduty_service" "example" {
name = "My Web App"
auto_resolve_timeout = 14400
acknowledgement_timeout = 600
escalation_policy = "${pagerduty_escalation_policy.example.id}"
}
resource "pagerduty_service_integration" "example" {
name = "Datadog Integration"
vendor = "${data.pagerduty_vendor.datadog.id}"
service = "${pagerduty_service.example.id}"
type = "generic_events_api_inbound_integration"
}
```
## Argument Reference
The following arguments are supported:
* `name_regex` - (Required) A regex string to apply to the vendor list returned by the PagerDuty API. This regex should be very specific. If your regex matches several vendors a list of found vendors will be returned so you can tweak your regex further. The final regex string is made case insensitive.
## Attributes Reference
* `name` - The short name of the found vendor.
* `type` - The generic service type for this vendor.
[1]: https://v2.developer.pagerduty.com/v2/page/api-reference#!/Vendors/get_vendors

View File

@ -14,15 +14,21 @@ An [escalation policy](https://v2.developer.pagerduty.com/v2/page/api-reference#
## Example Usage
```
resource "pagerduty_team" "example" {
name = "Engineering"
description = "All engineering"
}
resource "pagerduty_user" "example" {
name = "Earline Greenholt"
email = "125.greenholt.earline@graham.name"
teams = ["${pagerduty_team.example.id}"]
}
resource "pagerduty_escalation_policy" "foo" {
resource "pagerduty_escalation_policy" "example" {
name = "Engineering Escalation Policy"
num_loops = 2
teams = ["${pagerduty_team.example.id}"]
rule {
escalation_delay_in_minutes = 10
@ -40,6 +46,7 @@ resource "pagerduty_escalation_policy" "foo" {
The following arguments are supported:
* `name` - (Required) The name of the escalation policy.
* `teams` - (Optional) Teams associated with the policy. Account must have the `teams` ability to use this parameter.
* `description` - (Optional) A human-friendly description of the escalation policy.
If not set, a placeholder of "Managed by Terraform" will be set.
* `num_loops` - (Optional) The number of times the escalation policy will repeat after reaching the end of its escalation.

View File

@ -10,6 +10,8 @@ description: |-
A [service integration](https://v2.developer.pagerduty.com/v2/page/api-reference#!/Services/post_services_id_integrations) is an integration that belongs to a service.
`Note`: A service integration `cannot` be deleted via Terraform nor the PagerDuty API so if you remove a service integration, be sure to remove it from the PagerDuty Web UI afterwards. However, if you delete the `service` attached to the `integration`, the integration will be removed.
## Example Usage
@ -46,6 +48,28 @@ resource "pagerduty_service_integration" "example" {
type = "generic_events_api_inbound_integration"
service = "${pagerduty_service.example.id}"
}
data "pagerduty_vendor" "datadog" {
name = "Datadog"
}
data "pagerduty_vendor" "cloudwatch" {
name_regex = "Amazon CloudWatch"
}
resource "pagerduty_service_integration" "datadog" {
name = "${data.pagerduty_vendor.datadog.name}"
type = "generic_events_api_inbound_integration"
service = "${pagerduty_service.example.id}"
vendor = "${data.pagerduty_vendor.datadog.id}"
}
resource "pagerduty_service_integration" "datadog" {
name = "${data.pagerduty_vendor.datadog.name}"
type = "generic_events_api_inbound_integration"
service = "${pagerduty_service.example.id}"
vendor = "${data.pagerduty_vendor.datadog.id}"
}
```
## Argument Reference
@ -60,8 +84,12 @@ The following arguments are supported:
`keynote_inbound_integration`,
`nagios_inbound_integration`,
`pingdom_inbound_integration`,
`sql_monitor_inbound_integration`
`sql_monitor_inbound_integration`.
When integrating with a `vendor` this can usually be set to: `${data.pagerduty_vendor.datadog.type}`
* `service` - (Optional) The PagerDuty service that the integration belongs to.
* `vendor` - (Optional) The vendor that this integration integrates with, if applicable. (e.g Datadog)
## Attributes Reference

View File

@ -10,6 +10,7 @@ description: |-
A [team](https://v2.developer.pagerduty.com/v2/page/api-reference#!/Teams/get_teams) is a collection of users and escalation policies that represent a group of people within an organization.
The account must have the `teams` ability to use the following resource.
## Example Usage

View File

@ -33,7 +33,6 @@ The following arguments are supported:
* `name` - (Required) The name of the user.
* `email` - (Required) The user's email address.
* `color` - (Optional) The schedule color for the user.
* `role` - (Optional) The user role. Account must have the `read_only_users` ability to set a user as a `read_only_user`. Can be `admin`, `limited_user`, `owner`, `read_only_user` or `user`
* `job_title` - (Optional) The user's title.
* `teams` - (Optional) A list of teams the user should belong to.

View File

@ -13,8 +13,8 @@
<li<%= sidebar_current(/^docs-pagerduty-datasource/) %>>
<a href="#">Data Sources</a>
<ul class="nav nav-visible">
<li<%= sidebar_current("docs-pagerduty-datasource-on_call") %>>
<a href="/docs/providers/pagerduty/d/on_call.html">pagerduty_on_call</a>
<li<%= sidebar_current("docs-pagerduty-datasource-vendor") %>>
<a href="/docs/providers/pagerduty/d/vendor.html">pagerduty_vendor</a>
</li>
</ul>
</li>