Skip to content

Commit 9a6b6d5

Browse files
Adding data source to list compute routers
1 parent 57e2a04 commit 9a6b6d5

File tree

4 files changed

+234
-0
lines changed

4 files changed

+234
-0
lines changed

mmv1/third_party/terraform/provider/provider_mmv1_resources.go.tmpl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ var handwrittenDatasources = map[string]*schema.Resource{
137137
"google_compute_reservation_sub_block": compute.DataSourceGoogleComputeReservationSubBlock(),
138138
"google_compute_resource_policy": compute.DataSourceGoogleComputeResourcePolicy(),
139139
"google_compute_router": compute.DataSourceGoogleComputeRouter(),
140+
"google_compute_routers": compute.DataSourceGoogleComputeRouters(),
140141
"google_compute_router_nat": compute.DataSourceGoogleComputeRouterNat(),
141142
"google_compute_router_status": compute.DataSourceGoogleComputeRouterStatus(),
142143
"google_compute_security_policy": compute.DataSourceGoogleComputeSecurityPolicy(),
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
package compute
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
7+
"github.com/hashicorp/terraform-provider-google/google/tpgresource"
8+
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
9+
)
10+
11+
func DataSourceGoogleComputeRouters() *schema.Resource {
12+
return &schema.Resource{
13+
Read: dataSourceGoogleComputeRoutersRead,
14+
Schema: map[string]*schema.Schema{
15+
"project": {
16+
Type: schema.TypeString,
17+
Optional: true,
18+
Computed: true,
19+
},
20+
"region": {
21+
Type: schema.TypeString,
22+
Optional: true,
23+
Computed: true,
24+
},
25+
"routers": {
26+
Type: schema.TypeList,
27+
Computed: true,
28+
Elem: &schema.Resource{
29+
Schema: map[string]*schema.Schema{
30+
"name": {
31+
Type: schema.TypeString,
32+
Computed: true,
33+
},
34+
"network": {
35+
Type: schema.TypeString,
36+
Computed: true,
37+
},
38+
"description": {
39+
Type: schema.TypeString,
40+
Computed: true,
41+
},
42+
"self_link": {
43+
Type: schema.TypeString,
44+
Computed: true,
45+
},
46+
"bgp": {
47+
Type: schema.TypeList,
48+
Computed: true,
49+
Elem: &schema.Resource{
50+
Schema: map[string]*schema.Schema{
51+
"asn": {
52+
Type: schema.TypeInt,
53+
Computed: true,
54+
},
55+
"advertise_mode": {
56+
Type: schema.TypeString,
57+
Computed: true,
58+
},
59+
"advertised_groups": {
60+
Type: schema.TypeList,
61+
Computed: true,
62+
Elem: &schema.Schema{Type: schema.TypeString},
63+
},
64+
"advertised_ip_ranges": {
65+
Type: schema.TypeList,
66+
Computed: true,
67+
Elem: &schema.Resource{
68+
Schema: map[string]*schema.Schema{
69+
"range": {
70+
Type: schema.TypeString,
71+
Computed: true,
72+
},
73+
"description": {
74+
Type: schema.TypeString,
75+
Computed: true,
76+
},
77+
},
78+
},
79+
},
80+
},
81+
},
82+
},
83+
},
84+
},
85+
},
86+
},
87+
}
88+
}
89+
90+
func dataSourceGoogleComputeRoutersRead(d *schema.ResourceData, meta interface{}) error {
91+
config := meta.(*transport_tpg.Config)
92+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
93+
if err != nil {
94+
return err
95+
}
96+
97+
project, err := tpgresource.GetProject(d, config)
98+
if err != nil {
99+
return err
100+
}
101+
102+
region, err := tpgresource.GetRegion(d, config)
103+
if err != nil {
104+
return err
105+
}
106+
107+
d.SetId(fmt.Sprintf("projects/%s/regions/%s", project, region))
108+
109+
list, err := config.NewComputeClient(userAgent).Routers.List(project, region).Do()
110+
if err != nil {
111+
return fmt.Errorf("Error retrieving list of routers: %s", err)
112+
}
113+
114+
var routers []map[string]interface{}
115+
for _, router := range list.Items {
116+
var bgpList []interface{}
117+
if router.Bgp != nil {
118+
var advertisedIpRanges []interface{}
119+
for _, ipRange := range router.Bgp.AdvertisedIpRanges {
120+
advertisedIpRanges = append(advertisedIpRanges, map[string]interface{}{
121+
"range": ipRange.Range,
122+
"description": ipRange.Description,
123+
})
124+
}
125+
bgpList = []interface{}{
126+
map[string]interface{}{
127+
"asn": router.Bgp.Asn,
128+
"advertise_mode": router.Bgp.AdvertiseMode,
129+
"advertised_groups": router.Bgp.AdvertisedGroups,
130+
"advertised_ip_ranges": advertisedIpRanges,
131+
},
132+
}
133+
}
134+
135+
routers = append(routers, map[string]interface{}{
136+
"name": router.Name,
137+
"network": router.Network,
138+
"description": router.Description,
139+
"self_link": router.SelfLink,
140+
"bgp": bgpList,
141+
})
142+
}
143+
144+
if err := d.Set("routers", routers); err != nil {
145+
return fmt.Errorf("Error setting routers: %s", err)
146+
}
147+
148+
if err := d.Set("project", project); err != nil {
149+
return fmt.Errorf("Error setting project: %s", err)
150+
}
151+
152+
if err := d.Set("region", region); err != nil {
153+
return fmt.Errorf("Error setting region: %s", err)
154+
}
155+
156+
return nil
157+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package compute_test
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
8+
"github.com/hashicorp/terraform-provider-google/google/acctest"
9+
)
10+
11+
func TestAccDataSourceGoogleComputeRouters_basic(t *testing.T) {
12+
t.Parallel()
13+
14+
routerName := fmt.Sprintf("tf-test-routers-%d", acctest.RandInt(t))
15+
acctest.VcrTest(t, resource.TestCase{
16+
PreCheck: func() { acctest.AccTestPreCheck(t) },
17+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
18+
Steps: []resource.TestStep{
19+
{
20+
Config: testAccDataSourceGoogleComputeRoutersConfig(routerName),
21+
Check: resource.ComposeTestCheckFunc(
22+
resource.TestCheckResourceAttr("data.google_compute_routers.all", "routers.#", "1"),
23+
resource.TestCheckResourceAttr("data.google_compute_routers.all", "routers.0.name", routerName),
24+
resource.TestCheckResourceAttrSet("data.google_compute_routers.all", "routers.0.self_link"),
25+
),
26+
},
27+
},
28+
})
29+
}
30+
31+
func testAccDataSourceGoogleComputeRoutersConfig(routerName string) string {
32+
return fmt.Sprintf(`
33+
resource "google_compute_network" "foobar" {
34+
name = "%s"
35+
auto_create_subnetworks = false
36+
}
37+
38+
resource "google_compute_router" "foobar" {
39+
name = "%s"
40+
network = google_compute_network.foobar.name
41+
region = "us-east1"
42+
bgp {
43+
asn = 64514
44+
}
45+
}
46+
47+
data "google_compute_routers" "all" {
48+
project = google_compute_router.foobar.project
49+
region = google_compute_router.foobar.region
50+
}
51+
`, routerName, routerName)
52+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
---
2+
subcategory: "Compute Engine"
3+
description: |-
4+
Get a list of routers.
5+
---
6+
7+
# google_compute_routers
8+
Get a list of routers. For more information see
9+
the official [API](https://cloud.google.com/compute/docs/reference/rest/v1/routers/list) documentation.
10+
11+
## Example Usage
12+
```tf
13+
data "google_compute_routers" "all" {
14+
project = google_compute_router.foobar.project
15+
region = google_compute_router.foobar.region
16+
}
17+
```
18+
19+
## Argument Reference
20+
21+
The following arguments are supported:
22+
* `project` - (Optional) The project in which the resource belongs. If it
23+
is not provided, the provider project is used.
24+
* `region` - (Optional) If provided, only resources from the given regions are queried.

0 commit comments

Comments
 (0)