-
Notifications
You must be signed in to change notification settings - Fork 4.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
New Resource:
azurerm_eventgrid_system_topic
(#8735)
- Loading branch information
1 parent
ef1a8f0
commit 59c761d
Showing
7 changed files
with
626 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
217 changes: 217 additions & 0 deletions
217
azurerm/internal/services/eventgrid/eventgrid_system_topic_resource.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,217 @@ | ||
package eventgrid | ||
|
||
import ( | ||
"fmt" | ||
"log" | ||
"time" | ||
|
||
"github.com/Azure/azure-sdk-for-go/services/preview/eventgrid/mgmt/2020-04-01-preview/eventgrid" | ||
"github.com/hashicorp/go-azure-helpers/response" | ||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema" | ||
"github.com/hashicorp/terraform-plugin-sdk/helper/validation" | ||
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" | ||
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" | ||
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" | ||
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/eventgrid/parse" | ||
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tags" | ||
azSchema "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tf/schema" | ||
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts" | ||
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" | ||
) | ||
|
||
func resourceArmEventGridSystemTopic() *schema.Resource { | ||
return &schema.Resource{ | ||
Create: resourceArmEventGridSystemTopicCreateUpdate, | ||
Read: resourceArmEventGridSystemTopicRead, | ||
Update: resourceArmEventGridSystemTopicCreateUpdate, | ||
Delete: resourceArmEventGridSystemTopicDelete, | ||
|
||
Timeouts: &schema.ResourceTimeout{ | ||
Create: schema.DefaultTimeout(30 * time.Minute), | ||
Read: schema.DefaultTimeout(5 * time.Minute), | ||
Update: schema.DefaultTimeout(30 * time.Minute), | ||
Delete: schema.DefaultTimeout(30 * time.Minute), | ||
}, | ||
|
||
Importer: azSchema.ValidateResourceIDPriorToImport(func(id string) error { | ||
_, err := parse.EventGridSystemTopicID(id) | ||
return err | ||
}), | ||
|
||
Schema: map[string]*schema.Schema{ | ||
"name": { | ||
Type: schema.TypeString, | ||
Required: true, | ||
ForceNew: true, | ||
ValidateFunc: validation.StringIsNotEmpty, | ||
}, | ||
|
||
"location": azure.SchemaLocation(), | ||
|
||
"resource_group_name": azure.SchemaResourceGroupName(), | ||
|
||
"source_arm_resource_id": { | ||
Type: schema.TypeString, | ||
Required: true, | ||
ForceNew: true, | ||
ValidateFunc: azure.ValidateResourceID, | ||
}, | ||
|
||
"topic_type": { | ||
Type: schema.TypeString, | ||
Required: true, | ||
ForceNew: true, | ||
ValidateFunc: validation.StringInSlice([]string{ | ||
"Microsoft.AppConfiguration.ConfigurationStores", | ||
"Microsoft.Communication.CommunicationServices", | ||
"Microsoft.ContainerRegistry.Registries", | ||
"Microsoft.Devices.IoTHubs", | ||
"Microsoft.EventGrid.Domains", | ||
"Microsoft.EventGrid.Topics", | ||
"Microsoft.Eventhub.Namespaces", | ||
"Microsoft.KeyVault.vaults", | ||
"Microsoft.MachineLearningServices.Workspaces", | ||
"Microsoft.Maps.Accounts", | ||
"Microsoft.Media.MediaServices", | ||
"Microsoft.Resources.ResourceGroups", | ||
"Microsoft.Resources.Subscriptions", | ||
"Microsoft.ServiceBus.Namespaces", | ||
"Microsoft.SignalRService.SignalR", | ||
"Microsoft.Storage.StorageAccounts", | ||
"Microsoft.Web.ServerFarms", | ||
"Microsoft.Web.Sites", | ||
}, false), | ||
}, | ||
|
||
"metric_arm_resource_id": { | ||
Type: schema.TypeString, | ||
Computed: true, | ||
}, | ||
|
||
"tags": tags.Schema(), | ||
}, | ||
} | ||
} | ||
|
||
func resourceArmEventGridSystemTopicCreateUpdate(d *schema.ResourceData, meta interface{}) error { | ||
client := meta.(*clients.Client).EventGrid.SystemTopicsClient | ||
ctx, cancel := timeouts.ForCreateUpdate(meta.(*clients.Client).StopContext, d) | ||
defer cancel() | ||
|
||
name := d.Get("name").(string) | ||
resourceGroup := d.Get("resource_group_name").(string) | ||
source := d.Get("source_arm_resource_id").(string) | ||
topicType := d.Get("topic_type").(string) | ||
|
||
if d.IsNewResource() { | ||
existing, err := client.Get(ctx, resourceGroup, name) | ||
if err != nil { | ||
if !utils.ResponseWasNotFound(existing.Response) { | ||
return fmt.Errorf("Error checking for presence of existing Event Grid System Topic %q (Resource Group %q): %s", name, resourceGroup, err) | ||
} | ||
} | ||
|
||
if existing.ID != nil && *existing.ID != "" { | ||
return tf.ImportAsExistsError("azurerm_eventgrid_system_topic", *existing.ID) | ||
} | ||
} | ||
|
||
location := azure.NormalizeLocation(d.Get("location").(string)) | ||
t := d.Get("tags").(map[string]interface{}) | ||
|
||
systemTopic := eventgrid.SystemTopic{ | ||
Location: &location, | ||
SystemTopicProperties: &eventgrid.SystemTopicProperties{ | ||
Source: &source, | ||
TopicType: &topicType, | ||
}, | ||
Tags: tags.Expand(t), | ||
} | ||
|
||
log.Printf("[INFO] preparing arguments for AzureRM Event Grid System Topic creation with Properties: %+v.", systemTopic) | ||
|
||
future, err := client.CreateOrUpdate(ctx, resourceGroup, name, systemTopic) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { | ||
return err | ||
} | ||
|
||
read, err := client.Get(ctx, resourceGroup, name) | ||
if err != nil { | ||
return err | ||
} | ||
if read.ID == nil { | ||
return fmt.Errorf("Cannot read Event Grid System Topic %s (resource group %s) ID", name, resourceGroup) | ||
} | ||
|
||
d.SetId(*read.ID) | ||
|
||
return resourceArmEventGridSystemTopicRead(d, meta) | ||
} | ||
|
||
func resourceArmEventGridSystemTopicRead(d *schema.ResourceData, meta interface{}) error { | ||
client := meta.(*clients.Client).EventGrid.SystemTopicsClient | ||
ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d) | ||
defer cancel() | ||
|
||
id, err := parse.EventGridSystemTopicID(d.Id()) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
resp, err := client.Get(ctx, id.ResourceGroup, id.Name) | ||
if err != nil { | ||
if utils.ResponseWasNotFound(resp.Response) { | ||
log.Printf("[WARN] Event Grid System Topic '%s' was not found (resource group '%s')", id.Name, id.ResourceGroup) | ||
d.SetId("") | ||
return nil | ||
} | ||
|
||
return fmt.Errorf("Error making Read request on Event Grid System Topic '%s': %+v", id.Name, err) | ||
} | ||
|
||
d.Set("name", resp.Name) | ||
d.Set("resource_group_name", id.ResourceGroup) | ||
if location := resp.Location; location != nil { | ||
d.Set("location", azure.NormalizeLocation(*location)) | ||
} | ||
|
||
if props := resp.SystemTopicProperties; props != nil { | ||
d.Set("source_arm_resource_id", props.Source) | ||
d.Set("topic_type", props.TopicType) | ||
d.Set("metric_arm_resource_id", props.MetricResourceID) | ||
} | ||
|
||
return tags.FlattenAndSet(d, resp.Tags) | ||
} | ||
|
||
func resourceArmEventGridSystemTopicDelete(d *schema.ResourceData, meta interface{}) error { | ||
client := meta.(*clients.Client).EventGrid.SystemTopicsClient | ||
ctx, cancel := timeouts.ForDelete(meta.(*clients.Client).StopContext, d) | ||
defer cancel() | ||
|
||
id, err := parse.EventGridSystemTopicID(d.Id()) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
future, err := client.Delete(ctx, id.ResourceGroup, id.Name) | ||
if err != nil { | ||
if response.WasNotFound(future.Response()) { | ||
return nil | ||
} | ||
return fmt.Errorf("Error deleting Event Grid System Topic %q: %+v", id.Name, err) | ||
} | ||
|
||
if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { | ||
if response.WasNotFound(future.Response()) { | ||
return nil | ||
} | ||
return fmt.Errorf("Error deleting Event Grid System Topic %q: %+v", id.Name, err) | ||
} | ||
|
||
return nil | ||
} |
33 changes: 33 additions & 0 deletions
33
azurerm/internal/services/eventgrid/parse/eventgrid_system_topic.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
package parse | ||
|
||
import ( | ||
"fmt" | ||
|
||
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" | ||
) | ||
|
||
type EventGridSystemTopicId struct { | ||
ResourceGroup string | ||
Name string | ||
} | ||
|
||
func EventGridSystemTopicID(input string) (*EventGridSystemTopicId, error) { | ||
id, err := azure.ParseAzureResourceID(input) | ||
if err != nil { | ||
return nil, fmt.Errorf("[ERROR] Unable to parse EventGrid System Topic ID %q: %+v", input, err) | ||
} | ||
|
||
topic := EventGridSystemTopicId{ | ||
ResourceGroup: id.ResourceGroup, | ||
} | ||
|
||
if topic.Name, err = id.PopSegment("systemTopics"); err != nil { | ||
return nil, err | ||
} | ||
|
||
if err := id.ValidateNoEmptySegments(input); err != nil { | ||
return nil, err | ||
} | ||
|
||
return &topic, nil | ||
} |
53 changes: 53 additions & 0 deletions
53
azurerm/internal/services/eventgrid/parse/eventgrid_system_topic_test.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
package parse | ||
|
||
import ( | ||
"testing" | ||
) | ||
|
||
func TestEventGridSystemTopicId(t *testing.T) { | ||
testData := []struct { | ||
Name string | ||
Input string | ||
Expected *EventGridSystemTopicId | ||
}{ | ||
{ | ||
Name: "Empty", | ||
Input: "", | ||
Expected: nil, | ||
}, | ||
{ | ||
Name: "No System Topic", | ||
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/providers/Microsoft.EventGrid", | ||
Expected: nil, | ||
}, | ||
{ | ||
Name: "EventGrid System Topic ID", | ||
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/Microsoft.EventGrid/systemTopics/systemTopic1", | ||
Expected: &EventGridSystemTopicId{ | ||
Name: "systemTopic1", | ||
ResourceGroup: "resGroup1", | ||
}, | ||
}, | ||
} | ||
|
||
for _, v := range testData { | ||
t.Logf("[DEBUG] Testing %q", v.Name) | ||
|
||
actual, err := EventGridSystemTopicID(v.Input) | ||
if err != nil { | ||
if v.Expected == nil { | ||
continue | ||
} | ||
|
||
t.Fatalf("Expected a value but got an error: %s", err) | ||
} | ||
|
||
if actual.Name != v.Expected.Name { | ||
t.Fatalf("Expected %q but got %q for Name", v.Expected.Name, actual.Name) | ||
} | ||
|
||
if actual.ResourceGroup != v.Expected.ResourceGroup { | ||
t.Fatalf("Expected %q but got %q for Resource Group", v.Expected.ResourceGroup, actual.ResourceGroup) | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.