Skip to content

Commit 53fbada

Browse files
abheda-crestanoopkverma-google
authored andcommitted
Add support for parameter manager regional parameters datasource google_parameter_manager_regional_parameters (GoogleCloudPlatform#12651)
1 parent 15092fc commit 53fbada

File tree

4 files changed

+501
-0
lines changed

4 files changed

+501
-0
lines changed

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

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

0 commit comments

Comments
 (0)