Skip to content

Commit d4c89b3

Browse files
Adding Data Source Forwarding Rules (#10004) (#6997)
[upstream:b7e1e25a635c74eb6c5f6b13828ddcefa67eecd7] Signed-off-by: Modular Magician <[email protected]>
1 parent d9c18ed commit d4c89b3

File tree

5 files changed

+205
-0
lines changed

5 files changed

+205
-0
lines changed

.changelog/10004.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:new-datasource
2+
google_compute_forwarding_rules
3+
```

google-beta/provider/provider_mmv1_resources.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ var handwrittenDatasources = map[string]*schema.Resource{
179179
"google_compute_default_service_account": compute.DataSourceGoogleComputeDefaultServiceAccount(),
180180
"google_compute_disk": compute.DataSourceGoogleComputeDisk(),
181181
"google_compute_forwarding_rule": compute.DataSourceGoogleComputeForwardingRule(),
182+
"google_compute_forwarding_rules": compute.DataSourceGoogleComputeForwardingRules(),
182183
"google_compute_global_address": compute.DataSourceGoogleComputeGlobalAddress(),
183184
"google_compute_global_forwarding_rule": compute.DataSourceGoogleComputeGlobalForwardingRule(),
184185
"google_compute_ha_vpn_gateway": compute.DataSourceGoogleComputeHaVpnGateway(),
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
package compute
4+
5+
import (
6+
"fmt"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource"
10+
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
11+
)
12+
13+
func DataSourceGoogleComputeForwardingRules() *schema.Resource {
14+
return &schema.Resource{
15+
Read: dataSourceGoogleComputeForwardingRulesRead,
16+
17+
Schema: map[string]*schema.Schema{
18+
19+
"project": {
20+
Type: schema.TypeString,
21+
Optional: true,
22+
},
23+
24+
"region": {
25+
Type: schema.TypeString,
26+
Optional: true,
27+
},
28+
29+
"rules": {
30+
Type: schema.TypeList,
31+
Computed: true,
32+
Elem: &schema.Resource{
33+
Schema: tpgresource.DatasourceSchemaFromResourceSchema(ResourceComputeForwardingRule().Schema),
34+
},
35+
},
36+
},
37+
}
38+
}
39+
40+
func dataSourceGoogleComputeForwardingRulesRead(d *schema.ResourceData, meta interface{}) error {
41+
config := meta.(*transport_tpg.Config)
42+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
43+
if err != nil {
44+
return err
45+
}
46+
47+
project, err := tpgresource.GetProject(d, config)
48+
if err != nil {
49+
return err
50+
}
51+
52+
region, err := tpgresource.GetRegion(d, config)
53+
if err != nil {
54+
return err
55+
}
56+
57+
id := fmt.Sprintf("projects/%s/regions/%s/forwardingRules", project, region)
58+
d.SetId(id)
59+
60+
forwardingRulesAggregatedList, err := config.NewComputeClient(userAgent).ForwardingRules.List(project, region).Do()
61+
if err != nil {
62+
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("Forwarding Rules Not Found : %s", project))
63+
}
64+
65+
forwardingRules := make([]map[string]interface{}, 0, len(forwardingRulesAggregatedList.Items))
66+
67+
for i := 0; i < len(forwardingRulesAggregatedList.Items); i++ {
68+
rule := forwardingRulesAggregatedList.Items[i]
69+
mappedData := map[string]interface{}{
70+
"name": rule.Name,
71+
"network": rule.Network,
72+
"subnetwork": rule.Subnetwork,
73+
"backend_service": rule.BackendService,
74+
"ip_address": rule.IPAddress,
75+
"service_name": rule.ServiceName,
76+
"service_label": rule.ServiceLabel,
77+
"description": rule.Description,
78+
"self_link": rule.SelfLink,
79+
"labels": rule.Labels,
80+
"ports": rule.Ports,
81+
"region": rule.Region,
82+
"target": rule.Target,
83+
"ip_version": rule.IpVersion,
84+
"network_tier": rule.NetworkTier,
85+
"base_forwarding_rule": rule.BaseForwardingRule,
86+
"port_range": rule.PortRange,
87+
}
88+
forwardingRules = append(forwardingRules, mappedData)
89+
}
90+
91+
if err := d.Set("rules", forwardingRules); err != nil {
92+
return fmt.Errorf("Error setting the forwarding rules names: %s", err)
93+
}
94+
95+
if err := d.Set("project", project); err != nil {
96+
return fmt.Errorf("Error setting the network names: %s", err)
97+
}
98+
99+
if err := d.Set("region", region); err != nil {
100+
return fmt.Errorf("Error setting the region: %s", err)
101+
}
102+
103+
return nil
104+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
package compute_test
4+
5+
import (
6+
"fmt"
7+
"testing"
8+
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
10+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/acctest"
11+
)
12+
13+
func TestAccDataSourceGoogleForwardingRules(t *testing.T) {
14+
t.Parallel()
15+
16+
poolName := fmt.Sprintf("tf-%s", acctest.RandString(t, 10))
17+
ruleName := fmt.Sprintf("tf-%s", acctest.RandString(t, 10))
18+
19+
acctest.VcrTest(t, resource.TestCase{
20+
PreCheck: func() { acctest.AccTestPreCheck(t) },
21+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
22+
Steps: []resource.TestStep{
23+
{
24+
Config: testAccDataSourceGoogleForwardingRuleConfig(poolName, ruleName),
25+
Check: acctest.CheckDataSourceStateMatchesResourceState("data.google_compute_forwarding_rule.my_forwarding_rule", "google_compute_forwarding_rule.foobar-fr"),
26+
},
27+
},
28+
})
29+
}
30+
31+
func testAccDataSourceGoogleForwardingRulesConfig(poolName, ruleName string) string {
32+
return fmt.Sprintf(`
33+
resource "google_compute_target_pool" "foobar-tp" {
34+
description = "Resource created for Terraform acceptance testing"
35+
instances = ["us-central1-a/foo", "us-central1-b/bar"]
36+
name = "%s"
37+
}
38+
39+
resource "google_compute_forwarding_rule" "foobar-fr" {
40+
description = "Resource created for Terraform acceptance testing"
41+
ip_protocol = "UDP"
42+
name = "%s"
43+
port_range = "80-81"
44+
target = google_compute_target_pool.foobar-tp.self_link
45+
labels = {
46+
my-label = "my-label-value"
47+
}
48+
}
49+
50+
data "google_compute_forwarding_rules" "my_forwarding_rule" {
51+
project = google_compute_forwarding_rule.foobar-fr.project
52+
region = google_compute_forwarding_rule.foobar-fr.region
53+
}
54+
`, poolName, ruleName)
55+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
---
2+
subcategory: "Compute Engine"
3+
description: |-
4+
List forwarding rules in a region of a Google Cloud project.
5+
---
6+
7+
# google\_compute\_forwarding\_rules
8+
9+
List all networks in a specified Google Cloud project.
10+
11+
## Example Usage
12+
13+
```tf
14+
data "google_compute_forwarding_rules" "my-forwarding-rules" {
15+
project = "my-cloud-project"
16+
region = "us-central1"
17+
}
18+
```
19+
20+
## Argument Reference
21+
22+
The following arguments are supported:
23+
24+
* `project` - (Optional) The name of the project.
25+
26+
* `region` - (Optional) The region you want to get the forwarding rules from.
27+
28+
These arguments must be set in either the provider or the resouce in order for the information to be queried.
29+
30+
## Attributes Reference
31+
32+
In addition to the arguments listed above, the following attributes are exported:
33+
34+
* `id` - an identifier for the resource with format projects/{{project}}/region/{{region}}/forwardingRules
35+
36+
* `project` - The project name being queried.
37+
38+
* `region` - The region being queried.
39+
40+
* `rules` - This is a list of the forwarding rules in the project. Each forwarding rule will list the backend, description, ip address. name, network, self link, service label, service name, and subnet.
41+
42+
* `self_link` - The URI of the resource.

0 commit comments

Comments
 (0)