Skip to content

Commit 0c9c1a0

Browse files
Add support for parameter manager regional parameters datasource google_parameter_manager_regional_parameters (#12651) (#9089)
[upstream:eae83792920ab7e4acc6f5e65c06413c8ecbd7d9] Signed-off-by: Modular Magician <[email protected]>
1 parent caf3042 commit 0c9c1a0

File tree

5 files changed

+502
-0
lines changed

5 files changed

+502
-0
lines changed

.changelog/12651.txt

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

google-beta/provider/provider_mmv1_resources.go

+1
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ var handwrittenDatasources = map[string]*schema.Resource{
322322
"google_organization": resourcemanager.DataSourceGoogleOrganization(),
323323
"google_parameter_manager_parameter": parametermanager.DataSourceParameterManagerParameter(),
324324
"google_parameter_manager_regional_parameter": parametermanagerregional.DataSourceParameterManagerRegionalRegionalParameter(),
325+
"google_parameter_manager_regional_parameters": parametermanagerregional.DataSourceParameterManagerRegionalRegionalParameters(),
325326
"google_privateca_certificate_authority": privateca.DataSourcePrivatecaCertificateAuthority(),
326327
"google_privileged_access_manager_entitlement": privilegedaccessmanager.DataSourceGooglePrivilegedAccessManagerEntitlement(),
327328
"google_project": resourcemanager.DataSourceGoogleProject(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
package parametermanagerregional
4+
5+
import (
6+
"fmt"
7+
"strings"
8+
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource"
11+
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
12+
)
13+
14+
func DataSourceParameterManagerRegionalRegionalParameters() *schema.Resource {
15+
16+
dsSchema := tpgresource.DatasourceSchemaFromResourceSchema(ResourceParameterManagerRegionalRegionalParameter().Schema)
17+
18+
return &schema.Resource{
19+
Read: dataSourceParameterManagerRegionalRegionalParametersRead,
20+
Schema: map[string]*schema.Schema{
21+
"project": {
22+
Type: schema.TypeString,
23+
Optional: true,
24+
Computed: true,
25+
},
26+
"filter": {
27+
Type: schema.TypeString,
28+
Description: `Filter string, adhering to the rules in List-operation filtering. List only parameters matching the filter.
29+
If filter is empty, all regional parameters are listed from specific location.`,
30+
Optional: true,
31+
},
32+
"parameters": {
33+
Type: schema.TypeList,
34+
Computed: true,
35+
Elem: &schema.Resource{
36+
Schema: dsSchema,
37+
},
38+
},
39+
"location": {
40+
Type: schema.TypeString,
41+
Required: true,
42+
},
43+
},
44+
}
45+
}
46+
47+
func dataSourceParameterManagerRegionalRegionalParametersRead(d *schema.ResourceData, meta interface{}) error {
48+
config := meta.(*transport_tpg.Config)
49+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
50+
if err != nil {
51+
return err
52+
}
53+
54+
url, err := tpgresource.ReplaceVars(d, config, "{{ParameterManagerRegionalBasePath}}projects/{{project}}/locations/{{location}}/parameters")
55+
if err != nil {
56+
return err
57+
}
58+
59+
filter, has_filter := d.GetOk("filter")
60+
61+
if has_filter {
62+
url, err = transport_tpg.AddQueryParams(url, map[string]string{"filter": filter.(string)})
63+
if err != nil {
64+
return err
65+
}
66+
}
67+
68+
billingProject := ""
69+
70+
project, err := tpgresource.GetProject(d, config)
71+
if err != nil {
72+
return fmt.Errorf("error fetching project for Regional Parameters: %s", err)
73+
}
74+
billingProject = project
75+
76+
// err == nil indicates that the billing_project value was found
77+
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
78+
billingProject = bp
79+
}
80+
81+
// To handle the pagination locally
82+
allParameters := make([]interface{}, 0)
83+
token := ""
84+
for paginate := true; paginate; {
85+
if token != "" {
86+
url, err = transport_tpg.AddQueryParams(url, map[string]string{"pageToken": token})
87+
if err != nil {
88+
return err
89+
}
90+
}
91+
parameters, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
92+
Config: config,
93+
Method: "GET",
94+
Project: billingProject,
95+
RawURL: url,
96+
UserAgent: userAgent,
97+
})
98+
if err != nil {
99+
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("ParameterManagerRegionalParameters %q", d.Id()))
100+
}
101+
parametersInterface := parameters["parameters"]
102+
if parametersInterface != nil {
103+
allParameters = append(allParameters, parametersInterface.([]interface{})...)
104+
}
105+
tokenInterface := parameters["nextPageToken"]
106+
if tokenInterface == nil {
107+
paginate = false
108+
} else {
109+
paginate = true
110+
token = tokenInterface.(string)
111+
}
112+
}
113+
114+
if err := d.Set("parameters", flattenParameterManagerRegionalRegionalParameterParameters(allParameters, d, config)); err != nil {
115+
return fmt.Errorf("error setting regional parameters: %s", err)
116+
}
117+
118+
if err := d.Set("project", project); err != nil {
119+
return fmt.Errorf("error setting project: %s", err)
120+
}
121+
122+
if err := d.Set("filter", filter); err != nil {
123+
return fmt.Errorf("error setting filter: %s", err)
124+
}
125+
126+
// Store the ID now
127+
id, err := tpgresource.ReplaceVars(d, config, "projects/{{project}}/locations/{{location}}/parameters")
128+
if err != nil {
129+
return fmt.Errorf("error constructing id: %s", err)
130+
}
131+
if has_filter {
132+
id += "/filter=" + filter.(string)
133+
}
134+
d.SetId(id)
135+
136+
return nil
137+
}
138+
139+
func flattenParameterManagerRegionalRegionalParameterParameters(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
140+
if v == nil {
141+
return v
142+
}
143+
l := v.([]interface{})
144+
transformed := make([]interface{}, 0, len(l))
145+
for _, raw := range l {
146+
original := raw.(map[string]interface{})
147+
if len(original) < 1 {
148+
// Do not include empty json objects coming back from the api
149+
continue
150+
}
151+
transformed = append(transformed, map[string]interface{}{
152+
"format": flattenParameterManagerRegionalRegionalParameterFormat(original["format"], d, config),
153+
"labels": flattenParameterManagerRegionalRegionalParameterEffectiveLabels(original["labels"], d, config),
154+
"effective_labels": flattenParameterManagerRegionalRegionalParameterEffectiveLabels(original["labels"], d, config),
155+
"terraform_labels": flattenParameterManagerRegionalRegionalParameterEffectiveLabels(original["labels"], d, config),
156+
"create_time": flattenParameterManagerRegionalRegionalParameterCreateTime(original["createTime"], d, config),
157+
"update_time": flattenParameterManagerRegionalRegionalParameterUpdateTime(original["updateTime"], d, config),
158+
"policy_member": flattenParameterManagerRegionalRegionalParameterPolicyMember(original["policyMember"], d, config),
159+
"name": flattenParameterManagerRegionalRegionalParameterName(original["name"], d, config),
160+
"project": getDataFromName(original["name"], 1),
161+
"location": getDataFromName(original["name"], 3),
162+
"parameter_id": getDataFromName(original["name"], 5),
163+
})
164+
}
165+
return transformed
166+
}
167+
168+
func getDataFromName(v interface{}, part int) string {
169+
name := v.(string)
170+
split := strings.Split(name, "/")
171+
return split[part]
172+
}

0 commit comments

Comments
 (0)