Skip to content

Commit 83b3e7d

Browse files
Adding ipv6 support for bgp router peer, router interface and router (#10375) (#7207)
[upstream:4838a3707d954dd1f8187968266ef7e4623d3416] Signed-off-by: Modular Magician <[email protected]>
1 parent 98dd33d commit 83b3e7d

10 files changed

+584
-2
lines changed

.changelog/10375.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
```release-note:enhancement
2+
compute: added `identifier_range` field to `google_compute_router` resource (beta)
3+
```
4+
```release-note:enhancement
5+
compute: added `ip_version` field to `google_compute_router_interface` resource (beta)
6+
```
7+
```release-note:enhancement
8+
compute: added `enable_ipv4`, `ipv4_nexthop_address` and `peer_ipv4_nexthop_address` fields to `google_compute_router_peer` resource (beta)
9+
```

google-beta/services/compute/resource_compute_router.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,16 @@ CIDR-formatted string.`,
153153
},
154154
},
155155
},
156+
"identifier_range": {
157+
Type: schema.TypeString,
158+
Computed: true,
159+
Optional: true,
160+
Description: `Explicitly specifies a range of valid BGP Identifiers for this Router.
161+
It is provided as a link-local IPv4 range (from 169.254.0.0/16), of
162+
size at least /30, even if the BGP sessions are over IPv6. It must
163+
not overlap with any IPv4 BGP session ranges. Other vendors commonly
164+
call this router ID.`,
165+
},
156166
"keepalive_interval": {
157167
Type: schema.TypeInt,
158168
Optional: true,
@@ -579,6 +589,8 @@ func flattenComputeRouterBgp(v interface{}, d *schema.ResourceData, config *tran
579589
flattenComputeRouterBgpAdvertisedIpRanges(original["advertisedIpRanges"], d, config)
580590
transformed["keepalive_interval"] =
581591
flattenComputeRouterBgpKeepaliveInterval(original["keepaliveInterval"], d, config)
592+
transformed["identifier_range"] =
593+
flattenComputeRouterBgpIdentifierRange(original["identifierRange"], d, config)
582594
return []interface{}{transformed}
583595
}
584596
func flattenComputeRouterBgpAsn(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
@@ -650,6 +662,10 @@ func flattenComputeRouterBgpKeepaliveInterval(v interface{}, d *schema.ResourceD
650662
return v // let terraform core handle it otherwise
651663
}
652664

665+
func flattenComputeRouterBgpIdentifierRange(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
666+
return v
667+
}
668+
653669
func flattenComputeRouterEncryptedInterconnectRouter(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
654670
return v
655671
}
@@ -721,6 +737,13 @@ func expandComputeRouterBgp(v interface{}, d tpgresource.TerraformResourceData,
721737
transformed["keepaliveInterval"] = transformedKeepaliveInterval
722738
}
723739

740+
transformedIdentifierRange, err := expandComputeRouterBgpIdentifierRange(original["identifier_range"], d, config)
741+
if err != nil {
742+
return nil, err
743+
} else if val := reflect.ValueOf(transformedIdentifierRange); val.IsValid() && !tpgresource.IsEmptyValue(val) {
744+
transformed["identifierRange"] = transformedIdentifierRange
745+
}
746+
724747
return transformed, nil
725748
}
726749

@@ -777,6 +800,10 @@ func expandComputeRouterBgpKeepaliveInterval(v interface{}, d tpgresource.Terraf
777800
return v, nil
778801
}
779802

803+
func expandComputeRouterBgpIdentifierRange(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
804+
return v, nil
805+
}
806+
780807
func expandComputeRouterEncryptedInterconnectRouter(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
781808
return v, nil
782809
}

google-beta/services/compute/resource_compute_router_bgp_peer_test.go

Lines changed: 215 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,48 @@ func TestAccComputeRouterPeer_Ipv6Basic(t *testing.T) {
208208
})
209209
}
210210

211+
func TestAccComputeRouterPeer_Ipv4BasicCreateUpdate(t *testing.T) {
212+
t.Parallel()
213+
214+
routerName := fmt.Sprintf("tf-test-router-%s", acctest.RandString(t, 10))
215+
resourceName := "google_compute_router_peer.foobar"
216+
acctest.VcrTest(t, resource.TestCase{
217+
PreCheck: func() { acctest.AccTestPreCheck(t) },
218+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderBetaFactories(t),
219+
CheckDestroy: testAccCheckComputeRouterPeerDestroyProducer(t),
220+
Steps: []resource.TestStep{
221+
{
222+
Config: testAccComputeRouterPeerIpv4(routerName),
223+
Check: resource.ComposeTestCheckFunc(
224+
testAccCheckComputeRouterPeerExists(
225+
t, resourceName),
226+
resource.TestCheckResourceAttr(resourceName, "enable_ipv4", "true"),
227+
),
228+
},
229+
{
230+
ResourceName: resourceName,
231+
ImportState: true,
232+
ImportStateVerify: true,
233+
},
234+
{
235+
Config: testAccComputeRouterPeerUpdateIpv4Address(routerName),
236+
Check: resource.ComposeTestCheckFunc(
237+
testAccCheckComputeRouterPeerExists(
238+
t, resourceName),
239+
resource.TestCheckResourceAttr(resourceName, "enable_ipv4", "true"),
240+
resource.TestCheckResourceAttr(resourceName, "ipv4_nexthop_address", "169.254.1.2"),
241+
resource.TestCheckResourceAttr(resourceName, "peer_ipv4_nexthop_address", "169.254.1.1"),
242+
),
243+
},
244+
{
245+
ResourceName: resourceName,
246+
ImportState: true,
247+
ImportStateVerify: true,
248+
},
249+
},
250+
})
251+
}
252+
211253
func TestAccComputeRouterPeer_UpdateIpv6Address(t *testing.T) {
212254
t.Parallel()
213255

@@ -1421,8 +1463,8 @@ resource "google_compute_router_peer" "foobar" {
14211463
peer_asn = 65515
14221464
advertised_route_priority = 100
14231465
interface = google_compute_router_interface.foobar.name
1424-
14251466
enable_ipv6 = %v
1467+
14261468
}
14271469
`, routerName, routerName, routerName, routerName, routerName, routerName, routerName, routerName, enableIpv6)
14281470
}
@@ -1497,10 +1539,181 @@ resource "google_compute_router_peer" "foobar" {
14971539
peer_asn = 65515
14981540
advertised_route_priority = 100
14991541
interface = google_compute_router_interface.foobar.name
1500-
15011542
enable_ipv6 = %v
15021543
ipv6_nexthop_address = "2600:2d00:0000:0002:0000:0000:0000:0001"
15031544
peer_ipv6_nexthop_address = "2600:2d00:0:2::2"
15041545
}
15051546
`, routerName, routerName, routerName, routerName, routerName, routerName, routerName, routerName, enableIpv6)
15061547
}
1548+
1549+
func testAccComputeRouterPeerIpv4(routerName string) string {
1550+
return fmt.Sprintf(`resource "google_compute_network" "foobar" {
1551+
provider = google-beta
1552+
name = "%s-net"
1553+
auto_create_subnetworks = false
1554+
}
1555+
1556+
resource "google_compute_subnetwork" "foobar" {
1557+
provider = google-beta
1558+
name = "%s-subnet"
1559+
network = google_compute_network.foobar.self_link
1560+
ip_cidr_range = "10.0.0.0/16"
1561+
region = "us-central1"
1562+
stack_type = "IPV4_IPV6"
1563+
ipv6_access_type = "EXTERNAL"
1564+
}
1565+
1566+
resource "google_compute_ha_vpn_gateway" "foobar" {
1567+
provider = google-beta
1568+
name = "%s-gateway"
1569+
network = google_compute_network.foobar.self_link
1570+
region = google_compute_subnetwork.foobar.region
1571+
stack_type = "IPV4_IPV6"
1572+
}
1573+
1574+
resource "google_compute_external_vpn_gateway" "external_gateway" {
1575+
provider = google-beta
1576+
name = "%s-external-gateway"
1577+
redundancy_type = "SINGLE_IP_INTERNALLY_REDUNDANT"
1578+
description = "An externally managed VPN gateway"
1579+
interface {
1580+
id = 0
1581+
ip_address = "8.8.8.8"
1582+
}
1583+
}
1584+
1585+
resource "google_compute_router" "foobar" {
1586+
provider = google-beta
1587+
name = "%s"
1588+
region = google_compute_subnetwork.foobar.region
1589+
network = google_compute_network.foobar.self_link
1590+
bgp {
1591+
asn = 64514
1592+
}
1593+
}
1594+
1595+
resource "google_compute_vpn_tunnel" "foobar" {
1596+
provider = google-beta
1597+
name = "%s-tunnel"
1598+
region = google_compute_subnetwork.foobar.region
1599+
vpn_gateway = google_compute_ha_vpn_gateway.foobar.id
1600+
peer_external_gateway = google_compute_external_vpn_gateway.external_gateway.id
1601+
peer_external_gateway_interface = 0
1602+
shared_secret = "unguessable"
1603+
router = google_compute_router.foobar.name
1604+
vpn_gateway_interface = 0
1605+
}
1606+
1607+
resource "google_compute_router_interface" "foobar" {
1608+
provider = google-beta
1609+
name = "%s-interface"
1610+
router = google_compute_router.foobar.name
1611+
region = google_compute_router.foobar.region
1612+
vpn_tunnel = google_compute_vpn_tunnel.foobar.name
1613+
ip_range = "fdff:1::1:1/126"
1614+
}
1615+
1616+
resource "google_compute_router_peer" "foobar" {
1617+
provider = google-beta
1618+
name = "%s-peer"
1619+
router = google_compute_router.foobar.name
1620+
region = google_compute_router.foobar.region
1621+
peer_asn = 65515
1622+
advertised_route_priority = 100
1623+
interface = google_compute_router_interface.foobar.name
1624+
ip_address = "fdff:1::1:1"
1625+
peer_ip_address = "fdff:1::1:2"
1626+
1627+
enable_ipv4 = true
1628+
enable_ipv6 = true
1629+
ipv4_nexthop_address = "169.254.1.1"
1630+
peer_ipv4_nexthop_address = "169.254.1.2"
1631+
}
1632+
`, routerName, routerName, routerName, routerName, routerName, routerName, routerName, routerName)
1633+
}
1634+
1635+
func testAccComputeRouterPeerUpdateIpv4Address(routerName string) string {
1636+
return fmt.Sprintf(`resource "google_compute_network" "foobar" {
1637+
provider = google-beta
1638+
name = "%s-net"
1639+
auto_create_subnetworks = false
1640+
}
1641+
1642+
resource "google_compute_subnetwork" "foobar" {
1643+
provider = google-beta
1644+
name = "%s-subnet"
1645+
network = google_compute_network.foobar.self_link
1646+
ip_cidr_range = "10.0.0.0/16"
1647+
region = "us-central1"
1648+
stack_type = "IPV4_IPV6"
1649+
ipv6_access_type = "EXTERNAL"
1650+
}
1651+
1652+
resource "google_compute_ha_vpn_gateway" "foobar" {
1653+
provider = google-beta
1654+
name = "%s-gateway"
1655+
network = google_compute_network.foobar.self_link
1656+
region = google_compute_subnetwork.foobar.region
1657+
stack_type = "IPV4_IPV6"
1658+
}
1659+
1660+
resource "google_compute_external_vpn_gateway" "external_gateway" {
1661+
provider = google-beta
1662+
name = "%s-external-gateway"
1663+
redundancy_type = "SINGLE_IP_INTERNALLY_REDUNDANT"
1664+
description = "An externally managed VPN gateway"
1665+
interface {
1666+
id = 0
1667+
ip_address = "8.8.8.8"
1668+
}
1669+
}
1670+
1671+
resource "google_compute_router" "foobar" {
1672+
provider = google-beta
1673+
name = "%s"
1674+
region = google_compute_subnetwork.foobar.region
1675+
network = google_compute_network.foobar.self_link
1676+
bgp {
1677+
asn = 64514
1678+
}
1679+
}
1680+
1681+
resource "google_compute_vpn_tunnel" "foobar" {
1682+
provider = google-beta
1683+
name = "%s-tunnel"
1684+
region = google_compute_subnetwork.foobar.region
1685+
vpn_gateway = google_compute_ha_vpn_gateway.foobar.id
1686+
peer_external_gateway = google_compute_external_vpn_gateway.external_gateway.id
1687+
peer_external_gateway_interface = 0
1688+
shared_secret = "unguessable"
1689+
router = google_compute_router.foobar.name
1690+
vpn_gateway_interface = 0
1691+
}
1692+
1693+
resource "google_compute_router_interface" "foobar" {
1694+
provider = google-beta
1695+
name = "%s-interface"
1696+
router = google_compute_router.foobar.name
1697+
region = google_compute_router.foobar.region
1698+
vpn_tunnel = google_compute_vpn_tunnel.foobar.name
1699+
ip_range = "fdff:1::1:1/126"
1700+
}
1701+
1702+
resource "google_compute_router_peer" "foobar" {
1703+
provider = google-beta
1704+
name = "%s-peer"
1705+
router = google_compute_router.foobar.name
1706+
region = google_compute_router.foobar.region
1707+
peer_asn = 65515
1708+
advertised_route_priority = 100
1709+
interface = google_compute_router_interface.foobar.name
1710+
ip_address = "fdff:1::1:1"
1711+
peer_ip_address = "fdff:1::1:2"
1712+
1713+
enable_ipv4 = true
1714+
enable_ipv6 = true
1715+
ipv4_nexthop_address = "169.254.1.2"
1716+
peer_ipv4_nexthop_address = "169.254.1.1"
1717+
}
1718+
`, routerName, routerName, routerName, routerName, routerName, routerName, routerName, routerName)
1719+
}

google-beta/services/compute/resource_compute_router_interface.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff"
1616
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
17+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/verify"
1718
"google.golang.org/api/googleapi"
1819

1920
compute "google.golang.org/api/compute/v0.beta"
@@ -77,6 +78,14 @@ func ResourceComputeRouterInterface() *schema.Resource {
7778
AtLeastOneOf: []string{"ip_range", "interconnect_attachment", "subnetwork", "vpn_tunnel"},
7879
Description: `The IP address and range of the interface. The IP range must be in the RFC3927 link-local IP space. Changing this forces a new interface to be created.`,
7980
},
81+
"ip_version": {
82+
Type: schema.TypeString,
83+
Optional: true,
84+
ForceNew: true,
85+
Computed: true,
86+
ValidateFunc: verify.ValidateEnum([]string{"IPV4", "IPV6"}),
87+
Description: `IP version of this interface.`,
88+
},
8089
"private_ip_address": {
8190
Type: schema.TypeString,
8291
Optional: true,
@@ -175,6 +184,10 @@ func resourceComputeRouterInterfaceCreate(d *schema.ResourceData, meta interface
175184
iface.IpRange = ipRangeVal.(string)
176185
}
177186

187+
if ipVersionVal, ok := d.GetOk("ip_version"); ok {
188+
iface.IpVersion = ipVersionVal.(string)
189+
}
190+
178191
if privateIpVal, ok := d.GetOk("private_ip_address"); ok {
179192
iface.PrivateIpAddress = privateIpVal.(string)
180193
}
@@ -266,6 +279,9 @@ func resourceComputeRouterInterfaceRead(d *schema.ResourceData, meta interface{}
266279
if err := d.Set("ip_range", iface.IpRange); err != nil {
267280
return fmt.Errorf("Error setting ip_range: %s", err)
268281
}
282+
if err := d.Set("ip_version", iface.IpVersion); err != nil {
283+
return fmt.Errorf("Error setting ip_version: %s", err)
284+
}
269285
if err := d.Set("private_ip_address", iface.PrivateIpAddress); err != nil {
270286
return fmt.Errorf("Error setting private_ip_address: %s", err)
271287
}

0 commit comments

Comments
 (0)