diff --git a/nutanix/data_source_nutanix_address_groups_test.go b/nutanix/data_source_nutanix_address_groups_test.go index 56e5f8565..7b83fd7d2 100644 --- a/nutanix/data_source_nutanix_address_groups_test.go +++ b/nutanix/data_source_nutanix_address_groups_test.go @@ -44,6 +44,8 @@ func testAccAddressGroupsDataSourceConfig(r int) string { uuid = nutanix_address_group.test_address.id } - data "nutanix_address_groups" "addr_groups" {} + data "nutanix_address_groups" "addr_groups" { + depends_on = [nutanix_address_group.test_address] + } `, r) } diff --git a/nutanix/data_source_nutanix_network_security_rule.go b/nutanix/data_source_nutanix_network_security_rule.go index cb0d55822..77d4d980a 100644 --- a/nutanix/data_source_nutanix_network_security_rule.go +++ b/nutanix/data_source_nutanix_network_security_rule.go @@ -122,8 +122,8 @@ func dataSourceNutanixNetworkSecurityRule() *schema.Resource { }, }, }, - "service_group_list": referenceListSchema(), - "address_group_inclusion_list": referenceListSchema(), + "service_group_list": serviceGroupList(), + "address_group_inclusion_list": addressGroupList(), "filter_kind_list": { Type: schema.TypeList, Computed: true, @@ -531,8 +531,8 @@ func dataSourceNutanixNetworkSecurityRule() *schema.Resource { }, }, }, - "service_group_list": referenceListSchema(), - "address_group_inclusion_list": referenceListSchema(), + "service_group_list": serviceGroupList(), + "address_group_inclusion_list": addressGroupList(), "filter_kind_list": { Type: schema.TypeList, Computed: true, @@ -707,8 +707,8 @@ func dataSourceNutanixNetworkSecurityRule() *schema.Resource { }, }, }, - "service_group_list": referenceListSchema(), - "address_group_inclusion_list": referenceListSchema(), + "service_group_list": serviceGroupList(), + "address_group_inclusion_list": addressGroupList(), "filter_kind_list": { Type: schema.TypeList, Computed: true, @@ -855,8 +855,8 @@ func dataSourceNutanixNetworkSecurityRule() *schema.Resource { }, }, }, - "service_group_list": referenceListSchema(), - "address_group_inclusion_list": referenceListSchema(), + "service_group_list": serviceGroupList(), + "address_group_inclusion_list": addressGroupList(), "filter_kind_list": { Type: schema.TypeList, Computed: true, @@ -1375,8 +1375,8 @@ func resourceNutanixDatasourceNetworkSecurityRuleResourceV0() *schema.Resource { }, }, }, - "service_group_list": referenceListSchema(), - "address_group_inclusion_list": referenceListSchema(), + "service_group_list": serviceGroupList(), + "address_group_inclusion_list": addressGroupList(), "filter_kind_list": { Type: schema.TypeList, Computed: true, @@ -1523,8 +1523,8 @@ func resourceNutanixDatasourceNetworkSecurityRuleResourceV0() *schema.Resource { }, }, }, - "service_group_list": referenceListSchema(), - "address_group_inclusion_list": referenceListSchema(), + "service_group_list": serviceGroupList(), + "address_group_inclusion_list": addressGroupList(), "filter_kind_list": { Type: schema.TypeList, Computed: true, @@ -1640,8 +1640,8 @@ func resourceNutanixDatasourceNetworkSecurityRuleResourceV0() *schema.Resource { }, }, }, - "service_group_list": referenceListSchema(), - "address_group_inclusion_list": referenceListSchema(), + "service_group_list": serviceGroupList(), + "address_group_inclusion_list": addressGroupList(), "filter_kind_list": { Type: schema.TypeList, Computed: true, @@ -1788,8 +1788,8 @@ func resourceNutanixDatasourceNetworkSecurityRuleResourceV0() *schema.Resource { }, }, }, - "service_group_list": referenceListSchema(), - "address_group_inclusion_list": referenceListSchema(), + "service_group_list": serviceGroupList(), + "address_group_inclusion_list": addressGroupList(), "filter_kind_list": { Type: schema.TypeList, Computed: true, diff --git a/nutanix/helpers.go b/nutanix/helpers.go index e03664b1d..202fac85f 100644 --- a/nutanix/helpers.go +++ b/nutanix/helpers.go @@ -22,16 +22,16 @@ func getMetadataAttributes(d *schema.ResourceData, metadata *v3.Metadata, kind s if p, ok := d.GetOk("project_reference"); ok { pr := p.(map[string]interface{}) - r := &v3.Reference{ - // Kind: utils.StringPtr(pr["kind"].(string)), - UUID: utils.StringPtr(pr["uuid"].(string)), - } - if vKind, okKind := pr["kind"]; okKind { - r.Kind = utils.StringPtr(vKind.(string)) - } + r := &v3.Reference{} if v1, ok1 := pr["name"]; ok1 { r.Name = utils.StringPtr(v1.(string)) } + if v2, ok2 := pr["kind"]; ok2 { + r.Kind = utils.StringPtr(v2.(string)) + } + if v3, ok3 := pr["uuid"]; ok3 { + r.UUID = utils.StringPtr(v3.(string)) + } metadata.ProjectReference = r } if o, ok := d.GetOk("owner_reference"); ok { diff --git a/nutanix/resource_nutanix_karbon_cluster.go b/nutanix/resource_nutanix_karbon_cluster.go index 1c59dbcdc..2de9dafe7 100644 --- a/nutanix/resource_nutanix_karbon_cluster.go +++ b/nutanix/resource_nutanix_karbon_cluster.go @@ -17,9 +17,9 @@ import ( ) const ( - DEFAULTMASTERNODEPOOLNAME = "master_node_pool" - DEFAULTETCDNODEPOOLNAME = "etcd_node_pool" - DEFAULTWORKERNODEPOOLNAME = "worker_node_pool" + DEFAULTMASTERNODEPOOLNAME = "master-node-pool" + DEFAULTETCDNODEPOOLNAME = "etcd-node-pool" + DEFAULTWORKERNODEPOOLNAME = "worker-node-pool" DEFAULTPODIPV4CIDR = "172.20.0.0/16" DEFAULTSERVICEIPV4CIDR = "172.19.0.0/16" DEFAULTRECLAIMPOLICY = "Delete" diff --git a/nutanix/resource_nutanix_karbon_cluster_test.go b/nutanix/resource_nutanix_karbon_cluster_test.go index ae20ea2d9..e0228f13d 100644 --- a/nutanix/resource_nutanix_karbon_cluster_test.go +++ b/nutanix/resource_nutanix_karbon_cluster_test.go @@ -205,7 +205,7 @@ func testAccNutanixKarbonClusterConfig(subnetName string, r int, containter stri resource "nutanix_karbon_cluster" "cluster" { name = "test-karbon-%d" - version = "1.16.13-0" + version = "1.18.20-1" dynamic "active_passive_config" { for_each = local.deployment_type == "active-passive" ? [1] : [] diff --git a/nutanix/resource_nutanix_network_security_rule.go b/nutanix/resource_nutanix_network_security_rule.go index e990310d4..b5886d9f2 100644 --- a/nutanix/resource_nutanix_network_security_rule.go +++ b/nutanix/resource_nutanix_network_security_rule.go @@ -122,8 +122,8 @@ func resourceNutanixNetworkSecurityRule() *schema.Resource { }, "tcp_port_range_list": portRangeSchema(), "udp_port_range_list": portRangeSchema(), - "service_group_list": referenceListSchema(), - "address_group_inclusion_list": referenceListSchema(), + "service_group_list": serviceGroupList(), + "address_group_inclusion_list": addressGroupList(), "filter_kind_list": { Type: schema.TypeList, Optional: true, @@ -256,8 +256,8 @@ func resourceNutanixNetworkSecurityRule() *schema.Resource { }, "tcp_port_range_list": portRangeSchema(), "udp_port_range_list": portRangeSchema(), - "service_group_list": referenceListSchema(), - "address_group_inclusion_list": referenceListSchema(), + "service_group_list": serviceGroupList(), + "address_group_inclusion_list": addressGroupList(), "filter_kind_list": { Type: schema.TypeList, Optional: true, @@ -422,8 +422,8 @@ func resourceNutanixNetworkSecurityRule() *schema.Resource { }, "tcp_port_range_list": portRangeSchema(), "udp_port_range_list": portRangeSchema(), - "service_group_list": referenceListSchema(), - "address_group_inclusion_list": referenceListSchema(), + "service_group_list": serviceGroupList(), + "address_group_inclusion_list": addressGroupList(), "filter_kind_list": { Type: schema.TypeList, Optional: true, @@ -556,8 +556,8 @@ func resourceNutanixNetworkSecurityRule() *schema.Resource { }, "tcp_port_range_list": portRangeSchema(), "udp_port_range_list": portRangeSchema(), - "service_group_list": referenceListSchema(), - "address_group_inclusion_list": referenceListSchema(), + "service_group_list": serviceGroupList(), + "address_group_inclusion_list": addressGroupList(), "filter_kind_list": { Type: schema.TypeList, Optional: true, @@ -1221,7 +1221,14 @@ func expandNetworkRule(prefix string, d *schema.ResourceData) *v3.NetworkSecurit nrItem.IcmpTypeCodeList = expandIcmpTypeCodeList(icmp) } - nrItem.IPSubnet = iPSubnet + // Don't set this unless explicitly requested by the user as it won't be omitted when not nil and breaks + // network security rules that don't rely on categories + if ip, ipok := nr["ip_subnet"]; ipok && ip.(string) != "" { + nrItem.IPSubnet = iPSubnet + } else { + nrItem.IPSubnet = nil + } + if !reflect.DeepEqual(*filter, v3.CategoryFilter{}) { nrItem.Filter = filter } @@ -1359,7 +1366,14 @@ func expandNetworkRule(prefix string, d *schema.ResourceData) *v3.NetworkSecurit nrItem.IcmpTypeCodeList = expandIcmpTypeCodeList(icmp) } - nrItem.IPSubnet = iPSubnet + // Don't set this unless explicitly requested by the user as it won't be omitted when not nil and breaks + // network security rules that don't rely on categories + if ip, ipok := nr["ip_subnet"]; ipok && ip.(string) != "" { + nrItem.IPSubnet = iPSubnet + } else { + nrItem.IPSubnet = nil + } + if !reflect.DeepEqual(*filter, v3.CategoryFilter{}) { nrItem.Filter = filter } @@ -1551,7 +1565,15 @@ func flattenNetworkRuleList(networkRules []*v3.NetworkRule) []map[string]interfa return ruleList } -func referenceListSchema() *schema.Schema { +func serviceGroupList() *schema.Schema { + return referenceListSchema("service_group") +} + +func addressGroupList() *schema.Schema { + return referenceListSchema("address_group") +} + +func referenceListSchema(kind string) *schema.Schema { return &schema.Schema{ Type: schema.TypeList, Optional: true, @@ -1560,11 +1582,13 @@ func referenceListSchema() *schema.Schema { Schema: map[string]*schema.Schema{ "kind": { Type: schema.TypeString, - Computed: true, + Default: kind, + Optional: true, }, "uuid": { Type: schema.TypeString, Computed: true, + Optional: true, }, "name": { Type: schema.TypeString, @@ -1679,8 +1703,8 @@ func resourceNutanixSecurityRuleInstanceResourceV0() *schema.Resource { }, "tcp_port_range_list": portRangeSchema(), "udp_port_range_list": portRangeSchema(), - "service_group_list": referenceListSchema(), - "address_group_inclusion_list": referenceListSchema(), + "service_group_list": serviceGroupList(), + "address_group_inclusion_list": addressGroupList(), "filter_kind_list": { Type: schema.TypeList, Optional: true, @@ -1813,8 +1837,8 @@ func resourceNutanixSecurityRuleInstanceResourceV0() *schema.Resource { }, "tcp_port_range_list": portRangeSchema(), "udp_port_range_list": portRangeSchema(), - "service_group_list": referenceListSchema(), - "address_group_inclusion_list": referenceListSchema(), + "service_group_list": serviceGroupList(), + "address_group_inclusion_list": addressGroupList(), "filter_kind_list": { Type: schema.TypeList, Optional: true, diff --git a/test_config.json b/test_config.json index a0987d15b..aa45e8bf1 100644 --- a/test_config.json +++ b/test_config.json @@ -33,7 +33,7 @@ "directory_service_uuid": "bdf0bafb-bbd7-4a1b-ba14-94a990607506" } ], - "node_os_version": "ntnx-1.0", + "node_os_version": "ntnx-1.2", "ad_rule_target": { "name": "ADGroup", "values": "sspadmins"