From 3240b8d086ff94305e9200937e5256df65f74649 Mon Sep 17 00:00:00 2001 From: Jochen Rauschenbusch Date: Sun, 10 May 2020 02:44:13 +0200 Subject: [PATCH 01/11] r/eventgrid_event_subscription: update resource --- .../eventgrid_event_subscription_resource.go | 172 ++++++++++++++++- ...ntgrid_event_subscription_resource_test.go | 173 ++++++++++++++++++ ...eventgrid_event_subscription.html.markdown | 28 ++- 3 files changed, 371 insertions(+), 2 deletions(-) diff --git a/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go b/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go index a19f6c9f7ded..f2ef4c3fe330 100644 --- a/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go +++ b/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go @@ -6,6 +6,7 @@ import ( "time" "github.com/Azure/azure-sdk-for-go/services/preview/eventgrid/mgmt/2020-04-01-preview/eventgrid" + "github.com/Azure/go-autorest/autorest/date" "github.com/hashicorp/go-azure-helpers/response" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/helper/validation" @@ -20,7 +21,7 @@ import ( ) func getEnpointTypes() []string { - return []string{"webhook_endpoint", "storage_queue_endpoint", "eventhub_endpoint", "hybrid_connection_endpoint"} + return []string{"webhook_endpoint", "storage_queue_endpoint", "eventhub_endpoint", "hybrid_connection_endpoint", "service_bus_queue_endpoint", "service_bus_topic_endpoint", "azure_function_endpoint"} } func resourceArmEventGridEventSubscription() *schema.Resource { @@ -69,6 +70,13 @@ func resourceArmEventGridEventSubscription() *schema.Resource { }, false), }, + "expiration_time_utc": { + Type: schema.TypeString, + Optional: true, + Computed: true, + ValidateFunc: validation.StringIsNotEmpty, + }, + "topic_name": { Type: schema.TypeString, Optional: true, @@ -144,6 +152,54 @@ func resourceArmEventGridEventSubscription() *schema.Resource { }, }, + "service_bus_queue_endpoint": { + Type: schema.TypeList, + MaxItems: 1, + Optional: true, + ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "service_bus_queue_endpoint"), + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "service_bus_queue_id": { + Type: schema.TypeString, + Required: true, + ValidateFunc: azure.ValidateResourceID, + }, + }, + }, + }, + + "service_bus_topic_endpoint": { + Type: schema.TypeList, + MaxItems: 1, + Optional: true, + ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "service_bus_topic_endpoint"), + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "service_bus_queue_id": { + Type: schema.TypeString, + Required: true, + ValidateFunc: azure.ValidateResourceID, + }, + }, + }, + }, + + "azure_function_endpoint": { + Type: schema.TypeList, + MaxItems: 1, + Optional: true, + ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "azure_function_endpoint"), + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "azure_function_id": { + Type: schema.TypeString, + Required: true, + ValidateFunc: azure.ValidateResourceID, + }, + }, + }, + }, + "included_event_types": { Type: schema.TypeList, Optional: true, @@ -256,6 +312,13 @@ func resourceArmEventGridEventSubscriptionCreateUpdate(d *schema.ResourceData, m filter := expandEventGridEventSubscriptionFilter(d) + parsedTime, err := date.ParseTime(time.RFC3339, d.Get("expiration_time_utc").(string)) + if err != nil { + return fmt.Errorf("Error creating/updating EventGrid Event Subscription %q (Scope %q): %s", name, scope, err) + } + + expirationTime := date.Time{Time: parsedTime} + eventSubscriptionProperties := eventgrid.EventSubscriptionProperties{ Destination: destination, Filter: filter, @@ -263,6 +326,7 @@ func resourceArmEventGridEventSubscriptionCreateUpdate(d *schema.ResourceData, m RetryPolicy: expandEventGridEventSubscriptionRetryPolicy(d), Labels: utils.ExpandStringSlice(d.Get("labels").([]interface{})), EventDeliverySchema: eventgrid.EventDeliverySchema(d.Get("event_delivery_schema").(string)), + ExpirationTimeUtc: &expirationTime, } eventSubscription := eventgrid.EventSubscription{ @@ -318,6 +382,7 @@ func resourceArmEventGridEventSubscriptionRead(d *schema.ResourceData, meta inte d.Set("scope", id.Scope) if props := resp.EventSubscriptionProperties; props != nil { + d.Set("expiration_time_utc", props.ExpirationTimeUtc.Format(time.RFC3339)) d.Set("event_delivery_schema", string(props.EventDeliverySchema)) if props.Topic != nil && *props.Topic != "" { @@ -339,6 +404,21 @@ func resourceArmEventGridEventSubscriptionRead(d *schema.ResourceData, meta inte return fmt.Errorf("Error setting `hybrid_connection_endpoint` for EventGrid Event Subscription %q (Scope %q): %s", id.Name, id.Scope, err) } } + if serviceBusQueueEndpoint, ok := props.Destination.AsServiceBusQueueEventSubscriptionDestination(); ok { + if err := d.Set("service_bus_queue_endpoint", flattenEventGridEventSubscriptionServiceBusQueueEndpoint(serviceBusQueueEndpoint)); err != nil { + return fmt.Errorf("Error setting `service_bus_queue_endpoint` for EventGrid Event Subscription %q (Scope %q): %s", id.Name, id.Scope, err) + } + } + if serviceBusTopicEndpoint, ok := props.Destination.AsServiceBusTopicEventSubscriptionDestination(); ok { + if err := d.Set("service_bus_topic_endpoint", flattenEventGridEventSubscriptionServiceBusTopicEndpoint(serviceBusTopicEndpoint)); err != nil { + return fmt.Errorf("Error setting `service_bus_topic_endpoint` for EventGrid Event Subscription %q (Scope %q): %s", id.Name, id.Scope, err) + } + } + if azureFunctionEndpoint, ok := props.Destination.AsAzureFunctionEventSubscriptionDestination(); ok { + if err := d.Set("azure_function_endpoint", flattenEventGridEventSubscriptionAzureFunctionEndpoint(azureFunctionEndpoint)); err != nil { + return fmt.Errorf("Error setting `azure_function_endpoint` for EventGrid Event Subscription %q (Scope %q): %s", id.Name, id.Scope, err) + } + } if _, ok := props.Destination.AsWebHookEventSubscriptionDestination(); ok { fullURL, err := client.GetFullURL(ctx, id.Scope, id.Name) if err != nil { @@ -423,6 +503,18 @@ func expandEventGridEventSubscriptionDestination(d *schema.ResourceData) eventgr return expandEventGridEventSubscriptionWebhookEndpoint(d) } + if _, ok := d.GetOk("service_bus_queue_endpoint"); ok { + return expandEventGridEventSubscriptionServiceBusQueueEndpoint(d) + } + + if _, ok := d.GetOk("service_bus_topic_endpoint"); ok { + return expandEventGridEventSubscriptionServiceBusTopicEndpoint(d) + } + + if _, ok := d.GetOk("azure_function"); ok { + return expandEventGridEventSubscriptionAzureFunctionEndpoint(d) + } + return nil } @@ -480,6 +572,45 @@ func expandEventGridEventSubscriptionWebhookEndpoint(d *schema.ResourceData) eve return webhookEndpoint } +func expandEventGridEventSubscriptionServiceBusQueueEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { + props := d.Get("service_bus_queue_endpoint").([]interface{})[0].(map[string]interface{}) + serviceBusQueueID := props["service_bus_queue_id"].(string) + + serviceBusQueueEndpoint := eventgrid.ServiceBusQueueEventSubscriptionDestination{ + EndpointType: eventgrid.EndpointTypeServiceBusQueue, + ServiceBusQueueEventSubscriptionDestinationProperties: &eventgrid.ServiceBusQueueEventSubscriptionDestinationProperties{ + ResourceID: &serviceBusQueueID, + }, + } + return serviceBusQueueEndpoint +} + +func expandEventGridEventSubscriptionServiceBusTopicEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { + props := d.Get("service_bus_topic_endpoint").([]interface{})[0].(map[string]interface{}) + serviceBusTopicID := props["service_bus_topic_id"].(string) + + serviceBusTopicEndpoint := eventgrid.ServiceBusTopicEventSubscriptionDestination{ + EndpointType: eventgrid.EndpointTypeServiceBusTopic, + ServiceBusTopicEventSubscriptionDestinationProperties: &eventgrid.ServiceBusTopicEventSubscriptionDestinationProperties{ + ResourceID: &serviceBusTopicID, + }, + } + return serviceBusTopicEndpoint +} + +func expandEventGridEventSubscriptionAzureFunctionEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { + props := d.Get("azure_function_endpoint").([]interface{})[0].(map[string]interface{}) + azureFunctionResourceID := props["azure_function_id"].(string) + + azureFunctionEndpoint := eventgrid.AzureFunctionEventSubscriptionDestination{ + EndpointType: eventgrid.EndpointTypeAzureFunction, + AzureFunctionEventSubscriptionDestinationProperties: &eventgrid.AzureFunctionEventSubscriptionDestinationProperties{ + ResourceID: &azureFunctionResourceID, + }, + } + return azureFunctionEndpoint +} + func expandEventGridEventSubscriptionFilter(d *schema.ResourceData) *eventgrid.EventSubscriptionFilter { filter := &eventgrid.EventSubscriptionFilter{} @@ -623,6 +754,45 @@ func flattenEventGridEventSubscriptionStorageBlobDeadLetterDestination(dest *eve return []interface{}{result} } +func flattenEventGridEventSubscriptionServiceBusQueueEndpoint(input *eventgrid.ServiceBusQueueEventSubscriptionDestination) []interface{} { + if input == nil { + return nil + } + result := make(map[string]interface{}) + + if input.ResourceID != nil { + result["service_bus_queue_id"] = *input.ResourceID + } + + return []interface{}{result} +} + +func flattenEventGridEventSubscriptionServiceBusTopicEndpoint(input *eventgrid.ServiceBusTopicEventSubscriptionDestination) []interface{} { + if input == nil { + return nil + } + result := make(map[string]interface{}) + + if input.ResourceID != nil { + result["service_bus_topic_id"] = *input.ResourceID + } + + return []interface{}{result} +} + +func flattenEventGridEventSubscriptionAzureFunctionEndpoint(input *eventgrid.AzureFunctionEventSubscriptionDestination) []interface{} { + if input == nil { + return nil + } + result := make(map[string]interface{}) + + if input.ResourceID != nil { + result["azure_function_id"] = *input.ResourceID + } + + return []interface{}{result} +} + func flattenEventGridEventSubscriptionRetryPolicy(retryPolicy *eventgrid.RetryPolicy) []interface{} { result := make(map[string]interface{}) diff --git a/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go b/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go index 32ef7d96271e..022469cada6f 100644 --- a/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go +++ b/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go @@ -53,6 +53,69 @@ func TestAccAzureRMEventGridEventSubscription_eventhub(t *testing.T) { }) } +func TestAccAzureRMEventGridEventSubscription_serviceBusQueue(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_eventgrid_event_subscription", "test") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMEventGridEventSubscriptionDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMEventGridEventSubscription_serviceBusQueue(data), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMEventGridEventSubscriptionExists(data.ResourceName), + resource.TestCheckResourceAttr(data.ResourceName, "event_delivery_schema", "CloudEventSchemaV1_0"), + resource.TestCheckResourceAttr(data.ResourceName, "service_bus_queue_endpoint.#", "1"), + ), + }, + data.ImportStep(), + }, + }) +} + +func TestAccAzureRMEventGridEventSubscription_serviceBusTopic(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_eventgrid_event_subscription", "test") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMEventGridEventSubscriptionDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMEventGridEventSubscription_serviceBusTopic(data), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMEventGridEventSubscriptionExists(data.ResourceName), + resource.TestCheckResourceAttr(data.ResourceName, "event_delivery_schema", "CloudEventSchemaV1_0"), + resource.TestCheckResourceAttr(data.ResourceName, "service_bus_topic_endpoint.#", "1"), + ), + }, + data.ImportStep(), + }, + }) +} + +func TestAccAzureRMEventGridEventSubscription_azureFunction(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_eventgrid_event_subscription", "test") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMEventGridEventSubscriptionDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMEventGridEventSubscription_azureFunction(data), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMEventGridEventSubscriptionExists(data.ResourceName), + resource.TestCheckResourceAttr(data.ResourceName, "event_delivery_schema", "CloudEventSchemaV1_0"), + resource.TestCheckResourceAttr(data.ResourceName, "azure_function_endpoint.#", "1"), + ), + }, + data.ImportStep(), + }, + }) +} + func TestAccAzureRMEventGridEventSubscription_update(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_eventgrid_event_subscription", "test") @@ -355,6 +418,116 @@ resource "azurerm_eventgrid_event_subscription" "test" { `, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger) } +func testAccAzureRMEventGridEventSubscription_serviceBusQueue(data acceptance.TestData) string { + return fmt.Sprintf(` +provider "azurerm" { + features {} +} +resource "azurerm_resource_group" "test" { + name = "acctestRG-%d" + location = "%s" +} +resource "azurerm_servicebus_namespace" "example" { + name = "acctestservicebusnamespace-%d" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + sku = "Basic" +} +resource "azurerm_servicebus_queue" "test" { + name = "acctestservicebusqueue-%d" + resource_group_name = azurerm_resource_group.test.name + namespace_name = azurerm_servicebus_namespace.example.name + enable_partitioning = true +} +resource "azurerm_eventgrid_event_subscription" "test" { + name = "acctesteg-%d" + scope = azurerm_resource_group.test.id + event_delivery_schema = "CloudEventSchemaV1_0" + service_bus_queue_endpoint { + service_bus_queue_id = "${azurerm_servicebus_queue.test.id}" + } +} +`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger) +} + +func testAccAzureRMEventGridEventSubscription_serviceBusTopic(data acceptance.TestData) string { + return fmt.Sprintf(` +provider "azurerm" { + features {} +} +resource "azurerm_resource_group" "test" { + name = "acctestRG-%d" + location = "%s" +} +resource "azurerm_servicebus_namespace" "example" { + name = "acctestservicebusnamespace-%d" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + sku = "Basic" +} +resource "azurerm_servicebus_topic" "test" { + name = "acctestservicebustopic-%d" + resource_group_name = azurerm_resource_group.test.name + namespace_name = azurerm_servicebus_namespace.example.name + enable_partitioning = true +} +resource "azurerm_eventgrid_event_subscription" "test" { + name = "acctesteg-%d" + scope = azurerm_resource_group.test.id + event_delivery_schema = "CloudEventSchemaV1_0" + service_bus_topic_endpoint { + service_bus_topic_id = "${azurerm_servicebus_topic.test.id}" + } +} +`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger) +} + +func testAccAzureRMEventGridEventSubscription_azureFunction(data acceptance.TestData) string { + return fmt.Sprintf(` +provider "azurerm" { + features {} +} +resource "azurerm_resource_group" "test" { + name = "acctestRG-%d" + location = "%s" +} +resource "azurerm_storage_account" "test" { + name = "acctestacc%s" + resource_group_name = azurerm_resource_group.test.name + location = azurerm_resource_group.test.location + account_tier = "Standard" + account_replication_type = "LRS" + tags = { + environment = "staging" + } +} +resource "azurerm_app_service_plan" "test" { + name = "acctestASP-%d" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + sku { + tier = "Standard" + size = "S1" + } +} +resource "azurerm_function_app" "test" { + name = "acctest-%d-func" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + app_service_plan_id = azurerm_app_service_plan.test.id + storage_connection_string = azurerm_storage_account.test.primary_connection_string +} +resource "azurerm_eventgrid_event_subscription" "test" { + name = "acctesteg-%d" + scope = azurerm_resource_group.test.id + event_delivery_schema = "CloudEventSchemaV1_0" + azure_function_endpoint { + azure_function_id = "${azurerm_function_app.test.id}" + } +} +`, data.RandomInteger, data.Locations.Primary, data.RandomString, data.RandomInteger, data.RandomInteger, data.RandomInteger) +} + func testAccAzureRMEventGridEventSubscription_filter(data acceptance.TestData) string { return fmt.Sprintf(` provider "azurerm" { diff --git a/website/docs/r/eventgrid_event_subscription.html.markdown b/website/docs/r/eventgrid_event_subscription.html.markdown index 935add8a35cb..e20e645bee78 100644 --- a/website/docs/r/eventgrid_event_subscription.html.markdown +++ b/website/docs/r/eventgrid_event_subscription.html.markdown @@ -56,6 +56,8 @@ The following arguments are supported: * `scope` - (Required) Specifies the scope at which the EventGrid Event Subscription should be created. Changing this forces a new resource to be created. +* `expiration_time_utc` - (Optional) Specifies the expiration time of the event subscription (Datetime Format `RFC 3339`). + * `event_delivery_schema` - (Optional) Specifies the event delivery schema for the event subscription. Possible values include: `EventGridSchema`, `CloudEventSchemaV1_0`, `CustomInputSchema`. Defaults to `EventGridSchema`. Changing this forces a new resource to be created. * `storage_queue_endpoint` - (Optional) A `storage_queue_endpoint` block as defined below. @@ -66,7 +68,13 @@ The following arguments are supported: * `webhook_endpoint` - (Optional) A `webhook_endpoint` block as defined below. -~> **NOTE:** One of `storage_queue_endpoint`, `eventhub_endpoint`, `hybrid_connection_endpoint` or `webhook_endpoint` must be specified. +* `service_bus_queue_endpoint` - (Optional) A `service_bus_queue_endpoint` block as defined below. + +* `service_bus_topic_endpoint` - (Optional) A `service_bus_topic_endpoint` block as defined below. + +* `azure_function_endpoint` - (Optional) A `azure_function_endpoint` block as defined below. + +~> **NOTE:** One of `storage_queue_endpoint`, `eventhub_endpoint`, `hybrid_connection_endpoint`, `webhook_endpoint`, `service_bus_queue_endpoint`, `service_bus_topic_endpoint` or `azure_function_endpoint` must be specified. * `included_event_types` - (Optional) A list of applicable event types that need to be part of the event subscription. @@ -106,6 +114,24 @@ A `webhook_endpoint` supports the following: --- +A `service_bus_queue_endpoint` supports the following: + +* `service_bus_queue_id` - (Required) Specifies the id where the service bus queue is located. + +--- + +A `service_bus_topic_endpoint` supports the following: + +* `service_bus_topic_id` - (Required) Specifies the id where the service bus topic is located. + +--- + +A `azure_function_endpoint` supports the following: + +* `azure_function_id` - (Required) Specifies the id where the azure function is located. + +--- + A `subject_filter` supports the following: * `subject_begins_with` - (Optional) A string to filter events for an event subscription based on a resource path prefix. From db913f8362dd6ea25ac17e918210aea4c5da8ed1 Mon Sep 17 00:00:00 2001 From: Jochen Rauschenbusch Date: Wed, 13 May 2020 11:59:04 +0200 Subject: [PATCH 02/11] Update azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go fix: rename test resource group Co-authored-by: kt --- .../tests/eventgrid_event_subscription_resource_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go b/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go index 022469cada6f..a6c75e65fcbf 100644 --- a/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go +++ b/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go @@ -424,7 +424,7 @@ provider "azurerm" { features {} } resource "azurerm_resource_group" "test" { - name = "acctestRG-%d" + name = "acctestRG-eg-%d" location = "%s" } resource "azurerm_servicebus_namespace" "example" { From f7f7a083eca348e680cdee2f8a57d9c6b4c53f0d Mon Sep 17 00:00:00 2001 From: Jochen Rauschenbusch Date: Wed, 13 May 2020 12:00:23 +0200 Subject: [PATCH 03/11] Update azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go refactor: reformatting Co-authored-by: kt --- .../tests/eventgrid_event_subscription_resource_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go b/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go index a6c75e65fcbf..acf6ad3727a0 100644 --- a/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go +++ b/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go @@ -427,6 +427,7 @@ resource "azurerm_resource_group" "test" { name = "acctestRG-eg-%d" location = "%s" } + resource "azurerm_servicebus_namespace" "example" { name = "acctestservicebusnamespace-%d" location = azurerm_resource_group.test.location From dc8ec9ea5765d536afd5df6ea172256041e17932 Mon Sep 17 00:00:00 2001 From: Jochen Rauschenbusch Date: Fri, 15 May 2020 09:17:04 +0200 Subject: [PATCH 04/11] refactor: flatten endpoint schema --- .../eventgrid_event_subscription_resource.go | 244 ++++++------------ ...ntgrid_event_subscription_resource_test.go | 102 ++++---- 2 files changed, 124 insertions(+), 222 deletions(-) diff --git a/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go b/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go index f2ef4c3fe330..ff2747f3c6eb 100644 --- a/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go +++ b/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go @@ -21,7 +21,7 @@ import ( ) func getEnpointTypes() []string { - return []string{"webhook_endpoint", "storage_queue_endpoint", "eventhub_endpoint", "hybrid_connection_endpoint", "service_bus_queue_endpoint", "service_bus_topic_endpoint", "azure_function_endpoint"} + return []string{"azure_function_endpoint", "eventhub_endpoint", "hybrid_connection_endpoint", "service_bus_queue_endpoint", "service_bus_topic_endpoint", "storage_queue_endpoint", "webhook_endpoint_url"} } func resourceArmEventGridEventSubscription() *schema.Resource { @@ -83,123 +83,69 @@ func resourceArmEventGridEventSubscription() *schema.Resource { Computed: true, }, - "storage_queue_endpoint": { - Type: schema.TypeList, - MaxItems: 1, + "azure_function_endpoint": { + Type: schema.TypeString, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "storage_queue_endpoint"), - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "storage_account_id": { - Type: schema.TypeString, - Required: true, - ValidateFunc: azure.ValidateResourceID, - }, - "queue_name": { - Type: schema.TypeString, - Required: true, - ValidateFunc: validation.StringIsNotEmpty, - }, - }, - }, + ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "azure_function_endpoint"), + ValidateFunc: azure.ValidateResourceID, }, "eventhub_endpoint": { - Type: schema.TypeList, - MaxItems: 1, + Type: schema.TypeString, Optional: true, ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "eventhub_endpoint"), - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "eventhub_id": { - Type: schema.TypeString, - Required: true, - ValidateFunc: azure.ValidateResourceID, - }, - }, - }, + ValidateFunc: azure.ValidateResourceID, }, "hybrid_connection_endpoint": { - Type: schema.TypeList, - MaxItems: 1, + Type: schema.TypeString, Optional: true, ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "hybrid_connection_endpoint"), - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "hybrid_connection_id": { - Type: schema.TypeString, - Required: true, - ValidateFunc: azure.ValidateResourceID, - }, - }, - }, - }, - - "webhook_endpoint": { - Type: schema.TypeList, - MaxItems: 1, - Optional: true, - ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "webhook_endpoint"), - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "url": { - Type: schema.TypeString, - Required: true, - ValidateFunc: validation.IsURLWithHTTPS, - }, - }, - }, + ValidateFunc: azure.ValidateResourceID, }, "service_bus_queue_endpoint": { - Type: schema.TypeList, - MaxItems: 1, + Type: schema.TypeString, Optional: true, ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "service_bus_queue_endpoint"), - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "service_bus_queue_id": { - Type: schema.TypeString, - Required: true, - ValidateFunc: azure.ValidateResourceID, - }, - }, - }, + ValidateFunc: azure.ValidateResourceID, }, "service_bus_topic_endpoint": { - Type: schema.TypeList, - MaxItems: 1, + Type: schema.TypeString, Optional: true, ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "service_bus_topic_endpoint"), - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "service_bus_queue_id": { - Type: schema.TypeString, - Required: true, - ValidateFunc: azure.ValidateResourceID, - }, - }, - }, + ValidateFunc: azure.ValidateResourceID, }, - "azure_function_endpoint": { + "storage_queue_endpoint": { Type: schema.TypeList, MaxItems: 1, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "azure_function_endpoint"), + ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "storage_queue_endpoint"), Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ - "azure_function_id": { + "storage_account_id": { Type: schema.TypeString, Required: true, ValidateFunc: azure.ValidateResourceID, }, + "queue_name": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.StringIsNotEmpty, + }, }, }, }, + "webhook_endpoint_url": { + Type: schema.TypeString, + Optional: true, + ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "webhook_endpoint_url"), + ValidateFunc: validation.IsURLWithHTTPS, + }, + "included_event_types": { Type: schema.TypeList, Optional: true, @@ -424,8 +370,8 @@ func resourceArmEventGridEventSubscriptionRead(d *schema.ResourceData, meta inte if err != nil { return fmt.Errorf("Error making Read request on EventGrid Event Subscription full URL '%s': %+v", id.Name, err) } - if err := d.Set("webhook_endpoint", flattenEventGridEventSubscriptionWebhookEndpoint(&fullURL)); err != nil { - return fmt.Errorf("Error setting `webhook_endpoint` for EventGrid Event Subscription %q (Scope %q): %s", id.Name, id.Scope, err) + if err := d.Set("webhook_endpoint_url", flattenEventGridEventSubscriptionWebhookEndpoint(&fullURL)); err != nil { + return fmt.Errorf("Error setting `webhook_endpoint_url` for EventGrid Event Subscription %q (Scope %q): %s", id.Name, id.Scope, err) } } @@ -487,8 +433,8 @@ func resourceArmEventGridEventSubscriptionDelete(d *schema.ResourceData, meta in } func expandEventGridEventSubscriptionDestination(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - if _, ok := d.GetOk("storage_queue_endpoint"); ok { - return expandEventGridEventSubscriptionStorageQueueEndpoint(d) + if _, ok := d.GetOk("azure_function_endpoint"); ok { + return expandEventGridEventSubscriptionAzureFunctionEndpoint(d) } if _, ok := d.GetOk("eventhub_endpoint"); ok { @@ -499,10 +445,6 @@ func expandEventGridEventSubscriptionDestination(d *schema.ResourceData) eventgr return expandEventGridEventSubscriptionHybridConnectionEndpoint(d) } - if _, ok := d.GetOk("webhook_endpoint"); ok { - return expandEventGridEventSubscriptionWebhookEndpoint(d) - } - if _, ok := d.GetOk("service_bus_queue_endpoint"); ok { return expandEventGridEventSubscriptionServiceBusQueueEndpoint(d) } @@ -511,8 +453,12 @@ func expandEventGridEventSubscriptionDestination(d *schema.ResourceData) eventgr return expandEventGridEventSubscriptionServiceBusTopicEndpoint(d) } - if _, ok := d.GetOk("azure_function"); ok { - return expandEventGridEventSubscriptionAzureFunctionEndpoint(d) + if _, ok := d.GetOk("storage_queue_endpoint"); ok { + return expandEventGridEventSubscriptionStorageQueueEndpoint(d) + } + + if _, ok := d.GetOk("webhook_endpoint_url"); ok { + return expandEventGridEventSubscriptionWebhookEndpoint(d) } return nil @@ -534,8 +480,7 @@ func expandEventGridEventSubscriptionStorageQueueEndpoint(d *schema.ResourceData } func expandEventGridEventSubscriptionEventHubEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - props := d.Get("eventhub_endpoint").([]interface{})[0].(map[string]interface{}) - eventHubID := props["eventhub_id"].(string) + eventHubID := d.Get("eventhub_endpoint").(string) eventHubEndpoint := eventgrid.EventHubEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeEventHub, @@ -547,8 +492,7 @@ func expandEventGridEventSubscriptionEventHubEndpoint(d *schema.ResourceData) ev } func expandEventGridEventSubscriptionHybridConnectionEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - props := d.Get("hybrid_connection_endpoint").([]interface{})[0].(map[string]interface{}) - hybridConnectionID := props["hybrid_connection_id"].(string) + hybridConnectionID := d.Get("hybrid_connection_endpoint").(string) hybridConnectionEndpoint := eventgrid.HybridConnectionEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeHybridConnection, @@ -560,8 +504,7 @@ func expandEventGridEventSubscriptionHybridConnectionEndpoint(d *schema.Resource } func expandEventGridEventSubscriptionWebhookEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - props := d.Get("webhook_endpoint").([]interface{})[0].(map[string]interface{}) - url := props["url"].(string) + url := d.Get("webhook_endpoint_url").(string) webhookEndpoint := eventgrid.WebHookEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeWebHook, @@ -573,8 +516,7 @@ func expandEventGridEventSubscriptionWebhookEndpoint(d *schema.ResourceData) eve } func expandEventGridEventSubscriptionServiceBusQueueEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - props := d.Get("service_bus_queue_endpoint").([]interface{})[0].(map[string]interface{}) - serviceBusQueueID := props["service_bus_queue_id"].(string) + serviceBusQueueID := d.Get("service_bus_queue_endpoint").(string) serviceBusQueueEndpoint := eventgrid.ServiceBusQueueEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeServiceBusQueue, @@ -586,8 +528,7 @@ func expandEventGridEventSubscriptionServiceBusQueueEndpoint(d *schema.ResourceD } func expandEventGridEventSubscriptionServiceBusTopicEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - props := d.Get("service_bus_topic_endpoint").([]interface{})[0].(map[string]interface{}) - serviceBusTopicID := props["service_bus_topic_id"].(string) + serviceBusTopicID := d.Get("service_bus_topic_endpoint").(string) serviceBusTopicEndpoint := eventgrid.ServiceBusTopicEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeServiceBusTopic, @@ -599,8 +540,7 @@ func expandEventGridEventSubscriptionServiceBusTopicEndpoint(d *schema.ResourceD } func expandEventGridEventSubscriptionAzureFunctionEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - props := d.Get("azure_function_endpoint").([]interface{})[0].(map[string]interface{}) - azureFunctionResourceID := props["azure_function_id"].(string) + azureFunctionResourceID := d.Get("azure_function_endpoint").(string) azureFunctionEndpoint := eventgrid.AzureFunctionEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeAzureFunction, @@ -661,59 +601,68 @@ func expandEventGridEventSubscriptionRetryPolicy(d *schema.ResourceData) *eventg return nil } -func flattenEventGridEventSubscriptionStorageQueueEndpoint(input *eventgrid.StorageQueueEventSubscriptionDestination) []interface{} { - if input == nil { +func flattenEventGridEventSubscriptionEventHubEndpoint(input *eventgrid.EventHubEventSubscriptionDestination) *string { + if input == nil || input.ResourceID == nil { return nil } - result := make(map[string]interface{}) - if input.ResourceID != nil { - result["storage_account_id"] = *input.ResourceID + return input.ResourceID +} + +func flattenEventGridEventSubscriptionHybridConnectionEndpoint(input *eventgrid.HybridConnectionEventSubscriptionDestination) *string { + if input == nil || input.ResourceID == nil { + return nil } - if input.QueueName != nil { - result["queue_name"] = *input.QueueName + + return input.ResourceID +} + +func flattenEventGridEventSubscriptionServiceBusQueueEndpoint(input *eventgrid.ServiceBusQueueEventSubscriptionDestination) *string { + if input == nil || input.ResourceID == nil { + return nil } - return []interface{}{result} + return input.ResourceID } -func flattenEventGridEventSubscriptionEventHubEndpoint(input *eventgrid.EventHubEventSubscriptionDestination) []interface{} { - if input == nil { +func flattenEventGridEventSubscriptionServiceBusTopicEndpoint(input *eventgrid.ServiceBusTopicEventSubscriptionDestination) *string { + if input == nil || input.ResourceID == nil { return nil } - result := make(map[string]interface{}) - if input.ResourceID != nil { - result["eventhub_id"] = *input.ResourceID + return input.ResourceID +} + +func flattenEventGridEventSubscriptionAzureFunctionEndpoint(input *eventgrid.AzureFunctionEventSubscriptionDestination) *string { + if input == nil || input.ResourceID == nil { + return nil } - return []interface{}{result} + return input.ResourceID } -func flattenEventGridEventSubscriptionHybridConnectionEndpoint(input *eventgrid.HybridConnectionEventSubscriptionDestination) []interface{} { +func flattenEventGridEventSubscriptionStorageQueueEndpoint(input *eventgrid.StorageQueueEventSubscriptionDestination) []interface{} { if input == nil { return nil } result := make(map[string]interface{}) if input.ResourceID != nil { - result["eventhub_id"] = *input.ResourceID + result["storage_account_id"] = *input.ResourceID + } + if input.QueueName != nil { + result["queue_name"] = *input.QueueName } return []interface{}{result} } -func flattenEventGridEventSubscriptionWebhookEndpoint(input *eventgrid.EventSubscriptionFullURL) []interface{} { - if input == nil { +func flattenEventGridEventSubscriptionWebhookEndpoint(input *eventgrid.EventSubscriptionFullURL) *string { + if input == nil || input.EndpointURL == nil { return nil } - result := make(map[string]interface{}) - - if input.EndpointURL != nil { - result["url"] = *input.EndpointURL - } - return []interface{}{result} + return input.EndpointURL } func flattenEventGridEventSubscriptionSubjectFilter(filter *eventgrid.EventSubscriptionFilter) []interface{} { @@ -754,45 +703,6 @@ func flattenEventGridEventSubscriptionStorageBlobDeadLetterDestination(dest *eve return []interface{}{result} } -func flattenEventGridEventSubscriptionServiceBusQueueEndpoint(input *eventgrid.ServiceBusQueueEventSubscriptionDestination) []interface{} { - if input == nil { - return nil - } - result := make(map[string]interface{}) - - if input.ResourceID != nil { - result["service_bus_queue_id"] = *input.ResourceID - } - - return []interface{}{result} -} - -func flattenEventGridEventSubscriptionServiceBusTopicEndpoint(input *eventgrid.ServiceBusTopicEventSubscriptionDestination) []interface{} { - if input == nil { - return nil - } - result := make(map[string]interface{}) - - if input.ResourceID != nil { - result["service_bus_topic_id"] = *input.ResourceID - } - - return []interface{}{result} -} - -func flattenEventGridEventSubscriptionAzureFunctionEndpoint(input *eventgrid.AzureFunctionEventSubscriptionDestination) []interface{} { - if input == nil { - return nil - } - result := make(map[string]interface{}) - - if input.ResourceID != nil { - result["azure_function_id"] = *input.ResourceID - } - - return []interface{}{result} -} - func flattenEventGridEventSubscriptionRetryPolicy(retryPolicy *eventgrid.RetryPolicy) []interface{} { result := make(map[string]interface{}) diff --git a/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go b/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go index acf6ad3727a0..d18afb64178c 100644 --- a/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go +++ b/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go @@ -380,6 +380,50 @@ resource "azurerm_eventgrid_event_subscription" "test" { `, data.RandomInteger, data.Locations.Primary, data.RandomString, data.RandomInteger, data.RandomInteger) } +func testAccAzureRMEventGridEventSubscription_azureFunction(data acceptance.TestData) string { + return fmt.Sprintf(` +provider "azurerm" { + features {} +} +resource "azurerm_resource_group" "test" { + name = "acctestRG-%d" + location = "%s" +} +resource "azurerm_storage_account" "test" { + name = "acctestacc%s" + resource_group_name = azurerm_resource_group.test.name + location = azurerm_resource_group.test.location + account_tier = "Standard" + account_replication_type = "LRS" + tags = { + environment = "staging" + } +} +resource "azurerm_app_service_plan" "test" { + name = "acctestASP-%d" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + sku { + tier = "Standard" + size = "S1" + } +} +resource "azurerm_function_app" "test" { + name = "acctest-%d-func" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + app_service_plan_id = azurerm_app_service_plan.test.id + storage_connection_string = azurerm_storage_account.test.primary_connection_string +} +resource "azurerm_eventgrid_event_subscription" "test" { + name = "acctesteg-%d" + scope = azurerm_resource_group.test.id + event_delivery_schema = "CloudEventSchemaV1_0" + azure_function_endpoint = azurerm_function_app.test.id +} +`, data.RandomInteger, data.Locations.Primary, data.RandomString, data.RandomInteger, data.RandomInteger, data.RandomInteger) +} + func testAccAzureRMEventGridEventSubscription_eventhub(data acceptance.TestData) string { return fmt.Sprintf(` provider "azurerm" { @@ -411,9 +455,7 @@ resource "azurerm_eventgrid_event_subscription" "test" { scope = azurerm_resource_group.test.id event_delivery_schema = "CloudEventSchemaV1_0" - eventhub_endpoint { - eventhub_id = azurerm_eventhub.test.id - } + eventhub_endpoint = azurerm_eventhub.test.id } `, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger) } @@ -444,9 +486,7 @@ resource "azurerm_eventgrid_event_subscription" "test" { name = "acctesteg-%d" scope = azurerm_resource_group.test.id event_delivery_schema = "CloudEventSchemaV1_0" - service_bus_queue_endpoint { - service_bus_queue_id = "${azurerm_servicebus_queue.test.id}" - } + service_bus_queue_endpoint = azurerm_servicebus_queue.test.id } `, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger) } @@ -476,59 +516,11 @@ resource "azurerm_eventgrid_event_subscription" "test" { name = "acctesteg-%d" scope = azurerm_resource_group.test.id event_delivery_schema = "CloudEventSchemaV1_0" - service_bus_topic_endpoint { - service_bus_topic_id = "${azurerm_servicebus_topic.test.id}" - } + service_bus_topic_endpoint = azurerm_servicebus_topic.test.id } `, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger) } -func testAccAzureRMEventGridEventSubscription_azureFunction(data acceptance.TestData) string { - return fmt.Sprintf(` -provider "azurerm" { - features {} -} -resource "azurerm_resource_group" "test" { - name = "acctestRG-%d" - location = "%s" -} -resource "azurerm_storage_account" "test" { - name = "acctestacc%s" - resource_group_name = azurerm_resource_group.test.name - location = azurerm_resource_group.test.location - account_tier = "Standard" - account_replication_type = "LRS" - tags = { - environment = "staging" - } -} -resource "azurerm_app_service_plan" "test" { - name = "acctestASP-%d" - location = azurerm_resource_group.test.location - resource_group_name = azurerm_resource_group.test.name - sku { - tier = "Standard" - size = "S1" - } -} -resource "azurerm_function_app" "test" { - name = "acctest-%d-func" - location = azurerm_resource_group.test.location - resource_group_name = azurerm_resource_group.test.name - app_service_plan_id = azurerm_app_service_plan.test.id - storage_connection_string = azurerm_storage_account.test.primary_connection_string -} -resource "azurerm_eventgrid_event_subscription" "test" { - name = "acctesteg-%d" - scope = azurerm_resource_group.test.id - event_delivery_schema = "CloudEventSchemaV1_0" - azure_function_endpoint { - azure_function_id = "${azurerm_function_app.test.id}" - } -} -`, data.RandomInteger, data.Locations.Primary, data.RandomString, data.RandomInteger, data.RandomInteger, data.RandomInteger) -} - func testAccAzureRMEventGridEventSubscription_filter(data acceptance.TestData) string { return fmt.Sprintf(` provider "azurerm" { From 39faba7331f7b7b6d4e7cd4d900d1b4edc5c1221 Mon Sep 17 00:00:00 2001 From: Jochen Rauschenbusch Date: Fri, 15 May 2020 09:27:48 +0200 Subject: [PATCH 05/11] refactor: update docs --- ...eventgrid_event_subscription.html.markdown | 52 +++---------------- 1 file changed, 8 insertions(+), 44 deletions(-) diff --git a/website/docs/r/eventgrid_event_subscription.html.markdown b/website/docs/r/eventgrid_event_subscription.html.markdown index e20e645bee78..46e51238c291 100644 --- a/website/docs/r/eventgrid_event_subscription.html.markdown +++ b/website/docs/r/eventgrid_event_subscription.html.markdown @@ -60,21 +60,21 @@ The following arguments are supported: * `event_delivery_schema` - (Optional) Specifies the event delivery schema for the event subscription. Possible values include: `EventGridSchema`, `CloudEventSchemaV1_0`, `CustomInputSchema`. Defaults to `EventGridSchema`. Changing this forces a new resource to be created. -* `storage_queue_endpoint` - (Optional) A `storage_queue_endpoint` block as defined below. +* `azure_function_endpoint` - (Optional) Specifies the id where the azure function is located. -* `eventhub_endpoint` - (Optional) A `eventhub_endpoint` block as defined below. +* `eventhub_endpoint` - (Optional) Specifies the id of the eventhub where the Event Subscription will receive events. -* `hybrid_connection_endpoint` - (Optional) A `hybrid_connection_endpoint` block as defined below. +* `hybrid_connection_endpoint` - (Optional) Specifies the id of the hybrid connection where the Event Subscription will receive events. -* `webhook_endpoint` - (Optional) A `webhook_endpoint` block as defined below. +* `service_bus_queue_endpoint` - (Optional) Specifies the id where the service bus queue is located. -* `service_bus_queue_endpoint` - (Optional) A `service_bus_queue_endpoint` block as defined below. +* `service_bus_topic_endpoint` - (Optional) Specifies the id where the service bus topic is located. -* `service_bus_topic_endpoint` - (Optional) A `service_bus_topic_endpoint` block as defined below. +* `storage_queue_endpoint` - (Optional) A `storage_queue_endpoint` block as defined below. -* `azure_function_endpoint` - (Optional) A `azure_function_endpoint` block as defined below. +* `webhook_endpoint_url` - (Optional) Specifies the url of the webhook where the Event Subscription will receive events. -~> **NOTE:** One of `storage_queue_endpoint`, `eventhub_endpoint`, `hybrid_connection_endpoint`, `webhook_endpoint`, `service_bus_queue_endpoint`, `service_bus_topic_endpoint` or `azure_function_endpoint` must be specified. +~> **NOTE:** One of `azure_function_endpoint`, `eventhub_endpoint`, `hybrid_connection_endpoint`, `service_bus_queue_endpoint`, `service_bus_topic_endpoint`, `storage_queue_endpoint` or `webhook_endpoint_url` must be specified. * `included_event_types` - (Optional) A list of applicable event types that need to be part of the event subscription. @@ -96,42 +96,6 @@ A `storage_queue_endpoint` supports the following: --- -A `eventhub_endpoint` supports the following: - -* `eventhub_id` - (Required) Specifies the id of the eventhub where the Event Subscription will receive events. - ---- - -A `hybrid_connection_endpoint` supports the following: - -* `hybrid_connection_id` - (Required) Specifies the id of the hybrid connection where the Event Subscription will receive events. - ---- - -A `webhook_endpoint` supports the following: - -* `url` - (Required) Specifies the url of the webhook where the Event Subscription will receive events. - ---- - -A `service_bus_queue_endpoint` supports the following: - -* `service_bus_queue_id` - (Required) Specifies the id where the service bus queue is located. - ---- - -A `service_bus_topic_endpoint` supports the following: - -* `service_bus_topic_id` - (Required) Specifies the id where the service bus topic is located. - ---- - -A `azure_function_endpoint` supports the following: - -* `azure_function_id` - (Required) Specifies the id where the azure function is located. - ---- - A `subject_filter` supports the following: * `subject_begins_with` - (Optional) A string to filter events for an event subscription based on a resource path prefix. From 0346eeb0a9154c6ad16260b97a8934ac4d4f8e92 Mon Sep 17 00:00:00 2001 From: Jochen Rauschenbusch Date: Fri, 15 May 2020 19:41:13 +0200 Subject: [PATCH 06/11] fix: terrafmt --- ...ntgrid_event_subscription_resource_test.go | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go b/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go index d18afb64178c..4ab04bae97d5 100644 --- a/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go +++ b/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go @@ -416,9 +416,9 @@ resource "azurerm_function_app" "test" { storage_connection_string = azurerm_storage_account.test.primary_connection_string } resource "azurerm_eventgrid_event_subscription" "test" { - name = "acctesteg-%d" - scope = azurerm_resource_group.test.id - event_delivery_schema = "CloudEventSchemaV1_0" + name = "acctesteg-%d" + scope = azurerm_resource_group.test.id + event_delivery_schema = "CloudEventSchemaV1_0" azure_function_endpoint = azurerm_function_app.test.id } `, data.RandomInteger, data.Locations.Primary, data.RandomString, data.RandomInteger, data.RandomInteger, data.RandomInteger) @@ -455,7 +455,7 @@ resource "azurerm_eventgrid_event_subscription" "test" { scope = azurerm_resource_group.test.id event_delivery_schema = "CloudEventSchemaV1_0" - eventhub_endpoint = azurerm_eventhub.test.id + eventhub_endpoint = azurerm_eventhub.test.id } `, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger) } @@ -483,9 +483,9 @@ resource "azurerm_servicebus_queue" "test" { enable_partitioning = true } resource "azurerm_eventgrid_event_subscription" "test" { - name = "acctesteg-%d" - scope = azurerm_resource_group.test.id - event_delivery_schema = "CloudEventSchemaV1_0" + name = "acctesteg-%d" + scope = azurerm_resource_group.test.id + event_delivery_schema = "CloudEventSchemaV1_0" service_bus_queue_endpoint = azurerm_servicebus_queue.test.id } `, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger) @@ -513,9 +513,9 @@ resource "azurerm_servicebus_topic" "test" { enable_partitioning = true } resource "azurerm_eventgrid_event_subscription" "test" { - name = "acctesteg-%d" - scope = azurerm_resource_group.test.id - event_delivery_schema = "CloudEventSchemaV1_0" + name = "acctesteg-%d" + scope = azurerm_resource_group.test.id + event_delivery_schema = "CloudEventSchemaV1_0" service_bus_topic_endpoint = azurerm_servicebus_topic.test.id } `, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger) From ca07a392f826c31a720aee6f0e88c6debf1e6efe Mon Sep 17 00:00:00 2001 From: Jochen Rauschenbusch Date: Mon, 18 May 2020 14:16:25 +0200 Subject: [PATCH 07/11] refactor: cleanups, fixes, deprecation logic --- .../eventgrid_event_subscription_resource.go | 279 +++++++++++++----- .../parse/eventgrid_event_subscription.go | 11 +- ...ntgrid_event_subscription_resource_test.go | 113 ++++--- ...eventgrid_event_subscription.html.markdown | 35 ++- 4 files changed, 314 insertions(+), 124 deletions(-) diff --git a/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go b/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go index ff2747f3c6eb..cf83367a1c43 100644 --- a/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go +++ b/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go @@ -20,8 +20,20 @@ import ( "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) -func getEnpointTypes() []string { - return []string{"azure_function_endpoint", "eventhub_endpoint", "hybrid_connection_endpoint", "service_bus_queue_endpoint", "service_bus_topic_endpoint", "storage_queue_endpoint", "webhook_endpoint_url"} +const ( + AzureFunctionEndpointID string = "azure_function_endpoint_id" + EventHubEndpoint string = "eventhub_endpoint" + EventHubEndpointID string = "eventhub_endpoint_id" + HybridConnectionEndpoint string = "hybrid_connection_endpoint" + HybridConnectionEndpointID string = "hybrid_connection_endpoint_id" + ServiceBusQueueEndpointID string = "service_bus_queue_endpoint_id" + ServiceBusTopicEndpointID string = "service_bus_topic_endpoint_id" + StorageQueueEndpoint string = "storage_queue_endpoint" + WebhookEndpoint string = "webhook_endpoint" +) + +func PossibleEnpointTypes() []string { + return []string{AzureFunctionEndpointID, EventHubEndpoint, EventHubEndpointID, HybridConnectionEndpoint, HybridConnectionEndpointID, ServiceBusQueueEndpointID, ServiceBusTopicEndpointID, StorageQueueEndpoint, WebhookEndpoint} } func resourceArmEventGridEventSubscription() *schema.Resource { @@ -73,7 +85,6 @@ func resourceArmEventGridEventSubscription() *schema.Resource { "expiration_time_utc": { Type: schema.TypeString, Optional: true, - Computed: true, ValidateFunc: validation.StringIsNotEmpty, }, @@ -83,46 +94,80 @@ func resourceArmEventGridEventSubscription() *schema.Resource { Computed: true, }, - "azure_function_endpoint": { + AzureFunctionEndpointID: { Type: schema.TypeString, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "azure_function_endpoint"), + ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), AzureFunctionEndpointID), ValidateFunc: azure.ValidateResourceID, }, - "eventhub_endpoint": { + EventHubEndpointID: { Type: schema.TypeString, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "eventhub_endpoint"), + ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), EventHubEndpointID), ValidateFunc: azure.ValidateResourceID, }, - "hybrid_connection_endpoint": { + EventHubEndpoint: { + Type: schema.TypeList, + MaxItems: 1, + Deprecated: "Deprecated in favour of `" + EventHubEndpointID + "`", + Optional: true, + ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), EventHubEndpoint), + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "eventhub_id": { + Type: schema.TypeString, + Required: true, + ValidateFunc: azure.ValidateResourceID, + }, + }, + }, + }, + + HybridConnectionEndpointID: { Type: schema.TypeString, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "hybrid_connection_endpoint"), + ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), HybridConnectionEndpointID), ValidateFunc: azure.ValidateResourceID, }, - "service_bus_queue_endpoint": { + HybridConnectionEndpoint: { + Type: schema.TypeList, + MaxItems: 1, + Deprecated: "Deprecated in favour of `" + HybridConnectionEndpointID + "`", + Optional: true, + ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), HybridConnectionEndpoint), + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "hybrid_connection_id": { + Type: schema.TypeString, + Required: true, + ValidateFunc: azure.ValidateResourceID, + }, + }, + }, + }, + + ServiceBusQueueEndpointID: { Type: schema.TypeString, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "service_bus_queue_endpoint"), + ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), ServiceBusQueueEndpointID), ValidateFunc: azure.ValidateResourceID, }, - "service_bus_topic_endpoint": { + ServiceBusTopicEndpointID: { Type: schema.TypeString, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "service_bus_topic_endpoint"), + ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), ServiceBusTopicEndpointID), ValidateFunc: azure.ValidateResourceID, }, - "storage_queue_endpoint": { + StorageQueueEndpoint: { Type: schema.TypeList, MaxItems: 1, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "storage_queue_endpoint"), + ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), StorageQueueEndpoint), Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "storage_account_id": { @@ -139,11 +184,20 @@ func resourceArmEventGridEventSubscription() *schema.Resource { }, }, - "webhook_endpoint_url": { - Type: schema.TypeString, + WebhookEndpoint: { + Type: schema.TypeList, + MaxItems: 1, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(getEnpointTypes(), "webhook_endpoint_url"), - ValidateFunc: validation.IsURLWithHTTPS, + ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), WebhookEndpoint), + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "url": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.IsURLWithHTTPS, + }, + }, + }, }, "included_event_types": { @@ -253,18 +307,16 @@ func resourceArmEventGridEventSubscriptionCreateUpdate(d *schema.ResourceData, m destination := expandEventGridEventSubscriptionDestination(d) if destination == nil { - return fmt.Errorf("One of the following endpoint types must be specificed to create an EventGrid Event Subscription: %q", getEnpointTypes()) + return fmt.Errorf("One of the following endpoint types must be specificed to create an EventGrid Event Subscription: %q", PossibleEnpointTypes()) } filter := expandEventGridEventSubscriptionFilter(d) - parsedTime, err := date.ParseTime(time.RFC3339, d.Get("expiration_time_utc").(string)) + expirationTime, err := expandEventGridExpirationTime(d) if err != nil { return fmt.Errorf("Error creating/updating EventGrid Event Subscription %q (Scope %q): %s", name, scope, err) } - expirationTime := date.Time{Time: parsedTime} - eventSubscriptionProperties := eventgrid.EventSubscriptionProperties{ Destination: destination, Filter: filter, @@ -272,7 +324,7 @@ func resourceArmEventGridEventSubscriptionCreateUpdate(d *schema.ResourceData, m RetryPolicy: expandEventGridEventSubscriptionRetryPolicy(d), Labels: utils.ExpandStringSlice(d.Get("labels").([]interface{})), EventDeliverySchema: eventgrid.EventDeliverySchema(d.Get("event_delivery_schema").(string)), - ExpirationTimeUtc: &expirationTime, + ExpirationTimeUtc: expirationTime, } eventSubscription := eventgrid.EventSubscription{ @@ -328,41 +380,51 @@ func resourceArmEventGridEventSubscriptionRead(d *schema.ResourceData, meta inte d.Set("scope", id.Scope) if props := resp.EventSubscriptionProperties; props != nil { - d.Set("expiration_time_utc", props.ExpirationTimeUtc.Format(time.RFC3339)) + if props.ExpirationTimeUtc != nil { + d.Set("expiration_time_utc", props.ExpirationTimeUtc.Format(time.RFC3339)) + } d.Set("event_delivery_schema", string(props.EventDeliverySchema)) if props.Topic != nil && *props.Topic != "" { d.Set("topic_name", props.Topic) } - if storageQueueEndpoint, ok := props.Destination.AsStorageQueueEventSubscriptionDestination(); ok { - if err := d.Set("storage_queue_endpoint", flattenEventGridEventSubscriptionStorageQueueEndpoint(storageQueueEndpoint)); err != nil { - return fmt.Errorf("Error setting `storage_queue_endpoint` for EventGrid Event Subscription %q (Scope %q): %s", id.Name, id.Scope, err) + if azureFunctionEndpoint, ok := props.Destination.AsAzureFunctionEventSubscriptionDestination(); ok { + if err := d.Set(AzureFunctionEndpointID, flattenEventGridEventSubscriptionAzureFunctionEndpointID(azureFunctionEndpoint)); err != nil { + return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", AzureFunctionEndpointID, id.Name, id.Scope, err) } } if eventHubEndpoint, ok := props.Destination.AsEventHubEventSubscriptionDestination(); ok { - if err := d.Set("eventhub_endpoint", flattenEventGridEventSubscriptionEventHubEndpoint(eventHubEndpoint)); err != nil { - return fmt.Errorf("Error setting `eventhub_endpoint` for EventGrid Event Subscription %q (Scope %q): %s", id.Name, id.Scope, err) + if err := d.Set(EventHubEndpointID, flattenEventGridEventSubscriptionEventHubEndpointID(eventHubEndpoint)); err != nil { + return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", EventHubEndpointID, id.Name, id.Scope, err) + } + + if err := d.Set(EventHubEndpoint, flattenEventGridEventSubscriptionEventHubEndpoint(eventHubEndpoint)); err != nil { + return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", EventHubEndpoint, id.Name, id.Scope, err) } } if hybridConnectionEndpoint, ok := props.Destination.AsHybridConnectionEventSubscriptionDestination(); ok { - if err := d.Set("hybrid_connection_endpoint", flattenEventGridEventSubscriptionHybridConnectionEndpoint(hybridConnectionEndpoint)); err != nil { - return fmt.Errorf("Error setting `hybrid_connection_endpoint` for EventGrid Event Subscription %q (Scope %q): %s", id.Name, id.Scope, err) + if err := d.Set(HybridConnectionEndpointID, flattenEventGridEventSubscriptionHybridConnectionEndpointID(hybridConnectionEndpoint)); err != nil { + return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", HybridConnectionEndpointID, id.Name, id.Scope, err) + } + + if err := d.Set(HybridConnectionEndpoint, flattenEventGridEventSubscriptionHybridConnectionEndpoint(hybridConnectionEndpoint)); err != nil { + return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", HybridConnectionEndpoint, id.Name, id.Scope, err) } } if serviceBusQueueEndpoint, ok := props.Destination.AsServiceBusQueueEventSubscriptionDestination(); ok { - if err := d.Set("service_bus_queue_endpoint", flattenEventGridEventSubscriptionServiceBusQueueEndpoint(serviceBusQueueEndpoint)); err != nil { - return fmt.Errorf("Error setting `service_bus_queue_endpoint` for EventGrid Event Subscription %q (Scope %q): %s", id.Name, id.Scope, err) + if err := d.Set(ServiceBusQueueEndpointID, flattenEventGridEventSubscriptionServiceBusQueueEndpointID(serviceBusQueueEndpoint)); err != nil { + return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", ServiceBusQueueEndpointID, id.Name, id.Scope, err) } } if serviceBusTopicEndpoint, ok := props.Destination.AsServiceBusTopicEventSubscriptionDestination(); ok { - if err := d.Set("service_bus_topic_endpoint", flattenEventGridEventSubscriptionServiceBusTopicEndpoint(serviceBusTopicEndpoint)); err != nil { - return fmt.Errorf("Error setting `service_bus_topic_endpoint` for EventGrid Event Subscription %q (Scope %q): %s", id.Name, id.Scope, err) + if err := d.Set(ServiceBusTopicEndpointID, flattenEventGridEventSubscriptionServiceBusTopicEndpointID(serviceBusTopicEndpoint)); err != nil { + return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", ServiceBusTopicEndpointID, id.Name, id.Scope, err) } } - if azureFunctionEndpoint, ok := props.Destination.AsAzureFunctionEventSubscriptionDestination(); ok { - if err := d.Set("azure_function_endpoint", flattenEventGridEventSubscriptionAzureFunctionEndpoint(azureFunctionEndpoint)); err != nil { - return fmt.Errorf("Error setting `azure_function_endpoint` for EventGrid Event Subscription %q (Scope %q): %s", id.Name, id.Scope, err) + if storageQueueEndpoint, ok := props.Destination.AsStorageQueueEventSubscriptionDestination(); ok { + if err := d.Set(StorageQueueEndpoint, flattenEventGridEventSubscriptionStorageQueueEndpoint(storageQueueEndpoint)); err != nil { + return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", StorageQueueEndpoint, id.Name, id.Scope, err) } } if _, ok := props.Destination.AsWebHookEventSubscriptionDestination(); ok { @@ -370,8 +432,8 @@ func resourceArmEventGridEventSubscriptionRead(d *schema.ResourceData, meta inte if err != nil { return fmt.Errorf("Error making Read request on EventGrid Event Subscription full URL '%s': %+v", id.Name, err) } - if err := d.Set("webhook_endpoint_url", flattenEventGridEventSubscriptionWebhookEndpoint(&fullURL)); err != nil { - return fmt.Errorf("Error setting `webhook_endpoint_url` for EventGrid Event Subscription %q (Scope %q): %s", id.Name, id.Scope, err) + if err := d.Set(WebhookEndpoint, flattenEventGridEventSubscriptionWebhookEndpoint(&fullURL)); err != nil { + return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", WebhookEndpoint, id.Name, id.Scope, err) } } @@ -432,32 +494,53 @@ func resourceArmEventGridEventSubscriptionDelete(d *schema.ResourceData, meta in return nil } +func expandEventGridExpirationTime(d *schema.ResourceData) (*date.Time, error) { + if expirationTimeUtc, ok := d.GetOk("expiration_time_utc"); ok { + if expirationTimeUtc == "" { + return nil, nil + } + + parsedExpirationTimeUtc, err := date.ParseTime(time.RFC3339, expirationTimeUtc.(string)) + if err != nil { + return nil, err + } + + return &date.Time{Time: parsedExpirationTimeUtc}, nil + } + + return nil, nil +} + func expandEventGridEventSubscriptionDestination(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - if _, ok := d.GetOk("azure_function_endpoint"); ok { - return expandEventGridEventSubscriptionAzureFunctionEndpoint(d) + if _, ok := d.GetOk(AzureFunctionEndpointID); ok { + return expandEventGridEventSubscriptionAzureFunctionEndpointID(d) } - if _, ok := d.GetOk("eventhub_endpoint"); ok { + if _, ok := d.GetOk(EventHubEndpointID); ok { + return expandEventGridEventSubscriptionEventHubEndpointID(d) + } else if _, ok := d.GetOk(EventHubEndpoint); ok { return expandEventGridEventSubscriptionEventHubEndpoint(d) } - if _, ok := d.GetOk("hybrid_connection_endpoint"); ok { + if _, ok := d.GetOk(HybridConnectionEndpointID); ok { + return expandEventGridEventSubscriptionHybridConnectionEndpointID(d) + } else if _, ok := d.GetOk(HybridConnectionEndpoint); ok { return expandEventGridEventSubscriptionHybridConnectionEndpoint(d) } - if _, ok := d.GetOk("service_bus_queue_endpoint"); ok { - return expandEventGridEventSubscriptionServiceBusQueueEndpoint(d) + if _, ok := d.GetOk(ServiceBusQueueEndpointID); ok { + return expandEventGridEventSubscriptionServiceBusQueueEndpointID(d) } - if _, ok := d.GetOk("service_bus_topic_endpoint"); ok { - return expandEventGridEventSubscriptionServiceBusTopicEndpoint(d) + if _, ok := d.GetOk(ServiceBusTopicEndpointID); ok { + return expandEventGridEventSubscriptionServiceBusTopicEndpointID(d) } - if _, ok := d.GetOk("storage_queue_endpoint"); ok { + if _, ok := d.GetOk(StorageQueueEndpoint); ok { return expandEventGridEventSubscriptionStorageQueueEndpoint(d) } - if _, ok := d.GetOk("webhook_endpoint_url"); ok { + if _, ok := d.GetOk(WebhookEndpoint); ok { return expandEventGridEventSubscriptionWebhookEndpoint(d) } @@ -465,7 +548,7 @@ func expandEventGridEventSubscriptionDestination(d *schema.ResourceData) eventgr } func expandEventGridEventSubscriptionStorageQueueEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - props := d.Get("storage_queue_endpoint").([]interface{})[0].(map[string]interface{}) + props := d.Get(StorageQueueEndpoint).([]interface{})[0].(map[string]interface{}) storageAccountID := props["storage_account_id"].(string) queueName := props["queue_name"].(string) @@ -480,7 +563,20 @@ func expandEventGridEventSubscriptionStorageQueueEndpoint(d *schema.ResourceData } func expandEventGridEventSubscriptionEventHubEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - eventHubID := d.Get("eventhub_endpoint").(string) + props := d.Get(EventHubEndpoint).([]interface{})[0].(map[string]interface{}) + eventHubID := props["eventhub_id"].(string) + + eventHubEndpoint := eventgrid.EventHubEventSubscriptionDestination{ + EndpointType: eventgrid.EndpointTypeEventHub, + EventHubEventSubscriptionDestinationProperties: &eventgrid.EventHubEventSubscriptionDestinationProperties{ + ResourceID: &eventHubID, + }, + } + return eventHubEndpoint +} + +func expandEventGridEventSubscriptionEventHubEndpointID(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { + eventHubID := d.Get(EventHubEndpointID).(string) eventHubEndpoint := eventgrid.EventHubEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeEventHub, @@ -492,7 +588,20 @@ func expandEventGridEventSubscriptionEventHubEndpoint(d *schema.ResourceData) ev } func expandEventGridEventSubscriptionHybridConnectionEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - hybridConnectionID := d.Get("hybrid_connection_endpoint").(string) + props := d.Get(HybridConnectionEndpoint).([]interface{})[0].(map[string]interface{}) + hybridConnectionID := props["hybrid_connection_id"].(string) + + hybridConnectionEndpoint := eventgrid.HybridConnectionEventSubscriptionDestination{ + EndpointType: eventgrid.EndpointTypeHybridConnection, + HybridConnectionEventSubscriptionDestinationProperties: &eventgrid.HybridConnectionEventSubscriptionDestinationProperties{ + ResourceID: &hybridConnectionID, + }, + } + return hybridConnectionEndpoint +} + +func expandEventGridEventSubscriptionHybridConnectionEndpointID(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { + hybridConnectionID := d.Get(HybridConnectionEndpointID).(string) hybridConnectionEndpoint := eventgrid.HybridConnectionEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeHybridConnection, @@ -504,7 +613,8 @@ func expandEventGridEventSubscriptionHybridConnectionEndpoint(d *schema.Resource } func expandEventGridEventSubscriptionWebhookEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - url := d.Get("webhook_endpoint_url").(string) + props := d.Get(WebhookEndpoint).([]interface{})[0].(map[string]interface{}) + url := props["url"].(string) webhookEndpoint := eventgrid.WebHookEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeWebHook, @@ -515,8 +625,8 @@ func expandEventGridEventSubscriptionWebhookEndpoint(d *schema.ResourceData) eve return webhookEndpoint } -func expandEventGridEventSubscriptionServiceBusQueueEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - serviceBusQueueID := d.Get("service_bus_queue_endpoint").(string) +func expandEventGridEventSubscriptionServiceBusQueueEndpointID(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { + serviceBusQueueID := d.Get(ServiceBusQueueEndpointID).(string) serviceBusQueueEndpoint := eventgrid.ServiceBusQueueEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeServiceBusQueue, @@ -527,8 +637,8 @@ func expandEventGridEventSubscriptionServiceBusQueueEndpoint(d *schema.ResourceD return serviceBusQueueEndpoint } -func expandEventGridEventSubscriptionServiceBusTopicEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - serviceBusTopicID := d.Get("service_bus_topic_endpoint").(string) +func expandEventGridEventSubscriptionServiceBusTopicEndpointID(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { + serviceBusTopicID := d.Get(ServiceBusTopicEndpointID).(string) serviceBusTopicEndpoint := eventgrid.ServiceBusTopicEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeServiceBusTopic, @@ -539,8 +649,8 @@ func expandEventGridEventSubscriptionServiceBusTopicEndpoint(d *schema.ResourceD return serviceBusTopicEndpoint } -func expandEventGridEventSubscriptionAzureFunctionEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - azureFunctionResourceID := d.Get("azure_function_endpoint").(string) +func expandEventGridEventSubscriptionAzureFunctionEndpointID(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { + azureFunctionResourceID := d.Get(AzureFunctionEndpointID).(string) azureFunctionEndpoint := eventgrid.AzureFunctionEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeAzureFunction, @@ -601,7 +711,20 @@ func expandEventGridEventSubscriptionRetryPolicy(d *schema.ResourceData) *eventg return nil } -func flattenEventGridEventSubscriptionEventHubEndpoint(input *eventgrid.EventHubEventSubscriptionDestination) *string { +func flattenEventGridEventSubscriptionEventHubEndpoint(input *eventgrid.EventHubEventSubscriptionDestination) []interface{} { + if input == nil { + return nil + } + result := make(map[string]interface{}) + + if input.ResourceID != nil { + result["eventhub_id"] = *input.ResourceID + } + + return []interface{}{result} +} + +func flattenEventGridEventSubscriptionEventHubEndpointID(input *eventgrid.EventHubEventSubscriptionDestination) *string { if input == nil || input.ResourceID == nil { return nil } @@ -609,7 +732,20 @@ func flattenEventGridEventSubscriptionEventHubEndpoint(input *eventgrid.EventHub return input.ResourceID } -func flattenEventGridEventSubscriptionHybridConnectionEndpoint(input *eventgrid.HybridConnectionEventSubscriptionDestination) *string { +func flattenEventGridEventSubscriptionHybridConnectionEndpoint(input *eventgrid.HybridConnectionEventSubscriptionDestination) []interface{} { + if input == nil { + return nil + } + result := make(map[string]interface{}) + + if input.ResourceID != nil { + result["eventhub_id"] = *input.ResourceID + } + + return []interface{}{result} +} + +func flattenEventGridEventSubscriptionHybridConnectionEndpointID(input *eventgrid.HybridConnectionEventSubscriptionDestination) *string { if input == nil || input.ResourceID == nil { return nil } @@ -617,7 +753,7 @@ func flattenEventGridEventSubscriptionHybridConnectionEndpoint(input *eventgrid. return input.ResourceID } -func flattenEventGridEventSubscriptionServiceBusQueueEndpoint(input *eventgrid.ServiceBusQueueEventSubscriptionDestination) *string { +func flattenEventGridEventSubscriptionServiceBusQueueEndpointID(input *eventgrid.ServiceBusQueueEventSubscriptionDestination) *string { if input == nil || input.ResourceID == nil { return nil } @@ -625,7 +761,7 @@ func flattenEventGridEventSubscriptionServiceBusQueueEndpoint(input *eventgrid.S return input.ResourceID } -func flattenEventGridEventSubscriptionServiceBusTopicEndpoint(input *eventgrid.ServiceBusTopicEventSubscriptionDestination) *string { +func flattenEventGridEventSubscriptionServiceBusTopicEndpointID(input *eventgrid.ServiceBusTopicEventSubscriptionDestination) *string { if input == nil || input.ResourceID == nil { return nil } @@ -633,7 +769,7 @@ func flattenEventGridEventSubscriptionServiceBusTopicEndpoint(input *eventgrid.S return input.ResourceID } -func flattenEventGridEventSubscriptionAzureFunctionEndpoint(input *eventgrid.AzureFunctionEventSubscriptionDestination) *string { +func flattenEventGridEventSubscriptionAzureFunctionEndpointID(input *eventgrid.AzureFunctionEventSubscriptionDestination) *string { if input == nil || input.ResourceID == nil { return nil } @@ -657,12 +793,17 @@ func flattenEventGridEventSubscriptionStorageQueueEndpoint(input *eventgrid.Stor return []interface{}{result} } -func flattenEventGridEventSubscriptionWebhookEndpoint(input *eventgrid.EventSubscriptionFullURL) *string { - if input == nil || input.EndpointURL == nil { +func flattenEventGridEventSubscriptionWebhookEndpoint(input *eventgrid.EventSubscriptionFullURL) []interface{} { + if input == nil { return nil } + result := make(map[string]interface{}) + + if input.EndpointURL != nil { + result["url"] = *input.EndpointURL + } - return input.EndpointURL + return []interface{}{result} } func flattenEventGridEventSubscriptionSubjectFilter(filter *eventgrid.EventSubscriptionFilter) []interface{} { diff --git a/azurerm/internal/services/eventgrid/parse/eventgrid_event_subscription.go b/azurerm/internal/services/eventgrid/parse/eventgrid_event_subscription.go index a36965dafa3b..26efe025973b 100644 --- a/azurerm/internal/services/eventgrid/parse/eventgrid_event_subscription.go +++ b/azurerm/internal/services/eventgrid/parse/eventgrid_event_subscription.go @@ -13,7 +13,7 @@ type EventGridEventSubscriptionId struct { } func EventGridEventSubscriptionID(input string) (*EventGridEventSubscriptionId, error) { - id, err := azure.ParseAzureResourceID(input) + _, err := azure.ParseAzureResourceID(input) if err != nil { return nil, fmt.Errorf("[ERROR] Unable to parse EventGrid Event Subscription ID %q: %+v", input, err) } @@ -25,14 +25,7 @@ func EventGridEventSubscriptionID(input string) (*EventGridEventSubscriptionId, eventSubscription := EventGridEventSubscriptionId{ Scope: segments[0], - } - - if eventSubscription.Name, err = id.PopSegment("eventSubscriptions"); err != nil { - return nil, err - } - - if err := id.ValidateNoEmptySegments(input); err != nil { - return nil, err + Name: segments[1], } return &eventSubscription, nil diff --git a/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go b/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go index 4ab04bae97d5..dc07c63e05f9 100644 --- a/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go +++ b/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go @@ -32,7 +32,7 @@ func TestAccAzureRMEventGridEventSubscription_basic(t *testing.T) { }) } -func TestAccAzureRMEventGridEventSubscription_eventhub(t *testing.T) { +func TestAccAzureRMEventGridEventSubscription_requiresImport(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_eventgrid_event_subscription", "test") resource.ParallelTest(t, resource.TestCase{ @@ -41,11 +41,33 @@ func TestAccAzureRMEventGridEventSubscription_eventhub(t *testing.T) { CheckDestroy: testCheckAzureRMEventGridEventSubscriptionDestroy, Steps: []resource.TestStep{ { - Config: testAccAzureRMEventGridEventSubscription_eventhub(data), + Config: testAccAzureRMEventGridEventSubscription_basic(data), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMEventGridEventSubscriptionExists(data.ResourceName), + ), + }, + { + Config: testAccAzureRMEventGridEventSubscription_requiresImport(data), + ExpectError: acceptance.RequiresImportError("azurerm_eventgrid_event_subscription"), + }, + }, + }) +} + +func TestAccAzureRMEventGridEventSubscription_eventHubID(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_eventgrid_event_subscription", "test") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMEventGridEventSubscriptionDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMEventGridEventSubscription_eventHubID(data), Check: resource.ComposeTestCheckFunc( testCheckAzureRMEventGridEventSubscriptionExists(data.ResourceName), resource.TestCheckResourceAttr(data.ResourceName, "event_delivery_schema", "CloudEventSchemaV1_0"), - resource.TestCheckResourceAttr(data.ResourceName, "eventhub_endpoint.#", "1"), + resource.TestCheckResourceAttrSet(data.ResourceName, "eventhub_endpoint_id"), ), }, data.ImportStep(), @@ -53,7 +75,7 @@ func TestAccAzureRMEventGridEventSubscription_eventhub(t *testing.T) { }) } -func TestAccAzureRMEventGridEventSubscription_serviceBusQueue(t *testing.T) { +func TestAccAzureRMEventGridEventSubscription_serviceBusQueueID(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_eventgrid_event_subscription", "test") resource.ParallelTest(t, resource.TestCase{ @@ -62,11 +84,11 @@ func TestAccAzureRMEventGridEventSubscription_serviceBusQueue(t *testing.T) { CheckDestroy: testCheckAzureRMEventGridEventSubscriptionDestroy, Steps: []resource.TestStep{ { - Config: testAccAzureRMEventGridEventSubscription_serviceBusQueue(data), + Config: testAccAzureRMEventGridEventSubscription_serviceBusQueueID(data), Check: resource.ComposeTestCheckFunc( testCheckAzureRMEventGridEventSubscriptionExists(data.ResourceName), resource.TestCheckResourceAttr(data.ResourceName, "event_delivery_schema", "CloudEventSchemaV1_0"), - resource.TestCheckResourceAttr(data.ResourceName, "service_bus_queue_endpoint.#", "1"), + resource.TestCheckResourceAttrSet(data.ResourceName, "service_bus_queue_endpoint_id"), ), }, data.ImportStep(), @@ -74,7 +96,7 @@ func TestAccAzureRMEventGridEventSubscription_serviceBusQueue(t *testing.T) { }) } -func TestAccAzureRMEventGridEventSubscription_serviceBusTopic(t *testing.T) { +func TestAccAzureRMEventGridEventSubscription_serviceBusTopicID(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_eventgrid_event_subscription", "test") resource.ParallelTest(t, resource.TestCase{ @@ -83,11 +105,11 @@ func TestAccAzureRMEventGridEventSubscription_serviceBusTopic(t *testing.T) { CheckDestroy: testCheckAzureRMEventGridEventSubscriptionDestroy, Steps: []resource.TestStep{ { - Config: testAccAzureRMEventGridEventSubscription_serviceBusTopic(data), + Config: testAccAzureRMEventGridEventSubscription_serviceBusTopicID(data), Check: resource.ComposeTestCheckFunc( testCheckAzureRMEventGridEventSubscriptionExists(data.ResourceName), resource.TestCheckResourceAttr(data.ResourceName, "event_delivery_schema", "CloudEventSchemaV1_0"), - resource.TestCheckResourceAttr(data.ResourceName, "service_bus_topic_endpoint.#", "1"), + resource.TestCheckResourceAttrSet(data.ResourceName, "service_bus_topic_endpoint_id"), ), }, data.ImportStep(), @@ -95,7 +117,7 @@ func TestAccAzureRMEventGridEventSubscription_serviceBusTopic(t *testing.T) { }) } -func TestAccAzureRMEventGridEventSubscription_azureFunction(t *testing.T) { +func TestAccAzureRMEventGridEventSubscription_azureFunctionID(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_eventgrid_event_subscription", "test") resource.ParallelTest(t, resource.TestCase{ @@ -104,11 +126,11 @@ func TestAccAzureRMEventGridEventSubscription_azureFunction(t *testing.T) { CheckDestroy: testCheckAzureRMEventGridEventSubscriptionDestroy, Steps: []resource.TestStep{ { - Config: testAccAzureRMEventGridEventSubscription_azureFunction(data), + Config: testAccAzureRMEventGridEventSubscription_azureFunctionID(data), Check: resource.ComposeTestCheckFunc( testCheckAzureRMEventGridEventSubscriptionExists(data.ResourceName), resource.TestCheckResourceAttr(data.ResourceName, "event_delivery_schema", "CloudEventSchemaV1_0"), - resource.TestCheckResourceAttr(data.ResourceName, "azure_function_endpoint.#", "1"), + resource.TestCheckResourceAttrSet(data.ResourceName, "azure_function_endpoint_id"), ), }, data.ImportStep(), @@ -245,7 +267,7 @@ provider "azurerm" { } resource "azurerm_resource_group" "test" { - name = "acctestRG-%d" + name = "acctestRG-eg-%d" location = "%s" } @@ -306,6 +328,19 @@ resource "azurerm_eventgrid_event_subscription" "test" { `, data.RandomInteger, data.Locations.Primary, data.RandomString, data.RandomInteger, data.RandomInteger) } +func testAccAzureRMEventGridEventSubscription_requiresImport(data acceptance.TestData) string { + template := testAccAzureRMEventGridEventSubscription_basic(data) + return fmt.Sprintf(` +%s + +resource "azurerm_eventgrid_event_subscription" "import" { + name = azurerm_eventgrid_event_subscription.test.name + location = azurerm_eventgrid_event_subscription.test.location + resource_group_name = azurerm_eventgrid_event_subscription.test.resource_group_name +} +`, template) +} + func testAccAzureRMEventGridEventSubscription_update(data acceptance.TestData) string { return fmt.Sprintf(` provider "azurerm" { @@ -313,7 +348,7 @@ provider "azurerm" { } resource "azurerm_resource_group" "test" { - name = "acctestRG-%d" + name = "acctestRG-eg-%d" location = "%s" } @@ -351,7 +386,7 @@ resource "azurerm_storage_blob" "test" { } resource "azurerm_eventgrid_event_subscription" "test" { - name = "acctesteg-%d" + name = "acctest-eg-%d" scope = azurerm_resource_group.test.id storage_queue_endpoint { @@ -380,13 +415,13 @@ resource "azurerm_eventgrid_event_subscription" "test" { `, data.RandomInteger, data.Locations.Primary, data.RandomString, data.RandomInteger, data.RandomInteger) } -func testAccAzureRMEventGridEventSubscription_azureFunction(data acceptance.TestData) string { +func testAccAzureRMEventGridEventSubscription_azureFunctionID(data acceptance.TestData) string { return fmt.Sprintf(` provider "azurerm" { features {} } resource "azurerm_resource_group" "test" { - name = "acctestRG-%d" + name = "acctestRG-eg-%d" location = "%s" } resource "azurerm_storage_account" "test" { @@ -400,7 +435,7 @@ resource "azurerm_storage_account" "test" { } } resource "azurerm_app_service_plan" "test" { - name = "acctestASP-%d" + name = "acctestASP-eg-%d" location = azurerm_resource_group.test.location resource_group_name = azurerm_resource_group.test.name sku { @@ -416,22 +451,22 @@ resource "azurerm_function_app" "test" { storage_connection_string = azurerm_storage_account.test.primary_connection_string } resource "azurerm_eventgrid_event_subscription" "test" { - name = "acctesteg-%d" - scope = azurerm_resource_group.test.id - event_delivery_schema = "CloudEventSchemaV1_0" - azure_function_endpoint = azurerm_function_app.test.id + name = "acctest-eg-%d" + scope = azurerm_resource_group.test.id + event_delivery_schema = "CloudEventSchemaV1_0" + azure_function_endpoint_id = azurerm_function_app.test.id } `, data.RandomInteger, data.Locations.Primary, data.RandomString, data.RandomInteger, data.RandomInteger, data.RandomInteger) } -func testAccAzureRMEventGridEventSubscription_eventhub(data acceptance.TestData) string { +func testAccAzureRMEventGridEventSubscription_eventHubID(data acceptance.TestData) string { return fmt.Sprintf(` provider "azurerm" { features {} } resource "azurerm_resource_group" "test" { - name = "acctestRG-%d" + name = "acctestRG-eg-%d" location = "%s" } @@ -451,16 +486,16 @@ resource "azurerm_eventhub" "test" { } resource "azurerm_eventgrid_event_subscription" "test" { - name = "acctesteg-%d" + name = "acctest-eg-%d" scope = azurerm_resource_group.test.id event_delivery_schema = "CloudEventSchemaV1_0" - eventhub_endpoint = azurerm_eventhub.test.id + eventhub_endpoint_id = azurerm_eventhub.test.id } `, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger) } -func testAccAzureRMEventGridEventSubscription_serviceBusQueue(data acceptance.TestData) string { +func testAccAzureRMEventGridEventSubscription_serviceBusQueueID(data acceptance.TestData) string { return fmt.Sprintf(` provider "azurerm" { features {} @@ -483,21 +518,21 @@ resource "azurerm_servicebus_queue" "test" { enable_partitioning = true } resource "azurerm_eventgrid_event_subscription" "test" { - name = "acctesteg-%d" - scope = azurerm_resource_group.test.id - event_delivery_schema = "CloudEventSchemaV1_0" - service_bus_queue_endpoint = azurerm_servicebus_queue.test.id + name = "acctest-eg-%d" + scope = azurerm_resource_group.test.id + event_delivery_schema = "CloudEventSchemaV1_0" + service_bus_queue_endpoint_id = azurerm_servicebus_queue.test.id } `, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger) } -func testAccAzureRMEventGridEventSubscription_serviceBusTopic(data acceptance.TestData) string { +func testAccAzureRMEventGridEventSubscription_serviceBusTopicID(data acceptance.TestData) string { return fmt.Sprintf(` provider "azurerm" { features {} } resource "azurerm_resource_group" "test" { - name = "acctestRG-%d" + name = "acctestRG-eg-%d" location = "%s" } resource "azurerm_servicebus_namespace" "example" { @@ -513,10 +548,10 @@ resource "azurerm_servicebus_topic" "test" { enable_partitioning = true } resource "azurerm_eventgrid_event_subscription" "test" { - name = "acctesteg-%d" - scope = azurerm_resource_group.test.id - event_delivery_schema = "CloudEventSchemaV1_0" - service_bus_topic_endpoint = azurerm_servicebus_topic.test.id + name = "acctest-eg-%d" + scope = azurerm_resource_group.test.id + event_delivery_schema = "CloudEventSchemaV1_0" + service_bus_topic_endpoint_id = azurerm_servicebus_topic.test.id } `, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger) } @@ -528,7 +563,7 @@ provider "azurerm" { } resource "azurerm_resource_group" "test" { - name = "acctestRG-%d" + name = "acctestRG-eg-%d" location = "%s" } @@ -550,7 +585,7 @@ resource "azurerm_storage_queue" "test" { } resource "azurerm_eventgrid_event_subscription" "test" { - name = "acctesteg-%d" + name = "acctest-eg-%d" scope = "${azurerm_resource_group.test.id}" storage_queue_endpoint { diff --git a/website/docs/r/eventgrid_event_subscription.html.markdown b/website/docs/r/eventgrid_event_subscription.html.markdown index 46e51238c291..40b5aa641a66 100644 --- a/website/docs/r/eventgrid_event_subscription.html.markdown +++ b/website/docs/r/eventgrid_event_subscription.html.markdown @@ -60,21 +60,25 @@ The following arguments are supported: * `event_delivery_schema` - (Optional) Specifies the event delivery schema for the event subscription. Possible values include: `EventGridSchema`, `CloudEventSchemaV1_0`, `CustomInputSchema`. Defaults to `EventGridSchema`. Changing this forces a new resource to be created. -* `azure_function_endpoint` - (Optional) Specifies the id where the azure function is located. +* `azure_function_endpoint_id` - (Optional) Specifies the id where the Azure Function is located. -* `eventhub_endpoint` - (Optional) Specifies the id of the eventhub where the Event Subscription will receive events. +* `eventhub_endpoint` - (Optional / **Deprecated in favour of `eventhub_endpoint_id`**) A `eventhub_endpoint` block as defined below. -* `hybrid_connection_endpoint` - (Optional) Specifies the id of the hybrid connection where the Event Subscription will receive events. +* `eventhub_endpoint_id` - (Optional) Specifies the id where the Event Hub is located. -* `service_bus_queue_endpoint` - (Optional) Specifies the id where the service bus queue is located. +* `hybrid_connection_endpoint` - (Optional / **Deprecated in favour of `hybrid_connection_endpoint_id`**) A `hybrid_connection_endpoint` block as defined below. -* `service_bus_topic_endpoint` - (Optional) Specifies the id where the service bus topic is located. +* `hybrid_connection_endpoint_id` - (Optional) Specifies the id where the Hybrid Connection is located. + +* `service_bus_queue_endpoint_id` - (Optional) Specifies the id where the Service Bus Queue is located. + +* `service_bus_topic_endpoint_id` - (Optional) Specifies the id where the Service Bus Topic is located. * `storage_queue_endpoint` - (Optional) A `storage_queue_endpoint` block as defined below. -* `webhook_endpoint_url` - (Optional) Specifies the url of the webhook where the Event Subscription will receive events. +* `webhook_endpoint` - (Optional) A `webhook_endpoint` block as defined below. -~> **NOTE:** One of `azure_function_endpoint`, `eventhub_endpoint`, `hybrid_connection_endpoint`, `service_bus_queue_endpoint`, `service_bus_topic_endpoint`, `storage_queue_endpoint` or `webhook_endpoint_url` must be specified. +~> **NOTE:** One of `azure_function_endpoint_id`, `eventhub_endpoint`, `eventhub_endpoint_id`, `hybrid_connection_endpoint`, `hybrid_connection_endpoint_id`, `service_bus_queue_endpoint_id`, `service_bus_topic_endpoint_id`, `storage_queue_endpoint` or `webhook_endpoint` must be specified. * `included_event_types` - (Optional) A list of applicable event types that need to be part of the event subscription. @@ -94,6 +98,23 @@ A `storage_queue_endpoint` supports the following: * `queue_name` - (Required) Specifies the name of the storage queue where the Event Subscriptio will receive events. +--- +A `eventhub_endpoint` supports the following: + +* `eventhub_id` - (Required) Specifies the id of the eventhub where the Event Subscription will receive events. + +--- + +A `hybrid_connection_endpoint` supports the following: + +* `hybrid_connection_id` - (Required) Specifies the id of the hybrid connection where the Event Subscription will receive events. + +--- + +A `webhook_endpoint` supports the following: + +* `url` - (Required) Specifies the url of the webhook where the Event Subscription will receive events. + --- A `subject_filter` supports the following: From d7814942d248ecf07cc78c87150cbec35b06b762 Mon Sep 17 00:00:00 2001 From: Jochen Rauschenbusch Date: Wed, 20 May 2020 10:40:48 +0200 Subject: [PATCH 08/11] fix: PR notes --- .../eventgrid_event_subscription_resource.go | 192 ++++++------------ 1 file changed, 59 insertions(+), 133 deletions(-) diff --git a/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go b/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go index cf83367a1c43..e077c2e73620 100644 --- a/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go +++ b/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go @@ -94,26 +94,26 @@ func resourceArmEventGridEventSubscription() *schema.Resource { Computed: true, }, - AzureFunctionEndpointID: { + "azure_function_endpoint_id": { Type: schema.TypeString, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), AzureFunctionEndpointID), + ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), "azure_function_endpoint_id"), ValidateFunc: azure.ValidateResourceID, }, - EventHubEndpointID: { + "eventhub_endpoint_id": { Type: schema.TypeString, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), EventHubEndpointID), + ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), "eventhub_endpoint_id"), ValidateFunc: azure.ValidateResourceID, }, - EventHubEndpoint: { + "eventhub_endpoint": { Type: schema.TypeList, MaxItems: 1, Deprecated: "Deprecated in favour of `" + EventHubEndpointID + "`", Optional: true, - ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), EventHubEndpoint), + ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), "eventhub_endpoint"), Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "eventhub_id": { @@ -125,19 +125,19 @@ func resourceArmEventGridEventSubscription() *schema.Resource { }, }, - HybridConnectionEndpointID: { + "hybrid_connection_endpoint_id": { Type: schema.TypeString, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), HybridConnectionEndpointID), + ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), "hybrid_connection_endpoint_id"), ValidateFunc: azure.ValidateResourceID, }, - HybridConnectionEndpoint: { + "hybrid_connection_endpoint": { Type: schema.TypeList, MaxItems: 1, Deprecated: "Deprecated in favour of `" + HybridConnectionEndpointID + "`", Optional: true, - ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), HybridConnectionEndpoint), + ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), "hybrid_connection_endpoint"), Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "hybrid_connection_id": { @@ -149,25 +149,25 @@ func resourceArmEventGridEventSubscription() *schema.Resource { }, }, - ServiceBusQueueEndpointID: { + "service_bus_queue_endpoint_id": { Type: schema.TypeString, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), ServiceBusQueueEndpointID), + ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), "service_bus_queue_endpoint_id"), ValidateFunc: azure.ValidateResourceID, }, - ServiceBusTopicEndpointID: { + "service_bus_topic_endpoint_id": { Type: schema.TypeString, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), ServiceBusTopicEndpointID), + ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), "service_bus_topic_endpoint_id"), ValidateFunc: azure.ValidateResourceID, }, - StorageQueueEndpoint: { + "storage_queue_endpoint": { Type: schema.TypeList, MaxItems: 1, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), StorageQueueEndpoint), + ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), "storage_queue_endpoint"), Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "storage_account_id": { @@ -184,11 +184,11 @@ func resourceArmEventGridEventSubscription() *schema.Resource { }, }, - WebhookEndpoint: { + "webhook_endpoint": { Type: schema.TypeList, MaxItems: 1, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), WebhookEndpoint), + ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), "webhook_endpoint"), Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "url": { @@ -383,6 +383,7 @@ func resourceArmEventGridEventSubscriptionRead(d *schema.ResourceData, meta inte if props.ExpirationTimeUtc != nil { d.Set("expiration_time_utc", props.ExpirationTimeUtc.Format(time.RFC3339)) } + d.Set("event_delivery_schema", string(props.EventDeliverySchema)) if props.Topic != nil && *props.Topic != "" { @@ -390,12 +391,12 @@ func resourceArmEventGridEventSubscriptionRead(d *schema.ResourceData, meta inte } if azureFunctionEndpoint, ok := props.Destination.AsAzureFunctionEventSubscriptionDestination(); ok { - if err := d.Set(AzureFunctionEndpointID, flattenEventGridEventSubscriptionAzureFunctionEndpointID(azureFunctionEndpoint)); err != nil { + if err := d.Set(AzureFunctionEndpointID, azureFunctionEndpoint.ResourceID); err != nil { return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", AzureFunctionEndpointID, id.Name, id.Scope, err) } } if eventHubEndpoint, ok := props.Destination.AsEventHubEventSubscriptionDestination(); ok { - if err := d.Set(EventHubEndpointID, flattenEventGridEventSubscriptionEventHubEndpointID(eventHubEndpoint)); err != nil { + if err := d.Set(EventHubEndpointID, eventHubEndpoint.ResourceID); err != nil { return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", EventHubEndpointID, id.Name, id.Scope, err) } @@ -404,7 +405,7 @@ func resourceArmEventGridEventSubscriptionRead(d *schema.ResourceData, meta inte } } if hybridConnectionEndpoint, ok := props.Destination.AsHybridConnectionEventSubscriptionDestination(); ok { - if err := d.Set(HybridConnectionEndpointID, flattenEventGridEventSubscriptionHybridConnectionEndpointID(hybridConnectionEndpoint)); err != nil { + if err := d.Set(HybridConnectionEndpointID, hybridConnectionEndpoint.ResourceID); err != nil { return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", HybridConnectionEndpointID, id.Name, id.Scope, err) } @@ -413,12 +414,12 @@ func resourceArmEventGridEventSubscriptionRead(d *schema.ResourceData, meta inte } } if serviceBusQueueEndpoint, ok := props.Destination.AsServiceBusQueueEventSubscriptionDestination(); ok { - if err := d.Set(ServiceBusQueueEndpointID, flattenEventGridEventSubscriptionServiceBusQueueEndpointID(serviceBusQueueEndpoint)); err != nil { + if err := d.Set(ServiceBusQueueEndpointID, serviceBusQueueEndpoint.ResourceID); err != nil { return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", ServiceBusQueueEndpointID, id.Name, id.Scope, err) } } if serviceBusTopicEndpoint, ok := props.Destination.AsServiceBusTopicEventSubscriptionDestination(); ok { - if err := d.Set(ServiceBusTopicEndpointID, flattenEventGridEventSubscriptionServiceBusTopicEndpointID(serviceBusTopicEndpoint)); err != nil { + if err := d.Set(ServiceBusTopicEndpointID, serviceBusTopicEndpoint.ResourceID); err != nil { return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", ServiceBusTopicEndpointID, id.Name, id.Scope, err) } } @@ -512,28 +513,53 @@ func expandEventGridExpirationTime(d *schema.ResourceData) (*date.Time, error) { } func expandEventGridEventSubscriptionDestination(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - if _, ok := d.GetOk(AzureFunctionEndpointID); ok { - return expandEventGridEventSubscriptionAzureFunctionEndpointID(d) + if v, ok := d.GetOk(AzureFunctionEndpointID); ok { + return &eventgrid.AzureFunctionEventSubscriptionDestination{ + EndpointType: eventgrid.EndpointTypeAzureFunction, + AzureFunctionEventSubscriptionDestinationProperties: &eventgrid.AzureFunctionEventSubscriptionDestinationProperties{ + ResourceID: utils.String(v.(string)), + }, + } } - if _, ok := d.GetOk(EventHubEndpointID); ok { - return expandEventGridEventSubscriptionEventHubEndpointID(d) + if v, ok := d.GetOk(EventHubEndpointID); ok { + return &eventgrid.EventHubEventSubscriptionDestination{ + EndpointType: eventgrid.EndpointTypeEventHub, + EventHubEventSubscriptionDestinationProperties: &eventgrid.EventHubEventSubscriptionDestinationProperties{ + ResourceID: utils.String(v.(string)), + }, + } } else if _, ok := d.GetOk(EventHubEndpoint); ok { return expandEventGridEventSubscriptionEventHubEndpoint(d) } - if _, ok := d.GetOk(HybridConnectionEndpointID); ok { - return expandEventGridEventSubscriptionHybridConnectionEndpointID(d) + if v, ok := d.GetOk(HybridConnectionEndpointID); ok { + return &eventgrid.HybridConnectionEventSubscriptionDestination{ + EndpointType: eventgrid.EndpointTypeHybridConnection, + HybridConnectionEventSubscriptionDestinationProperties: &eventgrid.HybridConnectionEventSubscriptionDestinationProperties{ + ResourceID: utils.String(v.(string)), + }, + } } else if _, ok := d.GetOk(HybridConnectionEndpoint); ok { return expandEventGridEventSubscriptionHybridConnectionEndpoint(d) } - if _, ok := d.GetOk(ServiceBusQueueEndpointID); ok { - return expandEventGridEventSubscriptionServiceBusQueueEndpointID(d) + if v, ok := d.GetOk(ServiceBusQueueEndpointID); ok { + return &eventgrid.ServiceBusQueueEventSubscriptionDestination{ + EndpointType: eventgrid.EndpointTypeServiceBusQueue, + ServiceBusQueueEventSubscriptionDestinationProperties: &eventgrid.ServiceBusQueueEventSubscriptionDestinationProperties{ + ResourceID: utils.String(v.(string)), + }, + } } - if _, ok := d.GetOk(ServiceBusTopicEndpointID); ok { - return expandEventGridEventSubscriptionServiceBusTopicEndpointID(d) + if v, ok := d.GetOk(ServiceBusTopicEndpointID); ok { + return &eventgrid.ServiceBusTopicEventSubscriptionDestination{ + EndpointType: eventgrid.EndpointTypeServiceBusTopic, + ServiceBusTopicEventSubscriptionDestinationProperties: &eventgrid.ServiceBusTopicEventSubscriptionDestinationProperties{ + ResourceID: utils.String(v.(string)), + }, + } } if _, ok := d.GetOk(StorageQueueEndpoint); ok { @@ -575,18 +601,6 @@ func expandEventGridEventSubscriptionEventHubEndpoint(d *schema.ResourceData) ev return eventHubEndpoint } -func expandEventGridEventSubscriptionEventHubEndpointID(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - eventHubID := d.Get(EventHubEndpointID).(string) - - eventHubEndpoint := eventgrid.EventHubEventSubscriptionDestination{ - EndpointType: eventgrid.EndpointTypeEventHub, - EventHubEventSubscriptionDestinationProperties: &eventgrid.EventHubEventSubscriptionDestinationProperties{ - ResourceID: &eventHubID, - }, - } - return eventHubEndpoint -} - func expandEventGridEventSubscriptionHybridConnectionEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { props := d.Get(HybridConnectionEndpoint).([]interface{})[0].(map[string]interface{}) hybridConnectionID := props["hybrid_connection_id"].(string) @@ -600,18 +614,6 @@ func expandEventGridEventSubscriptionHybridConnectionEndpoint(d *schema.Resource return hybridConnectionEndpoint } -func expandEventGridEventSubscriptionHybridConnectionEndpointID(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - hybridConnectionID := d.Get(HybridConnectionEndpointID).(string) - - hybridConnectionEndpoint := eventgrid.HybridConnectionEventSubscriptionDestination{ - EndpointType: eventgrid.EndpointTypeHybridConnection, - HybridConnectionEventSubscriptionDestinationProperties: &eventgrid.HybridConnectionEventSubscriptionDestinationProperties{ - ResourceID: &hybridConnectionID, - }, - } - return hybridConnectionEndpoint -} - func expandEventGridEventSubscriptionWebhookEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { props := d.Get(WebhookEndpoint).([]interface{})[0].(map[string]interface{}) url := props["url"].(string) @@ -625,42 +627,6 @@ func expandEventGridEventSubscriptionWebhookEndpoint(d *schema.ResourceData) eve return webhookEndpoint } -func expandEventGridEventSubscriptionServiceBusQueueEndpointID(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - serviceBusQueueID := d.Get(ServiceBusQueueEndpointID).(string) - - serviceBusQueueEndpoint := eventgrid.ServiceBusQueueEventSubscriptionDestination{ - EndpointType: eventgrid.EndpointTypeServiceBusQueue, - ServiceBusQueueEventSubscriptionDestinationProperties: &eventgrid.ServiceBusQueueEventSubscriptionDestinationProperties{ - ResourceID: &serviceBusQueueID, - }, - } - return serviceBusQueueEndpoint -} - -func expandEventGridEventSubscriptionServiceBusTopicEndpointID(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - serviceBusTopicID := d.Get(ServiceBusTopicEndpointID).(string) - - serviceBusTopicEndpoint := eventgrid.ServiceBusTopicEventSubscriptionDestination{ - EndpointType: eventgrid.EndpointTypeServiceBusTopic, - ServiceBusTopicEventSubscriptionDestinationProperties: &eventgrid.ServiceBusTopicEventSubscriptionDestinationProperties{ - ResourceID: &serviceBusTopicID, - }, - } - return serviceBusTopicEndpoint -} - -func expandEventGridEventSubscriptionAzureFunctionEndpointID(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - azureFunctionResourceID := d.Get(AzureFunctionEndpointID).(string) - - azureFunctionEndpoint := eventgrid.AzureFunctionEventSubscriptionDestination{ - EndpointType: eventgrid.EndpointTypeAzureFunction, - AzureFunctionEventSubscriptionDestinationProperties: &eventgrid.AzureFunctionEventSubscriptionDestinationProperties{ - ResourceID: &azureFunctionResourceID, - }, - } - return azureFunctionEndpoint -} - func expandEventGridEventSubscriptionFilter(d *schema.ResourceData) *eventgrid.EventSubscriptionFilter { filter := &eventgrid.EventSubscriptionFilter{} @@ -724,14 +690,6 @@ func flattenEventGridEventSubscriptionEventHubEndpoint(input *eventgrid.EventHub return []interface{}{result} } -func flattenEventGridEventSubscriptionEventHubEndpointID(input *eventgrid.EventHubEventSubscriptionDestination) *string { - if input == nil || input.ResourceID == nil { - return nil - } - - return input.ResourceID -} - func flattenEventGridEventSubscriptionHybridConnectionEndpoint(input *eventgrid.HybridConnectionEventSubscriptionDestination) []interface{} { if input == nil { return nil @@ -745,38 +703,6 @@ func flattenEventGridEventSubscriptionHybridConnectionEndpoint(input *eventgrid. return []interface{}{result} } -func flattenEventGridEventSubscriptionHybridConnectionEndpointID(input *eventgrid.HybridConnectionEventSubscriptionDestination) *string { - if input == nil || input.ResourceID == nil { - return nil - } - - return input.ResourceID -} - -func flattenEventGridEventSubscriptionServiceBusQueueEndpointID(input *eventgrid.ServiceBusQueueEventSubscriptionDestination) *string { - if input == nil || input.ResourceID == nil { - return nil - } - - return input.ResourceID -} - -func flattenEventGridEventSubscriptionServiceBusTopicEndpointID(input *eventgrid.ServiceBusTopicEventSubscriptionDestination) *string { - if input == nil || input.ResourceID == nil { - return nil - } - - return input.ResourceID -} - -func flattenEventGridEventSubscriptionAzureFunctionEndpointID(input *eventgrid.AzureFunctionEventSubscriptionDestination) *string { - if input == nil || input.ResourceID == nil { - return nil - } - - return input.ResourceID -} - func flattenEventGridEventSubscriptionStorageQueueEndpoint(input *eventgrid.StorageQueueEventSubscriptionDestination) []interface{} { if input == nil { return nil From 031fa9862c1c53cc411fd37f38e99962f2bcc1e8 Mon Sep 17 00:00:00 2001 From: Jochen Rauschenbusch Date: Wed, 20 May 2020 10:41:03 +0200 Subject: [PATCH 09/11] remove trailing whitespaces --- ...eventgrid_event_subscription.html.markdown | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/website/docs/r/eventgrid_event_subscription.html.markdown b/website/docs/r/eventgrid_event_subscription.html.markdown index 40b5aa641a66..c970cac9fb26 100644 --- a/website/docs/r/eventgrid_event_subscription.html.markdown +++ b/website/docs/r/eventgrid_event_subscription.html.markdown @@ -99,21 +99,22 @@ A `storage_queue_endpoint` supports the following: * `queue_name` - (Required) Specifies the name of the storage queue where the Event Subscriptio will receive events. --- -A `eventhub_endpoint` supports the following: -* `eventhub_id` - (Required) Specifies the id of the eventhub where the Event Subscription will receive events. +A `eventhub_endpoint` supports the following: ---- +* `eventhub_id` - (Required) Specifies the id of the eventhub where the Event Subscription will receive events. -A `hybrid_connection_endpoint` supports the following: +--- + +A `hybrid_connection_endpoint` supports the following: -* `hybrid_connection_id` - (Required) Specifies the id of the hybrid connection where the Event Subscription will receive events. +* `hybrid_connection_id` - (Required) Specifies the id of the hybrid connection where the Event Subscription will receive events. ---- +--- -A `webhook_endpoint` supports the following: +A `webhook_endpoint` supports the following: -* `url` - (Required) Specifies the url of the webhook where the Event Subscription will receive events. +* `url` - (Required) Specifies the url of the webhook where the Event Subscription will receive events. --- @@ -131,7 +132,7 @@ A `storage_blob_dead_letter_destination` supports the following: * `storage_account_id` - (Required) Specifies the id of the storage account id where the storage blob is located. -* `storage_blob_container_name` - (Required) Specifies the name of the Storage blob container that is the destination of the deadletter events +* `storage_blob_container_name` - (Required) Specifies the name of the Storage blob container that is the destination of the deadletter events. --- From 35f62e638f426a4bdaf288e0211b4d8b76eb652c Mon Sep 17 00:00:00 2001 From: kt Date: Sun, 24 May 2020 14:34:18 -0700 Subject: [PATCH 10/11] fix tests & remove function support --- .../eventgrid_event_subscription_resource.go | 160 ++++++++---------- ...ntgrid_event_subscription_resource_test.go | 72 +------- ...eventgrid_event_subscription.html.markdown | 4 +- 3 files changed, 74 insertions(+), 162 deletions(-) diff --git a/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go b/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go index e077c2e73620..b133082a6639 100644 --- a/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go +++ b/azurerm/internal/services/eventgrid/eventgrid_event_subscription_resource.go @@ -20,20 +20,17 @@ import ( "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) -const ( - AzureFunctionEndpointID string = "azure_function_endpoint_id" - EventHubEndpoint string = "eventhub_endpoint" - EventHubEndpointID string = "eventhub_endpoint_id" - HybridConnectionEndpoint string = "hybrid_connection_endpoint" - HybridConnectionEndpointID string = "hybrid_connection_endpoint_id" - ServiceBusQueueEndpointID string = "service_bus_queue_endpoint_id" - ServiceBusTopicEndpointID string = "service_bus_topic_endpoint_id" - StorageQueueEndpoint string = "storage_queue_endpoint" - WebhookEndpoint string = "webhook_endpoint" -) - -func PossibleEnpointTypes() []string { - return []string{AzureFunctionEndpointID, EventHubEndpoint, EventHubEndpointID, HybridConnectionEndpoint, HybridConnectionEndpointID, ServiceBusQueueEndpointID, ServiceBusTopicEndpointID, StorageQueueEndpoint, WebhookEndpoint} +func enpointPropertyNames() []string { + return []string{ + "eventhub_endpoint", + "eventhub_endpoint_id", + "hybrid_connection_endpoint", + "hybrid_connection_endpoint_id", + "service_bus_queue_endpoint_id", + "service_bus_topic_endpoint_id", + "storage_queue_endpoint", + "webhook_endpoint", + } } func resourceArmEventGridEventSubscription() *schema.Resource { @@ -94,31 +91,27 @@ func resourceArmEventGridEventSubscription() *schema.Resource { Computed: true, }, - "azure_function_endpoint_id": { - Type: schema.TypeString, - Optional: true, - ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), "azure_function_endpoint_id"), - ValidateFunc: azure.ValidateResourceID, - }, - "eventhub_endpoint_id": { Type: schema.TypeString, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), "eventhub_endpoint_id"), + Computed: true, + ConflictsWith: utils.RemoveFromStringArray(enpointPropertyNames(), "eventhub_endpoint_id"), ValidateFunc: azure.ValidateResourceID, }, "eventhub_endpoint": { Type: schema.TypeList, MaxItems: 1, - Deprecated: "Deprecated in favour of `" + EventHubEndpointID + "`", + Deprecated: "Deprecated in favour of `" + "eventhub_endpoint_id" + "`", Optional: true, - ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), "eventhub_endpoint"), + Computed: true, + ConflictsWith: utils.RemoveFromStringArray(enpointPropertyNames(), "eventhub_endpoint"), Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "eventhub_id": { Type: schema.TypeString, - Required: true, + Optional: true, + Computed: true, ValidateFunc: azure.ValidateResourceID, }, }, @@ -128,21 +121,24 @@ func resourceArmEventGridEventSubscription() *schema.Resource { "hybrid_connection_endpoint_id": { Type: schema.TypeString, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), "hybrid_connection_endpoint_id"), + Computed: true, + ConflictsWith: utils.RemoveFromStringArray(enpointPropertyNames(), "hybrid_connection_endpoint_id"), ValidateFunc: azure.ValidateResourceID, }, "hybrid_connection_endpoint": { Type: schema.TypeList, MaxItems: 1, - Deprecated: "Deprecated in favour of `" + HybridConnectionEndpointID + "`", + Deprecated: "Deprecated in favour of `" + "hybrid_connection_endpoint_id" + "`", Optional: true, - ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), "hybrid_connection_endpoint"), + Computed: true, + ConflictsWith: utils.RemoveFromStringArray(enpointPropertyNames(), "hybrid_connection_endpoint"), Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "hybrid_connection_id": { Type: schema.TypeString, - Required: true, + Optional: true, + Computed: true, ValidateFunc: azure.ValidateResourceID, }, }, @@ -152,14 +148,14 @@ func resourceArmEventGridEventSubscription() *schema.Resource { "service_bus_queue_endpoint_id": { Type: schema.TypeString, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), "service_bus_queue_endpoint_id"), + ConflictsWith: utils.RemoveFromStringArray(enpointPropertyNames(), "service_bus_queue_endpoint_id"), ValidateFunc: azure.ValidateResourceID, }, "service_bus_topic_endpoint_id": { Type: schema.TypeString, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), "service_bus_topic_endpoint_id"), + ConflictsWith: utils.RemoveFromStringArray(enpointPropertyNames(), "service_bus_topic_endpoint_id"), ValidateFunc: azure.ValidateResourceID, }, @@ -167,7 +163,7 @@ func resourceArmEventGridEventSubscription() *schema.Resource { Type: schema.TypeList, MaxItems: 1, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), "storage_queue_endpoint"), + ConflictsWith: utils.RemoveFromStringArray(enpointPropertyNames(), "storage_queue_endpoint"), Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "storage_account_id": { @@ -188,7 +184,7 @@ func resourceArmEventGridEventSubscription() *schema.Resource { Type: schema.TypeList, MaxItems: 1, Optional: true, - ConflictsWith: utils.RemoveFromStringArray(PossibleEnpointTypes(), "webhook_endpoint"), + ConflictsWith: utils.RemoveFromStringArray(enpointPropertyNames(), "webhook_endpoint"), Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "url": { @@ -307,7 +303,7 @@ func resourceArmEventGridEventSubscriptionCreateUpdate(d *schema.ResourceData, m destination := expandEventGridEventSubscriptionDestination(d) if destination == nil { - return fmt.Errorf("One of the following endpoint types must be specificed to create an EventGrid Event Subscription: %q", PossibleEnpointTypes()) + return fmt.Errorf("One of the following endpoint types must be specificed to create an EventGrid Event Subscription: %q", enpointPropertyNames()) } filter := expandEventGridEventSubscriptionFilter(d) @@ -390,42 +386,37 @@ func resourceArmEventGridEventSubscriptionRead(d *schema.ResourceData, meta inte d.Set("topic_name", props.Topic) } - if azureFunctionEndpoint, ok := props.Destination.AsAzureFunctionEventSubscriptionDestination(); ok { - if err := d.Set(AzureFunctionEndpointID, azureFunctionEndpoint.ResourceID); err != nil { - return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", AzureFunctionEndpointID, id.Name, id.Scope, err) - } - } - if eventHubEndpoint, ok := props.Destination.AsEventHubEventSubscriptionDestination(); ok { - if err := d.Set(EventHubEndpointID, eventHubEndpoint.ResourceID); err != nil { - return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", EventHubEndpointID, id.Name, id.Scope, err) + if v, ok := props.Destination.AsEventHubEventSubscriptionDestination(); ok { + if err := d.Set("eventhub_endpoint_id", v.ResourceID); err != nil { + return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", "eventhub_endpoint_id", id.Name, id.Scope, err) } - if err := d.Set(EventHubEndpoint, flattenEventGridEventSubscriptionEventHubEndpoint(eventHubEndpoint)); err != nil { - return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", EventHubEndpoint, id.Name, id.Scope, err) + if err := d.Set("eventhub_endpoint", flattenEventGridEventSubscriptionEventhubEndpoint(v)); err != nil { + return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", "eventhub_endpoint", id.Name, id.Scope, err) } } - if hybridConnectionEndpoint, ok := props.Destination.AsHybridConnectionEventSubscriptionDestination(); ok { - if err := d.Set(HybridConnectionEndpointID, hybridConnectionEndpoint.ResourceID); err != nil { - return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", HybridConnectionEndpointID, id.Name, id.Scope, err) + if v, ok := props.Destination.AsHybridConnectionEventSubscriptionDestination(); ok { + if err := d.Set("hybrid_connection_endpoint_id", v.ResourceID); err != nil { + return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", "hybrid_connection_endpoint_id", id.Name, id.Scope, err) } - if err := d.Set(HybridConnectionEndpoint, flattenEventGridEventSubscriptionHybridConnectionEndpoint(hybridConnectionEndpoint)); err != nil { - return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", HybridConnectionEndpoint, id.Name, id.Scope, err) + if err := d.Set("hybrid_connection_endpoint", flattenEventGridEventSubscriptionHybridConnectionEndpoint(v)); err != nil { + return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", "hybrid_connection_endpoint", id.Name, id.Scope, err) } } if serviceBusQueueEndpoint, ok := props.Destination.AsServiceBusQueueEventSubscriptionDestination(); ok { - if err := d.Set(ServiceBusQueueEndpointID, serviceBusQueueEndpoint.ResourceID); err != nil { - return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", ServiceBusQueueEndpointID, id.Name, id.Scope, err) + if err := d.Set("service_bus_queue_endpoint_id", serviceBusQueueEndpoint.ResourceID); err != nil { + return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", "service_bus_queue_endpoint_id", id.Name, id.Scope, err) } } if serviceBusTopicEndpoint, ok := props.Destination.AsServiceBusTopicEventSubscriptionDestination(); ok { - if err := d.Set(ServiceBusTopicEndpointID, serviceBusTopicEndpoint.ResourceID); err != nil { - return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", ServiceBusTopicEndpointID, id.Name, id.Scope, err) + if err := d.Set("service_bus_topic_endpoint_id", serviceBusTopicEndpoint.ResourceID); err != nil { + return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", "service_bus_topic_endpoint_id", id.Name, id.Scope, err) } } - if storageQueueEndpoint, ok := props.Destination.AsStorageQueueEventSubscriptionDestination(); ok { - if err := d.Set(StorageQueueEndpoint, flattenEventGridEventSubscriptionStorageQueueEndpoint(storageQueueEndpoint)); err != nil { - return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", StorageQueueEndpoint, id.Name, id.Scope, err) + if v, ok := props.Destination.AsStorageQueueEventSubscriptionDestination(); ok { + if err := d.Set("storage_queue_endpoint", flattenEventGridEventSubscriptionStorageQueueEndpoint(v)); err != nil { + return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", "storage_queue_endpoint", id.Name, id.Scope, err) } } if _, ok := props.Destination.AsWebHookEventSubscriptionDestination(); ok { @@ -433,8 +424,8 @@ func resourceArmEventGridEventSubscriptionRead(d *schema.ResourceData, meta inte if err != nil { return fmt.Errorf("Error making Read request on EventGrid Event Subscription full URL '%s': %+v", id.Name, err) } - if err := d.Set(WebhookEndpoint, flattenEventGridEventSubscriptionWebhookEndpoint(&fullURL)); err != nil { - return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", WebhookEndpoint, id.Name, id.Scope, err) + if err := d.Set("webhook_endpoint", flattenEventGridEventSubscriptionWebhookEndpoint(&fullURL)); err != nil { + return fmt.Errorf("Error setting `%q` for EventGrid Event Subscription %q (Scope %q): %s", "webhook_endpoint", id.Name, id.Scope, err) } } @@ -513,38 +504,29 @@ func expandEventGridExpirationTime(d *schema.ResourceData) (*date.Time, error) { } func expandEventGridEventSubscriptionDestination(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - if v, ok := d.GetOk(AzureFunctionEndpointID); ok { - return &eventgrid.AzureFunctionEventSubscriptionDestination{ - EndpointType: eventgrid.EndpointTypeAzureFunction, - AzureFunctionEventSubscriptionDestinationProperties: &eventgrid.AzureFunctionEventSubscriptionDestinationProperties{ - ResourceID: utils.String(v.(string)), - }, - } - } - - if v, ok := d.GetOk(EventHubEndpointID); ok { + if v, ok := d.GetOk("eventhub_endpoint_id"); ok { return &eventgrid.EventHubEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeEventHub, EventHubEventSubscriptionDestinationProperties: &eventgrid.EventHubEventSubscriptionDestinationProperties{ ResourceID: utils.String(v.(string)), }, } - } else if _, ok := d.GetOk(EventHubEndpoint); ok { - return expandEventGridEventSubscriptionEventHubEndpoint(d) + } else if _, ok := d.GetOk("eventhub_endpoint"); ok { + return expandEventGridEventSubscriptionEventhubEndpoint(d) } - if v, ok := d.GetOk(HybridConnectionEndpointID); ok { + if v, ok := d.GetOk("hybrid_connection_endpoint_id"); ok { return &eventgrid.HybridConnectionEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeHybridConnection, HybridConnectionEventSubscriptionDestinationProperties: &eventgrid.HybridConnectionEventSubscriptionDestinationProperties{ ResourceID: utils.String(v.(string)), }, } - } else if _, ok := d.GetOk(HybridConnectionEndpoint); ok { + } else if _, ok := d.GetOk("hybrid_connection_endpoint"); ok { return expandEventGridEventSubscriptionHybridConnectionEndpoint(d) } - if v, ok := d.GetOk(ServiceBusQueueEndpointID); ok { + if v, ok := d.GetOk("service_bus_queue_endpoint_id"); ok { return &eventgrid.ServiceBusQueueEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeServiceBusQueue, ServiceBusQueueEventSubscriptionDestinationProperties: &eventgrid.ServiceBusQueueEventSubscriptionDestinationProperties{ @@ -553,7 +535,7 @@ func expandEventGridEventSubscriptionDestination(d *schema.ResourceData) eventgr } } - if v, ok := d.GetOk(ServiceBusTopicEndpointID); ok { + if v, ok := d.GetOk("service_bus_topic_endpoint_id"); ok { return &eventgrid.ServiceBusTopicEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeServiceBusTopic, ServiceBusTopicEventSubscriptionDestinationProperties: &eventgrid.ServiceBusTopicEventSubscriptionDestinationProperties{ @@ -562,11 +544,11 @@ func expandEventGridEventSubscriptionDestination(d *schema.ResourceData) eventgr } } - if _, ok := d.GetOk(StorageQueueEndpoint); ok { + if _, ok := d.GetOk("storage_queue_endpoint"); ok { return expandEventGridEventSubscriptionStorageQueueEndpoint(d) } - if _, ok := d.GetOk(WebhookEndpoint); ok { + if _, ok := d.GetOk("webhook_endpoint"); ok { return expandEventGridEventSubscriptionWebhookEndpoint(d) } @@ -574,57 +556,53 @@ func expandEventGridEventSubscriptionDestination(d *schema.ResourceData) eventgr } func expandEventGridEventSubscriptionStorageQueueEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - props := d.Get(StorageQueueEndpoint).([]interface{})[0].(map[string]interface{}) + props := d.Get("storage_queue_endpoint").([]interface{})[0].(map[string]interface{}) storageAccountID := props["storage_account_id"].(string) queueName := props["queue_name"].(string) - storageQueueEndpoint := eventgrid.StorageQueueEventSubscriptionDestination{ + return eventgrid.StorageQueueEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeStorageQueue, StorageQueueEventSubscriptionDestinationProperties: &eventgrid.StorageQueueEventSubscriptionDestinationProperties{ ResourceID: &storageAccountID, QueueName: &queueName, }, } - return storageQueueEndpoint } -func expandEventGridEventSubscriptionEventHubEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - props := d.Get(EventHubEndpoint).([]interface{})[0].(map[string]interface{}) +func expandEventGridEventSubscriptionEventhubEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { + props := d.Get("eventhub_endpoint").([]interface{})[0].(map[string]interface{}) eventHubID := props["eventhub_id"].(string) - eventHubEndpoint := eventgrid.EventHubEventSubscriptionDestination{ + return eventgrid.EventHubEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeEventHub, EventHubEventSubscriptionDestinationProperties: &eventgrid.EventHubEventSubscriptionDestinationProperties{ ResourceID: &eventHubID, }, } - return eventHubEndpoint } func expandEventGridEventSubscriptionHybridConnectionEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - props := d.Get(HybridConnectionEndpoint).([]interface{})[0].(map[string]interface{}) + props := d.Get("hybrid_connection_endpoint").([]interface{})[0].(map[string]interface{}) hybridConnectionID := props["hybrid_connection_id"].(string) - hybridConnectionEndpoint := eventgrid.HybridConnectionEventSubscriptionDestination{ + return eventgrid.HybridConnectionEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeHybridConnection, HybridConnectionEventSubscriptionDestinationProperties: &eventgrid.HybridConnectionEventSubscriptionDestinationProperties{ ResourceID: &hybridConnectionID, }, } - return hybridConnectionEndpoint } func expandEventGridEventSubscriptionWebhookEndpoint(d *schema.ResourceData) eventgrid.BasicEventSubscriptionDestination { - props := d.Get(WebhookEndpoint).([]interface{})[0].(map[string]interface{}) + props := d.Get("webhook_endpoint").([]interface{})[0].(map[string]interface{}) url := props["url"].(string) - webhookEndpoint := eventgrid.WebHookEventSubscriptionDestination{ + return eventgrid.WebHookEventSubscriptionDestination{ EndpointType: eventgrid.EndpointTypeWebHook, WebHookEventSubscriptionDestinationProperties: &eventgrid.WebHookEventSubscriptionDestinationProperties{ EndpointURL: &url, }, } - return webhookEndpoint } func expandEventGridEventSubscriptionFilter(d *schema.ResourceData) *eventgrid.EventSubscriptionFilter { @@ -661,6 +639,7 @@ func expandEventGridEventSubscriptionStorageBlobDeadLetterDestination(d *schema. }, } } + return nil } @@ -674,10 +653,11 @@ func expandEventGridEventSubscriptionRetryPolicy(d *schema.ResourceData) *eventg EventTimeToLiveInMinutes: utils.Int32(int32(eventTimeToLive)), } } + return nil } -func flattenEventGridEventSubscriptionEventHubEndpoint(input *eventgrid.EventHubEventSubscriptionDestination) []interface{} { +func flattenEventGridEventSubscriptionEventhubEndpoint(input *eventgrid.EventHubEventSubscriptionDestination) []interface{} { if input == nil { return nil } diff --git a/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go b/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go index dc07c63e05f9..2ef6c280f299 100644 --- a/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go +++ b/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go @@ -117,27 +117,6 @@ func TestAccAzureRMEventGridEventSubscription_serviceBusTopicID(t *testing.T) { }) } -func TestAccAzureRMEventGridEventSubscription_azureFunctionID(t *testing.T) { - data := acceptance.BuildTestData(t, "azurerm_eventgrid_event_subscription", "test") - - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { acceptance.PreCheck(t) }, - Providers: acceptance.SupportedProviders, - CheckDestroy: testCheckAzureRMEventGridEventSubscriptionDestroy, - Steps: []resource.TestStep{ - { - Config: testAccAzureRMEventGridEventSubscription_azureFunctionID(data), - Check: resource.ComposeTestCheckFunc( - testCheckAzureRMEventGridEventSubscriptionExists(data.ResourceName), - resource.TestCheckResourceAttr(data.ResourceName, "event_delivery_schema", "CloudEventSchemaV1_0"), - resource.TestCheckResourceAttrSet(data.ResourceName, "azure_function_endpoint_id"), - ), - }, - data.ImportStep(), - }, - }) -} - func TestAccAzureRMEventGridEventSubscription_update(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_eventgrid_event_subscription", "test") @@ -153,7 +132,7 @@ func TestAccAzureRMEventGridEventSubscription_update(t *testing.T) { resource.TestCheckResourceAttr(data.ResourceName, "event_delivery_schema", "EventGridSchema"), resource.TestCheckResourceAttr(data.ResourceName, "storage_queue_endpoint.#", "1"), resource.TestCheckResourceAttr(data.ResourceName, "storage_blob_dead_letter_destination.#", "1"), - resource.TestCheckResourceAttr(data.ResourceName, "included_event_types.0", "All"), + resource.TestCheckResourceAttr(data.ResourceName, "included_event_types.0", "Microsoft.Resources.ResourceWriteSuccess"), resource.TestCheckResourceAttr(data.ResourceName, "retry_policy.0.max_delivery_attempts", "11"), resource.TestCheckResourceAttr(data.ResourceName, "retry_policy.0.event_time_to_live", "11"), resource.TestCheckResourceAttr(data.ResourceName, "labels.0", "test"), @@ -335,8 +314,7 @@ func testAccAzureRMEventGridEventSubscription_requiresImport(data acceptance.Tes resource "azurerm_eventgrid_event_subscription" "import" { name = azurerm_eventgrid_event_subscription.test.name - location = azurerm_eventgrid_event_subscription.test.location - resource_group_name = azurerm_eventgrid_event_subscription.test.resource_group_name + scope = azurerm_eventgrid_event_subscription.test.scope } `, template) } @@ -415,50 +393,6 @@ resource "azurerm_eventgrid_event_subscription" "test" { `, data.RandomInteger, data.Locations.Primary, data.RandomString, data.RandomInteger, data.RandomInteger) } -func testAccAzureRMEventGridEventSubscription_azureFunctionID(data acceptance.TestData) string { - return fmt.Sprintf(` -provider "azurerm" { - features {} -} -resource "azurerm_resource_group" "test" { - name = "acctestRG-eg-%d" - location = "%s" -} -resource "azurerm_storage_account" "test" { - name = "acctestacc%s" - resource_group_name = azurerm_resource_group.test.name - location = azurerm_resource_group.test.location - account_tier = "Standard" - account_replication_type = "LRS" - tags = { - environment = "staging" - } -} -resource "azurerm_app_service_plan" "test" { - name = "acctestASP-eg-%d" - location = azurerm_resource_group.test.location - resource_group_name = azurerm_resource_group.test.name - sku { - tier = "Standard" - size = "S1" - } -} -resource "azurerm_function_app" "test" { - name = "acctest-%d-func" - location = azurerm_resource_group.test.location - resource_group_name = azurerm_resource_group.test.name - app_service_plan_id = azurerm_app_service_plan.test.id - storage_connection_string = azurerm_storage_account.test.primary_connection_string -} -resource "azurerm_eventgrid_event_subscription" "test" { - name = "acctest-eg-%d" - scope = azurerm_resource_group.test.id - event_delivery_schema = "CloudEventSchemaV1_0" - azure_function_endpoint_id = azurerm_function_app.test.id -} -`, data.RandomInteger, data.Locations.Primary, data.RandomString, data.RandomInteger, data.RandomInteger, data.RandomInteger) -} - func testAccAzureRMEventGridEventSubscription_eventHubID(data acceptance.TestData) string { return fmt.Sprintf(` provider "azurerm" { @@ -539,7 +473,7 @@ resource "azurerm_servicebus_namespace" "example" { name = "acctestservicebusnamespace-%d" location = azurerm_resource_group.test.location resource_group_name = azurerm_resource_group.test.name - sku = "Basic" + sku = "Standard" } resource "azurerm_servicebus_topic" "test" { name = "acctestservicebustopic-%d" diff --git a/website/docs/r/eventgrid_event_subscription.html.markdown b/website/docs/r/eventgrid_event_subscription.html.markdown index c6fc4d2362b8..d9b3ded22ad1 100644 --- a/website/docs/r/eventgrid_event_subscription.html.markdown +++ b/website/docs/r/eventgrid_event_subscription.html.markdown @@ -59,8 +59,6 @@ The following arguments are supported: * `event_delivery_schema` - (Optional) Specifies the event delivery schema for the event subscription. Possible values include: `EventGridSchema`, `CloudEventSchemaV1_0`, `CustomInputSchema`. Defaults to `EventGridSchema`. Changing this forces a new resource to be created. -* `azure_function_endpoint_id` - (Optional) Specifies the id where the Azure Function is located. - * `eventhub_endpoint` - (Optional / **Deprecated in favour of `eventhub_endpoint_id`**) A `eventhub_endpoint` block as defined below. * `eventhub_endpoint_id` - (Optional) Specifies the id where the Event Hub is located. @@ -77,7 +75,7 @@ The following arguments are supported: * `webhook_endpoint` - (Optional) A `webhook_endpoint` block as defined below. -~> **NOTE:** One of `azure_function_endpoint_id`, `eventhub_endpoint`, `eventhub_endpoint_id`, `hybrid_connection_endpoint`, `hybrid_connection_endpoint_id`, `service_bus_queue_endpoint_id`, `service_bus_topic_endpoint_id`, `storage_queue_endpoint` or `webhook_endpoint` must be specified. +~> **NOTE:** One of `eventhub_endpoint`, `eventhub_endpoint_id`, `hybrid_connection_endpoint`, `hybrid_connection_endpoint_id`, `service_bus_queue_endpoint_id`, `service_bus_topic_endpoint_id`, `storage_queue_endpoint` or `webhook_endpoint` must be specified. * `included_event_types` - (Optional) A list of applicable event types that need to be part of the event subscription. From 1c8cd442269b6b06a07c1a202904a4d072dff5a0 Mon Sep 17 00:00:00 2001 From: kt Date: Sun, 24 May 2020 14:40:10 -0700 Subject: [PATCH 11/11] make terrafmt --- .../tests/eventgrid_event_subscription_resource_test.go | 4 ++-- ...ot_time_series_insights_standard_environment.html.markdown | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go b/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go index 2ef6c280f299..dea09dffd18b 100644 --- a/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go +++ b/azurerm/internal/services/eventgrid/tests/eventgrid_event_subscription_resource_test.go @@ -313,8 +313,8 @@ func testAccAzureRMEventGridEventSubscription_requiresImport(data acceptance.Tes %s resource "azurerm_eventgrid_event_subscription" "import" { - name = azurerm_eventgrid_event_subscription.test.name - scope = azurerm_eventgrid_event_subscription.test.scope + name = azurerm_eventgrid_event_subscription.test.name + scope = azurerm_eventgrid_event_subscription.test.scope } `, template) } diff --git a/website/docs/r/iot_time_series_insights_standard_environment.html.markdown b/website/docs/r/iot_time_series_insights_standard_environment.html.markdown index 28d2cc78cb3b..5816abefae47 100644 --- a/website/docs/r/iot_time_series_insights_standard_environment.html.markdown +++ b/website/docs/r/iot_time_series_insights_standard_environment.html.markdown @@ -67,4 +67,4 @@ Azure IoT Time Series Insights Standard Environment can be imported using the `r ```shell terraform import azurerm_iot_time_series_environment.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example/providers/Microsoft.TimeSeriesInsights/environments/example -``` \ No newline at end of file +```