Skip to content

Commit 6c6c65b

Browse files
Adding google_compute_networks data source (#9232) (#16240)
* Adding support for listing networks in a Google Cloud project through a new data source * Updating documentation for data source. Removing print from data source. [upstream:b57324babdc32918c225c7d12fba12fd72dfc0bb] Signed-off-by: Modular Magician <[email protected]>
1 parent 5382aaa commit 6c6c65b

File tree

5 files changed

+195
-0
lines changed

5 files changed

+195
-0
lines changed

.changelog/9232.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:new-datasource
2+
`google_compute_networks`
3+
```

google/provider/provider.go

+1
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,7 @@ func DatasourceMapWithErrors() (map[string]*schema.Resource, error) {
824824
"google_compute_instance_template": compute.DataSourceGoogleComputeInstanceTemplate(),
825825
"google_compute_lb_ip_ranges": compute.DataSourceGoogleComputeLbIpRanges(),
826826
"google_compute_network": compute.DataSourceGoogleComputeNetwork(),
827+
"google_compute_networks": compute.DataSourceGoogleComputeNetworks(),
827828
"google_compute_network_endpoint_group": compute.DataSourceGoogleComputeNetworkEndpointGroup(),
828829
"google_compute_network_peering": compute.DataSourceComputeNetworkPeering(),
829830
"google_compute_node_types": compute.DataSourceGoogleComputeNodeTypes(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
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/google/tpgresource"
10+
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
11+
)
12+
13+
func DataSourceGoogleComputeNetworks() *schema.Resource {
14+
return &schema.Resource{
15+
Read: dataSourceGoogleComputeNetworksRead,
16+
17+
Schema: map[string]*schema.Schema{
18+
19+
"self_link": {
20+
Type: schema.TypeString,
21+
Computed: true,
22+
},
23+
24+
"project": {
25+
Type: schema.TypeString,
26+
Optional: true,
27+
},
28+
29+
"networks": {
30+
Type: schema.TypeList,
31+
Computed: true,
32+
Elem: &schema.Schema{Type: schema.TypeString},
33+
},
34+
},
35+
}
36+
}
37+
38+
func dataSourceGoogleComputeNetworksRead(d *schema.ResourceData, meta interface{}) error {
39+
config := meta.(*transport_tpg.Config)
40+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
41+
if err != nil {
42+
return err
43+
}
44+
45+
project, err := tpgresource.GetProject(d, config)
46+
if err != nil {
47+
return err
48+
}
49+
50+
networkList, err := config.NewComputeClient(userAgent).Networks.List(project).Do()
51+
if err != nil {
52+
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("Network Not Found : %s", project))
53+
}
54+
55+
var networks = make([]string, len(networkList.Items))
56+
57+
for i := 0; i < len(networkList.Items); i++ {
58+
networks[i] = networkList.Items[i].Name
59+
}
60+
61+
if err := d.Set("networks", networks); err != nil {
62+
return fmt.Errorf("Error setting the network names: %s", err)
63+
}
64+
65+
if err := d.Set("project", project); err != nil {
66+
return fmt.Errorf("Error setting the network names: %s", err)
67+
}
68+
69+
if err := d.Set("self_link", networkList.SelfLink); err != nil {
70+
return fmt.Errorf("Error setting self_link: %s", err)
71+
}
72+
73+
d.SetId(fmt.Sprintf("projects/%s/global/networks", project))
74+
return nil
75+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
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-plugin-sdk/v2/terraform"
11+
"github.com/hashicorp/terraform-provider-google/google/acctest"
12+
)
13+
14+
func TestAccDataSourceGoogleNetworks(t *testing.T) {
15+
t.Parallel()
16+
17+
networkName := fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10))
18+
acctest.VcrTest(t, resource.TestCase{
19+
PreCheck: func() { acctest.AccTestPreCheck(t) },
20+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
21+
Steps: []resource.TestStep{
22+
{
23+
Config: testAccDataSourceGoogleNetworksConfig(networkName),
24+
Check: resource.ComposeTestCheckFunc(
25+
testAccDataSourceGoogleNetworksCheck("data.google_compute_networks.my_networks", "google_compute_network.foobar"),
26+
),
27+
},
28+
},
29+
})
30+
}
31+
32+
func testAccDataSourceGoogleNetworksCheck(data_source_name string, resource_name string) resource.TestCheckFunc {
33+
return func(s *terraform.State) error {
34+
ds, ok := s.RootModule().Resources[data_source_name]
35+
if !ok {
36+
return fmt.Errorf("root module has no resource called %s", data_source_name)
37+
}
38+
39+
rs, ok := s.RootModule().Resources[resource_name]
40+
if !ok {
41+
return fmt.Errorf("can't find %s in state", resource_name)
42+
}
43+
44+
ds_attr := ds.Primary.Attributes
45+
rs_attr := rs.Primary.Attributes
46+
47+
containsNetwork := false
48+
49+
for _, itm := range ds_attr {
50+
if string(itm) == rs_attr["name"] {
51+
containsNetwork = true
52+
break
53+
}
54+
}
55+
56+
if !containsNetwork {
57+
return fmt.Errorf(
58+
"Was expecting %s in %v",
59+
rs_attr["name"],
60+
ds_attr["networks"],
61+
)
62+
}
63+
64+
return nil
65+
}
66+
}
67+
68+
func testAccDataSourceGoogleNetworksConfig(name string) string {
69+
return fmt.Sprintf(`
70+
resource "google_compute_network" "foobar" {
71+
name = "%s"
72+
description = "my-description"
73+
}
74+
75+
data "google_compute_networks" "my_networks" {
76+
depends_on = [
77+
google_compute_network.foobar
78+
]
79+
}
80+
`, name)
81+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
---
2+
subcategory: "Compute Engine"
3+
description: |-
4+
List networks in a Google Cloud project.
5+
---
6+
7+
# google\_compute\_networks
8+
9+
List all networks in a specified Google Cloud project.
10+
11+
## Example Usage
12+
13+
```tf
14+
data "google_compute_networks" "my-networks" {
15+
project = "my-cloud-project"
16+
}
17+
```
18+
19+
## Argument Reference
20+
21+
The following arguments are supported:
22+
23+
* `project` - (Optional) The name of the project.
24+
25+
## Attributes Reference
26+
27+
In addition to the arguments listed above, the following attributes are exported:
28+
29+
* `id` - an identifier for the resource with format projects/{{project}}/global/networks
30+
31+
* `networks` - The list of networks in the specified project.
32+
33+
* `project` - The project name being queried.
34+
35+
* `self_link` - The URI of the resource.

0 commit comments

Comments
 (0)