Skip to content

Commit

Permalink
[Feature] Notification Destination resource (#3820)
Browse files Browse the repository at this point in the history
## Changes
Made a new Notification Destination resource


- [x] relevant change in `docs/` folder
- [x] covered with integration tests in `internal/acceptance`
- [x] relevant acceptance tests are passing
- [x] using Go SDK

---------

Co-authored-by: vuong-nguyen <44292934+nkvuong@users.noreply.github.com>
  • Loading branch information
Divyansh-db and nkvuong authored Aug 1, 2024
1 parent 8d628d1 commit 5258611
Show file tree
Hide file tree
Showing 5 changed files with 651 additions and 0 deletions.
99 changes: 99 additions & 0 deletions docs/resources/notification_destination.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
---
subcategory: "Workspace"
---
# databricks_notification_destination Resource

This resource allows you to manage [Notification Destinations](https://docs.databricks.com/api/workspace/notificationdestinations). Notification destinations are used to send notifications for query alerts and jobs to destinations outside of Databricks. Only workspace admins can create, update, and delete notification destinations.

## Example Usage

`Email` notification destination:

```hcl
resource "databricks_notification_destination" "ndresource" {
display_name = "Notification Destination"
config {
email {
addresses = ["abc@gmail.com"]
}
}
}
```
`Slack` notification destination:

```hcl
resource "databricks_notification_destination" "ndresource" {
display_name = "Notification Destination"
config {
slack {
url = "https://hooks.slack.com/services/..."
}
}
}
```
`PagerDuty` notification destination:

```hcl
resource "databricks_notification_destination" "ndresource" {
display_name = "Notification Destination"
config {
pagerduty {
integration_key = "xxxxxx"
}
}
}
```
`Microsoft Teams` notification destination:

```hcl
resource "databricks_notification_destination" "ndresource" {
display_name = "Notification Destination"
config {
microsoft_teams {
url = "https://outlook.office.com/webhook/..."
}
}
}
```
`Generic Webhook` notification destination:

```hcl
resource "databricks_notification_destination" "ndresource" {
display_name = "Notification Destination"
config {
generic_webhook {
url = "https://example.com/webhook"
username = "username" // Optional
password = "password" // Optional
}
}
}
```


## Argument Reference

The following arguments are supported:

* `display_name` - (Required) The display name of the Notification Destination.
* `config` - (Required) The configuration of the Notification Destination. It must contain exactly one of the following blocks:
* `email` - The email configuration of the Notification Destination. It must contain the following:
* `addresses` - (Required) The list of email addresses to send notifications to.
* `slack` - The Slack configuration of the Notification Destination. It must contain the following:
* `url` - (Required) The Slack webhook URL.
* `pagerduty` - The PagerDuty configuration of the Notification Destination. It must contain the following:
* `integration_key` - (Required) The PagerDuty integration key.
* `microsoft_teams` - The Microsoft Teams configuration of the Notification Destination. It must contain the following:
* `url` - (Required) The Microsoft Teams webhook URL.
* `generic_webhook` - The Generic Webhook configuration of the Notification Destination. It must contain the following:
* `url` - (Required) The Generic Webhook URL.
* `username` - (Optional) The username for basic authentication.
* `password` - (Optional) The password for basic authentication.

-> **NOTE** If the type of notification destination is changed, the existing notification destination will be deleted and a new notification destination will be created with the new type.

## Attribute Reference

In addition to all arguments above, the following attributes are exported:

* `id` - The unique ID of the Notification Destination.
204 changes: 204 additions & 0 deletions internal/acceptance/notification_destination_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
package acceptance

import (
"context"
"testing"

"github.com/databricks/databricks-sdk-go/service/settings"
"github.com/databricks/terraform-provider-databricks/common"
"github.com/databricks/terraform-provider-databricks/qa"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func checkND(t *testing.T, display_name string, config_type settings.DestinationType) resource.TestCheckFunc {
return resourceCheck("databricks_notification_destination.this", func(ctx context.Context, client *common.DatabricksClient, id string) error {
w, err := client.WorkspaceClient()
if err != nil {
return err
}
ndResource, err := w.NotificationDestinations.Get(ctx, settings.GetNotificationDestinationRequest{
Id: id,
})
if err != nil {
return err
}
assert.Equal(t, config_type, ndResource.DestinationType)
assert.Equal(t, display_name, ndResource.DisplayName)
require.NoError(t, err)
return nil
})
}

func TestAccNDEmail(t *testing.T) {
display_name := "Email Notification Destination - " + qa.RandomName()
workspaceLevel(t, step{
Template: `
resource "databricks_notification_destination" "this" {
display_name = "` + display_name + `"
config {
email {
addresses = ["` + qa.RandomEmail() + `"]
}
}
}
`,
}, step{
Template: `
resource "databricks_notification_destination" "this" {
display_name = "` + display_name + `"
config {
email {
addresses = ["` + qa.RandomEmail() + `", "` + qa.RandomEmail() + `"]
}
}
}
`,
Check: checkND(t, display_name, settings.DestinationTypeEmail),
})
}

func TestAccNDSlack(t *testing.T) {
display_name := "Notification Destination - " + qa.RandomName()
workspaceLevel(t, step{
Template: `
resource "databricks_notification_destination" "this" {
display_name = "` + display_name + `"
config {
slack {
url = "https://hooks.slack.com/services/{var.RANDOM}"
}
}
}
`,
Check: checkND(t, display_name, settings.DestinationTypeSlack),
}, step{
Template: `
resource "databricks_notification_destination" "this" {
display_name = "` + display_name + `"
config {
slack {
url = "https://hooks.slack.com/services/{var.RANDOM}"
}
}
}
`,
Check: checkND(t, display_name, settings.DestinationTypeSlack),
})
}

func TestAccNDMicrosoftTeams(t *testing.T) {
display_name := "Notification Destination - " + qa.RandomName()
workspaceLevel(t, step{
Template: `
resource "databricks_notification_destination" "this" {
display_name = "` + display_name + `"
config {
microsoft_teams {
url = "https://outlook.office.com/webhook/{var.RANDOM}"
}
}
}
`,
}, step{
Template: `
resource "databricks_notification_destination" "this" {
display_name = "` + display_name + `"
config {
microsoft_teams {
url = "https://outlook.office.com/webhook/{var.RANDOM}"
}
}
}
`,
Check: checkND(t, display_name, settings.DestinationTypeMicrosoftTeams),
})
}

func TestAccNDPagerduty(t *testing.T) {
display_name := "Notification Destination - " + qa.RandomName()
workspaceLevel(t, step{
Template: `
resource "databricks_notification_destination" "this" {
display_name = "` + display_name + `"
config {
pagerduty {
integration_key = "{var.RANDOM}"
}
}
}
`,
}, step{
Template: `
resource "databricks_notification_destination" "this" {
display_name = "` + display_name + `"
config {
pagerduty {
integration_key = "{var.RANDOM}"
}
}
}
`,
Check: checkND(t, display_name, settings.DestinationTypePagerduty),
})
}

func TestAccNDGenericWebhook(t *testing.T) {
display_name := "Notification Destination - " + qa.RandomName()
workspaceLevel(t, step{
Template: `
resource "databricks_notification_destination" "this" {
display_name = "` + display_name + `"
config {
generic_webhook {
url = "https://webhook.site/{var.RANDOM}"
password = "password"
}
}
}
`,
}, step{
Template: `
resource "databricks_notification_destination" "this" {
display_name = "` + display_name + `"
config {
generic_webhook {
url = "https://webhook.site/{var.RANDOM}"
username = "username2"
}
}
}
`,
Check: checkND(t, display_name, settings.DestinationTypeWebhook),
})
}

func TestAccConfigTypeChange(t *testing.T) {
display_name := "Notification Destination - " + qa.RandomName()
workspaceLevel(t, step{
Template: `
resource "databricks_notification_destination" "this" {
display_name = "` + display_name + `"
config {
slack {
url = "https://hooks.slack.com/services/{var.RANDOM}"
}
}
}
`,
Check: checkND(t, display_name, settings.DestinationTypeSlack),
}, step{
Template: `
resource "databricks_notification_destination" "this" {
display_name = "` + display_name + `"
config {
microsoft_teams {
url = "https://outlook.office.com/webhook/{var.RANDOM}"
}
}
}
`,
Check: checkND(t, display_name, settings.DestinationTypeMicrosoftTeams),
})
}
1 change: 1 addition & 0 deletions provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,7 @@ func DatabricksProvider() *schema.Provider {
"databricks_mws_vpc_endpoint": mws.ResourceMwsVpcEndpoint().ToResource(),
"databricks_mws_workspaces": mws.ResourceMwsWorkspaces().ToResource(),
"databricks_notebook": workspace.ResourceNotebook().ToResource(),
"databricks_notification_destination": settings.ResourceNotificationDestination().ToResource(),
"databricks_obo_token": tokens.ResourceOboToken().ToResource(),
"databricks_online_table": catalog.ResourceOnlineTable().ToResource(),
"databricks_permission_assignment": access.ResourcePermissionAssignment().ToResource(),
Expand Down
Loading

0 comments on commit 5258611

Please sign in to comment.