Skip to content

Commit ae6e020

Browse files
authored
Add support for parameter manager parameters datasource google_parameter_manager_parameters (#12652)
1 parent a61293e commit ae6e020

File tree

4 files changed

+486
-0
lines changed

4 files changed

+486
-0
lines changed

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

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

0 commit comments

Comments
 (0)