opentofu/builtin/providers/azurerm/resource_arm_servicebus_topic.go
Peter McAtominey c199d1fde2 provider/azurerm: fix servicebus_topic updating values (#9323)
enable_partitioning set to ForceNew
requires_duplicate_detection set to ForceNew

max_size_in_megabytes would cause a loop if enable_partitioning was true as this
causes the value to be multiplied by 16 for it's effective value, this computed
value is then returned by the ARM API in the same field which caused Terraform
to always detect a change

```
TF_ACC=1 go test ./builtin/providers/azurerm -v -run TestAccAzureRMServiceBusTopic -timeout 120m
=== RUN   TestAccAzureRMServiceBusTopic_importBasic
--- PASS: TestAccAzureRMServiceBusTopic_importBasic (345.08s)
=== RUN   TestAccAzureRMServiceBusTopic_basic
--- PASS: TestAccAzureRMServiceBusTopic_basic (342.23s)
=== RUN   TestAccAzureRMServiceBusTopic_update
--- PASS: TestAccAzureRMServiceBusTopic_update (359.56s)
=== RUN   TestAccAzureRMServiceBusTopic_enablePartitioning
--- PASS: TestAccAzureRMServiceBusTopic_enablePartitioning (362.80s)
=== RUN   TestAccAzureRMServiceBusTopic_enableDuplicateDetection
--- PASS: TestAccAzureRMServiceBusTopic_enableDuplicateDetection (364.97s)
PASS
ok  	github.com/hashicorp/terraform/builtin/providers/azurerm	1774.657s
```
2016-10-25 16:34:08 +01:00

244 lines
6.7 KiB
Go

package azurerm
import (
"fmt"
"log"
"net/http"
"github.com/Azure/azure-sdk-for-go/arm/servicebus"
"github.com/hashicorp/terraform/helper/schema"
)
func resourceArmServiceBusTopic() *schema.Resource {
return &schema.Resource{
Create: resourceArmServiceBusTopicCreate,
Read: resourceArmServiceBusTopicRead,
Update: resourceArmServiceBusTopicCreate,
Delete: resourceArmServiceBusTopicDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"namespace_name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"location": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
StateFunc: azureRMNormalizeLocation,
},
"resource_group_name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"auto_delete_on_idle": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"default_message_ttl": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"duplicate_detection_history_time_window": {
Type: schema.TypeString,
Optional: true,
},
"enable_batched_operations": {
Type: schema.TypeBool,
Optional: true,
},
"enable_express": {
Type: schema.TypeBool,
Optional: true,
},
"enable_filtering_messages_before_publishing": {
Type: schema.TypeBool,
Optional: true,
},
"enable_partitioning": {
Type: schema.TypeBool,
Optional: true,
ForceNew: true,
},
"max_size_in_megabytes": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
ValidateFunc: validateArmServiceBusTopicMaxSize,
},
"requires_duplicate_detection": {
Type: schema.TypeBool,
Optional: true,
ForceNew: true,
},
"support_ordering": {
Type: schema.TypeBool,
Optional: true,
},
},
}
}
func resourceArmServiceBusTopicCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*ArmClient).serviceBusTopicsClient
log.Printf("[INFO] preparing arguments for Azure ARM ServiceBus Topic creation.")
name := d.Get("name").(string)
namespaceName := d.Get("namespace_name").(string)
location := d.Get("location").(string)
resGroup := d.Get("resource_group_name").(string)
parameters := servicebus.TopicCreateOrUpdateParameters{
Name: &name,
Location: &location,
Properties: &servicebus.TopicProperties{},
}
if autoDeleteOnIdle := d.Get("auto_delete_on_idle").(string); autoDeleteOnIdle != "" {
parameters.Properties.AutoDeleteOnIdle = &autoDeleteOnIdle
}
if defaultTTL := d.Get("default_message_ttl").(string); defaultTTL != "" {
parameters.Properties.DefaultMessageTimeToLive = &defaultTTL
}
if duplicateWindow := d.Get("duplicate_detection_history_time_window").(string); duplicateWindow != "" {
parameters.Properties.DuplicateDetectionHistoryTimeWindow = &duplicateWindow
}
enableBatchedOps := d.Get("enable_batched_operations").(bool)
enableExpress := d.Get("enable_express").(bool)
enableFiltering := d.Get("enable_filtering_messages_before_publishing").(bool)
enablePartitioning := d.Get("enable_partitioning").(bool)
maxSize := int64(d.Get("max_size_in_megabytes").(int))
requiresDuplicateDetection := d.Get("requires_duplicate_detection").(bool)
supportOrdering := d.Get("support_ordering").(bool)
parameters.Properties.EnableBatchedOperations = &enableBatchedOps
parameters.Properties.EnableExpress = &enableExpress
parameters.Properties.FilteringMessagesBeforePublishing = &enableFiltering
parameters.Properties.EnablePartitioning = &enablePartitioning
parameters.Properties.MaxSizeInMegabytes = &maxSize
parameters.Properties.RequiresDuplicateDetection = &requiresDuplicateDetection
parameters.Properties.SupportOrdering = &supportOrdering
_, err := client.CreateOrUpdate(resGroup, namespaceName, name, parameters)
if err != nil {
return err
}
read, err := client.Get(resGroup, namespaceName, name)
if err != nil {
return err
}
if read.ID == nil {
return fmt.Errorf("Cannot read ServiceBus Topic %s (resource group %s) ID", name, resGroup)
}
d.SetId(*read.ID)
return resourceArmServiceBusTopicRead(d, meta)
}
func resourceArmServiceBusTopicRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*ArmClient).serviceBusTopicsClient
id, err := parseAzureResourceID(d.Id())
if err != nil {
return err
}
resGroup := id.ResourceGroup
namespaceName := id.Path["namespaces"]
name := id.Path["topics"]
resp, err := client.Get(resGroup, namespaceName, name)
if err != nil {
return fmt.Errorf("Error making Read request on Azure ServiceBus Topic %s: %s", name, err)
}
if resp.StatusCode == http.StatusNotFound {
d.SetId("")
return nil
}
d.Set("name", resp.Name)
d.Set("resource_group_name", resGroup)
d.Set("namespace_name", namespaceName)
d.Set("location", azureRMNormalizeLocation(*resp.Location))
props := resp.Properties
d.Set("auto_delete_on_idle", props.AutoDeleteOnIdle)
d.Set("default_message_ttl", props.DefaultMessageTimeToLive)
if props.DuplicateDetectionHistoryTimeWindow != nil && *props.DuplicateDetectionHistoryTimeWindow != "" {
d.Set("duplicate_detection_history_time_window", props.DuplicateDetectionHistoryTimeWindow)
}
d.Set("enable_batched_operations", props.EnableBatchedOperations)
d.Set("enable_express", props.EnableExpress)
d.Set("enable_filtering_messages_before_publishing", props.FilteringMessagesBeforePublishing)
d.Set("enable_partitioning", props.EnablePartitioning)
d.Set("requires_duplicate_detection", props.RequiresDuplicateDetection)
d.Set("support_ordering", props.SupportOrdering)
// if partitioning is enabled then the max size returned by the API will be
// 16 times greater than the value set by the user
if *props.EnablePartitioning {
const partitionCount = 16
d.Set("max_size_in_megabytes", int(*props.MaxSizeInMegabytes/partitionCount))
} else {
d.Set("max_size_in_megabytes", int(*props.MaxSizeInMegabytes))
}
return nil
}
func resourceArmServiceBusTopicDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*ArmClient).serviceBusTopicsClient
id, err := parseAzureResourceID(d.Id())
if err != nil {
return err
}
resGroup := id.ResourceGroup
namespaceName := id.Path["namespaces"]
name := id.Path["topics"]
_, err = client.Delete(resGroup, namespaceName, name)
return err
}
func validateArmServiceBusTopicMaxSize(i interface{}, k string) (s []string, es []error) {
v := i.(int)
if v%1024 != 0 || v < 0 || v > 10240 {
es = append(es, fmt.Errorf("%q must be a multiple of 1024 up to and including 10240", k))
}
return
}