Skip to content

Commit

Permalink
New Resource: azurerm_monitor_action_group (#1725)
Browse files Browse the repository at this point in the history
* Add new Action Group resource of Azure Monitor

* Add documentation of azurerm_action_group

* Fix location description in documentation.

* Add azurerm_action_group page to the ToC

* Add acceptance tests for azurerm_action_group

* Add import tests for azurerm_action_group

* Add action group resource back to providers.

* Modify the code according to the feedbacks

* Upgrade to the latest Go SDK

* Include import test as one step after normal tests

* Rename from action_group to monitor_action_group

* Fix minor issues according to the feedback

* Change the code logic according to the feedback

* Add more test scenarios from the feedback

* Fix code according to the 16th iteration
  • Loading branch information
Junyi Yi authored and tombuildsstuff committed Aug 10, 2018
1 parent 3ee166d commit 6aa3dc0
Show file tree
Hide file tree
Showing 6 changed files with 930 additions and 1 deletion.
5 changes: 5 additions & 0 deletions azurerm/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@ type ArmClient struct {
logicWorkflowsClient logic.WorkflowsClient

// Monitor
actionGroupsClient insights.ActionGroupsClient
monitorAlertRulesClient insights.AlertRulesClient

// MSI
Expand Down Expand Up @@ -777,6 +778,10 @@ func (c *ArmClient) registerLogicClients(endpoint, subscriptionId string, auth a
}

func (c *ArmClient) registerMonitorClients(endpoint, subscriptionId string, auth autorest.Authorizer, sender autorest.Sender) {
actionGroupsClient := insights.NewActionGroupsClientWithBaseURI(endpoint, subscriptionId)
c.configureClient(&actionGroupsClient.Client, auth)
c.actionGroupsClient = actionGroupsClient

arc := insights.NewAlertRulesClientWithBaseURI(endpoint, subscriptionId)
setUserAgent(&arc.Client)
arc.Authorizer = auth
Expand Down
1 change: 1 addition & 0 deletions azurerm/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ func Provider() terraform.ResourceProvider {
"azurerm_managed_disk": resourceArmManagedDisk(),
"azurerm_management_lock": resourceArmManagementLock(),
"azurerm_metric_alertrule": resourceArmMetricAlertRule(),
"azurerm_monitor_action_group": resourceArmMonitorActionGroup(),
"azurerm_mysql_configuration": resourceArmMySQLConfiguration(),
"azurerm_mysql_database": resourceArmMySqlDatabase(),
"azurerm_mysql_firewall_rule": resourceArmMySqlFirewallRule(),
Expand Down
317 changes: 317 additions & 0 deletions azurerm/resource_arm_monitor_action_group.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,317 @@
package azurerm

import (
"fmt"

"github.com/Azure/azure-sdk-for-go/services/preview/monitor/mgmt/2018-03-01/insights"
"github.com/hashicorp/terraform/helper/schema"
"github.com/hashicorp/terraform/helper/validation"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/response"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils"
)

func resourceArmMonitorActionGroup() *schema.Resource {
return &schema.Resource{
Create: resourceArmMonitorActionGroupCreateOrUpdate,
Read: resourceArmMonitorActionGroupRead,
Update: resourceArmMonitorActionGroupCreateOrUpdate,
Delete: resourceArmMonitorActionGroupDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},

Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: validation.NoZeroValues,
},

"resource_group_name": resourceGroupNameSchema(),

"short_name": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringLenBetween(1, 12),
},

"enabled": {
Type: schema.TypeBool,
Optional: true,
Default: true,
},

"email_receiver": {
Type: schema.TypeList,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.NoZeroValues,
},
"email_address": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.NoZeroValues,
},
},
},
},

"sms_receiver": {
Type: schema.TypeList,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.NoZeroValues,
},
"country_code": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.NoZeroValues,
},
"phone_number": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.NoZeroValues,
},
},
},
},

"webhook_receiver": {
Type: schema.TypeList,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.NoZeroValues,
},
"service_uri": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.NoZeroValues,
},
},
},
},

"tags": tagsSchema(),
},
}
}

func resourceArmMonitorActionGroupCreateOrUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*ArmClient).actionGroupsClient
ctx := meta.(*ArmClient).StopContext

name := d.Get("name").(string)
resGroup := d.Get("resource_group_name").(string)

shortName := d.Get("short_name").(string)
enabled := d.Get("enabled").(bool)

emailReceiversRaw := d.Get("email_receiver").([]interface{})
smsReceiversRaw := d.Get("sms_receiver").([]interface{})
webhookReceiversRaw := d.Get("webhook_receiver").([]interface{})

tags := d.Get("tags").(map[string]interface{})
expandedTags := expandTags(tags)

parameters := insights.ActionGroupResource{
Location: utils.String(azureRMNormalizeLocation("Global")),
ActionGroup: &insights.ActionGroup{
GroupShortName: utils.String(shortName),
Enabled: utils.Bool(enabled),
EmailReceivers: expandMonitorActionGroupEmailReceiver(emailReceiversRaw),
SmsReceivers: expandMonitorActionGroupSmsReceiver(smsReceiversRaw),
WebhookReceivers: expandMonitorActionGroupWebHookReceiver(webhookReceiversRaw),
},
Tags: expandedTags,
}

_, err := client.CreateOrUpdate(ctx, resGroup, name, parameters)
if err != nil {
return fmt.Errorf("Error creating or updating action group %q (resource group %q): %+v", name, resGroup, err)
}

read, err := client.Get(ctx, resGroup, name)
if err != nil {
return fmt.Errorf("Error getting action group %q (resource group %q) after creation: %+v", name, resGroup, err)
}
if read.ID == nil {
return fmt.Errorf("Action group %q (resource group %q) ID is empty", name, resGroup)
}

d.SetId(*read.ID)

return resourceArmMonitorActionGroupRead(d, meta)
}

func resourceArmMonitorActionGroupRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*ArmClient).actionGroupsClient
ctx := meta.(*ArmClient).StopContext

id, err := parseAzureResourceID(d.Id())
if err != nil {
return err
}
resGroup := id.ResourceGroup
name := id.Path["actionGroups"]

resp, err := client.Get(ctx, resGroup, name)
if err != nil {
if response.WasNotFound(resp.Response.Response) {
d.SetId("")
return nil
}
return fmt.Errorf("Error getting action group %q (resource group %q): %+v", name, resGroup, err)
}

d.Set("name", name)
d.Set("resource_group_name", resGroup)

if group := resp.ActionGroup; group != nil {
d.Set("short_name", group.GroupShortName)
d.Set("enabled", group.Enabled)

if err = d.Set("email_receiver", flattenMonitorActionGroupEmailReceiver(group.EmailReceivers)); err != nil {
return fmt.Errorf("Error setting `email_receiver`: %+v", err)
}

if err = d.Set("sms_receiver", flattenMonitorActionGroupSmsReceiver(group.SmsReceivers)); err != nil {
return fmt.Errorf("Error setting `sms_receiver`: %+v", err)
}

if err = d.Set("webhook_receiver", flattenMonitorActionGroupWebHookReceiver(group.WebhookReceivers)); err != nil {
return fmt.Errorf("Error setting `webhook_receiver`: %+v", err)
}
}

flattenAndSetTags(d, resp.Tags)

return nil
}

func resourceArmMonitorActionGroupDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*ArmClient).actionGroupsClient
ctx := meta.(*ArmClient).StopContext

id, err := parseAzureResourceID(d.Id())
if err != nil {
return err
}
resGroup := id.ResourceGroup
name := id.Path["actionGroups"]

resp, err := client.Delete(ctx, resGroup, name)
if err != nil {
if !response.WasNotFound(resp.Response) {
return fmt.Errorf("Error deleting action group %q (resource group %q): %+v", name, resGroup, err)
}
}

return nil
}

func expandMonitorActionGroupEmailReceiver(v []interface{}) *[]insights.EmailReceiver {
receivers := make([]insights.EmailReceiver, 0)
for _, receiverValue := range v {
val := receiverValue.(map[string]interface{})
receiver := insights.EmailReceiver{
Name: utils.String(val["name"].(string)),
EmailAddress: utils.String(val["email_address"].(string)),
}
receivers = append(receivers, receiver)
}
return &receivers
}

func expandMonitorActionGroupSmsReceiver(v []interface{}) *[]insights.SmsReceiver {
receivers := make([]insights.SmsReceiver, 0)
for _, receiverValue := range v {
val := receiverValue.(map[string]interface{})
receiver := insights.SmsReceiver{
Name: utils.String(val["name"].(string)),
CountryCode: utils.String(val["country_code"].(string)),
PhoneNumber: utils.String(val["phone_number"].(string)),
}
receivers = append(receivers, receiver)
}
return &receivers
}

func expandMonitorActionGroupWebHookReceiver(v []interface{}) *[]insights.WebhookReceiver {
receivers := make([]insights.WebhookReceiver, 0)
for _, receiverValue := range v {
val := receiverValue.(map[string]interface{})
receiver := insights.WebhookReceiver{
Name: utils.String(val["name"].(string)),
ServiceURI: utils.String(val["service_uri"].(string)),
}
receivers = append(receivers, receiver)
}
return &receivers
}

func flattenMonitorActionGroupEmailReceiver(receivers *[]insights.EmailReceiver) []interface{} {
result := make([]interface{}, 0)
if receivers != nil {
for _, receiver := range *receivers {
val := make(map[string]interface{}, 0)
if receiver.Name != nil {
val["name"] = *receiver.Name
}
if receiver.EmailAddress != nil {
val["email_address"] = *receiver.EmailAddress
}
result = append(result, val)
}
}
return result
}

func flattenMonitorActionGroupSmsReceiver(receivers *[]insights.SmsReceiver) []interface{} {
result := make([]interface{}, 0)
if receivers != nil {
for _, receiver := range *receivers {
val := make(map[string]interface{}, 0)
if receiver.Name != nil {
val["name"] = *receiver.Name
}
if receiver.CountryCode != nil {
val["country_code"] = *receiver.CountryCode
}
if receiver.PhoneNumber != nil {
val["phone_number"] = *receiver.PhoneNumber
}
result = append(result, val)
}
}
return result
}

func flattenMonitorActionGroupWebHookReceiver(receivers *[]insights.WebhookReceiver) []interface{} {
result := make([]interface{}, 0)
if receivers != nil {
for _, receiver := range *receivers {
val := make(map[string]interface{}, 0)
if receiver.Name != nil {
val["name"] = *receiver.Name
}
if receiver.ServiceURI != nil {
val["service_uri"] = *receiver.ServiceURI
}
result = append(result, val)
}
}
return result
}
Loading

0 comments on commit 6aa3dc0

Please sign in to comment.