Skip to content

Commit f988f9c

Browse files
Monitobquantumsheepremyleoneyfodilndrpnt
authored
feat(secret-version): resource secret version (#1815)
* feat(secret_versions): add resource secret version * feat(secret-versions): add helpers and cassette test * docs: secret version * feat(secret_version): add option with_access and data encoded 64 * docs: secret version add options * test: add cassettes * feat(secret_versions): add helpers encode 64 * Update scaleway/helpers.go Co-authored-by: Nathanael Demacon <[email protected]> * fix: remove base64 test * fix(secrets-versions): remove option update_with and make data base64 required * chore: bump cassettes * fix(secrets-version): update helpers * docs: bump documentation * feat(lb): add ips datasource (#1791) * feat(lb): add ips datasource * fix * fix * add support for returning multiple ips sharing the same prexif * typo * fix ci * fix ci * update cassette * rename to ipv4Match * fix * match with cidr * fix(domain): correctly check for NoSuchDNSZone error code (#1812) * fix(baremetal): fix updating of name and description (#1826) * docs: update index.md with new links for credentials and project ID (#1827) * fix(secret-version): remove the base64 encoded restriction * Update scaleway/helpers_secret.go Co-authored-by: Nathanael Demacon <[email protected]> * Update docs/resources/secret_version.md Co-authored-by: Nathanael Demacon <[email protected]> * Update docs/resources/secret_version.md Co-authored-by: Nathanael Demacon <[email protected]> * Update docs/resources/secret_version.md Co-authored-by: Nathanael Demacon <[email protected]> * Update scaleway/resource_secret_version.go Co-authored-by: Nathanael Demacon <[email protected]> --------- Co-authored-by: Nathanael Demacon <[email protected]> Co-authored-by: Rémy Léone <[email protected]> Co-authored-by: Yacine Fodil <[email protected]> Co-authored-by: ndrpnt <[email protected]> Co-authored-by: Jules Castéran <[email protected]>
1 parent c67642e commit f988f9c

File tree

6 files changed

+1389
-0
lines changed

6 files changed

+1389
-0
lines changed

docs/resources/secret_version.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
---
2+
page_title: "Scaleway: scaleway_secret_version"
3+
description: |-
4+
Manages Scaleway Secret Versions
5+
---
6+
7+
# scaleway_secret
8+
9+
Creates and manages Scaleway Secret Versions.
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 = "foo"
19+
description = "barr"
20+
tags = ["foo", "terraform"]
21+
}
22+
23+
resource "scaleway_secret_version" "v1" {
24+
description = "version1"
25+
secret_id = scaleway_secret.main.id
26+
data = "my_new_secret"
27+
}
28+
```
29+
30+
## Arguments Reference
31+
32+
The following arguments are supported:
33+
34+
- `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)
36+
- `description` - (Optional) Description of the secret version (e.g. `my-new-description`).
37+
- `region` - (Defaults to [provider](../index.md#region) `region`) The [region](../guides/regions_and_zones.md#regions)
38+
in which the resource exists.
39+
40+
## Data
41+
42+
Note: The `data` should be a base64 encoded string when sent from the API. **It is already handled by the provider so you don't need to encode it yourself.**
43+
44+
Updating `data` will force creating a new the secret version.
45+
46+
Be aware that this is a sensitive attribute. For more information, see [Sensitive Data in State](https://developer.hashicorp.com/terraform/language/state/sensitive-data).
47+
48+
~> **Important:** This property is sensitive and will not be displayed in the plan.
49+
50+
51+
## Attributes Reference
52+
53+
In addition to all arguments above, the following attributes are exported:
54+
55+
- `revision` - The revision for this Secret Version.
56+
- `status` - The status of the Secret Version.
57+
- `created_at` - Date and time of secret version's creation (RFC 3339 format).
58+
- `updated_at` - Date and time of secret version's last update (RFC 3339 format).
59+
60+
## Import
61+
62+
The Secret Version can be imported using the `{region}/{id}/{revision}`, e.g.
63+
64+
~> **Important:** Be aware if you import with revision `latest` you will overwrite the version you used before.
65+
66+
```bash
67+
$ terraform import scaleway_secret.main fr-par/11111111-1111-1111-1111-111111111111/2
68+
```

scaleway/helpers_secret.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package scaleway
22

33
import (
4+
"encoding/base64"
45
"time"
56

67
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -35,3 +36,28 @@ func secretAPIWithRegionAndID(m interface{}, id string) (*secret.API, scw.Region
3536
}
3637
return api, region, id, nil
3738
}
39+
40+
// secretVersionAPIWithRegionAndID returns a Secret API with locality and Nested ID extracted from the state
41+
func secretVersionAPIWithRegionAndID(m interface{}, id string) (*secret.API, scw.Region, string, string, error) {
42+
meta := m.(*Meta)
43+
44+
region, id, revision, err := parseLocalizedNestedID(id)
45+
if err != nil {
46+
return nil, "", "", "", err
47+
}
48+
49+
api := secret.NewAPI(meta.scwClient)
50+
return api, scw.Region(region), id, revision, nil
51+
}
52+
53+
func isBase64Encoded(data []byte) bool {
54+
_, err := base64.StdEncoding.DecodeString(string(data))
55+
return err == nil
56+
}
57+
58+
func base64Encoded(data []byte) string {
59+
if isBase64Encoded(data) {
60+
return string(data)
61+
}
62+
return base64.StdEncoding.EncodeToString(data)
63+
}

scaleway/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ func Provider(config *ProviderConfig) plugin.ProviderFunc {
151151
"scaleway_mnq_namespace": resourceScalewayMNQNamespace(),
152152
"scaleway_mnq_credential": resourceScalewayMNQCredential(),
153153
"scaleway_secret": resourceScalewaySecret(),
154+
"scaleway_secret_version": resourceScalewaySecretVersion(),
154155
"scaleway_vpc_public_gateway": resourceScalewayVPCPublicGateway(),
155156
"scaleway_vpc_gateway_network": resourceScalewayVPCGatewayNetwork(),
156157
"scaleway_vpc_public_gateway_dhcp": resourceScalewayVPCPublicGatewayDHCP(),
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
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 resourceScalewaySecretVersion() *schema.Resource {
14+
return &schema.Resource{
15+
CreateContext: resourceScalewaySecretVersionCreate,
16+
ReadContext: resourceScalewaySecretVersionRead,
17+
UpdateContext: resourceScalewaySecretVersionUpdate,
18+
DeleteContext: resourceScalewaySecretVersionDelete,
19+
Importer: &schema.ResourceImporter{
20+
StateContext: schema.ImportStatePassthroughContext,
21+
},
22+
Timeouts: &schema.ResourceTimeout{
23+
Default: schema.DefaultTimeout(defaultSecretTimeout),
24+
},
25+
SchemaVersion: 0,
26+
Schema: map[string]*schema.Schema{
27+
"secret_id": {
28+
Type: schema.TypeString,
29+
Required: true,
30+
Description: "The secret ID associated with this version",
31+
DiffSuppressFunc: diffSuppressFuncLocality,
32+
},
33+
"data": {
34+
Type: schema.TypeString,
35+
Required: true,
36+
Description: "The data payload of your secret version.",
37+
Sensitive: true,
38+
ForceNew: true,
39+
StateFunc: func(i interface{}) string {
40+
return base64Encoded([]byte(i.(string)))
41+
},
42+
},
43+
"description": {
44+
Type: schema.TypeString,
45+
Optional: true,
46+
Description: "Description of the secret version",
47+
},
48+
"status": {
49+
Type: schema.TypeString,
50+
Computed: true,
51+
Description: "Status of the secret version",
52+
},
53+
"revision": {
54+
Type: schema.TypeInt,
55+
Computed: true,
56+
Description: "The revision of secret version",
57+
},
58+
"created_at": {
59+
Type: schema.TypeString,
60+
Computed: true,
61+
Description: "Date and time of secret version's creation (RFC 3339 format)",
62+
},
63+
"updated_at": {
64+
Type: schema.TypeString,
65+
Computed: true,
66+
Description: "Date and time of secret version's creation (RFC 3339 format)",
67+
},
68+
"region": regionSchema(),
69+
},
70+
}
71+
}
72+
73+
func resourceScalewaySecretVersionCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
74+
api, region, err := secretAPIWithRegion(d, meta)
75+
if err != nil {
76+
return diag.FromErr(err)
77+
}
78+
79+
secretID := expandID(d.Get("secret_id").(string))
80+
payloadSecretRaw := []byte(d.Get("data").(string))
81+
if err != nil {
82+
return diag.FromErr(err)
83+
}
84+
secretCreateVersionRequest := &secret.CreateSecretVersionRequest{
85+
Region: region,
86+
SecretID: secretID,
87+
Data: payloadSecretRaw,
88+
Description: expandStringPtr(d.Get("description")),
89+
}
90+
91+
secretResponse, err := api.CreateSecretVersion(secretCreateVersionRequest, scw.WithContext(ctx))
92+
if err != nil {
93+
return diag.FromErr(err)
94+
}
95+
96+
_ = d.Set("data", base64Encoded(payloadSecretRaw))
97+
98+
d.SetId(newRegionalIDString(region, fmt.Sprintf("%s/%d", secretResponse.SecretID, secretResponse.Revision)))
99+
100+
return resourceScalewaySecretVersionRead(ctx, d, meta)
101+
}
102+
103+
func resourceScalewaySecretVersionRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
104+
api, region, id, revision, err := secretVersionAPIWithRegionAndID(meta, d.Id())
105+
if err != nil {
106+
return diag.FromErr(err)
107+
}
108+
109+
secretResponse, err := api.GetSecretVersion(&secret.GetSecretVersionRequest{
110+
Region: region,
111+
SecretID: id,
112+
Revision: revision,
113+
}, scw.WithContext(ctx))
114+
if err != nil {
115+
if is404Error(err) {
116+
d.SetId("")
117+
return nil
118+
}
119+
return diag.FromErr(err)
120+
}
121+
122+
_ = d.Set("secret_id", newRegionalIDString(region, id))
123+
_ = d.Set("description", flattenStringPtr(secretResponse.Description))
124+
_ = d.Set("created_at", flattenTime(secretResponse.CreatedAt))
125+
_ = d.Set("updated_at", flattenTime(secretResponse.UpdatedAt))
126+
_ = d.Set("status", secretResponse.Status.String())
127+
_ = d.Set("revision", int(secretResponse.Revision))
128+
_ = d.Set("region", string(region))
129+
130+
return nil
131+
}
132+
133+
func resourceScalewaySecretVersionUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
134+
api, region, id, revision, err := secretVersionAPIWithRegionAndID(meta, d.Id())
135+
if err != nil {
136+
return diag.FromErr(err)
137+
}
138+
139+
updateRequest := &secret.UpdateSecretVersionRequest{
140+
Region: region,
141+
SecretID: id,
142+
Revision: revision,
143+
}
144+
145+
hasChanged := false
146+
147+
if d.HasChange("description") {
148+
updateRequest.Description = expandUpdatedStringPtr(d.Get("description"))
149+
hasChanged = true
150+
}
151+
152+
if hasChanged {
153+
_, err := api.UpdateSecretVersion(updateRequest, scw.WithContext(ctx))
154+
if err != nil {
155+
return diag.FromErr(err)
156+
}
157+
}
158+
159+
return resourceScalewaySecretVersionRead(ctx, d, meta)
160+
}
161+
162+
func resourceScalewaySecretVersionDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
163+
api, region, id, revision, err := secretVersionAPIWithRegionAndID(meta, d.Id())
164+
if err != nil {
165+
return diag.FromErr(err)
166+
}
167+
168+
_, err = api.DestroySecretVersion(&secret.DestroySecretVersionRequest{
169+
Region: region,
170+
SecretID: id,
171+
Revision: revision,
172+
}, scw.WithContext(ctx))
173+
if err != nil && !is404Error(err) {
174+
return diag.FromErr(err)
175+
}
176+
177+
return nil
178+
}

0 commit comments

Comments
 (0)