Skip to content

[datadog_integration_pagerduty_service_object] Add data source for pagerduty service objects #1773

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package datadog

import (
"context"
"fmt"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"

"github.com/terraform-providers/terraform-provider-datadog/datadog/internal/utils"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

func dataSourceDatadogIntegrationPagerdutySO() *schema.Resource {
return &schema.Resource{
Description: "Use this data source to retrieve individual Service Objects of Datadog PagerDuty integrations. Note that the Datadog PagerDuty integration must be activated in the Datadog UI in order for this resource to be usable.",
ReadContext: dataSourceDatadogIntegrationPagerdutySORead,

Schema: map[string]*schema.Schema{
"service_name": {
Description: "Your Service name in PagerDuty.",
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringIsNotEmpty,
},
},
}
}

func dataSourceDatadogIntegrationPagerdutySORead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
providerConf := meta.(*ProviderConfiguration)
apiInstances := providerConf.DatadogApiInstances
auth := providerConf.Auth

err := resource.RetryContext(ctx, d.Timeout(schema.TimeoutRead), func() *resource.RetryError {
searchedName := d.Get("service_name")

resp, httpresp, err := apiInstances.GetPagerDutyIntegrationApiV1().GetPagerDutyIntegrationService(auth, searchedName.(string))

if err != nil {
if httpresp != nil && (httpresp.StatusCode == 504 || httpresp.StatusCode == 502) {
return resource.RetryableError(utils.TranslateClientError(err, httpresp, "error querying pagerduty integrations, retrying"))
}
if httpresp != nil && httpresp.StatusCode == 404 {
d.SetId("")
return nil
}
return resource.NonRetryableError(utils.TranslateClientError(err, httpresp, "error querying pagerduty integrations"))
}

if serviceName, ok := resp.GetServiceNameOk(); !ok {
d.SetId("")
return resource.NonRetryableError(fmt.Errorf("couldn't find a pagerduty integration service named %s", *serviceName))
} else {
d.SetId(*serviceName)
}

return nil
})
if err != nil {
return diag.FromErr(err)
}

return nil
}
53 changes: 27 additions & 26 deletions datadog/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -180,32 +180,33 @@ func Provider() *schema.Provider {
},

DataSourcesMap: map[string]*schema.Resource{
"datadog_api_key": dataSourceDatadogApiKey(),
"datadog_application_key": dataSourceDatadogApplicationKey(),
"datadog_cloud_workload_security_agent_rules": dataSourceDatadogCloudWorkloadSecurityAgentRules(),
"datadog_dashboard": dataSourceDatadogDashboard(),
"datadog_dashboard_list": dataSourceDatadogDashboardList(),
"datadog_integration_aws_logs_services": dataSourceDatadogIntegrationAWSLogsServices(),
"datadog_ip_ranges": dataSourceDatadogIPRanges(),
"datadog_logs_archives_order": dataSourceDatadogLogsArchivesOrder(),
"datadog_logs_indexes": dataSourceDatadogLogsIndexes(),
"datadog_logs_indexes_order": dataSourceDatadogLogsIndexesOrder(),
"datadog_logs_pipelines": dataSourceDatadogLogsPipelines(),
"datadog_monitor": dataSourceDatadogMonitor(),
"datadog_monitors": dataSourceDatadogMonitors(),
"datadog_monitor_config_policies": dataSourceDatadogMonitorConfigPolicies(),
"datadog_permissions": dataSourceDatadogPermissions(),
"datadog_role": dataSourceDatadogRole(),
"datadog_roles": dataSourceDatadogRoles(),
"datadog_rum_application": dataSourceDatadogRUMApplication(),
"datadog_security_monitoring_rules": dataSourceDatadogSecurityMonitoringRules(),
"datadog_security_monitoring_filters": dataSourceDatadogSecurityMonitoringFilters(),
"datadog_service_level_objective": dataSourceDatadogServiceLevelObjective(),
"datadog_service_level_objectives": dataSourceDatadogServiceLevelObjectives(),
"datadog_synthetics_locations": dataSourceDatadogSyntheticsLocations(),
"datadog_synthetics_global_variable": dataSourceDatadogSyntheticsGlobalVariable(),
"datadog_synthetics_test": dataSourceDatadogSyntheticsTest(),
"datadog_user": dataSourceDatadogUser(),
"datadog_api_key": dataSourceDatadogApiKey(),
"datadog_application_key": dataSourceDatadogApplicationKey(),
"datadog_cloud_workload_security_agent_rules": dataSourceDatadogCloudWorkloadSecurityAgentRules(),
"datadog_dashboard": dataSourceDatadogDashboard(),
"datadog_dashboard_list": dataSourceDatadogDashboardList(),
"datadog_integration_aws_logs_services": dataSourceDatadogIntegrationAWSLogsServices(),
"datadog_ip_ranges": dataSourceDatadogIPRanges(),
"datadog_logs_archives_order": dataSourceDatadogLogsArchivesOrder(),
"datadog_logs_indexes": dataSourceDatadogLogsIndexes(),
"datadog_logs_indexes_order": dataSourceDatadogLogsIndexesOrder(),
"datadog_logs_pipelines": dataSourceDatadogLogsPipelines(),
"datadog_monitor": dataSourceDatadogMonitor(),
"datadog_monitors": dataSourceDatadogMonitors(),
"datadog_monitor_config_policies": dataSourceDatadogMonitorConfigPolicies(),
"datadog_permissions": dataSourceDatadogPermissions(),
"datadog_role": dataSourceDatadogRole(),
"datadog_roles": dataSourceDatadogRoles(),
"datadog_rum_application": dataSourceDatadogRUMApplication(),
"datadog_security_monitoring_rules": dataSourceDatadogSecurityMonitoringRules(),
"datadog_security_monitoring_filters": dataSourceDatadogSecurityMonitoringFilters(),
"datadog_service_level_objective": dataSourceDatadogServiceLevelObjective(),
"datadog_service_level_objectives": dataSourceDatadogServiceLevelObjectives(),
"datadog_synthetics_locations": dataSourceDatadogSyntheticsLocations(),
"datadog_synthetics_global_variable": dataSourceDatadogSyntheticsGlobalVariable(),
"datadog_synthetics_test": dataSourceDatadogSyntheticsTest(),
"datadog_user": dataSourceDatadogUser(),
"datadog_integration_pagerduty_service_object": dataSourceDatadogIntegrationPagerdutySO(),
},

ConfigureContextFunc: providerConfigure,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
2023-02-09T15:11:35.55929-05:00
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
---
version: 1
interactions:
- request:
body: |
{"service_key":"tf-TestAccDatadogPagerdutyIntegrationSODatasource-local-1675973495","service_name":"tf-TestAccDatadogPagerdutyIntegrationSODatasource-local-1675973495"}
form: {}
headers:
Accept:
- application/json
Content-Type:
- application/json
url: https://api.datadoghq.com/api/v1/integration/pagerduty/configuration/services
method: POST
response:
body: |
{"service_name":"tf-TestAccDatadogPagerdutyIntegrationSODatasource-local-1675973495"}
headers:
Content-Type:
- application/json
status: 201 Created
code: 201
duration: ""
- request:
body: ""
form: {}
headers:
Accept:
- application/json
url: https://api.datadoghq.com/api/v1/integration/pagerduty/configuration/services/tf-TestAccDatadogPagerdutyIntegrationSODatasource-local-1675973495
method: GET
response:
body: |
{"service_name":"tf-TestAccDatadogPagerdutyIntegrationSODatasource-local-1675973495"}
headers:
Content-Type:
- application/json
status: 200 OK
code: 200
duration: ""
- request:
body: ""
form: {}
headers:
Accept:
- application/json
url: https://api.datadoghq.com/api/v1/integration/pagerduty/configuration/services/tf-TestAccDatadogPagerdutyIntegrationSODatasource-local-1675973495
method: GET
response:
body: |
{"service_name":"tf-TestAccDatadogPagerdutyIntegrationSODatasource-local-1675973495"}
headers:
Content-Type:
- application/json
status: 200 OK
code: 200
duration: ""
- request:
body: ""
form: {}
headers: {}
url: https://api.datadoghq.com/api/v1/integration/pagerduty
method: GET
response:
body: |
{"show_all_incidents":false,"filter_services":[],"schedules":["https://ddog.pagerduty.com/schedules/X123VF"],"api_token":"*****","services":[{"service_name":"tf-TestAccDatadogPagerdutyIntegrationSODatasource-local-1675973495","service_key":"*****"}],"subdomain":"testdomain"}
headers:
Content-Type:
- application/json
status: 200 OK
code: 200
duration: ""
- request:
body: ""
form: {}
headers:
Accept:
- application/json
url: https://api.datadoghq.com/api/v1/integration/pagerduty/configuration/services/tf-TestAccDatadogPagerdutyIntegrationSODatasource-local-1675973495
method: GET
response:
body: |
{"service_name":"tf-TestAccDatadogPagerdutyIntegrationSODatasource-local-1675973495"}
headers:
Content-Type:
- application/json
status: 200 OK
code: 200
duration: ""
- request:
body: ""
form: {}
headers:
Accept:
- application/json
url: https://api.datadoghq.com/api/v1/integration/pagerduty/configuration/services/tf-TestAccDatadogPagerdutyIntegrationSODatasource-local-1675973495
method: GET
response:
body: |
{"service_name":"tf-TestAccDatadogPagerdutyIntegrationSODatasource-local-1675973495"}
headers:
Content-Type:
- application/json
status: 200 OK
code: 200
duration: ""
- request:
body: ""
form: {}
headers:
Accept:
- application/json
url: https://api.datadoghq.com/api/v1/integration/pagerduty/configuration/services/tf-TestAccDatadogPagerdutyIntegrationSODatasource-local-1675973495
method: GET
response:
body: |
{"service_name":"tf-TestAccDatadogPagerdutyIntegrationSODatasource-local-1675973495"}
headers:
Content-Type:
- application/json
status: 200 OK
code: 200
duration: ""
- request:
body: ""
form: {}
headers:
Accept:
- application/json
url: https://api.datadoghq.com/api/v1/integration/pagerduty/configuration/services/tf-TestAccDatadogPagerdutyIntegrationSODatasource-local-1675973495
method: GET
response:
body: |
{"service_name":"tf-TestAccDatadogPagerdutyIntegrationSODatasource-local-1675973495"}
headers:
Content-Type:
- application/json
status: 200 OK
code: 200
duration: ""
- request:
body: ""
form: {}
headers:
Accept:
- '*/*'
url: https://api.datadoghq.com/api/v1/integration/pagerduty/configuration/services/tf-TestAccDatadogPagerdutyIntegrationSODatasource-local-1675973495
method: DELETE
response:
body: ""
headers: {}
status: 204 No Content
code: 204
duration: ""
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package test

import (
"context"
"fmt"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

func TestAccDatadogPagerdutyIntegrationSODatasource(t *testing.T) {
t.Parallel()
ctx, accProviders := testAccProviders(context.Background(), t)
uniq := uniqueEntityName(ctx, t)
accProvider := testAccProvider(t, accProviders)

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProviderFactories: accProviders,
CheckDestroy: testAccCheckDatadogIntegrationPagerdutyDestroy(accProvider),
Steps: []resource.TestStep{
{
Config: testAccDatasourcePagerdutyIntegrationSOConfig(uniq),
Check: checkDatasourcePagerdutyIntegrationSOAttrs(accProvider, uniq),
},
},
})
}

func checkDatasourcePagerdutyIntegrationSOAttrs(accProvider func() (*schema.Provider, error), uniq string) resource.TestCheckFunc {
return resource.ComposeTestCheckFunc(
testAccCheckDatadogIntegrationPagerdutyExists(accProvider),
resource.TestCheckResourceAttr("data.datadog_integration_pagerduty_service_object.foo", "service_name", uniq),
)
}

func testAccPagerdutyIntegrationSOConfig(uniq string) string {
return fmt.Sprintf(`
resource "datadog_integration_pagerduty_service_object" "foo" {
service_name = "%s"
service_key = "%s"
}
`, uniq, uniq)
}

func testAccDatasourcePagerdutyIntegrationSOConfig(uniq string) string {
return fmt.Sprintf(`
%s
data "datadog_integration_pagerduty_service_object" "foo" {
depends_on = [
datadog_integration_pagerduty_service_object.foo
]
service_name = "%s"
}`, testAccPagerdutyIntegrationSOConfig(uniq), uniq)
}
1 change: 1 addition & 0 deletions datadog/tests/provider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ var testFiles2EndpointTags = map[string]string{
"tests/data_source_datadog_monitors_test": "monitors",
"tests/data_source_datadog_monitor_config_policy_test": "monitor-config-policies",
"tests/data_source_datadog_monitor_config_policies_test": "monitor-config-policies",
"tests/data_source_datadog_pagerduty_service_object_test": "integration-pagerduty",
"tests/data_source_datadog_permissions_test": "permissions",
"tests/data_source_datadog_role_test": "roles",
"tests/data_source_datadog_roles_test": "roles",
Expand Down
38 changes: 38 additions & 0 deletions docs/data-sources/integration_pagerduty_service_object.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "datadog_integration_pagerduty_service_object Data Source - terraform-provider-datadog"
subcategory: ""
description: |-
Use this data source to retrieve individual Service Objects of Datadog PagerDuty integrations. Note that the Datadog PagerDuty integration must be activated in the Datadog UI in order for this resource to be usable.
---

# datadog_integration_pagerduty_service_object (Data Source)

Use this data source to retrieve individual Service Objects of Datadog PagerDuty integrations. Note that the Datadog PagerDuty integration must be activated in the Datadog UI in order for this resource to be usable.

## Example Usage

```terraform
data "datadog_integration_pagerduty_service_object" "foo" {
service_name = "foo"
}

resource "datadog_integration_pagerduty_service_object" "foo" {
count = length(datadog_integration_pagerduty_service_object.foo) > 0 ? 1 : 0
service_name = "foo"
service_key = "foo"
}
```

<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `service_name` (String) Your Service name in PagerDuty.

### Read-Only

- `id` (String) The ID of this resource.


Loading