Skip to content

Commit 62b9068

Browse files
feat(keymanager): add key datasource (#3524)
1 parent 509d74e commit 62b9068

File tree

9 files changed

+506
-2
lines changed

9 files changed

+506
-2
lines changed

.github/workflows/acceptance-tests.yaml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,13 @@ jobs:
2828
- flexibleip
2929
- function
3030
- iam
31-
- instance
3231
- inference
32+
- instance
3333
- iot
3434
- ipam
3535
- jobs
3636
- k8s
37+
- keymanager
3738
- lb
3839
- marketplace
3940
- mnq
@@ -186,12 +187,13 @@ jobs:
186187
- flexibleip
187188
- function
188189
- iam
189-
- instance
190190
- inference
191+
- instance
191192
- iot
192193
- ipam
193194
- jobs
194195
- k8s
196+
- keymanager
195197
- lb
196198
- marketplace
197199
- mnq

.github/workflows/nightly.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ jobs:
3737
- ipam
3838
- jobs
3939
- k8s
40+
- keymanager
4041
- lb
4142
- marketplace
4243
- mnq
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
---
2+
subcategory: "Key Manager"
3+
page_title: "Scaleway: scaleway_key_manager_key"
4+
---
5+
6+
# scaleway_key_manager_key
7+
8+
Gets information about a Key Manager Key. For more information, refer to the [Key Manager API documentation](https://www.scaleway.com/en/developers/api/key-manager/#path-keys-get-key-metadata).
9+
10+
## Example Usage
11+
12+
### Create a key and get its information
13+
14+
The following commands allow you to:
15+
16+
- create a key named `my-kms-key`
17+
- retrieve the key's information using the key's ID
18+
19+
```hcl
20+
// Create a key
21+
resource "scaleway_key_manager_key" "symmetric" {
22+
name = "my-kms-key"
23+
region = "fr-par"
24+
project_id = "your-project-id" # optional, will use provider default if omitted
25+
usage = "symmetric_encryption"
26+
algorithm = "aes_256_gcm"
27+
description = "Key for encrypting secrets"
28+
tags = ["env:prod", "kms"]
29+
unprotected = true
30+
31+
rotation_policy {
32+
rotation_period = "720h" # 30 days
33+
}
34+
}
35+
36+
// Get the key information by its ID
37+
data "scaleway_key_manager_key" "byID" {
38+
key_id = "11111111-1111-1111-1111-111111111111"
39+
}
40+
```
41+
42+
## Argument Reference
43+
44+
- `key_id` - ID of the key to target. Can be a plain UUID or a [regional](../guides/regions_and_zones.md#resource-ids) ID.
45+
46+
- `region` - (Defaults to [provider](../index.md#region) `region`) The [region](../guides/regions_and_zones.md#regions) in which the key was created.
47+
48+
## Attributes Reference
49+
50+
Exported attributes are the ones from `scaleway_key_manager_key` [resource](../resources/key_manager_key.md)

internal/acctest/acctest.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ var foldersUsingVCRv4 = []string{
3838
"iam",
3939
"instance",
4040
"k8s",
41+
"keymanager",
4142
"marketplace",
4243
"secret",
4344
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package keymanager
2+
3+
import (
4+
"context"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
8+
"github.com/scaleway/terraform-provider-scaleway/v2/internal/datasource"
9+
"github.com/scaleway/terraform-provider-scaleway/v2/internal/meta"
10+
"github.com/scaleway/terraform-provider-scaleway/v2/internal/verify"
11+
)
12+
13+
func DataSourceKey() *schema.Resource {
14+
return &schema.Resource{
15+
ReadContext: dataSourceKeyRead,
16+
SchemaFunc: dataSourceKeySchema,
17+
}
18+
}
19+
20+
func dataSourceKeySchema() map[string]*schema.Schema {
21+
dsSchema := datasource.SchemaFromResourceSchema(ResourceKeyManagerKey().SchemaFunc())
22+
23+
datasource.AddOptionalFieldsToSchema(dsSchema, "region")
24+
25+
dsSchema["key_id"] = &schema.Schema{
26+
Type: schema.TypeString,
27+
Required: true,
28+
Description: "The ID of the key",
29+
ValidateDiagFunc: verify.IsUUIDorUUIDWithLocality(),
30+
}
31+
32+
return dsSchema
33+
}
34+
35+
func dataSourceKeyRead(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics {
36+
keyID := d.Get("key_id")
37+
38+
fallbackRegion, err := meta.ExtractRegion(d, m)
39+
if err != nil {
40+
return diag.FromErr(err)
41+
}
42+
43+
regionalID := datasource.NewRegionalID(keyID, fallbackRegion)
44+
d.SetId(regionalID)
45+
46+
err = d.Set("key_id", regionalID)
47+
if err != nil {
48+
return diag.FromErr(err)
49+
}
50+
51+
diags := resourceKeyManagerKeyRead(ctx, d, m)
52+
if diags != nil {
53+
return append(diags, diag.Errorf("failed to read key")...)
54+
}
55+
56+
if d.Id() == "" {
57+
return diag.Errorf("key (%s) not found", regionalID)
58+
}
59+
60+
return nil
61+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package keymanager_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
7+
"github.com/scaleway/terraform-provider-scaleway/v2/internal/acctest"
8+
)
9+
10+
func TestAccDataSourceKey_Basic(t *testing.T) {
11+
tt := acctest.NewTestTools(t)
12+
defer tt.Cleanup()
13+
14+
resource.ParallelTest(t, resource.TestCase{
15+
ProtoV6ProviderFactories: tt.ProviderFactories,
16+
CheckDestroy: IsKeyManagerKeyDestroyed(tt),
17+
Steps: []resource.TestStep{
18+
{
19+
Config: `
20+
resource "scaleway_key_manager_key" "main" {
21+
name = "tf-test-kms-key-unprotected-a"
22+
region = "fr-par"
23+
usage = "symmetric_encryption"
24+
algorithm = "aes_256_gcm"
25+
description = "Test key"
26+
tags = ["tf", "test"]
27+
unprotected = true
28+
}
29+
30+
data "scaleway_key_manager_key" "by_id" {
31+
key_id = scaleway_key_manager_key.main.id
32+
}
33+
`,
34+
Check: resource.ComposeTestCheckFunc(
35+
resource.TestCheckResourceAttr("data.scaleway_key_manager_key.by_id", "name", "tf-test-kms-key-unprotected-a"),
36+
resource.TestCheckResourceAttr("data.scaleway_key_manager_key.by_id", "region", "fr-par"),
37+
resource.TestCheckResourceAttr("data.scaleway_key_manager_key.by_id", "usage", "symmetric_encryption"),
38+
resource.TestCheckResourceAttr("data.scaleway_key_manager_key.by_id", "algorithm", "aes_256_gcm"),
39+
resource.TestCheckResourceAttr("data.scaleway_key_manager_key.by_id", "description", "Test key"),
40+
resource.TestCheckResourceAttr("data.scaleway_key_manager_key.by_id", "tags.0", "tf"),
41+
resource.TestCheckResourceAttr("data.scaleway_key_manager_key.by_id", "tags.1", "test"),
42+
),
43+
},
44+
},
45+
})
46+
}

0 commit comments

Comments
 (0)