Skip to content

Commit 15cde73

Browse files
paultyngstack72
authored andcommitted
Add pagerduty_user data source (hashicorp#10541)
1 parent 726c998 commit 15cde73

5 files changed

Lines changed: 174 additions & 0 deletions

File tree

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
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 dataSourcePagerDutyUser() *schema.Resource {
12+
return &schema.Resource{
13+
Read: dataSourcePagerDutyUserRead,
14+
15+
Schema: map[string]*schema.Schema{
16+
"name": {
17+
Type: schema.TypeString,
18+
Computed: true,
19+
},
20+
"email": {
21+
Type: schema.TypeString,
22+
Required: true,
23+
},
24+
},
25+
}
26+
}
27+
28+
func dataSourcePagerDutyUserRead(d *schema.ResourceData, meta interface{}) error {
29+
client := meta.(*pagerduty.Client)
30+
31+
log.Printf("[INFO] Reading PagerDuty user")
32+
33+
searchEmail := d.Get("email").(string)
34+
35+
o := &pagerduty.ListUsersOptions{
36+
Query: searchEmail,
37+
}
38+
39+
resp, err := client.ListUsers(*o)
40+
if err != nil {
41+
return err
42+
}
43+
44+
var found *pagerduty.User
45+
46+
for _, user := range resp.Users {
47+
if user.Email == searchEmail {
48+
found = &user
49+
break
50+
}
51+
}
52+
53+
if found == nil {
54+
return fmt.Errorf("Unable to locate any user with the email: %s", searchEmail)
55+
}
56+
57+
d.SetId(found.ID)
58+
d.Set("name", found.Name)
59+
d.Set("email", found.Email)
60+
61+
return nil
62+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package pagerduty
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform/helper/acctest"
8+
"github.com/hashicorp/terraform/helper/resource"
9+
"github.com/hashicorp/terraform/terraform"
10+
)
11+
12+
func TestAccDataSourcePagerDutyUser_Basic(t *testing.T) {
13+
rName := acctest.RandString(5)
14+
resource.Test(t, resource.TestCase{
15+
PreCheck: func() { testAccPreCheck(t) },
16+
Providers: testAccProviders,
17+
Steps: []resource.TestStep{
18+
resource.TestStep{
19+
Config: testAccDataSourcePagerDutyUserConfig(rName),
20+
Check: resource.ComposeTestCheckFunc(
21+
testAccDataSourcePagerDutyUser("pagerduty_user.test", "data.pagerduty_user.by_email"),
22+
),
23+
},
24+
},
25+
})
26+
}
27+
28+
func testAccDataSourcePagerDutyUser(src, n string) resource.TestCheckFunc {
29+
return func(s *terraform.State) error {
30+
31+
srcR := s.RootModule().Resources[src]
32+
srcA := srcR.Primary.Attributes
33+
34+
r := s.RootModule().Resources[n]
35+
a := r.Primary.Attributes
36+
37+
if a["id"] == "" {
38+
return fmt.Errorf("Expected to get a user ID from PagerDuty")
39+
}
40+
41+
testAtts := []string{"id", "name", "email"}
42+
43+
for _, att := range testAtts {
44+
if a[att] != srcA[att] {
45+
return fmt.Errorf("Expected the user %s to be: %s, but got: %s", att, srcA[att], a[att])
46+
}
47+
}
48+
49+
return nil
50+
}
51+
}
52+
53+
func testAccDataSourcePagerDutyUserConfig(rName string) string {
54+
return fmt.Sprintf(`
55+
resource "pagerduty_user" "test" {
56+
name = "TF User %[1]s"
57+
email = "tf.%[1]s@example.com"
58+
}
59+
60+
data "pagerduty_user" "by_email" {
61+
email = "${pagerduty_user.test.email}"
62+
}
63+
`, rName)
64+
}

builtin/providers/pagerduty/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ func Provider() terraform.ResourceProvider {
1919
},
2020

2121
DataSourcesMap: map[string]*schema.Resource{
22+
"pagerduty_user": dataSourcePagerDutyUser(),
2223
"pagerduty_vendor": dataSourcePagerDutyVendor(),
2324
},
2425

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
---
2+
layout: "pagerduty"
3+
page_title: "PagerDuty: pagerduty_user"
4+
sidebar_current: "docs-pagerduty-datasource-user"
5+
description: |-
6+
Get information about a user that you can use for a service integration (e.g Amazon Cloudwatch, Splunk, Datadog).
7+
---
8+
9+
# pagerduty\_user
10+
11+
Use this data source to get information about a specific [user][1] that you can use for other Pager Duty resources.
12+
13+
## Example Usage
14+
15+
```
16+
data "pagerduty_user" "me" {
17+
email = "me@example.com"
18+
}
19+
20+
resource "pagerduty_escalation_policy" "foo" {
21+
name = "Engineering Escalation Policy"
22+
num_loops = 2
23+
24+
rule {
25+
escalation_delay_in_minutes = 10
26+
27+
target {
28+
type = "user"
29+
id = "${data.pagerduty_user.me.id}"
30+
}
31+
}
32+
}
33+
```
34+
35+
## Argument Reference
36+
37+
The following arguments are supported:
38+
39+
* `email` - (Required) The email to use to find a user in the PagerDuty API.
40+
41+
## Attributes Reference
42+
* `name` - The short name of the found user.
43+
44+
[1]: https://v2.developer.pagerduty.com/v2/page/api-reference#!/Users/get_users

website/source/layouts/pagerduty.erb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
<li<%= sidebar_current(/^docs-pagerduty-datasource/) %>>
1414
<a href="#">Data Sources</a>
1515
<ul class="nav nav-visible">
16+
<li<%= sidebar_current("docs-pagerduty-datasource-user") %>>
17+
<a href="/docs/providers/pagerduty/d/user.html">pagerduty_user</a>
18+
</li>
1619
<li<%= sidebar_current("docs-pagerduty-datasource-vendor") %>>
1720
<a href="/docs/providers/pagerduty/d/vendor.html">pagerduty_vendor</a>
1821
</li>

0 commit comments

Comments
 (0)