HasChange always return true for type map[string] Set #617
Closed
Description
SDK version
v1.13.1
Relevant provider source code
"network_rules": {
Type: schema.TypeList,
Optional: true,
Computed: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"bypass": {
Type: schema.TypeSet,
Optional: true,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
ValidateFunc: validation.StringInSlice([]string{
string(storage.AzureServices),
string(storage.Logging),
string(storage.Metrics),
string(storage.None),
}, true),
},
Set: schema.HashString,
},
"ip_rules": {
Type: schema.TypeSet,
Optional: true,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
ValidateFunc: validate.StorageAccountIPRule,
},
Set: schema.HashString,
},
"virtual_network_subnet_ids": {
Type: schema.TypeSet,
Optional: true,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
Set: schema.HashString,
},
"default_action": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringInSlice([]string{
string(storage.DefaultActionAllow),
string(storage.DefaultActionDeny),
}, false),
},
},
},
},
...
func flattenStorageAccountNetworkRules(input *storage.NetworkRuleSet) []interface{} {
if input == nil {
return []interface{}{}
}
networkRules := make(map[string]interface{})
networkRules["ip_rules"] = schema.NewSet(schema.HashString, flattenStorageAccountIPRules(input.IPRules))
networkRules["virtual_network_subnet_ids"] = schema.NewSet(schema.HashString, flattenStorageAccountVirtualNetworks(input.VirtualNetworkRules))
networkRules["bypass"] = schema.NewSet(schema.HashString, flattenStorageAccountBypass(input.Bypass))
networkRules["default_action"] = string(input.DefaultAction)
return []interface{}{networkRules}
}
...
if d.HasChange("network_rules") {
...
}
Terraform Configuration Files
provider "azurerm" {
features {}
}
resource "azurerm_resource_group" "test" {
name = "acctestRG-storage-%d"
location = "%s"
}
resource "azurerm_storage_account" "test" {
name = "unlikely23exst2acct%s"
resource_group_name = azurerm_resource_group.test.name
location = azurerm_resource_group.test.location
account_tier = "Standard"
account_replication_type = "LRS"
tags = {
environment = "production"
}
}
Debug Output
I can see d.HasChange has used Set's Equal() before reflect.DeepEqual(o, n). But it works only for Set. It doesn't work for complicated struct including type Set.
Expected Behavior
If no update in "network_rules", d.HasChange("network_rules") should return false
Actual Behavior
d.HasChange("network_rules") always return true
Steps to Reproduce
Please list the full steps required to reproduce the issue, for example:
terraform init
terraform apply
terraform apply