Skip to content

Commit a18b7a3

Browse files
Terraform - Cannot change bgp_best_path_selection_mode (#15648)
1 parent 8063866 commit a18b7a3

File tree

6 files changed

+160
-13
lines changed

6 files changed

+160
-13
lines changed

mmv1/products/compute/Network.yaml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,12 @@ examples:
8282
network_name: 'vpc-network'
8383
test_env_vars:
8484
project: 'PROJECT_NAME'
85+
- name: 'network_bgp_standard_mode_delete_med'
86+
primary_resource_id: 'vpc_network'
87+
vars:
88+
network_name: 'vpc-network'
89+
test_env_vars:
90+
project: 'PROJECT_NAME'
8591
virtual_fields:
8692
- name: 'delete_default_routes_on_create'
8793
description: |
@@ -200,6 +206,16 @@ properties:
200206
- 'DEFAULT'
201207
- 'ADD_COST_TO_MED'
202208
is_missing_in_cai: true
209+
- name: 'delete_bgp_always_compare_med'
210+
type: Boolean
211+
default_value: false
212+
update_verb: 'PATCH'
213+
update_url: 'projects/{{project}}/global/networks/{{name}}'
214+
custom_flatten: 'templates/terraform/custom_flatten/compute_network_delete_bgp_always_compare_med.go.tmpl'
215+
description: |
216+
If set to `true`, the `bgp_always_compare_med` field will be cleared.
217+
If set to `false` (the default), `bgp_always_compare_med` will be set to the value specified in the configuration.
218+
ignore_read: true
203219
- name: 'mtu'
204220
type: Integer
205221
description: |
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// The API does not return this field, so we must read it from the
2+
// local state to prevent perpetual diffs.
3+
func flattenComputeNetworkRoutingConfigDeleteBgpAlwaysCompareMed(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
4+
return d.Get("delete_bgp_always_compare_med")
5+
}
Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,18 @@
1-
delete(obj, "numeric_id") // Field doesn't exist in the API
2-
return obj, nil
1+
// BGP always-compare-med
2+
_, ok := obj["routingConfig"].(map[string]interface{})
3+
if ok {
4+
obj["routingConfig"].(map[string]interface{})["deleteBgpAlwaysCompareMed"] = d.Get("delete_bgp_always_compare_med").(bool)
5+
6+
bgpAlwaysCompareMed := d.Get("bgp_always_compare_med").(bool)
7+
if d.Get("delete_bgp_always_compare_med").(bool) {
8+
if bgpAlwaysCompareMed {
9+
return nil, fmt.Errorf("Cannot set BgpAlwaysCompareMed to true while DeleteBgpAlwaysCompareMed is also true")
10+
}
11+
obj["routingConfig"].(map[string]interface{})["bgpAlwaysCompareMed"] = nil
12+
} else if _, present := d.GetOkExists("bgp_always_compare_med"); present {
13+
obj["routingConfig"].(map[string]interface{})["bgpAlwaysCompareMed"] = d.Get("bgp_always_compare_med").(bool)
14+
}
15+
}
16+
// now clean up the rest
17+
delete(obj, "numeric_id")
18+
return obj, nil
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
resource "google_compute_network" "vpc_network" {
2+
name = "{{index $.Vars "network_name"}}"
3+
auto_create_subnetworks = false
4+
routing_mode = "GLOBAL"
5+
project = "{{index $.TestEnvVars "project"}}"
6+
bgp_best_path_selection_mode = "LEGACY"
7+
bgp_always_compare_med = false
8+
# By setting this to true, any previous value for bgp_always_compare_med
9+
# will be cleared, reverting it to the API default.
10+
delete_bgp_always_compare_med = true
11+
}
Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
1-
// BGP always-compare-med
2-
if d.HasChange("bgp_always_compare_med") {
3-
if _, ok := obj["routingConfig"]; !ok {
4-
obj["routingConfig"] = make(map[string]interface{})
5-
}
6-
obj["routingConfig"].(map[string]interface{})["bgpAlwaysCompareMed"] = d.Get("bgp_always_compare_med").(bool)
7-
}
8-
9-
// now clean up the rest
10-
delete(obj, "numeric_id")
11-
return obj, nil
1+
// BGP always-compare-med
2+
_, ok := obj["routingConfig"].(map[string]interface{})
3+
if ok {
4+
obj["routingConfig"].(map[string]interface{})["deleteBgpAlwaysCompareMed"] = d.Get("delete_bgp_always_compare_med").(bool)
125

6+
bgpAlwaysCompareMed := d.Get("bgp_always_compare_med").(bool)
7+
if d.Get("delete_bgp_always_compare_med").(bool) {
8+
if bgpAlwaysCompareMed {
9+
return nil, fmt.Errorf("Cannot set BgpAlwaysCompareMed to true while DeleteBgpAlwaysCompareMed is also true")
10+
}
11+
obj["routingConfig"].(map[string]interface{})["bgpAlwaysCompareMed"] = nil
12+
} else if d.HasChange("bgp_always_compare_med") {
13+
obj["routingConfig"].(map[string]interface{})["bgpAlwaysCompareMed"] = d.Get("bgp_always_compare_med").(bool)
14+
}
15+
}
16+
// now clean up the rest
17+
delete(obj, "numeric_id")
18+
return obj, nil

mmv1/third_party/terraform/services/compute/resource_compute_network_test.go.tmpl

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,79 @@ func testAccCheckComputeNetworkWasUpdated(newNetwork *compute.Network, oldNetwor
775775
}
776776
}
777777

778+
func TestAccComputeNetwork_bgpModeAndMedInteractions(t *testing.T) {
779+
t.Parallel()
780+
781+
network := "google_compute_network.vpc_network"
782+
netName := fmt.Sprintf("tf-bgp-int-%s", acctest.RandString(t, 10))
783+
784+
acctest.VcrTest(t, resource.TestCase{
785+
PreCheck: func() { acctest.AccTestPreCheck(t) },
786+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
787+
CheckDestroy: testAccCheckComputeNetworkDestroyProducer(t),
788+
Steps: []resource.TestStep{
789+
{
790+
Config: testAccComputeNetwork_bgp(netName, "STANDARD", "true", ""),
791+
Check: resource.ComposeTestCheckFunc(
792+
resource.TestCheckResourceAttr(network, "bgp_best_path_selection_mode", "STANDARD"),
793+
resource.TestCheckResourceAttr(network, "bgp_always_compare_med", "true"),
794+
),
795+
},
796+
{
797+
Config: testAccComputeNetwork_bgp(netName, "STANDARD", "false", ""),
798+
Check: resource.ComposeTestCheckFunc(
799+
resource.TestCheckResourceAttr(network, "bgp_always_compare_med", "false"),
800+
),
801+
},
802+
{
803+
Config: testAccComputeNetwork_bgp(netName, "LEGACY", "", ""),
804+
// Expect an API error because bgp_always_compare_med cannot be set when switching to LEGACY
805+
ExpectError: regexp.MustCompile("Field bgp_always_compare_med is not supported for LEGACY BGP Best Path Selection algorithm"),
806+
},
807+
{
808+
Config: testAccComputeNetwork_bgp(netName, "LEGACY", "", "true"),
809+
Check: resource.ComposeTestCheckFunc(
810+
resource.TestCheckResourceAttr(network, "bgp_best_path_selection_mode", "LEGACY"),
811+
resource.TestCheckResourceAttr(network, "bgp_always_compare_med", "false"),
812+
),
813+
},
814+
},
815+
})
816+
}
817+
818+
func TestAccComputeNetwork_networkBgpStandardModeDeleteMed(t *testing.T) {
819+
t.Parallel()
820+
821+
network := "google_compute_network.vpc_network"
822+
netName := fmt.Sprintf("tf-bgp-del-%s", acctest.RandString(t, 10))
823+
824+
acctest.VcrTest(t, resource.TestCase{
825+
PreCheck: func() { acctest.AccTestPreCheck(t) },
826+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
827+
CheckDestroy: testAccCheckComputeNetworkDestroyProducer(t),
828+
Steps: []resource.TestStep{
829+
{
830+
Config: testAccComputeNetwork_bgp(netName, "STANDARD", "true", ""),
831+
Check: resource.TestCheckResourceAttr(network, "bgp_always_compare_med", "true"),
832+
},
833+
{
834+
ResourceName: network,
835+
ImportState: true,
836+
ImportStateVerify: true,
837+
ImportStateVerifyIgnore: []string{"params", "delete_bgp_always_compare_med"},
838+
},
839+
{
840+
Config: testAccComputeNetwork_bgp(netName, "STANDARD", "true", "true"),
841+
ExpectError: regexp.MustCompile("Cannot set BgpAlwaysCompareMed to true while DeleteBgpAlwaysCompareMed is also true"),
842+
},
843+
{
844+
Config: testAccComputeNetwork_bgp(netName, "STANDARD", "false", "true"),
845+
Check: resource.TestCheckResourceAttr(network, "bgp_always_compare_med", "false"),
846+
},
847+
},
848+
})
849+
}
850+
778851
func testAccComputeNetwork_basic(networkName string) string {
779852
return fmt.Sprintf(`
780853
resource "google_compute_network" "bar" {
@@ -793,6 +866,26 @@ resource "google_compute_network" "baz" {
793866
`, networkName)
794867
}
795868

869+
func testAccComputeNetwork_bgp(name, bgpBestPathSelectionMode, bgpAlwaysCompareMed, deleteBgpAlwaysCompareMed string) string {
870+
var medLine, deleteMedLine string
871+
if bgpAlwaysCompareMed != "" {
872+
medLine = fmt.Sprintf(" bgp_always_compare_med = %s\n", bgpAlwaysCompareMed)
873+
}
874+
if deleteBgpAlwaysCompareMed != "" {
875+
deleteMedLine = fmt.Sprintf(" delete_bgp_always_compare_med = %s\n", deleteBgpAlwaysCompareMed)
876+
}
877+
878+
return fmt.Sprintf(`
879+
resource "google_compute_network" "vpc_network" {
880+
name = "%s"
881+
auto_create_subnetworks = false
882+
routing_mode = "GLOBAL"
883+
project = "%s"
884+
bgp_best_path_selection_mode = "%s"
885+
%s%s}
886+
`, name, envvar.GetTestProjectFromEnv(), bgpBestPathSelectionMode, medLine, deleteMedLine)
887+
}
888+
796889
func testAccComputeNetwork_mtu(networkName string, mtu int32) string {
797890
return fmt.Sprintf(`
798891
resource "google_compute_network" "acc_network_mtu" {

0 commit comments

Comments
 (0)