Skip to content

Commit cd8f297

Browse files
Add google_compute_router_status data source (#5307) (#10573)
Signed-off-by: Modular Magician <[email protected]>
1 parent d152a2c commit cd8f297

6 files changed

+358
-0
lines changed

.changelog/5307.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:new-datasource
2+
compute: New `google_compute_router_status` data source
3+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package google
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
7+
"google.golang.org/api/compute/v1"
8+
)
9+
10+
func dataSourceGoogleComputeRouterStatus() *schema.Resource {
11+
routeElemSchema := datasourceSchemaFromResourceSchema(resourceComputeRoute().Schema)
12+
13+
return &schema.Resource{
14+
Read: dataSourceComputeRouterStatusRead,
15+
Schema: map[string]*schema.Schema{
16+
"name": {
17+
Type: schema.TypeString,
18+
Description: "Name of the router to query.",
19+
Required: true,
20+
Computed: false,
21+
},
22+
"project": {
23+
Type: schema.TypeString,
24+
Description: "Project ID of the target router.",
25+
Optional: true,
26+
Computed: false,
27+
},
28+
"region": {
29+
Type: schema.TypeString,
30+
Description: "Region of the target router.",
31+
Optional: true,
32+
Computed: true,
33+
},
34+
"network": {
35+
Type: schema.TypeString,
36+
Description: "URI of the network to which this router belongs.",
37+
Computed: true,
38+
},
39+
"best_routes": {
40+
Type: schema.TypeList,
41+
Description: "Best routes for this router's network.",
42+
Elem: &schema.Resource{
43+
Schema: routeElemSchema,
44+
},
45+
Computed: true,
46+
},
47+
"best_routes_for_router": {
48+
Type: schema.TypeList,
49+
Description: "Best routes learned by this router.",
50+
Elem: &schema.Resource{
51+
Schema: routeElemSchema,
52+
},
53+
Computed: true,
54+
},
55+
},
56+
}
57+
}
58+
59+
func dataSourceComputeRouterStatusRead(d *schema.ResourceData, meta interface{}) error {
60+
config := meta.(*Config)
61+
userAgent, err := generateUserAgentString(d, config.userAgent)
62+
if err != nil {
63+
return err
64+
}
65+
66+
project, err := getProject(d, config)
67+
if err != nil {
68+
return err
69+
}
70+
71+
region, err := getRegion(d, config)
72+
if err != nil {
73+
return err
74+
}
75+
76+
var name string
77+
if n, ok := d.GetOk("name"); ok {
78+
name = n.(string)
79+
}
80+
81+
resp, err := config.NewComputeClient(userAgent).Routers.GetRouterStatus(project, region, name).Do()
82+
if err != nil {
83+
return err
84+
}
85+
86+
status := resp.Result
87+
88+
if err := d.Set("network", status.Network); err != nil {
89+
return fmt.Errorf("Error setting network: %s", err)
90+
}
91+
92+
if err := d.Set("best_routes", flattenRoutes(status.BestRoutes)); err != nil {
93+
return fmt.Errorf("Error setting best_routes: %s", err)
94+
}
95+
96+
if err := d.Set("best_routes_for_router", flattenRoutes(status.BestRoutesForRouter)); err != nil {
97+
return fmt.Errorf("Error setting best_routes_for_router: %s", err)
98+
}
99+
100+
id, err := replaceVars(d, config, "projects/{{project}}/regions/{{region}}/routers/{{name}}")
101+
if err != nil {
102+
return fmt.Errorf("Error constructing id: %s", err)
103+
}
104+
d.SetId(id)
105+
106+
return nil
107+
}
108+
109+
func flattenRoutes(routes []*compute.Route) []map[string]interface{} {
110+
results := make([]map[string]interface{}, len(routes))
111+
112+
for i, route := range routes {
113+
results[i] = map[string]interface{}{
114+
"dest_range": route.DestRange,
115+
"name": route.Name,
116+
"network": route.Network,
117+
"description": route.Description,
118+
"next_hop_gateway": route.NextHopGateway,
119+
"next_hop_ilb": route.NextHopIlb,
120+
"next_hop_ip": route.NextHopIp,
121+
"next_hop_vpn_tunnel": route.NextHopVpnTunnel,
122+
"priority": route.Priority,
123+
"tags": route.Tags,
124+
"next_hop_network": route.NextHopNetwork,
125+
}
126+
}
127+
128+
return results
129+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
package google
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
func TestAccDataSourceComputeRouterStatus(t *testing.T) {
10+
t.Parallel()
11+
12+
context := map[string]interface{}{
13+
"suffix": randString(t, 10),
14+
"region": "us-central1",
15+
}
16+
17+
vcrTest(t, resource.TestCase{
18+
PreCheck: func() { testAccPreCheck(t) },
19+
Providers: testAccProviders,
20+
ExternalProviders: map[string]resource.ExternalProvider{
21+
"time": {},
22+
},
23+
CheckDestroy: testAccCheckComputeRouterDestroyProducer(t),
24+
Steps: []resource.TestStep{
25+
{
26+
Config: testAccDataSourceComputeRouterStatusConfig(context),
27+
Check: resource.ComposeTestCheckFunc(
28+
resource.TestCheckResourceAttrPair("data.google_compute_router_status.router1", "name", "google_compute_router.router1", "name"),
29+
resource.TestCheckResourceAttrPair("data.google_compute_router_status.router1", "region", "google_compute_router.router1", "region"),
30+
resource.TestCheckResourceAttrSet("data.google_compute_router_status.router1", "network"),
31+
resource.TestCheckResourceAttr("data.google_compute_router_status.router1", "best_routes.#", "2"),
32+
resource.TestCheckResourceAttr("data.google_compute_router_status.router1", "best_routes_for_router.#", "2"),
33+
resource.TestCheckResourceAttrPair("data.google_compute_router_status.router1", "best_routes.0.next_hop_ip", "google_compute_router_peer.router1_peer1", "peer_ip_address"),
34+
resource.TestCheckResourceAttrSet("data.google_compute_router_status.router1", "best_routes.0.next_hop_vpn_tunnel"),
35+
),
36+
},
37+
},
38+
})
39+
}
40+
41+
func testAccDataSourceComputeRouterStatusConfig(context map[string]interface{}) string {
42+
return Nprintf(`
43+
resource "google_compute_network" "network1" {
44+
name = "network1-%{suffix}"
45+
routing_mode = "GLOBAL"
46+
auto_create_subnetworks = false
47+
}
48+
49+
resource "google_compute_network" "network2" {
50+
name = "network2-%{suffix}"
51+
routing_mode = "GLOBAL"
52+
auto_create_subnetworks = false
53+
}
54+
55+
resource "google_compute_subnetwork" "network2_subnet1" {
56+
name = "ha-vpn-subnet-1-%{suffix}"
57+
ip_cidr_range = "192.168.1.0/24"
58+
region = "%{region}"
59+
network = google_compute_network.network2.id
60+
}
61+
62+
resource "google_compute_subnetwork" "network2_subnet2" {
63+
name = "ha-vpn-subnet-2-%{suffix}"
64+
ip_cidr_range = "192.168.2.0/24"
65+
region = "us-east1"
66+
network = google_compute_network.network2.id
67+
}
68+
69+
resource "google_compute_router" "router1" {
70+
name = "tf-test-ha-vpn-router1-%{suffix}"
71+
network = google_compute_network.network1.name
72+
region = "%{region}"
73+
bgp {
74+
asn = 64514
75+
}
76+
}
77+
78+
resource "google_compute_router" "router2" {
79+
name = "tf-test-ha-vpn-router2-%{suffix}"
80+
network = google_compute_network.network2.name
81+
region = "%{region}"
82+
bgp {
83+
asn = 64515
84+
}
85+
}
86+
87+
resource "google_compute_ha_vpn_gateway" "ha_gateway1" {
88+
region = "%{region}"
89+
name = "tf-test-ha-vpn-1-%{suffix}"
90+
network = google_compute_network.network1.id
91+
}
92+
93+
resource "google_compute_ha_vpn_gateway" "ha_gateway2" {
94+
region = "%{region}"
95+
name = "tf-test-ha-vpn-2-%{suffix}"
96+
network = google_compute_network.network2.id
97+
}
98+
99+
resource "google_compute_vpn_tunnel" "tunnel1" {
100+
name = "ha-vpn-tunnel1-%{suffix}"
101+
region = "%{region}"
102+
vpn_gateway = google_compute_ha_vpn_gateway.ha_gateway1.id
103+
peer_gcp_gateway = google_compute_ha_vpn_gateway.ha_gateway2.id
104+
shared_secret = "a secret message"
105+
router = google_compute_router.router1.id
106+
vpn_gateway_interface = 0
107+
}
108+
109+
resource "google_compute_vpn_tunnel" "tunnel2" {
110+
name = "ha-vpn-tunnel2-%{suffix}"
111+
region = "%{region}"
112+
vpn_gateway = google_compute_ha_vpn_gateway.ha_gateway2.id
113+
peer_gcp_gateway = google_compute_ha_vpn_gateway.ha_gateway1.id
114+
shared_secret = "a secret message"
115+
router = google_compute_router.router2.id
116+
vpn_gateway_interface = 0
117+
}
118+
119+
resource "google_compute_router_interface" "router1_interface1" {
120+
name = "router1-interface1-%{suffix}"
121+
router = google_compute_router.router1.name
122+
region = "%{region}"
123+
ip_range = "169.254.0.1/30"
124+
vpn_tunnel = google_compute_vpn_tunnel.tunnel1.name
125+
}
126+
127+
resource "google_compute_router_peer" "router1_peer1" {
128+
name = "router1-peer1-%{suffix}"
129+
router = google_compute_router.router1.name
130+
region = "%{region}"
131+
peer_ip_address = "169.254.0.2"
132+
peer_asn = 64515
133+
advertised_route_priority = 100
134+
interface = google_compute_router_interface.router1_interface1.name
135+
}
136+
137+
resource "google_compute_router_interface" "router2_interface1" {
138+
name = "router2-interface1-%{suffix}"
139+
router = google_compute_router.router2.name
140+
region = "%{region}"
141+
ip_range = "169.254.0.2/30"
142+
vpn_tunnel = google_compute_vpn_tunnel.tunnel2.name
143+
}
144+
145+
resource "google_compute_router_peer" "router2_peer1" {
146+
name = "router2-peer1-%{suffix}"
147+
router = google_compute_router.router2.name
148+
region = "%{region}"
149+
peer_ip_address = "169.254.0.1"
150+
peer_asn = 64514
151+
advertised_route_priority = 100
152+
interface = google_compute_router_interface.router2_interface1.name
153+
}
154+
155+
resource "time_sleep" "wait_60_seconds" {
156+
create_duration = "60s"
157+
158+
depends_on = [
159+
google_compute_router_peer.router1_peer1,
160+
google_compute_router_peer.router2_peer1,
161+
]
162+
}
163+
164+
data "google_compute_router_status" "router1" {
165+
name = google_compute_router.router1.name
166+
region = google_compute_router.router1.region
167+
168+
depends_on = [time_sleep.wait_60_seconds]
169+
}
170+
`, context)
171+
172+
}

google/provider.go

+1
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,7 @@ func Provider() *schema.Provider {
736736
"google_compute_region_ssl_certificate": dataSourceGoogleRegionComputeSslCertificate(),
737737
"google_compute_resource_policy": dataSourceGoogleComputeResourcePolicy(),
738738
"google_compute_router": dataSourceGoogleComputeRouter(),
739+
"google_compute_router_status": dataSourceGoogleComputeRouterStatus(),
739740
"google_compute_ssl_certificate": dataSourceGoogleComputeSslCertificate(),
740741
"google_compute_ssl_policy": dataSourceGoogleComputeSslPolicy(),
741742
"google_compute_subnetwork": dataSourceGoogleComputeSubnetwork(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
---
2+
layout: "google"
3+
subcategory: "Compute Engine"
4+
page_title: "Google: google_compute_router"
5+
sidebar_current: "docs-google-datasource-compute-router-status"
6+
description: |-
7+
Get a Cloud Router's Status.
8+
---
9+
10+
# google\_compute\_router\_status
11+
12+
Get a Cloud Router's status within GCE from its name and region. This data source exposes the
13+
routes learned by a Cloud Router via BGP peers.
14+
15+
For more information see [the official documentation](https://cloud.google.com/network-connectivity/docs/router/how-to/viewing-router-details)
16+
and
17+
[API](https://cloud.google.com/compute/docs/reference/rest/v1/routers/getRouterStatus).
18+
19+
## Example Usage
20+
21+
```hcl
22+
data "google_compute_router_status" "my-router" {
23+
name = "myrouter"
24+
}
25+
```
26+
27+
## Argument Reference
28+
29+
The following arguments are supported:
30+
31+
* `name` - (Required) The name of the router.
32+
33+
* `project` - (Optional) The ID of the project in which the resource
34+
belongs. If it is not provided, the provider project is used.
35+
36+
* `region` - (Optional) The region this router has been created in. If
37+
unspecified, this defaults to the region configured in the provider.
38+
39+
40+
## Attributes Reference
41+
42+
In addition to the arguments listed above, the following attributes are exported:
43+
44+
* `network` - The network name or resource link to the parent
45+
network of this subnetwork.
46+
47+
* `best_routes` - List of best `compute#routes` configurations for this router's network. See [google_compute_route](https://www.terraform.io/docs/providers/google/r/compute_route.html) resource for available attributes.
48+
49+
* `best_routes_for_router` - List of best `compute#routes` for this specific router. See [google_compute_route](https://www.terraform.io/docs/providers/google/r/compute_route.html) resource for available attributes.

website/google.erb

+4
Original file line numberDiff line numberDiff line change
@@ -1685,6 +1685,10 @@
16851685
<a href="/docs/providers/google/d/compute_router.html">google_compute_router</a>
16861686
</li>
16871687

1688+
<li>
1689+
<a href="/docs/providers/google/d/compute_router_status.html">google_compute_router</a>
1690+
</li>
1691+
16881692
<li>
16891693
<a href="/docs/providers/google/d/compute_ssl_certificate.html">google_compute_ssl_certificate</a>
16901694
</li>

0 commit comments

Comments
 (0)