Skip to content

Commit 8710525

Browse files
Add support for regional secret version datasource google_secret_manager_regional_secret_version (#11730) (#19514)
[upstream:863df2f34711963eed91d45053ee3e6927070fcd] Signed-off-by: Modular Magician <[email protected]>
1 parent fc3652d commit 8710525

8 files changed

+711
-179
lines changed

.changelog/11730.txt

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
```release-note:new-datasource
2+
`google_secret_manager_regional_secret_version`
3+
```
4+
```release-note:enhancement
5+
secretmanagerregional: added `version_aliases` field to `google_secret_manager_regional_secret` resource
6+
```

google/provider/provider_mmv1_resources.go

+1
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ var handwrittenDatasources = map[string]*schema.Resource{
270270
"google_project_service": resourcemanager.DataSourceGoogleProjectService(),
271271
"google_pubsub_subscription": pubsub.DataSourceGooglePubsubSubscription(),
272272
"google_pubsub_topic": pubsub.DataSourceGooglePubsubTopic(),
273+
"google_secret_manager_regional_secret_version": secretmanagerregional.DataSourceSecretManagerRegionalRegionalSecretVersion(),
273274
"google_secret_manager_regional_secret": secretmanagerregional.DataSourceSecretManagerRegionalRegionalSecret(),
274275
"google_secret_manager_secret": secretmanager.DataSourceSecretManagerSecret(),
275276
"google_secret_manager_secrets": secretmanager.DataSourceSecretManagerSecrets(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
package secretmanagerregional
4+
5+
import (
6+
"encoding/base64"
7+
"fmt"
8+
"log"
9+
"regexp"
10+
11+
"github.com/hashicorp/terraform-provider-google/google/tpgresource"
12+
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
13+
14+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
15+
)
16+
17+
func DataSourceSecretManagerRegionalRegionalSecretVersion() *schema.Resource {
18+
return &schema.Resource{
19+
Read: dataSourceSecretManagerRegionalRegionalSecretVersionRead,
20+
Schema: map[string]*schema.Schema{
21+
"project": {
22+
Type: schema.TypeString,
23+
Optional: true,
24+
Computed: true,
25+
},
26+
"location": {
27+
Type: schema.TypeString,
28+
Optional: true,
29+
Computed: true,
30+
},
31+
"secret": {
32+
Type: schema.TypeString,
33+
Required: true,
34+
DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName,
35+
},
36+
"version": {
37+
Type: schema.TypeString,
38+
Optional: true,
39+
Computed: true,
40+
},
41+
"create_time": {
42+
Type: schema.TypeString,
43+
Computed: true,
44+
},
45+
"destroy_time": {
46+
Type: schema.TypeString,
47+
Computed: true,
48+
},
49+
"name": {
50+
Type: schema.TypeString,
51+
Computed: true,
52+
},
53+
"enabled": {
54+
Type: schema.TypeBool,
55+
Computed: true,
56+
},
57+
"secret_data": {
58+
Type: schema.TypeString,
59+
Computed: true,
60+
Sensitive: true,
61+
},
62+
"customer_managed_encryption": {
63+
Type: schema.TypeList,
64+
Computed: true,
65+
Elem: &schema.Resource{
66+
Schema: map[string]*schema.Schema{
67+
"kms_key_version_name": {
68+
Type: schema.TypeString,
69+
Computed: true,
70+
},
71+
},
72+
},
73+
},
74+
},
75+
}
76+
}
77+
78+
func dataSourceSecretManagerRegionalRegionalSecretVersionRead(d *schema.ResourceData, meta interface{}) error {
79+
config := meta.(*transport_tpg.Config)
80+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
81+
if err != nil {
82+
return err
83+
}
84+
85+
secretRegex := regexp.MustCompile("projects/(.+)/locations/(.+)/secrets/(.+)$")
86+
parts := secretRegex.FindStringSubmatch(d.Get("secret").(string))
87+
88+
var project string
89+
90+
// if reference of the secret is provided in the secret field
91+
if len(parts) == 4 {
92+
// Store values of project to set in state
93+
project = parts[1]
94+
if d.Get("project").(string) != "" && d.Get("project").(string) != parts[1] {
95+
return fmt.Errorf("The project set on this secret version (%s) is not equal to the project where this secret exists (%s).", d.Get("project").(string), parts[1])
96+
}
97+
if d.Get("location").(string) != "" && d.Get("location").(string) != parts[2] {
98+
return fmt.Errorf("The location set on this secret version (%s) is not equal to the location where this secret exists (%s).", d.Get("location").(string), parts[2])
99+
}
100+
if err := d.Set("location", parts[2]); err != nil {
101+
return fmt.Errorf("Error setting location: %s", err)
102+
}
103+
if err := d.Set("secret", parts[3]); err != nil {
104+
return fmt.Errorf("Error setting secret: %s", err)
105+
}
106+
} else { // if secret name is provided in the secret field
107+
// Store values of project to set in state
108+
project, err = tpgresource.GetProject(d, config)
109+
if err != nil {
110+
return fmt.Errorf("Error fetching project for Secret: %s", err)
111+
}
112+
if d.Get("location").(string) == "" {
113+
return fmt.Errorf("Location must be set when providing only secret name")
114+
}
115+
}
116+
if err := d.Set("project", project); err != nil {
117+
return fmt.Errorf("Error setting project: %s", err)
118+
}
119+
120+
var url string
121+
versionNum := d.Get("version")
122+
123+
// set version if provided, else set version to latest
124+
if versionNum != "" {
125+
url, err = tpgresource.ReplaceVars(d, config, "{{SecretManagerRegionalBasePath}}projects/{{project}}/locations/{{location}}/secrets/{{secret}}/versions/{{version}}")
126+
if err != nil {
127+
return err
128+
}
129+
} else {
130+
url, err = tpgresource.ReplaceVars(d, config, "{{SecretManagerRegionalBasePath}}projects/{{project}}/locations/{{location}}/secrets/{{secret}}/versions/latest")
131+
if err != nil {
132+
return err
133+
}
134+
}
135+
136+
var secretVersion map[string]interface{}
137+
secretVersion, err = transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
138+
Config: config,
139+
Method: "GET",
140+
Project: project,
141+
RawURL: url,
142+
UserAgent: userAgent,
143+
})
144+
145+
if err != nil {
146+
return fmt.Errorf("Error retrieving available secret manager regional secret versions: %s", err.Error())
147+
}
148+
149+
secretVersionRegex := regexp.MustCompile("projects/(.+)/locations/(.+)/secrets/(.+)/versions/(.+)$")
150+
parts = secretVersionRegex.FindStringSubmatch(secretVersion["name"].(string))
151+
152+
if len(parts) != 5 {
153+
return fmt.Errorf("secret name, %s, does not match format, projects/{{project}}/locations/{{location}}/secrets/{{secret}}/versions/{{version}}", secretVersion["name"].(string))
154+
}
155+
156+
log.Printf("[DEBUG] Received Google Secret Manager Regional Secret Version: %q", secretVersion)
157+
158+
if err := d.Set("version", parts[4]); err != nil {
159+
return fmt.Errorf("Error setting version: %s", err)
160+
}
161+
162+
url = fmt.Sprintf("%s:access", url)
163+
resp, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
164+
Config: config,
165+
Method: "GET",
166+
Project: project,
167+
RawURL: url,
168+
UserAgent: userAgent,
169+
})
170+
171+
if err != nil {
172+
return fmt.Errorf("Error retrieving available secret manager regional secret version access: %s", err.Error())
173+
}
174+
175+
if err := d.Set("customer_managed_encryption", flattenSecretManagerRegionalRegionalSecretVersionCustomerManagedEncryption(secretVersion["customerManagedEncryption"], d, config)); err != nil {
176+
return fmt.Errorf("Error setting customer_managed_encryption: %s", err)
177+
}
178+
179+
if err := d.Set("create_time", secretVersion["createTime"].(string)); err != nil {
180+
return fmt.Errorf("Error setting create_time: %s", err)
181+
}
182+
183+
if secretVersion["destroyTime"] != nil {
184+
if err := d.Set("destroy_time", secretVersion["destroyTime"].(string)); err != nil {
185+
return fmt.Errorf("Error setting destroy_time: %s", err)
186+
}
187+
}
188+
189+
if err := d.Set("name", secretVersion["name"].(string)); err != nil {
190+
return fmt.Errorf("Error setting name: %s", err)
191+
}
192+
193+
if err := d.Set("enabled", true); err != nil {
194+
return fmt.Errorf("Error setting enabled: %s", err)
195+
}
196+
197+
data := resp["payload"].(map[string]interface{})
198+
secretData, err := base64.StdEncoding.DecodeString(data["data"].(string))
199+
if err != nil {
200+
return fmt.Errorf("Error decoding secret manager regional secret version data: %s", err.Error())
201+
}
202+
203+
if err := d.Set("secret_data", string(secretData)); err != nil {
204+
return fmt.Errorf("Error setting secret_data: %s", err)
205+
}
206+
207+
d.SetId(secretVersion["name"].(string))
208+
return nil
209+
}

0 commit comments

Comments
 (0)