Skip to content

Commit 01024f7

Browse files
Add support for regional secrets list datasource google_secret_manager_regional_secrets (#11743) (#8217)
[upstream:441144d36266a1f90a4deed8607c86e15ba39a59] Signed-off-by: Modular Magician <[email protected]>
1 parent fccb541 commit 01024f7

File tree

5 files changed

+523
-0
lines changed

5 files changed

+523
-0
lines changed

Diff for: .changelog/11743.txt

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

Diff for: google-beta/provider/provider_mmv1_resources.go

+1
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ var handwrittenDatasources = map[string]*schema.Resource{
303303
"google_runtimeconfig_variable": runtimeconfig.DataSourceGoogleRuntimeconfigVariable(),
304304
"google_secret_manager_regional_secret_version": secretmanagerregional.DataSourceSecretManagerRegionalRegionalSecretVersion(),
305305
"google_secret_manager_regional_secret": secretmanagerregional.DataSourceSecretManagerRegionalRegionalSecret(),
306+
"google_secret_manager_regional_secrets": secretmanagerregional.DataSourceSecretManagerRegionalRegionalSecrets(),
306307
"google_secret_manager_secret": secretmanager.DataSourceSecretManagerSecret(),
307308
"google_secret_manager_secrets": secretmanager.DataSourceSecretManagerSecrets(),
308309
"google_secret_manager_secret_version": secretmanager.DataSourceSecretManagerSecretVersion(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
package secretmanagerregional
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 DataSourceSecretManagerRegionalRegionalSecrets() *schema.Resource {
15+
dsSchema := tpgresource.DatasourceSchemaFromResourceSchema(ResourceSecretManagerRegionalRegionalSecret().Schema)
16+
return &schema.Resource{
17+
Read: dataSourceSecretManagerRegionalRegionalSecretsRead,
18+
Schema: map[string]*schema.Schema{
19+
"project": {
20+
Type: schema.TypeString,
21+
Optional: true,
22+
Computed: true,
23+
},
24+
"location": {
25+
Type: schema.TypeString,
26+
Required: true,
27+
},
28+
"filter": {
29+
Type: schema.TypeString,
30+
Description: `Filter string, adhering to the rules in List-operation filtering (https://cloud.google.com/secret-manager/docs/filtering).
31+
List only secrets matching the filter. If filter is empty, all regional secrets are listed from the specified location.`,
32+
Optional: true,
33+
},
34+
"secrets": {
35+
Type: schema.TypeList,
36+
Computed: true,
37+
Elem: &schema.Resource{
38+
Schema: dsSchema,
39+
},
40+
},
41+
},
42+
}
43+
}
44+
45+
func dataSourceSecretManagerRegionalRegionalSecretsRead(d *schema.ResourceData, meta interface{}) error {
46+
config := meta.(*transport_tpg.Config)
47+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
48+
if err != nil {
49+
return err
50+
}
51+
52+
url, err := tpgresource.ReplaceVars(d, config, "{{SecretManagerRegionalBasePath}}projects/{{project}}/locations/{{location}}/secrets")
53+
if err != nil {
54+
return err
55+
}
56+
57+
filter, has_filter := d.GetOk("filter")
58+
59+
if has_filter {
60+
url, err = transport_tpg.AddQueryParams(url, map[string]string{"filter": filter.(string)})
61+
if err != nil {
62+
return err
63+
}
64+
}
65+
66+
billingProject := ""
67+
68+
project, err := tpgresource.GetProject(d, config)
69+
if err != nil {
70+
return fmt.Errorf("Error fetching project for Secret: %s", err)
71+
}
72+
billingProject = project
73+
74+
// err == nil indicates that the billing_project value was found
75+
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
76+
billingProject = bp
77+
}
78+
79+
// To handle pagination locally
80+
allSecrets := make([]interface{}, 0)
81+
token := ""
82+
for paginate := true; paginate; {
83+
if token != "" {
84+
url, err = transport_tpg.AddQueryParams(url, map[string]string{"pageToken": token})
85+
if err != nil {
86+
return err
87+
}
88+
}
89+
secrets, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
90+
Config: config,
91+
Method: "GET",
92+
Project: billingProject,
93+
RawURL: url,
94+
UserAgent: userAgent,
95+
})
96+
if err != nil {
97+
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("SecretManagerRegionalSecrets %q", d.Id()))
98+
}
99+
secretsInterface := secrets["secrets"]
100+
if secretsInterface == nil {
101+
break
102+
}
103+
allSecrets = append(allSecrets, secretsInterface.([]interface{})...)
104+
tokenInterface := secrets["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("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+
if err := d.Set("secrets", flattenSecretManagerRegionalRegionalSecretsSecrets(allSecrets, d, config)); err != nil {
122+
return fmt.Errorf("error setting secrets: %s", err)
123+
}
124+
125+
// Store the ID now
126+
id, err := tpgresource.ReplaceVars(d, config, "projects/{{project}}/locations/{{location}}/secrets")
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 flattenSecretManagerRegionalRegionalSecretsSecrets(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+
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+
152+
transformed = append(transformed, map[string]interface{}{
153+
"annotations": flattenSecretManagerRegionalRegionalSecretEffectiveAnnotations(original["annotations"], d, config),
154+
"effective_annotations": flattenSecretManagerRegionalRegionalSecretEffectiveAnnotations(original["annotations"], d, config),
155+
"expire_time": flattenSecretManagerRegionalRegionalSecretExpireTime(original["expireTime"], d, config),
156+
"labels": flattenSecretManagerRegionalRegionalSecretEffectiveLabels(original["labels"], d, config),
157+
"effective_labels": flattenSecretManagerRegionalRegionalSecretEffectiveLabels(original["labels"], d, config),
158+
"terraform_labels": flattenSecretManagerRegionalRegionalSecretEffectiveLabels(original["labels"], d, config),
159+
"version_aliases": flattenSecretManagerRegionalRegionalSecretVersionAliases(original["versionAliases"], d, config),
160+
"rotation": flattenSecretManagerRegionalRegionalSecretRotation(original["rotation"], d, config),
161+
"topics": flattenSecretManagerRegionalRegionalSecretTopics(original["topics"], d, config),
162+
"version_destroy_ttl": flattenSecretManagerRegionalRegionalSecretVersionDestroyTtl(original["versionDestroyTtl"], d, config),
163+
"customer_managed_encryption": flattenSecretManagerRegionalRegionalSecretCustomerManagedEncryption(original["customerManagedEncryption"], d, config),
164+
"create_time": flattenSecretManagerRegionalRegionalSecretCreateTime(original["createTime"], d, config),
165+
"name": flattenSecretManagerRegionalRegionalSecretName(original["name"], d, config),
166+
"project": getDataFromName(original["name"], 1),
167+
"location": getDataFromName(original["name"], 3),
168+
"secret_id": getDataFromName(original["name"], 5),
169+
})
170+
}
171+
return transformed
172+
}
173+
174+
func getDataFromName(v interface{}, part int) string {
175+
name := v.(string)
176+
split := strings.Split(name, "/")
177+
return split[part]
178+
}

0 commit comments

Comments
 (0)