Skip to content

Commit 0a41706

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

11 files changed

+564
-1
lines changed

internal/services/secret/secret.go

Lines changed: 74 additions & 1 deletion
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,49 @@ 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+
"secret_id": {
130+
Type: schema.TypeString,
131+
Computed: true,
132+
Description: "The secret ID associated with this version",
133+
},
134+
"status": {
135+
Type: schema.TypeString,
136+
Computed: true,
137+
Description: "Status of the secret version",
138+
},
139+
"created_at": {
140+
Type: schema.TypeString,
141+
Computed: true,
142+
Description: "Date and time of secret version's creation (RFC 3339 format)",
143+
},
144+
"updated_at": {
145+
Type: schema.TypeString,
146+
Computed: true,
147+
Description: "Date and time of secret version's creation (RFC 3339 format)",
148+
},
149+
"description": {
150+
Type: schema.TypeString,
151+
Optional: true,
152+
Description: "Description of the secret version",
153+
},
154+
"latest": {
155+
Type: schema.TypeBool,
156+
Optional: true,
157+
Description: "Returns true if the version is the latest.",
158+
},
159+
},
160+
},
161+
},
118162
"region": regional.Schema(),
119163
"project_id": account.ProjectIDSchema(),
120164
},
@@ -192,19 +236,48 @@ func ResourceSecretRead(ctx context.Context, d *schema.ResourceData, m interface
192236
_ = d.Set("tags", types.FlattenSliceString(secretResponse.Tags))
193237
}
194238

239+
versions, err := api.ListSecretVersions(&secret.ListSecretVersionsRequest{
240+
Region: region,
241+
SecretID: id,
242+
}, scw.WithAllPages(), scw.WithContext(ctx))
243+
if err != nil {
244+
if httperrors.Is404(err) {
245+
d.SetId("")
246+
247+
return nil
248+
}
249+
250+
return diag.FromErr(err)
251+
}
252+
195253
_ = d.Set("name", secretResponse.Name)
196254
_ = d.Set("description", types.FlattenStringPtr(secretResponse.Description))
197255
_ = d.Set("created_at", types.FlattenTime(secretResponse.CreatedAt))
198256
_ = d.Set("updated_at", types.FlattenTime(secretResponse.UpdatedAt))
199257
_ = d.Set("status", secretResponse.Status.String())
200-
_ = d.Set("version_count", int(secretResponse.VersionCount))
258+
_ = d.Set("version_count", int(versions.TotalCount))
201259
_ = d.Set("region", string(region))
202260
_ = d.Set("project_id", secretResponse.ProjectID)
203261
_ = d.Set("path", secretResponse.Path)
204262
_ = d.Set("protected", secretResponse.Protected)
205263
_ = d.Set("ephemeral_policy", flattenEphemeralPolicy(secretResponse.EphemeralPolicy))
206264
_ = d.Set("type", secretResponse.Type)
207265

266+
versionsList := make([]map[string]interface{}, 0, len(versions.Versions))
267+
for _, version := range versions.Versions {
268+
versionsList = append(versionsList, map[string]interface{}{
269+
"revision": strconv.Itoa(int(version.Revision)),
270+
"secret_id": version.SecretID,
271+
"status": version.Status.String(),
272+
"created_at": types.FlattenTime(version.CreatedAt),
273+
"updated_at": types.FlattenTime(version.UpdatedAt),
274+
"description": types.FlattenStringPtr(version.Description),
275+
"latest": types.FlattenBoolPtr(&version.Latest),
276+
})
277+
}
278+
279+
_ = d.Set("versions", versionsList)
280+
208281
return nil
209282
}
210283

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

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1422,3 +1422,52 @@ interactions:
14221422
status: 404 Not Found
14231423
code: 404
14241424
duration: 30.173411ms
1425+
- id: 29
1426+
request:
1427+
proto: HTTP/1.1
1428+
proto_major: 1
1429+
proto_minor: 1
1430+
content_length: 0
1431+
transfer_encoding: [ ]
1432+
trailer: { }
1433+
host: api.scaleway.com
1434+
remote_addr: ""
1435+
request_uri: ""
1436+
body: ""
1437+
form: { }
1438+
headers:
1439+
User-Agent:
1440+
- scaleway-sdk-go/v1.0.0-beta.7+dev (go1.24.0; darwin; amd64) terraform-provider/develop terraform/terraform-tests
1441+
url: https://api.scaleway.com/secret-manager/v1beta1/regions/fr-par/secrets/832d9ec7-e9dd-4fd6-b4c8-fe312f2f0ff9/versions?page=1
1442+
method: GET
1443+
response:
1444+
proto: HTTP/2.0
1445+
proto_major: 2
1446+
proto_minor: 0
1447+
transfer_encoding: [ ]
1448+
trailer: { }
1449+
content_length: 457
1450+
uncompressed: false
1451+
body: '{"versions":[],"total_count":0}'
1452+
headers:
1453+
Content-Length:
1454+
- "457"
1455+
Content-Security-Policy:
1456+
- default-src 'none'; frame-ancestors 'none'
1457+
Content-Type:
1458+
- application/json
1459+
Date:
1460+
- Thu, 06 Mar 2025 15:45:34 GMT
1461+
Server:
1462+
- Scaleway API Gateway (fr-par-3;edge02)
1463+
Strict-Transport-Security:
1464+
- max-age=63072000
1465+
X-Content-Type-Options:
1466+
- nosniff
1467+
X-Frame-Options:
1468+
- DENY
1469+
X-Request-Id:
1470+
- 26bbd5fb-02e0-4532-90e6-b5ccdcc3e517
1471+
status: 200 OK
1472+
code: 200
1473+
duration: 49.216649ms

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

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -932,3 +932,52 @@ interactions:
932932
status: 404 Not Found
933933
code: 404
934934
duration: 19.416756ms
935+
- id: 19
936+
request:
937+
proto: HTTP/1.1
938+
proto_major: 1
939+
proto_minor: 1
940+
content_length: 0
941+
transfer_encoding: [ ]
942+
trailer: { }
943+
host: api.scaleway.com
944+
remote_addr: ""
945+
request_uri: ""
946+
body: ""
947+
form: { }
948+
headers:
949+
User-Agent:
950+
- scaleway-sdk-go/v1.0.0-beta.7+dev (go1.24.0; darwin; amd64) terraform-provider/develop terraform/terraform-tests
951+
url: https://api.scaleway.com/secret-manager/v1beta1/regions/fr-par/secrets/0b5d67fe-77d6-4ad2-b01c-8be06703b899/versions?page=1
952+
method: GET
953+
response:
954+
proto: HTTP/2.0
955+
proto_major: 2
956+
proto_minor: 0
957+
transfer_encoding: [ ]
958+
trailer: { }
959+
content_length: 443
960+
uncompressed: false
961+
body: '{"versions":[],"total_count":0}'
962+
headers:
963+
Content-Length:
964+
- "443"
965+
Content-Security-Policy:
966+
- default-src 'none'; frame-ancestors 'none'
967+
Content-Type:
968+
- application/json
969+
Date:
970+
- Thu, 06 Mar 2025 15:47:23 GMT
971+
Server:
972+
- Scaleway API Gateway (fr-par-3;edge01)
973+
Strict-Transport-Security:
974+
- max-age=63072000
975+
X-Content-Type-Options:
976+
- nosniff
977+
X-Frame-Options:
978+
- DENY
979+
X-Request-Id:
980+
- 9a754dd2-3568-4d10-8267-c5e4dcad22f1
981+
status: 200 OK
982+
code: 200
983+
duration: 61.565453ms

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

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3137,3 +3137,52 @@ interactions:
31373137
status: 404 Not Found
31383138
code: 404
31393139
duration: 27.332ms
3140+
- id: 64
3141+
request:
3142+
proto: HTTP/1.1
3143+
proto_major: 1
3144+
proto_minor: 1
3145+
content_length: 0
3146+
transfer_encoding: [ ]
3147+
trailer: { }
3148+
host: api.scaleway.com
3149+
remote_addr: ""
3150+
request_uri: ""
3151+
body: ""
3152+
form: { }
3153+
headers:
3154+
User-Agent:
3155+
- scaleway-sdk-go/v1.0.0-beta.7+dev (go1.23.0; darwin; arm64) terraform-provider/develop terraform/terraform-tests
3156+
url: https://api.scaleway.com/secret-manager/v1beta1/regions/fr-par/secrets/503b00ab-678b-4298-8f68-c8c12edca630/versions?page=1
3157+
method: GET
3158+
response:
3159+
proto: HTTP/2.0
3160+
proto_major: 2
3161+
proto_minor: 0
3162+
transfer_encoding: [ ]
3163+
trailer: { }
3164+
content_length: 467
3165+
uncompressed: false
3166+
body: '{"versions":[],"total_count":0}'
3167+
headers:
3168+
Content-Length:
3169+
- "467"
3170+
Content-Security-Policy:
3171+
- default-src 'none'; frame-ancestors 'none'
3172+
Content-Type:
3173+
- application/json
3174+
Date:
3175+
- Thu, 12 Sep 2024 15:28:10 GMT
3176+
Server:
3177+
- Scaleway API Gateway (fr-par-2;edge02)
3178+
Strict-Transport-Security:
3179+
- max-age=63072000
3180+
X-Content-Type-Options:
3181+
- nosniff
3182+
X-Frame-Options:
3183+
- DENY
3184+
X-Request-Id:
3185+
- 8dc69eed-078f-448c-a73f-643890a96ecg
3186+
status: 200 OK
3187+
code: 200
3188+
duration: 51.810125ms

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

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2549,3 +2549,52 @@ interactions:
25492549
status: 404 Not Found
25502550
code: 404
25512551
duration: 21.473404ms
2552+
- id: 52
2553+
request:
2554+
proto: HTTP/1.1
2555+
proto_major: 1
2556+
proto_minor: 1
2557+
content_length: 0
2558+
transfer_encoding: [ ]
2559+
trailer: { }
2560+
host: api.scaleway.com
2561+
remote_addr: ""
2562+
request_uri: ""
2563+
body: ""
2564+
form: { }
2565+
headers:
2566+
User-Agent:
2567+
- scaleway-sdk-go/v1.0.0-beta.7+dev (go1.24.0; darwin; amd64) terraform-provider/develop terraform/terraform-tests
2568+
url: https://api.scaleway.com/secret-manager/v1beta1/regions/fr-par/secrets/a1686e2e-68a2-4e73-8a5c-f62322a9f6ef/versions?page=1
2569+
method: GET
2570+
response:
2571+
proto: HTTP/2.0
2572+
proto_major: 2
2573+
proto_minor: 0
2574+
transfer_encoding: [ ]
2575+
trailer: { }
2576+
content_length: 468
2577+
uncompressed: false
2578+
body: '{"versions":[],"total_count":0}'
2579+
headers:
2580+
Content-Length:
2581+
- "468"
2582+
Content-Security-Policy:
2583+
- default-src 'none'; frame-ancestors 'none'
2584+
Content-Type:
2585+
- application/json
2586+
Date:
2587+
- Thu, 06 Mar 2025 15:46:57 GMT
2588+
Server:
2589+
- Scaleway API Gateway (fr-par-3;edge02)
2590+
Strict-Transport-Security:
2591+
- max-age=63072000
2592+
X-Content-Type-Options:
2593+
- nosniff
2594+
X-Frame-Options:
2595+
- DENY
2596+
X-Request-Id:
2597+
- b54ca295-40b3-4957-90d1-8ad879414b52
2598+
status: 200 OK
2599+
code: 200
2600+
duration: 44.770171ms

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

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,3 +789,52 @@ interactions:
789789
status: 404 Not Found
790790
code: 404
791791
duration: 23.156219ms
792+
- id: 16
793+
request:
794+
proto: HTTP/1.1
795+
proto_major: 1
796+
proto_minor: 1
797+
content_length: 0
798+
transfer_encoding: [ ]
799+
trailer: { }
800+
host: api.scaleway.com
801+
remote_addr: ""
802+
request_uri: ""
803+
body: ""
804+
form: { }
805+
headers:
806+
User-Agent:
807+
- scaleway-sdk-go/v1.0.0-beta.7+dev (go1.22.2; linux; amd64) terraform-provider/develop terraform/terraform-tests
808+
url: https://api.scaleway.com/secret-manager/v1beta1/regions/fr-par/secrets/f1188615-2dca-4ef8-9b8b-a2f52e2751c0/versions?page=1
809+
method: GET
810+
response:
811+
proto: HTTP/2.0
812+
proto_major: 2
813+
proto_minor: 0
814+
transfer_encoding: [ ]
815+
trailer: { }
816+
content_length: 440
817+
uncompressed: false
818+
body: '{"versions":[],"total_count":0}'
819+
headers:
820+
Content-Length:
821+
- "440"
822+
Content-Security-Policy:
823+
- default-src 'none'; frame-ancestors 'none'
824+
Content-Type:
825+
- application/json
826+
Date:
827+
- Fri, 09 Aug 2024 09:22:49 GMT
828+
Server:
829+
- Scaleway API Gateway (fr-par-3;edge02)
830+
Strict-Transport-Security:
831+
- max-age=63072000
832+
X-Content-Type-Options:
833+
- nosniff
834+
X-Frame-Options:
835+
- DENY
836+
X-Request-Id:
837+
- f3fecb52-a356-42d5-8374-0b2b8690d48g
838+
status: 200 OK
839+
code: 200
840+
duration: 47.160223ms

0 commit comments

Comments
 (0)