From d0611b511ed3800b5cee729f831de4c715e30276 Mon Sep 17 00:00:00 2001 From: Tao <104055472+teowa@users.noreply.github.com> Date: Tue, 6 Sep 2022 23:54:22 +0800 Subject: [PATCH] `azurerm_monitor_action_group` - fix tests and doc of `itsm_receiver` (#18190) --- .../monitor_action_group_data_source_test.go | 8 ++--- .../monitor/monitor_action_group_resource.go | 30 ++++++++++++++++--- .../monitor_action_group_resource_test.go | 4 +-- .../docs/r/monitor_action_group.html.markdown | 4 ++- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/internal/services/monitor/monitor_action_group_data_source_test.go b/internal/services/monitor/monitor_action_group_data_source_test.go index c7843aec42c3..cd44f3fc324d 100644 --- a/internal/services/monitor/monitor_action_group_data_source_test.go +++ b/internal/services/monitor/monitor_action_group_data_source_test.go @@ -90,9 +90,9 @@ func TestAccDataSourceMonitorActionGroup_complete(t *testing.T) { check.That(data.ResourceName).Key("email_receiver.1.email_address").HasValue("devops@contoso.com"), check.That(data.ResourceName).Key("email_receiver.1.use_common_alert_schema").HasValue("false"), check.That(data.ResourceName).Key("itsm_receiver.#").HasValue("1"), - check.That(data.ResourceName).Key("itsm_receiver.0.workspace_id").HasValue("6eee3a18-aac3-40e4-b98e-1f309f329816"), + check.That(data.ResourceName).Key("itsm_receiver.0.workspace_id").HasValue("5def922a-3ed4-49c1-b9fd-05ec533819a3|55dfd1f8-7e59-4f89-bf56-4c82f5ace23c"), check.That(data.ResourceName).Key("itsm_receiver.0.connection_id").HasValue("53de6956-42b4-41ba-be3c-b154cdf17b13"), - check.That(data.ResourceName).Key("itsm_receiver.0.ticket_configuration").HasValue("{}"), + check.That(data.ResourceName).Key("itsm_receiver.0.ticket_configuration").HasValue("{\"PayloadRevision\":0,\"WorkItemType\":\"Incident\",\"UseTemplate\":false,\"WorkItemData\":\"{}\",\"CreateOneWIPerCI\":false}"), check.That(data.ResourceName).Key("itsm_receiver.0.region").HasValue("southcentralus"), check.That(data.ResourceName).Key("azure_app_push_receiver.#").HasValue("1"), check.That(data.ResourceName).Key("azure_app_push_receiver.0.email_address").HasValue("admin@contoso.com"), @@ -217,9 +217,9 @@ resource "azurerm_monitor_action_group" "test" { itsm_receiver { name = "createorupdateticket" - workspace_id = "6eee3a18-aac3-40e4-b98e-1f309f329816" + workspace_id = "5def922a-3ed4-49c1-b9fd-05ec533819a3|55dfd1f8-7e59-4f89-bf56-4c82f5ace23c" connection_id = "53de6956-42b4-41ba-be3c-b154cdf17b13" - ticket_configuration = "{}" + ticket_configuration = "{\"PayloadRevision\":0,\"WorkItemType\":\"Incident\",\"UseTemplate\":false,\"WorkItemData\":\"{}\",\"CreateOneWIPerCI\":false}" region = "southcentralus" } diff --git a/internal/services/monitor/monitor_action_group_resource.go b/internal/services/monitor/monitor_action_group_resource.go index fff9ae22787f..5fb89d99f588 100644 --- a/internal/services/monitor/monitor_action_group_resource.go +++ b/internal/services/monitor/monitor_action_group_resource.go @@ -1,6 +1,7 @@ package monitor import ( + "encoding/json" "fmt" "time" @@ -447,6 +448,11 @@ func resourceMonitorActionGroupCreateUpdate(d *pluginsdk.ResourceData, meta inte return err } + expandedItsmReceiver, err := expandMonitorActionGroupItsmReceiver(itsmReceiversRaw) + if err != nil { + return err + } + t := d.Get("tags").(map[string]interface{}) expandedTags := tags.Expand(t) @@ -457,7 +463,7 @@ func resourceMonitorActionGroupCreateUpdate(d *pluginsdk.ResourceData, meta inte Enabled: utils.Bool(enabled), EmailReceivers: expandMonitorActionGroupEmailReceiver(emailReceiversRaw), AzureAppPushReceivers: expandMonitorActionGroupAzureAppPushReceiver(azureAppPushReceiversRaw), - ItsmReceivers: expandMonitorActionGroupItsmReceiver(itsmReceiversRaw), + ItsmReceivers: expandedItsmReceiver, SmsReceivers: expandMonitorActionGroupSmsReceiver(smsReceiversRaw), WebhookReceivers: expandMonitorActionGroupWebHookReceiver(tenantId, webhookReceiversRaw), AutomationRunbookReceivers: expandMonitorActionGroupAutomationRunbookReceiver(automationRunbookReceiversRaw), @@ -584,20 +590,36 @@ func expandMonitorActionGroupEmailReceiver(v []interface{}) *[]insights.EmailRec return &receivers } -func expandMonitorActionGroupItsmReceiver(v []interface{}) *[]insights.ItsmReceiver { +func expandMonitorActionGroupItsmReceiver(v []interface{}) (*[]insights.ItsmReceiver, error) { receivers := make([]insights.ItsmReceiver, 0) for _, receiverValue := range v { val := receiverValue.(map[string]interface{}) + ticketConfiguration := utils.String(val["ticket_configuration"].(string)) receiver := insights.ItsmReceiver{ Name: utils.String(val["name"].(string)), WorkspaceID: utils.String(val["workspace_id"].(string)), ConnectionID: utils.String(val["connection_id"].(string)), - TicketConfiguration: utils.String(val["ticket_configuration"].(string)), + TicketConfiguration: ticketConfiguration, Region: utils.String(azure.NormalizeLocation(val["region"].(string))), } + + // https://github.com/Azure/azure-rest-api-specs/issues/20488 ticket_configuration should have `PayloadRevision` and `WorkItemType` keys + if ticketConfiguration != nil { + j := make(map[string]interface{}) + err := json.Unmarshal([]byte(*ticketConfiguration), &j) + if err != nil { + return nil, fmt.Errorf("`itsm_receiver.ticket_configuration` %s unmarshall json error: %+v", *ticketConfiguration, err) + } + + _, existKeyPayloadRevision := j["PayloadRevision"] + _, existKeyWorkItemType := j["WorkItemType"] + if !(existKeyPayloadRevision && existKeyWorkItemType) { + return nil, fmt.Errorf("`itsm_receiver.ticket_configuration` should be JSON blob with `PayloadRevision` and `WorkItemType` keys") + } + } receivers = append(receivers, receiver) } - return &receivers + return &receivers, nil } func expandMonitorActionGroupAzureAppPushReceiver(v []interface{}) *[]insights.AzureAppPushReceiver { diff --git a/internal/services/monitor/monitor_action_group_resource_test.go b/internal/services/monitor/monitor_action_group_resource_test.go index 4b93a05beef1..8024297d1daa 100644 --- a/internal/services/monitor/monitor_action_group_resource_test.go +++ b/internal/services/monitor/monitor_action_group_resource_test.go @@ -499,7 +499,7 @@ resource "azurerm_monitor_action_group" "test" { name = "createorupdateticket" workspace_id = "${data.azurerm_client_config.current.subscription_id}|${azurerm_log_analytics_workspace.test.workspace_id}" connection_id = "53de6956-42b4-41ba-be3c-b154cdf17b13" - ticket_configuration = "{}" + ticket_configuration = "{\"PayloadRevision\":0,\"WorkItemType\":\"Incident\",\"UseTemplate\":false,\"WorkItemData\":\"{}\",\"CreateOneWIPerCI\":false}" region = "eastus" } } @@ -912,7 +912,7 @@ resource "azurerm_monitor_action_group" "test" { name = "createorupdateticket" workspace_id = "${data.azurerm_client_config.current.subscription_id}|${azurerm_log_analytics_workspace.test.workspace_id}" connection_id = "53de6956-42b4-41ba-be3c-b154cdf17b13" - ticket_configuration = "{}" + ticket_configuration = "{\"PayloadRevision\":0,\"WorkItemType\":\"Incident\",\"UseTemplate\":false,\"WorkItemData\":\"{}\",\"CreateOneWIPerCI\":false}" region = "eastus" } diff --git a/website/docs/r/monitor_action_group.html.markdown b/website/docs/r/monitor_action_group.html.markdown index 00a3d59f3884..d01ffa795a02 100644 --- a/website/docs/r/monitor_action_group.html.markdown +++ b/website/docs/r/monitor_action_group.html.markdown @@ -83,7 +83,7 @@ resource "azurerm_monitor_action_group" "example" { name = "createorupdateticket" workspace_id = "${data.azurerm_client_config.current.subscription_id}|${azurerm_log_analytics_workspace.example.workspace_id}" connection_id = "53de6956-42b4-41ba-be3c-b154cdf17b13" - ticket_configuration = "{}" + ticket_configuration = "{\"PayloadRevision\":0,\"WorkItemType\":\"Incident\",\"UseTemplate\":false,\"WorkItemData\":\"{}\",\"CreateOneWIPerCI\":false}" region = "southcentralus" } @@ -199,6 +199,8 @@ The following arguments are supported: * `ticket_configuration` - (Required) A JSON blob for the configurations of the ITSM action. CreateMultipleWorkItems option will be part of this blob as well. * `region` - (Required) The region of the workspace. +-> **NOTE** `ticket_configuration` should be JSON blob with `PayloadRevision` and `WorkItemType` keys (e.g., `ticket_configuration="{\"PayloadRevision\":0,\"WorkItemType\":\"Incident\"}"`), and `ticket_configuration="{}"` will return an error, see more at this [REST API issue](https://github.com/Azure/azure-rest-api-specs/issues/20488) + --- `logic_app_receiver` supports the following: