Skip to content

Commit 0004d07

Browse files
Add support for parameter manager parameters datasource google_parameter_manager_parameters (#12652) (#9148)
[upstream:ae6e020d0aa15e1525ae84c5bdf9657b13a5965b] Signed-off-by: Modular Magician <[email protected]>
1 parent 20b7c28 commit 0004d07

File tree

5 files changed

+487
-0
lines changed

5 files changed

+487
-0
lines changed

.changelog/12652.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:new-datasource
2+
`google_parameter_manager_parameters`
3+
```

google-beta/provider/provider_mmv1_resources.go

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

0 commit comments

Comments
 (0)