Skip to content

Commit 286005b

Browse files
heimwehstack72
authored andcommitted
provider/pagerduty: pagerduty_addon resource (hashicorp#11620)
* Add resource * Add tests * Add documentation
1 parent 523432e commit 286005b

5 files changed

Lines changed: 254 additions & 0 deletions

File tree

builtin/providers/pagerduty/provider.go

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

2828
ResourcesMap: map[string]*schema.Resource{
29+
"pagerduty_addon": resourcePagerDutyAddon(),
2930
"pagerduty_user": resourcePagerDutyUser(),
3031
"pagerduty_team": resourcePagerDutyTeam(),
3132
"pagerduty_service": resourcePagerDutyService(),
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package pagerduty
2+
3+
import (
4+
"log"
5+
6+
"github.com/PagerDuty/go-pagerduty"
7+
"github.com/hashicorp/terraform/helper/schema"
8+
)
9+
10+
func resourcePagerDutyAddon() *schema.Resource {
11+
return &schema.Resource{
12+
Create: resourcePagerDutyAddonCreate,
13+
Read: resourcePagerDutyAddonRead,
14+
Update: resourcePagerDutyAddonUpdate,
15+
Delete: resourcePagerDutyAddonDelete,
16+
Importer: &schema.ResourceImporter{
17+
State: resourcePagerDutyAddonImport,
18+
},
19+
Schema: map[string]*schema.Schema{
20+
"name": {
21+
Type: schema.TypeString,
22+
Required: true,
23+
},
24+
"src": {
25+
Type: schema.TypeString,
26+
Required: true,
27+
},
28+
},
29+
}
30+
}
31+
32+
func buildAddonStruct(d *schema.ResourceData) *pagerduty.Addon {
33+
addon := pagerduty.Addon{
34+
Name: d.Get("name").(string),
35+
Src: d.Get("src").(string),
36+
APIObject: pagerduty.APIObject{
37+
Type: "full_page_addon",
38+
},
39+
}
40+
41+
return &addon
42+
}
43+
44+
func resourcePagerDutyAddonCreate(d *schema.ResourceData, meta interface{}) error {
45+
client := meta.(*pagerduty.Client)
46+
47+
addon := buildAddonStruct(d)
48+
49+
log.Printf("[INFO] Creating PagerDuty add-on %s", addon.Name)
50+
51+
addon, err := client.InstallAddon(*addon)
52+
if err != nil {
53+
return err
54+
}
55+
56+
d.SetId(addon.ID)
57+
58+
return resourcePagerDutyAddonRead(d, meta)
59+
}
60+
61+
func resourcePagerDutyAddonRead(d *schema.ResourceData, meta interface{}) error {
62+
client := meta.(*pagerduty.Client)
63+
64+
log.Printf("[INFO] Reading PagerDuty add-on %s", d.Id())
65+
66+
addon, err := client.GetAddon(d.Id())
67+
if err != nil {
68+
if isNotFound(err) {
69+
d.SetId("")
70+
return nil
71+
}
72+
return err
73+
}
74+
75+
d.Set("name", addon.Name)
76+
d.Set("src", addon.Src)
77+
78+
return nil
79+
}
80+
81+
func resourcePagerDutyAddonUpdate(d *schema.ResourceData, meta interface{}) error {
82+
client := meta.(*pagerduty.Client)
83+
84+
addon := buildAddonStruct(d)
85+
86+
log.Printf("[INFO] Updating PagerDuty add-on %s", d.Id())
87+
88+
if _, err := client.UpdateAddon(d.Id(), *addon); err != nil {
89+
return err
90+
}
91+
92+
return nil
93+
}
94+
95+
func resourcePagerDutyAddonDelete(d *schema.ResourceData, meta interface{}) error {
96+
client := meta.(*pagerduty.Client)
97+
98+
log.Printf("[INFO] Deleting PagerDuty add-on %s", d.Id())
99+
100+
if err := client.DeleteAddon(d.Id()); err != nil {
101+
return err
102+
}
103+
104+
d.SetId("")
105+
106+
return nil
107+
}
108+
109+
func resourcePagerDutyAddonImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
110+
if err := resourcePagerDutyAddonRead(d, meta); err != nil {
111+
return nil, err
112+
}
113+
return []*schema.ResourceData{d}, nil
114+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package pagerduty
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/PagerDuty/go-pagerduty"
8+
"github.com/hashicorp/terraform/helper/resource"
9+
"github.com/hashicorp/terraform/terraform"
10+
)
11+
12+
func TestAccPagerDutyAddon_Basic(t *testing.T) {
13+
resource.Test(t, resource.TestCase{
14+
PreCheck: func() { testAccPreCheck(t) },
15+
Providers: testAccProviders,
16+
CheckDestroy: testAccCheckPagerDutyAddonDestroy,
17+
Steps: []resource.TestStep{
18+
resource.TestStep{
19+
Config: testAccCheckPagerDutyAddonConfig,
20+
Check: resource.ComposeTestCheckFunc(
21+
testAccCheckPagerDutyAddonExists("pagerduty_addon.foo"),
22+
resource.TestCheckResourceAttr(
23+
"pagerduty_addon.foo", "name", "Foo status page"),
24+
resource.TestCheckResourceAttr(
25+
"pagerduty_addon.foo", "src", "https://intranet.foo.com/status"),
26+
),
27+
},
28+
resource.TestStep{
29+
Config: testAccCheckPagerDutyAddonConfigUpdated,
30+
Check: resource.ComposeTestCheckFunc(
31+
testAccCheckPagerDutyAddonExists("pagerduty_addon.foo"),
32+
resource.TestCheckResourceAttr(
33+
"pagerduty_addon.foo", "name", "Bar status page"),
34+
resource.TestCheckResourceAttr(
35+
"pagerduty_addon.foo", "src", "https://intranet.bar.com/status"),
36+
),
37+
},
38+
},
39+
})
40+
}
41+
42+
func testAccCheckPagerDutyAddonDestroy(s *terraform.State) error {
43+
client := testAccProvider.Meta().(*pagerduty.Client)
44+
for _, r := range s.RootModule().Resources {
45+
if r.Type != "pagerduty_addon" {
46+
continue
47+
}
48+
49+
if _, err := client.GetAddon(r.Primary.ID); err == nil {
50+
return fmt.Errorf("Add-on still exists")
51+
}
52+
53+
}
54+
return nil
55+
}
56+
57+
func testAccCheckPagerDutyAddonExists(n string) resource.TestCheckFunc {
58+
return func(s *terraform.State) error {
59+
rs, ok := s.RootModule().Resources[n]
60+
if !ok {
61+
return fmt.Errorf("Not found: %s", n)
62+
}
63+
64+
if rs.Primary.ID == "" {
65+
return fmt.Errorf("No add-on ID is set")
66+
}
67+
68+
client := testAccProvider.Meta().(*pagerduty.Client)
69+
70+
found, err := client.GetAddon(rs.Primary.ID)
71+
if err != nil {
72+
return err
73+
}
74+
75+
if found.ID != rs.Primary.ID {
76+
return fmt.Errorf("Add-on not found: %v - %v", rs.Primary.ID, found)
77+
}
78+
79+
return nil
80+
}
81+
}
82+
83+
const testAccCheckPagerDutyAddonConfig = `
84+
resource "pagerduty_addon" "foo" {
85+
name = "Foo status page"
86+
src = "https://intranet.foo.com/status"
87+
}
88+
`
89+
90+
const testAccCheckPagerDutyAddonConfigUpdated = `
91+
resource "pagerduty_addon" "foo" {
92+
name = "Bar status page"
93+
src = "https://intranet.bar.com/status"
94+
}
95+
`
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
---
2+
layout: "pagerduty"
3+
page_title: "PagerDuty: pagerduty_addon"
4+
sidebar_current: "docs-pagerduty-resource-addon"
5+
description: |-
6+
Creates and manages an add-on in PagerDuty.
7+
---
8+
9+
# pagerduty\_addon
10+
11+
With [add-ons](https://v2.developer.pagerduty.com/v2/page/api-reference#!/Add-ons/get_addons), third-party developers can write their own add-ons to PagerDuty's UI. Given a configuration containing a src parameter, that URL will be embedded in an iframe on a page that's available to users from a drop-down menu.
12+
13+
## Example Usage
14+
15+
```
16+
resource "pagerduty_addon" "example" {
17+
name = "Internal Status Page"
18+
src = "https://intranet.example.com/status"
19+
}
20+
```
21+
22+
## Argument Reference
23+
24+
The following arguments are supported:
25+
26+
* `name` - (Required) The name of the add-on.
27+
* `src` - (Required) The source URL to display in a frame in the PagerDuty UI. `HTTPS` is required.
28+
29+
## Attributes Reference
30+
31+
The following attributes are exported:
32+
33+
* `id` - The ID of the add-on.
34+
35+
## Import
36+
37+
Add-ons can be imported using the `id`, e.g.
38+
39+
```
40+
$ terraform import pagerduty_addon.example P3DH5M6
41+
```

website/source/layouts/pagerduty.erb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131
<li<%= sidebar_current(/^docs-pagerduty-resource/) %>>
3232
<a href="#">Resources</a>
3333
<ul class="nav nav-visible">
34+
<li<%= sidebar_current("docs-pagerduty-resource-addon") %>>
35+
<a href="/docs/providers/pagerduty/r/addon.html">pagerduty_addon</a>
36+
</li>
3437
<li<%= sidebar_current("docs-pagerduty-resource-user") %>>
3538
<a href="/docs/providers/pagerduty/r/user.html">pagerduty_user</a>
3639
</li>

0 commit comments

Comments
 (0)