Skip to content

Commit 046d664

Browse files
Terraform Team AutomationNagaRajuPasunuri
authored andcommitted
Bug Fix - [Terraform Provider] Virtual circuit should not pass vlan if not changed in core_virtual_circuit resource
1 parent 08cd6a1 commit 046d664

File tree

3 files changed

+117
-15
lines changed

3 files changed

+117
-15
lines changed

internal/integrationtest/core_cross_connect_within_group_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ var (
3333

3434
crossConnectWithGroupRepresentation = map[string]interface{}{
3535
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
36-
"location_name": acctest.Representation{RepType: acctest.Required, Create: `${data.oci_core_cross_connect_locations.test_cross_connect_locations.cross_connect_locations.1.name}`}, // not all locations support macsec
36+
"location_name": acctest.Representation{RepType: acctest.Required, Create: `${data.oci_core_cross_connect_locations.test_cross_connect_locations.cross_connect_locations.0.name}`}, // not all locations support macsec
3737
"port_speed_shape_name": acctest.Representation{RepType: acctest.Required, Create: `10 Gbps`},
3838
"cross_connect_group_id": acctest.Representation{RepType: acctest.Optional, Create: `${oci_core_cross_connect_group.test_cross_connect_group.id}`},
3939
"customer_reference_name": acctest.Representation{RepType: acctest.Optional, Create: `customerReferenceName`, Update: `customerReferenceName2`},

internal/integrationtest/core_virtual_circuit_test.go

Lines changed: 104 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -102,16 +102,26 @@ var (
102102
CoreVirtualCircuitWithProviderRepresentation = map[string]interface{}{
103103
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
104104
"type": acctest.Representation{RepType: acctest.Required, Create: `${var.virtual_circuit_type}`},
105-
"bandwidth_shape_name": acctest.Representation{RepType: acctest.Optional, Create: "${data.oci_core_virtual_circuit_bandwidth_shapes.test_virtual_circuit_bandwidth_shapes.virtual_circuit_bandwidth_shapes.0.name}"},
105+
"bandwidth_shape_name": acctest.Representation{RepType: acctest.Optional, Create: "${data.oci_core_virtual_circuit_bandwidth_shapes.test_virtual_circuit_bandwidth_shapes_layer2.virtual_circuit_bandwidth_shapes.0.name}"},
106106
"cross_connect_mappings": acctest.RepresentationGroup{RepType: acctest.Required, Group: CoreVirtualCircuitCrossConnectMappingsRepresentation},
107107
"customer_asn": acctest.Representation{RepType: acctest.Required, Create: `10`, Update: `11`},
108108
"display_name": acctest.Representation{RepType: acctest.Optional, Create: `displayName`, Update: `displayName2`},
109109
"gateway_id": acctest.Representation{RepType: acctest.Optional, Create: `${oci_core_drg.test_drg.id}`},
110-
"provider_service_id": acctest.Representation{RepType: acctest.Optional, Create: `${data.oci_core_fast_connect_provider_services.test_fast_connect_provider_services.fast_connect_provider_services.0.id}`},
110+
"provider_service_id": acctest.Representation{RepType: acctest.Optional, Create: `${data.oci_core_fast_connect_provider_services.test_fast_connect_provider_services_layer2.fast_connect_provider_services.0.id}`},
111111
// provider_service_key_name can only be updated by a Fast Connect Service Provider
112112
// "provider_service_key_name": acctest.Representation{RepType: acctest.Optional, Create: `d8f7a443-28c2-4dcf-996c-286351908c58`},
113113
"region": acctest.Representation{RepType: acctest.Optional, Create: `us-phoenix-1`},
114114
}
115+
CorePrivateVirtualCircuitUpdateRepresentation = acctest.RepresentationCopyWithNewProperties(
116+
acctest.RepresentationCopyWithRemovedProperties(CoreVirtualCircuitRequiredOnlyRepresentation, []string{"cross_connect_mappings"}), map[string]interface{}{
117+
"cross_connect_mappings": acctest.RepresentationGroup{RepType: acctest.Required, Group: CoreVirtualCircuitCrossConnectMappingsRepresentation},
118+
})
119+
120+
CoreVirtualCircuitWithProviderLayer3Representation = acctest.RepresentationCopyWithNewProperties(
121+
acctest.RepresentationCopyWithRemovedProperties(CoreVirtualCircuitRequiredOnlyRepresentation, []string{"cross_connect_mappings", "bandwidth_shape_name", "provider_service_id", "customer_asn"}), map[string]interface{}{
122+
"bandwidth_shape_name": acctest.Representation{RepType: acctest.Optional, Create: "${data.oci_core_virtual_circuit_bandwidth_shapes.test_virtual_circuit_bandwidth_shapes_layer3.virtual_circuit_bandwidth_shapes.0.name}"},
123+
"provider_service_id": acctest.Representation{RepType: acctest.Optional, Create: `${data.oci_core_fast_connect_provider_services.test_fast_connect_provider_services_layer3.fast_connect_provider_services.0.id}`},
124+
})
115125

116126
CoreVirtualCircuitCrossConnectMappingsPublicRequiredOnlyRepresentation = map[string]interface{}{
117127
"cross_connect_or_cross_connect_group_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_core_cross_connect.test_cross_connect.cross_connect_group_id}`},
@@ -132,7 +142,7 @@ var (
132142
}
133143

134144
VirtualCircuitWithProviderResourceConfigFilter = `
135-
data "oci_core_fast_connect_provider_services" "test_fast_connect_provider_services" {
145+
data "oci_core_fast_connect_provider_services" "test_fast_connect_provider_services_layer2" {
136146
#Required
137147
compartment_id = "${var.compartment_id}"
138148
@@ -141,6 +151,11 @@ data "oci_core_fast_connect_provider_services" "test_fast_connect_provider_servi
141151
values = [ "LAYER2" ]
142152
}
143153
154+
filter {
155+
name = "provider_name"
156+
values = ["OracleL2IntegDeployment"]
157+
}
158+
144159
filter {
145160
name = "private_peering_bgp_management"
146161
values = [ "CUSTOMER_MANAGED" ]
@@ -162,9 +177,44 @@ data "oci_core_fast_connect_provider_services" "test_fast_connect_provider_servi
162177
}
163178
}
164179
165-
data "oci_core_virtual_circuit_bandwidth_shapes" "test_virtual_circuit_bandwidth_shapes" {
180+
data "oci_core_fast_connect_provider_services" "test_fast_connect_provider_services_layer3" {
181+
#Required
182+
compartment_id = "${var.compartment_id}"
183+
184+
filter {
185+
name = "type"
186+
values = [ "LAYER3" ]
187+
}
188+
189+
filter {
190+
name = "provider_name"
191+
values = ["OracleL3IntegDeployment"]
192+
}
193+
194+
filter {
195+
name = "supported_virtual_circuit_types"
196+
values = [ "${var.virtual_circuit_type}" ]
197+
}
198+
199+
filter {
200+
name = "public_peering_bgp_management"
201+
values = [ "ORACLE_MANAGED" ]
202+
}
203+
204+
filter {
205+
name = "provider_service_key_management"
206+
values = ["PROVIDER_MANAGED"]
207+
}
208+
}
209+
210+
data "oci_core_virtual_circuit_bandwidth_shapes" "test_virtual_circuit_bandwidth_shapes_layer2" {
166211
#Required
167-
provider_service_id = "${data.oci_core_fast_connect_provider_services.test_fast_connect_provider_services.fast_connect_provider_services.0.id}"
212+
provider_service_id = "${data.oci_core_fast_connect_provider_services.test_fast_connect_provider_services_layer2.fast_connect_provider_services.0.id}"
213+
}
214+
215+
data "oci_core_virtual_circuit_bandwidth_shapes" "test_virtual_circuit_bandwidth_shapes_layer3" {
216+
#Required
217+
provider_service_id = "${data.oci_core_fast_connect_provider_services.test_fast_connect_provider_services_layer3.fast_connect_provider_services.0.id}"
168218
}
169219
`
170220

@@ -329,10 +379,11 @@ func TestCoreVirtualCircuitResource_basic(t *testing.T) {
329379
{
330380
Config: config + compartmentIdVariableStr + VirtualCircuitResourceDependenciesCopyForVC + secretIdVariableStrCKN + secretIdVariableStrCAK + secretVersionStrCAK + secretVersionStrCKN,
331381
},
332-
// verify Create - PRIVATE Virtual Circuit with Provider
382+
// verify Create - PRIVATE Virtual Circuit with Provider Layer 2
333383
{
334384
Config: config + compartmentIdVariableStr + VirtualCircuitResourceDependenciesCopyForVC + VirtualCircuitPrivatePropertyVariables + VirtualCircuitWithProviderResourceConfigFilter +
335-
acctest.GenerateResourceFromRepresentationMap("oci_core_virtual_circuit", "test_virtual_circuit", acctest.Optional, acctest.Create, CoreVirtualCircuitWithProviderRepresentation),
385+
acctest.GenerateResourceFromRepresentationMap("oci_core_virtual_circuit", "test_virtual_circuit", acctest.Optional, acctest.Create,
386+
CoreVirtualCircuitWithProviderRepresentation),
336387
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
337388
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
338389
resource.TestCheckResourceAttr(resourceName, "cross_connect_mappings.#", "1"),
@@ -350,7 +401,7 @@ func TestCoreVirtualCircuitResource_basic(t *testing.T) {
350401
},
351402
),
352403
},
353-
// verify Update - PRIVATE Virtual Circuit with Provider
404+
// verify Update - PRIVATE Virtual Circuit with Provider Layer 2
354405
{
355406
Config: config + compartmentIdVariableStr + VirtualCircuitResourceDependenciesCopyForVC + VirtualCircuitPrivatePropertyVariables + VirtualCircuitWithProviderResourceConfigFilter + secretIdVariableStrCKN + secretIdVariableStrCAK + secretVersionStrCAK + secretVersionStrCKN +
356407
acctest.GenerateResourceFromRepresentationMap("oci_core_virtual_circuit", "test_virtual_circuit", acctest.Optional, acctest.Update, CoreVirtualCircuitWithProviderRepresentation),
@@ -378,6 +429,29 @@ func TestCoreVirtualCircuitResource_basic(t *testing.T) {
378429
{
379430
Config: config + compartmentIdVariableStr + VirtualCircuitResourceDependenciesCopyForVC + secretIdVariableStrCKN + secretIdVariableStrCAK + secretVersionStrCAK + secretVersionStrCKN,
380431
},
432+
// verify Create - PRIVATE Virtual Circuit with Provider Layer 3
433+
{
434+
Config: config + compartmentIdVariableStr + VirtualCircuitResourceDependenciesCopyForVC + VirtualCircuitPrivatePropertyVariables + VirtualCircuitWithProviderResourceConfigFilter +
435+
acctest.GenerateResourceFromRepresentationMap("oci_core_virtual_circuit", "test_virtual_circuit", acctest.Optional, acctest.Create,
436+
CoreVirtualCircuitWithProviderLayer3Representation),
437+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
438+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
439+
resource.TestCheckResourceAttr(resourceName, "cross_connect_mappings.#", "0"),
440+
resource.TestCheckResourceAttrSet(resourceName, "gateway_id"),
441+
resource.TestCheckResourceAttrSet(resourceName, "provider_service_id"),
442+
resource.TestCheckResourceAttr(resourceName, "provider_state", "INACTIVE"),
443+
resource.TestCheckResourceAttr(resourceName, "type", "PRIVATE"),
444+
445+
func(s *terraform.State) (err error) {
446+
resId, err = acctest.FromInstanceState(s, resourceName, "id")
447+
return err
448+
},
449+
),
450+
},
451+
// delete before next Create
452+
{
453+
Config: config + compartmentIdVariableStr + VirtualCircuitResourceDependenciesCopyForVC + secretIdVariableStrCKN + secretIdVariableStrCAK + secretVersionStrCAK + secretVersionStrCKN,
454+
},
381455

382456
// verify Create - PRIVATE Virtual Circuit
383457
{
@@ -399,6 +473,28 @@ func TestCoreVirtualCircuitResource_basic(t *testing.T) {
399473
},
400474
),
401475
},
476+
// verify Update - PRIVATE Virtual Circuit
477+
{
478+
Config: config + VirtualCircuitPrivatePropertyVariables + compartmentIdVariableStr + secretIdVariableStrCKN + secretIdVariableStrCAK + secretVersionStrCAK + secretVersionStrCKN + secretVersionStrCAKU +
479+
VirtualCircuitResourceDependenciesCopyForVC +
480+
acctest.GenerateResourceFromRepresentationMap("oci_core_virtual_circuit", "test_virtual_circuit", acctest.Required, acctest.Update, CorePrivateVirtualCircuitUpdateRepresentation),
481+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
482+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
483+
resource.TestCheckResourceAttr(resourceName, "cross_connect_mappings.#", "1"),
484+
resource.TestCheckResourceAttrSet(resourceName, "cross_connect_mappings.0.cross_connect_or_cross_connect_group_id"),
485+
resource.TestCheckResourceAttr(resourceName, "cross_connect_mappings.0.customer_bgp_peering_ip", "10.0.0.20/31"),
486+
resource.TestCheckResourceAttr(resourceName, "cross_connect_mappings.0.oracle_bgp_peering_ip", "10.0.0.21/31"),
487+
resource.TestCheckResourceAttr(resourceName, "cross_connect_mappings.0.vlan", "200"),
488+
resource.TestCheckResourceAttr(resourceName, "customer_asn", "11"),
489+
resource.TestCheckResourceAttrSet(resourceName, "gateway_id"),
490+
resource.TestCheckResourceAttr(resourceName, "type", "PRIVATE"),
491+
492+
func(s *terraform.State) (err error) {
493+
resId, err = acctest.FromInstanceState(s, resourceName, "id")
494+
return err
495+
},
496+
),
497+
},
402498

403499
// delete before next Create
404500
{

internal/service/core/core_virtual_circuit_resource.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ func CoreVirtualCircuitResource() *schema.Resource {
7070
Type: schema.TypeString,
7171
Optional: true,
7272
Computed: true,
73+
Default: nil,
7374
},
7475
"customer_bgp_peering_ip": {
7576
Type: schema.TypeString,
@@ -97,6 +98,7 @@ func CoreVirtualCircuitResource() *schema.Resource {
9798
Type: schema.TypeInt,
9899
Optional: true,
99100
Computed: true,
101+
Default: nil,
100102
},
101103

102104
// Computed
@@ -348,7 +350,7 @@ func (s *CoreVirtualCircuitResourceCrud) Create() error {
348350
for i := range interfaces {
349351
stateDataIndex := i
350352
fieldKeyFormat := fmt.Sprintf("%s.%d.%%s", "cross_connect_mappings", stateDataIndex)
351-
converted, err := s.mapToCrossConnectMapping(fieldKeyFormat)
353+
converted, err := s.mapToCrossConnectMapping(fieldKeyFormat, false)
352354
if err != nil {
353355
return err
354356
}
@@ -551,7 +553,7 @@ func (s *CoreVirtualCircuitResourceCrud) Update() error {
551553
for i := range interfaces {
552554
stateDataIndex := i
553555
fieldKeyFormat := fmt.Sprintf("%s.%d.%%s", "cross_connect_mappings", stateDataIndex)
554-
converted, err := s.mapToCrossConnectMapping(fieldKeyFormat)
556+
converted, err := s.mapToCrossConnectMapping(fieldKeyFormat, true)
555557
if err != nil {
556558
return err
557559
}
@@ -870,8 +872,11 @@ func CreateVirtualCircuitPublicPrefixDetailsToMap(obj string) map[string]interfa
870872
return result
871873
}
872874

873-
func (s *CoreVirtualCircuitResourceCrud) mapToCrossConnectMapping(fieldKeyFormat string) (oci_core.CrossConnectMapping, error) {
875+
func (s *CoreVirtualCircuitResourceCrud) mapToCrossConnectMapping(fieldKeyFormat string, isUpdate bool) (oci_core.CrossConnectMapping, error) {
874876
result := oci_core.CrossConnectMapping{}
877+
_, hasProviderId := s.D.GetOkExists("provider_service_id")
878+
_, hasProviderName := s.D.GetOkExists("provider_service_name")
879+
isProvider := hasProviderId || hasProviderName
875880

876881
// Do not include default empty bgp_md5auth_key in request payload unless it has changed
877882
if bgpMd5AuthKey, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "bgp_md5auth_key")); ok &&
@@ -882,7 +887,8 @@ func (s *CoreVirtualCircuitResourceCrud) mapToCrossConnectMapping(fieldKeyFormat
882887

883888
// Do not include default empty cross_connect_or_cross_connect_group_id in request payload unless it has changed
884889
if crossConnectOrCrossConnectGroupId, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "cross_connect_or_cross_connect_group_id")); ok &&
885-
(crossConnectOrCrossConnectGroupId != "" || s.D.HasChange("cross_connect_or_cross_connect_group_id")) {
890+
((!isUpdate && crossConnectOrCrossConnectGroupId != "") || !isProvider) ||
891+
(isUpdate && s.D.HasChange("cross_connect_or_cross_connect_group_id")) {
886892
tmp := crossConnectOrCrossConnectGroupId.(string)
887893
result.CrossConnectOrCrossConnectGroupId = &tmp
888894
}
@@ -914,10 +920,10 @@ func (s *CoreVirtualCircuitResourceCrud) mapToCrossConnectMapping(fieldKeyFormat
914920
}
915921
}
916922

917-
if vlan, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "vlan")); ok || s.D.HasChange("vlan") {
923+
if vlan, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "vlan")); ok {
918924
tmp := vlan.(int)
919925
// Do not include default 0 vlan in request payload unless it has changed
920-
if tmp > 0 || s.D.HasChange("vlan") {
926+
if ((!isUpdate && tmp > 0) || !isProvider) || (isUpdate && s.D.HasChange("vlan")) {
921927
result.Vlan = &tmp
922928
}
923929
}

0 commit comments

Comments
 (0)