Skip to content

Commit 50a0264

Browse files
authored
fix(secret_version): data source (#1845)
* fix(secret_version): data source * docs: secret version * feat(secret_version): data source * feat(secret_version): add cassettes
1 parent 0fa31d2 commit 50a0264

9 files changed

+2900
-125
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
---
2+
page_title: "Scaleway: scaleway_secret_version"
3+
description: |-
4+
Gets information about an existing Secret version.
5+
---
6+
7+
# scaleway_secret_version
8+
9+
Gets information about Scaleway a Secret Version.
10+
For more information, see [the documentation](https://developers.scaleway.com/en/products/secret_manager/api/v1alpha1/#secret-versions-079501).
11+
12+
## Examples
13+
14+
### Basic
15+
16+
```hcl
17+
resource "scaleway_secret" "main" {
18+
name = "fooii"
19+
description = "barr"
20+
}
21+
22+
resource "scaleway_secret_version" "main" {
23+
description = "your description"
24+
secret_id = scaleway_secret.main.id
25+
data = "your_secret"
26+
}
27+
28+
data "scaleway_secret_version" "data_by_secret_id" {
29+
secret_id = scaleway_secret.main.id
30+
revision = "1"
31+
depends_on = [scaleway_secret_version.main]
32+
}
33+
34+
data "scaleway_secret_version" "data_by_secret_name" {
35+
secret_name = scaleway_secret.main.name
36+
revision = "1"
37+
depends_on = [scaleway_secret_version.main]
38+
}
39+
40+
#Output Sensitive data
41+
output "scaleway_secret_access_payload" {
42+
value = data.scaleway_secret_version.data_by_secret_name.data
43+
}
44+
45+
#Output Sensitive data
46+
output "scaleway_secret_access_payload_by_id" {
47+
value = data.scaleway_secret_version.data_by_secret_id.data
48+
}
49+
```
50+
51+
## Arguments Reference
52+
53+
The following arguments are supported:
54+
55+
- `secret_id` - (Optional) The Secret ID associated wit the secret version.
56+
Only one of `secret_id` and `secret_name` should be specified.
57+
58+
- `secret_name` - (Optional) The Name of Secret associated wit the secret version.
59+
Only one of `secret_id` and `secret_name` should be specified.
60+
61+
- `revision` - The revision for this Secret Version.
62+
63+
- `region` - (Defaults to [provider](../index.md#region) `region`) The [region](../guides/regions_and_zones.md#regions)
64+
in which the resource exists.
65+
66+
## Data
67+
68+
Note: This Data Source give you **access** to the secret payload encoded en base64.
69+
70+
Be aware that this is a sensitive attribute. For more information,
71+
see [Sensitive Data in State](https://developer.hashicorp.com/terraform/language/state/sensitive-data).
72+
73+
~> **Important:** This property is sensitive and will not be displayed in the plan.
74+
75+
## Attributes Reference
76+
77+
In addition to all arguments above, the following attributes are exported:
78+
79+
- `description` - (Optional) Description of the secret version (e.g. `my-new-description`).
80+
- `data` - The data payload of the secret version. more on the [data section](#data)
81+
- `status` - The status of the Secret Version.
82+
- `created_at` - Date and time of secret version's creation (RFC 3339 format).
83+
- `updated_at` - Date and time of secret version's last update (RFC 3339 format).
84+
85+
Exported attributes are the ones from `scaleway_secret_version` [resource](../resources/secret_version.md)

docs/resources/secret_version.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ resource "scaleway_secret_version" "v1" {
3232
The following arguments are supported:
3333

3434
- `secret_id` - (Required) The Secret ID associated wit the secret version.
35-
- `data` - (Optional) The data payload of the secret version. Must be no larger than 64KiB. (e.g. `my-secret-version-payload`). more on the [data section](#data)
35+
- `data` - (Required) The data payload of the secret version. Must be no larger than 64KiB. (e.g. `my-secret-version-payload`). more on the [data section](#data)
3636
- `description` - (Optional) Description of the secret version (e.g. `my-new-description`).
3737
- `region` - (Defaults to [provider](../index.md#region) `region`) The [region](../guides/regions_and_zones.md#regions)
3838
in which the resource exists.
@@ -47,7 +47,6 @@ Be aware that this is a sensitive attribute. For more information, see [Sensitiv
4747

4848
~> **Important:** This property is sensitive and will not be displayed in the plan.
4949

50-
5150
## Attributes Reference
5251

5352
In addition to all arguments above, the following attributes are exported:
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package scaleway
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
secret "github.com/scaleway/scaleway-sdk-go/api/secret/v1alpha1"
10+
"github.com/scaleway/scaleway-sdk-go/scw"
11+
)
12+
13+
func dataSourceScalewaySecretVersion() *schema.Resource {
14+
// Generate datasource schema from resource
15+
dsSchema := datasourceSchemaFromResourceSchema(resourceScalewaySecretVersion().Schema)
16+
17+
// Set 'Optional' schema elements
18+
addOptionalFieldsToSchema(dsSchema, "region", "revision")
19+
dsSchema["secret_id"] = &schema.Schema{
20+
Type: schema.TypeString,
21+
Optional: true,
22+
Description: "The ID of the secret",
23+
ValidateFunc: validationUUIDorUUIDWithLocality(),
24+
ConflictsWith: []string{"secret_name"},
25+
}
26+
dsSchema["secret_name"] = &schema.Schema{
27+
Type: schema.TypeString,
28+
Optional: true,
29+
Description: "The Name of the secret",
30+
ConflictsWith: []string{"secret_id"},
31+
}
32+
dsSchema["data"] = &schema.Schema{
33+
Type: schema.TypeString,
34+
Computed: true,
35+
Description: "The payload of the secret version",
36+
}
37+
38+
return &schema.Resource{
39+
ReadContext: datasourceSchemaFromResourceVersionSchema,
40+
Schema: dsSchema,
41+
}
42+
}
43+
44+
func datasourceSchemaFromResourceVersionSchema(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
45+
api, region, err := secretAPIWithRegion(d, meta)
46+
if err != nil {
47+
return diag.FromErr(err)
48+
}
49+
50+
var secretVersionIDStr string
51+
var payloadSecretRaw []byte
52+
53+
secretID, existSecretID := d.GetOk("secret_id")
54+
if !existSecretID {
55+
request := &secret.AccessSecretVersionByNameRequest{
56+
Region: region,
57+
SecretName: d.Get("secret_name").(string),
58+
Revision: d.Get("revision").(string),
59+
}
60+
61+
res, err := api.AccessSecretVersionByName(request, scw.WithContext(ctx))
62+
if err != nil {
63+
return diag.FromErr(err)
64+
}
65+
66+
secretVersionIDStr = newRegionalIDString(region, fmt.Sprintf("%s/%d", res.SecretID, res.Revision))
67+
_ = d.Set("secret_id", newRegionalIDString(region, res.SecretID))
68+
payloadSecretRaw = res.Data
69+
} else {
70+
request := &secret.AccessSecretVersionRequest{
71+
Region: region,
72+
SecretID: expandID(secretID),
73+
Revision: d.Get("revision").(string),
74+
}
75+
76+
res, err := api.AccessSecretVersion(request, scw.WithContext(ctx))
77+
if err != nil {
78+
return diag.FromErr(err)
79+
}
80+
81+
secretVersionIDStr = newRegionalIDString(region, fmt.Sprintf("%s/%d", res.SecretID, res.Revision))
82+
payloadSecretRaw = res.Data
83+
}
84+
85+
d.SetId(secretVersionIDStr)
86+
err = d.Set("data", base64Encoded(payloadSecretRaw))
87+
if err != nil {
88+
return diag.FromErr(err)
89+
}
90+
91+
diags := resourceScalewaySecretVersionRead(ctx, d, meta)
92+
if diags != nil {
93+
return append(diags, diag.Errorf("failed to read secret version")...)
94+
}
95+
96+
if d.Id() == "" {
97+
return diag.Errorf("secret version (%s) not found", secretVersionIDStr)
98+
}
99+
100+
return nil
101+
}
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
package scaleway
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
8+
)
9+
10+
func TestAccScalewayDataSourceSecretVersion_Basic(t *testing.T) {
11+
tt := NewTestTools(t)
12+
defer tt.Cleanup()
13+
14+
const (
15+
secretName = "dataSourceSecretVersionBasic"
16+
secretDataDescription = "secret description"
17+
secretVersionData = "my_super_secret"
18+
secretVersionDataV2 = "my_super_secret_v2"
19+
)
20+
21+
resource.ParallelTest(t, resource.TestCase{
22+
PreCheck: func() { testAccPreCheck(t) },
23+
ProviderFactories: tt.ProviderFactories,
24+
CheckDestroy: testAccCheckScalewaySecretVersionDestroy(tt),
25+
Steps: []resource.TestStep{
26+
{
27+
Config: fmt.Sprintf(`
28+
resource "scaleway_secret" "main" {
29+
name = "%[1]s"
30+
description = "%[2]s"
31+
tags = ["devtools", "provider", "terraform"]
32+
}
33+
34+
resource "scaleway_secret_version" "v1" {
35+
description = "version1"
36+
secret_id = scaleway_secret.main.id
37+
data = "%[3]s"
38+
}
39+
`, secretName, secretDataDescription, secretVersionData),
40+
},
41+
{
42+
Config: fmt.Sprintf(`
43+
resource "scaleway_secret" "main" {
44+
name = "%[1]s"
45+
description = "%[2]s"
46+
tags = ["devtools", "provider", "terraform"]
47+
}
48+
49+
resource "scaleway_secret_version" "v1" {
50+
description = "version1"
51+
secret_id = scaleway_secret.main.id
52+
data = "%[3]s"
53+
}
54+
55+
resource "scaleway_secret_version" "v2" {
56+
description = "version2"
57+
secret_id = scaleway_secret.main.id
58+
data = "%[4]s"
59+
}
60+
`, secretName, secretDataDescription, secretVersionData, secretVersionDataV2),
61+
},
62+
{
63+
Config: fmt.Sprintf(`
64+
resource "scaleway_secret" "main" {
65+
name = "%[1]s"
66+
description = "%[2]s"
67+
tags = ["devtools", "provider", "terraform"]
68+
}
69+
70+
resource "scaleway_secret_version" "v1" {
71+
description = "version1"
72+
secret_id = scaleway_secret.main.id
73+
data = "%[3]s"
74+
}
75+
76+
resource "scaleway_secret_version" "v2" {
77+
description = "version2"
78+
secret_id = scaleway_secret.main.id
79+
data = "%[4]s"
80+
}
81+
82+
data "scaleway_secret_version" "data_v1" {
83+
secret_id = scaleway_secret.main.id
84+
revision = "1"
85+
}
86+
87+
data "scaleway_secret_version" "data_v2" {
88+
secret_id = scaleway_secret.main.id
89+
revision = "2"
90+
}
91+
`, secretName, secretDataDescription, secretVersionData, secretVersionDataV2),
92+
Check: resource.ComposeTestCheckFunc(
93+
testAccCheckScalewaySecretVersionExists(tt, "scaleway_secret_version.v1"),
94+
resource.TestCheckResourceAttrPair("data.scaleway_secret_version.data_v1", "secret_id", "scaleway_secret.main", "id"),
95+
resource.TestCheckResourceAttr("data.scaleway_secret_version.data_v1", "data", base64Encoded([]byte(secretVersionData))),
96+
resource.TestCheckResourceAttr("data.scaleway_secret_version.data_v1", "revision", "1"),
97+
98+
testAccCheckScalewaySecretVersionExists(tt, "scaleway_secret_version.v2"),
99+
resource.TestCheckResourceAttrPair("data.scaleway_secret_version.data_v2", "secret_id", "scaleway_secret.main", "id"),
100+
resource.TestCheckResourceAttr("data.scaleway_secret_version.data_v2", "data", base64Encoded([]byte(secretVersionDataV2))),
101+
),
102+
},
103+
},
104+
})
105+
}
106+
107+
func TestAccScalewayDataSourceSecretVersion_ByNameSecret(t *testing.T) {
108+
tt := NewTestTools(t)
109+
defer tt.Cleanup()
110+
111+
secretName := "dataSourceSecretVersionByNameSecret"
112+
secretVersionData := "my_super_secret"
113+
resource.ParallelTest(t, resource.TestCase{
114+
PreCheck: func() { testAccPreCheck(t) },
115+
ProviderFactories: tt.ProviderFactories,
116+
CheckDestroy: testAccCheckScalewaySecretVersionDestroy(tt),
117+
Steps: []resource.TestStep{
118+
{
119+
Config: fmt.Sprintf(`
120+
resource "scaleway_secret" "main" {
121+
name = "%[1]s"
122+
tags = ["devtools", "provider", "terraform"]
123+
}
124+
125+
resource "scaleway_secret_version" "main" {
126+
description = "version1"
127+
secret_id = scaleway_secret.main.id
128+
data = "%[2]s"
129+
}
130+
`, secretName, secretVersionData),
131+
},
132+
{
133+
Config: fmt.Sprintf(`
134+
resource "scaleway_secret" "main" {
135+
name = "%[1]s"
136+
tags = ["devtools", "provider", "terraform"]
137+
}
138+
139+
resource "scaleway_secret_version" "main" {
140+
description = "version1"
141+
secret_id = scaleway_secret.main.id
142+
data = "%[2]s"
143+
}
144+
145+
data "scaleway_secret_version" "data_by_name" {
146+
secret_name = scaleway_secret.main.name
147+
revision = "1"
148+
}
149+
`, secretName, secretVersionData),
150+
Check: resource.ComposeTestCheckFunc(
151+
testAccCheckScalewaySecretVersionExists(tt, "scaleway_secret_version.main"),
152+
resource.TestCheckResourceAttrPair("data.scaleway_secret_version.data_by_name", "secret_id", "scaleway_secret.main", "id"),
153+
resource.TestCheckResourceAttr("data.scaleway_secret_version.data_by_name", "data", base64Encoded([]byte(secretVersionData))),
154+
resource.TestCheckResourceAttr("data.scaleway_secret_version.data_by_name", "revision", "1"),
155+
),
156+
},
157+
},
158+
})
159+
}

scaleway/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ func Provider(config *ProviderConfig) plugin.ProviderFunc {
217217
"scaleway_registry_namespace": dataSourceScalewayRegistryNamespace(),
218218
"scaleway_tem_domain": dataSourceScalewayTemDomain(),
219219
"scaleway_secret": dataSourceScalewaySecret(),
220+
"scaleway_secret_version": dataSourceScalewaySecretVersion(),
220221
"scaleway_registry_image": dataSourceScalewayRegistryImage(),
221222
"scaleway_vpc_public_gateway": dataSourceScalewayVPCPublicGateway(),
222223
"scaleway_vpc_gateway_network": dataSourceScalewayVPCGatewayNetwork(),

0 commit comments

Comments
 (0)