Skip to content

Commit 9870b22

Browse files
authored
Add data source for Network Management Connectivity Tests (#15335)
1 parent bad7cb6 commit 9870b22

File tree

4 files changed

+596
-0
lines changed

4 files changed

+596
-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
@@ -301,6 +301,7 @@ var handwrittenDatasources = map[string]*schema.Resource{
301301
"google_vmwareengine_vcenter_credentials": vmwareengine.DataSourceVmwareengineVcenterCredentials(),
302302
"google_compute_region_backend_service": compute.DataSourceGoogleComputeRegionBackendService(),
303303
"google_network_management_connectivity_test_run": networkmanagement.DataSourceGoogleNetworkManagementTestRun(),
304+
"google_network_management_connectivity_tests": networkmanagement.DataSourceGoogleNetworkManagementConnectivityTests(),
304305
// ####### END handwritten datasources ###########
305306
}
306307

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
package networkmanagement
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
8+
"github.com/hashicorp/terraform-provider-google/google/tpgresource"
9+
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
10+
)
11+
12+
func DataSourceGoogleNetworkManagementConnectivityTests() *schema.Resource {
13+
testSchema := tpgresource.DatasourceSchemaFromResourceSchema(ResourceNetworkManagementConnectivityTest().Schema)
14+
return &schema.Resource{
15+
Read: dataSourceGoogleNetworkManagementConnectivityTests,
16+
Schema: map[string]*schema.Schema{
17+
"project": {
18+
Type: schema.TypeString,
19+
Optional: true,
20+
Computed: true,
21+
},
22+
"filter": {
23+
Type: schema.TypeString,
24+
Description: `Lists the ConnectivityTests that match the filter expression. A filter expression filters the resources listed in the response.`,
25+
Optional: true,
26+
},
27+
"connectivity_tests": {
28+
Type: schema.TypeList,
29+
Computed: true,
30+
Elem: &schema.Resource{
31+
Schema: testSchema,
32+
},
33+
},
34+
},
35+
UseJSONNumber: true,
36+
}
37+
}
38+
39+
func dataSourceGoogleNetworkManagementConnectivityTests(d *schema.ResourceData, meta interface{}) error {
40+
config := meta.(*transport_tpg.Config)
41+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
42+
if err != nil {
43+
return err
44+
}
45+
46+
url, err := tpgresource.ReplaceVars(d, config, "{{NetworkManagementBasePath}}projects/{{project}}/locations/global/connectivityTests")
47+
if err != nil {
48+
return err
49+
}
50+
51+
filter, has_filter := d.GetOk("filter")
52+
53+
if has_filter {
54+
url, err = transport_tpg.AddQueryParams(url, map[string]string{"filter": filter.(string)})
55+
if err != nil {
56+
return err
57+
}
58+
}
59+
60+
billingProject := ""
61+
62+
project, err := tpgresource.GetProject(d, config)
63+
if err != nil {
64+
return fmt.Errorf("Error fetching project for Connectivity Tests: %s", err)
65+
}
66+
billingProject = project
67+
68+
// err == nil indicates that the billing_project value was found
69+
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
70+
billingProject = bp
71+
}
72+
73+
// To handle pagination locally
74+
allTests := make([]interface{}, 0)
75+
token := ""
76+
for paginate := true; paginate; {
77+
if token != "" {
78+
url, err = transport_tpg.AddQueryParams(url, map[string]string{"pageToken": token})
79+
if err != nil {
80+
return err
81+
}
82+
}
83+
tests, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
84+
Config: config,
85+
Method: "GET",
86+
Project: billingProject,
87+
RawURL: url,
88+
UserAgent: userAgent,
89+
})
90+
if err != nil {
91+
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("NetworkManagementConnectivityTests %q", d.Id()))
92+
}
93+
testsInterface := tests["resources"]
94+
if testsInterface == nil {
95+
break
96+
}
97+
allTests = append(allTests, testsInterface.([]interface{})...)
98+
tokenInterface := tests["nextPageToken"]
99+
if tokenInterface == nil {
100+
paginate = false
101+
} else {
102+
paginate = true
103+
token = tokenInterface.(string)
104+
}
105+
}
106+
if err := d.Set("project", project); err != nil {
107+
return fmt.Errorf("error setting project: %s", err)
108+
}
109+
110+
if err := d.Set("filter", filter); err != nil {
111+
return fmt.Errorf("error setting filter: %s", err)
112+
}
113+
114+
if err := d.Set("connectivity_tests", flattenNetworkManagementConnectivityTests(allTests, d, config)); err != nil {
115+
return fmt.Errorf("error setting connectivity tests: %s", err)
116+
}
117+
118+
// Store the ID now
119+
id, err := tpgresource.ReplaceVars(d, config, "projects/{{project}}/locations/global/connectivityTests")
120+
if err != nil {
121+
return fmt.Errorf("Error constructing id: %s", err)
122+
}
123+
if has_filter {
124+
id += "/filter=" + filter.(string)
125+
}
126+
d.SetId(id)
127+
return nil
128+
}
129+
130+
func flattenNetworkManagementConnectivityTests(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
131+
if v == nil {
132+
return v
133+
}
134+
l := v.([]interface{})
135+
transformed := make([]interface{}, 0, len(l))
136+
for _, raw := range l {
137+
original := raw.(map[string]interface{})
138+
if len(original) < 1 {
139+
// Do not include empty json objects coming back from the api
140+
continue
141+
}
142+
transformed = append(transformed, map[string]interface{}{
143+
"name": flattenNetworkManagementConnectivityTestName(original["name"], d, config),
144+
"description": flattenNetworkManagementConnectivityTestDescription(original["description"], d, config),
145+
"source": flattenNetworkManagementConnectivityTestSource(original["source"], d, config),
146+
"destination": flattenNetworkManagementConnectivityTestDestination(original["destination"], d, config),
147+
"protocol": flattenNetworkManagementConnectivityTestProtocol(original["protocol"], d, config),
148+
"related_projects": flattenNetworkManagementConnectivityTestRelatedProjects(original["relatedProjects"], d, config),
149+
"labels": flattenNetworkManagementConnectivityTestLabels(original["labels"], d, config),
150+
"round_trip": flattenNetworkManagementConnectivityTestRoundTrip(original["roundTrip"], d, config),
151+
"bypass_firewall_checks": flattenNetworkManagementConnectivityTestBypassFirewallChecks(original["bypassFirewallChecks"], d, config),
152+
"terraform_labels": flattenNetworkManagementConnectivityTestTerraformLabels(original["labels"], d, config),
153+
"effective_labels": flattenNetworkManagementConnectivityTestEffectiveLabels(original["labels"], d, config),
154+
"project": getDataFromName(original["name"], 1),
155+
})
156+
}
157+
return transformed
158+
}
159+
160+
func getDataFromName(v interface{}, part int) string {
161+
name := v.(string)
162+
split := strings.Split(name, "/")
163+
return split[part]
164+
}

0 commit comments

Comments
 (0)