Skip to content

Commit 756fbba

Browse files
author
Mélanie Marques
committed
feat(secret_manager): add list of secret versions in secret datasource
1 parent c4b3921 commit 756fbba

11 files changed

+165
-98
lines changed

internal/services/secret/secret.go

+68-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package secret
33
import (
44
"context"
55
"path/filepath"
6+
"strconv"
67

78
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
89
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -115,6 +116,44 @@ func ResourceSecret() *schema.Resource {
115116
},
116117
},
117118
},
119+
"versions": {
120+
Type: schema.TypeList,
121+
Optional: true,
122+
Elem: &schema.Resource{
123+
Schema: map[string]*schema.Schema{
124+
"revision": {
125+
Type: schema.TypeString,
126+
Computed: true,
127+
Description: "The revision of secret version",
128+
},
129+
"status": {
130+
Type: schema.TypeString,
131+
Computed: true,
132+
Description: "Status of the secret version",
133+
},
134+
"created_at": {
135+
Type: schema.TypeString,
136+
Computed: true,
137+
Description: "Date and time of secret version's creation (RFC 3339 format)",
138+
},
139+
"updated_at": {
140+
Type: schema.TypeString,
141+
Computed: true,
142+
Description: "Date and time of secret version's creation (RFC 3339 format)",
143+
},
144+
"description": {
145+
Type: schema.TypeString,
146+
Optional: true,
147+
Description: "Description of the secret version",
148+
},
149+
"latest": {
150+
Type: schema.TypeBool,
151+
Optional: true,
152+
Description: "Returns true if the version is the latest.",
153+
},
154+
},
155+
},
156+
},
118157
"region": regional.Schema(),
119158
"project_id": account.ProjectIDSchema(),
120159
},
@@ -192,19 +231,47 @@ func ResourceSecretRead(ctx context.Context, d *schema.ResourceData, m interface
192231
_ = d.Set("tags", types.FlattenSliceString(secretResponse.Tags))
193232
}
194233

234+
versions, err := api.ListSecretVersions(&secret.ListSecretVersionsRequest{
235+
Region: region,
236+
SecretID: id,
237+
}, scw.WithAllPages(), scw.WithContext(ctx))
238+
if err != nil {
239+
if httperrors.Is404(err) {
240+
d.SetId("")
241+
242+
return nil
243+
}
244+
245+
return diag.FromErr(err)
246+
}
247+
195248
_ = d.Set("name", secretResponse.Name)
196249
_ = d.Set("description", types.FlattenStringPtr(secretResponse.Description))
197250
_ = d.Set("created_at", types.FlattenTime(secretResponse.CreatedAt))
198251
_ = d.Set("updated_at", types.FlattenTime(secretResponse.UpdatedAt))
199252
_ = d.Set("status", secretResponse.Status.String())
200-
_ = d.Set("version_count", int(secretResponse.VersionCount))
253+
_ = d.Set("version_count", int(versions.TotalCount))
201254
_ = d.Set("region", string(region))
202255
_ = d.Set("project_id", secretResponse.ProjectID)
203256
_ = d.Set("path", secretResponse.Path)
204257
_ = d.Set("protected", secretResponse.Protected)
205258
_ = d.Set("ephemeral_policy", flattenEphemeralPolicy(secretResponse.EphemeralPolicy))
206259
_ = d.Set("type", secretResponse.Type)
207260

261+
versionsList := make([]map[string]interface{}, 0, len(versions.Versions))
262+
for _, version := range versions.Versions {
263+
versionsList = append(versionsList, map[string]interface{}{
264+
"revision": strconv.Itoa(int(version.Revision)),
265+
"status": version.Status.String(),
266+
"created_at": types.FlattenTime(version.CreatedAt),
267+
"updated_at": types.FlattenTime(version.UpdatedAt),
268+
"description": types.FlattenStringPtr(version.Description),
269+
"latest": types.FlattenBoolPtr(&version.Latest),
270+
})
271+
}
272+
273+
_ = d.Set("versions", versionsList)
274+
208275
return nil
209276
}
210277

internal/services/secret/testdata/data-source-secret-basic.cassette.yaml

+17-17
Large diffs are not rendered by default.

internal/services/secret/testdata/data-source-secret-path.cassette.yaml

+12-12
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ interactions:
129129
trailer: {}
130130
content_length: 443
131131
uncompressed: false
132-
body: '{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0}'
132+
body: '{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0,"versions":[]}'
133133
headers:
134134
Content-Length:
135135
- "443"
@@ -178,7 +178,7 @@ interactions:
178178
trailer: {}
179179
content_length: 443
180180
uncompressed: false
181-
body: '{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0}'
181+
body: '{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0,"versions":[]}'
182182
headers:
183183
Content-Length:
184184
- "443"
@@ -227,7 +227,7 @@ interactions:
227227
trailer: {}
228228
content_length: 473
229229
uncompressed: false
230-
body: '{"secrets":[{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0}],"total_count":1}'
230+
body: '{"secrets":[{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0,"versions":[]}],"total_count":1}'
231231
headers:
232232
Content-Length:
233233
- "473"
@@ -276,7 +276,7 @@ interactions:
276276
trailer: {}
277277
content_length: 443
278278
uncompressed: false
279-
body: '{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0}'
279+
body: '{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0,"versions":[]}'
280280
headers:
281281
Content-Length:
282282
- "443"
@@ -325,7 +325,7 @@ interactions:
325325
trailer: {}
326326
content_length: 443
327327
uncompressed: false
328-
body: '{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0}'
328+
body: '{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0,"versions":[]}'
329329
headers:
330330
Content-Length:
331331
- "443"
@@ -374,7 +374,7 @@ interactions:
374374
trailer: {}
375375
content_length: 473
376376
uncompressed: false
377-
body: '{"secrets":[{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0}],"total_count":1}'
377+
body: '{"secrets":[{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0,"versions":[]}],"total_count":1}'
378378
headers:
379379
Content-Length:
380380
- "473"
@@ -423,7 +423,7 @@ interactions:
423423
trailer: {}
424424
content_length: 443
425425
uncompressed: false
426-
body: '{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0}'
426+
body: '{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0,"versions":[]}'
427427
headers:
428428
Content-Length:
429429
- "443"
@@ -521,7 +521,7 @@ interactions:
521521
trailer: {}
522522
content_length: 443
523523
uncompressed: false
524-
body: '{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0}'
524+
body: '{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0,"versions":[]}'
525525
headers:
526526
Content-Length:
527527
- "443"
@@ -570,7 +570,7 @@ interactions:
570570
trailer: {}
571571
content_length: 473
572572
uncompressed: false
573-
body: '{"secrets":[{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0}],"total_count":1}'
573+
body: '{"secrets":[{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0,"versions":[]}],"total_count":1}'
574574
headers:
575575
Content-Length:
576576
- "473"
@@ -619,7 +619,7 @@ interactions:
619619
trailer: {}
620620
content_length: 443
621621
uncompressed: false
622-
body: '{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0}'
622+
body: '{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0,"versions":[]}'
623623
headers:
624624
Content-Length:
625625
- "443"
@@ -668,7 +668,7 @@ interactions:
668668
trailer: {}
669669
content_length: 473
670670
uncompressed: false
671-
body: '{"secrets":[{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0}],"total_count":1}'
671+
body: '{"secrets":[{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0,"versions":[]}],"total_count":1}'
672672
headers:
673673
Content-Length:
674674
- "473"
@@ -717,7 +717,7 @@ interactions:
717717
trailer: {}
718718
content_length: 443
719719
uncompressed: false
720-
body: '{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0}'
720+
body: '{"created_at":"2025-03-06T15:47:23.833070Z","deletion_requested_at":null,"description":"","ephemeral_policy":null,"id":"0b5d67fe-77d6-4ad2-b01c-8be06703b899","managed":false,"name":"test-secret-ds-path","path":"/test-secret-ds-path-path","project_id":"cc4f20ac-b973-4ebf-a716-a43735511810","protected":false,"region":"fr-par","status":"ready","tags":[],"type":"opaque","updated_at":"2025-03-06T15:47:23.833070Z","used_by":[],"version_count":0,"versions":[]}'
721721
headers:
722722
Content-Length:
723723
- "443"

internal/services/secret/testdata/data-source-secret-version-basic.cassette.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ interactions:
2929
trailer: {}
3030
content_length: 467
3131
uncompressed: false
32-
body: '{"created_at":"2024-09-12T15:28:10.658832Z","description":"secret description","ephemeral_policy":null,"id":"503b00ab-678b-4298-8f68-c8c12edca630","managed":false,"name":"dataSourceSecretVersionBasic","path":"/","project_id":"ee7bd9e1-9cbd-4724-b2f4-19e50f3cf38b","protected":false,"region":"fr-par","status":"ready","tags":["devtools","provider","terraform"],"type":"opaque","updated_at":"2024-09-12T15:28:10.658832Z","used_by":[],"version_count":0}'
32+
body: '{"created_at":"2024-09-12T15:28:10.658832Z","description":"secret description","ephemeral_policy":null,"id":"503b00ab-678b-4298-8f68-c8c12edca630","managed":false,"name":"dataSourceSecretVersionBasic","path":"/","project_id":"ee7bd9e1-9cbd-4724-b2f4-19e50f3cf38b","protected":false,"region":"fr-par","status":"ready","tags":["devtools","provider","terraform"],"type":"opaque","updated_at":"2024-09-12T15:28:10.658832Z","used_by":[],"version_count":0,"versions":[]}'
3333
headers:
3434
Content-Length:
3535
- "467"
@@ -78,7 +78,7 @@ interactions:
7878
trailer: {}
7979
content_length: 467
8080
uncompressed: false
81-
body: '{"created_at":"2024-09-12T15:28:10.658832Z","description":"secret description","ephemeral_policy":null,"id":"503b00ab-678b-4298-8f68-c8c12edca630","managed":false,"name":"dataSourceSecretVersionBasic","path":"/","project_id":"ee7bd9e1-9cbd-4724-b2f4-19e50f3cf38b","protected":false,"region":"fr-par","status":"ready","tags":["devtools","provider","terraform"],"type":"opaque","updated_at":"2024-09-12T15:28:10.658832Z","used_by":[],"version_count":0}'
81+
body: '{"created_at":"2024-09-12T15:28:10.658832Z","description":"secret description","ephemeral_policy":null,"id":"503b00ab-678b-4298-8f68-c8c12edca630","managed":false,"name":"dataSourceSecretVersionBasic","path":"/","project_id":"ee7bd9e1-9cbd-4724-b2f4-19e50f3cf38b","protected":false,"region":"fr-par","status":"ready","tags":["devtools","provider","terraform"],"type":"opaque","updated_at":"2024-09-12T15:28:10.658832Z","used_by":[],"version_count":0,"versions":[]}'
8282
headers:
8383
Content-Length:
8484
- "467"

0 commit comments

Comments
 (0)