-
Notifications
You must be signed in to change notification settings - Fork 173
[TF-28674] Add HYOK data sources for HYOKCustomerKeyVersion and HYOKEncryptedDataKey #1842
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 11 commits
202a208
4060a6a
81ad65c
34dae45
8b846dc
2713372
5a1c9b2
49d4a3a
6abdd35
8457a54
66f2a61
44add6a
afa401b
9a469a4
a7622dd
8a2e80c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
// Copyright (c) HashiCorp, Inc. | ||
// SPDX-License-Identifier: MPL-2.0 | ||
|
||
package provider | ||
|
||
import ( | ||
"context" | ||
"fmt" | ||
"github.com/hashicorp/terraform-plugin-framework/datasource" | ||
"github.com/hashicorp/terraform-plugin-framework/datasource/schema" | ||
"github.com/hashicorp/terraform-plugin-framework/types" | ||
"time" | ||
) | ||
|
||
var ( | ||
_ datasource.DataSource = &dataSourceHYOKCustomerKeyVersion{} | ||
_ datasource.DataSourceWithConfigure = &dataSourceHYOKCustomerKeyVersion{} | ||
) | ||
|
||
func NewHYOKCustomerKeyVersionDataSource() datasource.DataSource { | ||
return &dataSourceHYOKCustomerKeyVersion{} | ||
} | ||
|
||
type dataSourceHYOKCustomerKeyVersion struct { | ||
config ConfiguredClient | ||
} | ||
|
||
type HYOKCustomerKeyVersionDataSourceModel struct { | ||
ID types.String `tfsdk:"id"` | ||
Status types.String `tfsdk:"status"` | ||
Error types.String `tfsdk:"error"` | ||
KeyVersion types.String `tfsdk:"key_version"` | ||
CreatedAt types.String `tfsdk:"created_at"` | ||
WorkspacesSecured types.Int64 `tfsdk:"workspaces_secured"` | ||
} | ||
|
||
func (d *dataSourceHYOKCustomerKeyVersion) Configure(_ context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { | ||
if req.ProviderData == nil { | ||
return | ||
} | ||
|
||
client, ok := req.ProviderData.(ConfiguredClient) | ||
if !ok { | ||
resp.Diagnostics.AddError( | ||
"Unexpected Data Source Configure Type", | ||
fmt.Sprintf("Expected tfe.ConfiguredClient, got %T. This is a bug in the tfe provider, so please report it on GitHub.", req.ProviderData), | ||
) | ||
|
||
return | ||
} | ||
d.config = client | ||
} | ||
|
||
func (d *dataSourceHYOKCustomerKeyVersion) Metadata(ctx context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { | ||
resp.TypeName = req.ProviderTypeName + "_hyok_customer_key_version" | ||
} | ||
|
||
func (d *dataSourceHYOKCustomerKeyVersion) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) { | ||
resp.Schema = schema.Schema{ | ||
Description: "This data source can be used to retrieve a HYOK customer key version.", | ||
Attributes: map[string]schema.Attribute{ | ||
"id": schema.StringAttribute{ | ||
Description: "The ID of the HYOK customer key version.", | ||
Required: true, | ||
}, | ||
"status": schema.StringAttribute{ | ||
Description: "The status of the HYOK customer key version.", | ||
Computed: true, | ||
}, | ||
"error": schema.StringAttribute{ | ||
Description: "Any error message associated with the HYOK customer key version.", | ||
Computed: true, | ||
}, | ||
"key_version": schema.StringAttribute{ | ||
Description: "The version number of the customer key version.", | ||
Computed: true, | ||
}, | ||
"workspaces_secured": schema.Int64Attribute{ | ||
Description: "The number workspaces secured by this customer key version.", | ||
Computed: true, | ||
}, | ||
"created_at": schema.StringAttribute{ | ||
Description: "The timestamp when the key version was created.", | ||
Computed: true, | ||
}, | ||
}, | ||
} | ||
} | ||
|
||
func (d *dataSourceHYOKCustomerKeyVersion) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { | ||
var data HYOKCustomerKeyVersionDataSourceModel | ||
|
||
// Read Terraform configuration data into the model | ||
resp.Diagnostics.Append(req.Config.Get(ctx, &data)...) | ||
if resp.Diagnostics.HasError() { | ||
return | ||
} | ||
|
||
// Make API call to fetch the HYOK customer key version | ||
keyVersion, err := d.config.Client.HYOKCustomerKeyVersions.Read(ctx, data.ID.ValueString()) | ||
Check failure on line 100 in internal/provider/data_source_hyok_customer_key_version.go
|
||
if err != nil { | ||
resp.Diagnostics.AddError("Unable to read HYOK customer key version", err.Error()) | ||
return | ||
} | ||
|
||
// Set the computed attributes from the API response | ||
data.Status = types.StringValue(string(keyVersion.Status)) | ||
data.KeyVersion = types.StringValue(keyVersion.KeyVersion) | ||
data.CreatedAt = types.StringValue(keyVersion.CreatedAt.Format(time.RFC3339)) | ||
data.WorkspacesSecured = types.Int64Value(int64(keyVersion.WorkspacesSecured)) | ||
data.Error = types.StringValue(keyVersion.Error) | ||
|
||
// Save data into Terraform state | ||
resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
package provider | ||
|
||
import ( | ||
"os" | ||
"testing" | ||
|
||
"github.com/hashicorp/terraform-plugin-testing/helper/resource" | ||
) | ||
|
||
func TestAccTFEHYOKCustomerKeyVersionDataSource_basic(t *testing.T) { | ||
hyokCustomerKeyVersionId := os.Getenv("HYOK_CUSTOMER_KEY_VERSION_ID") | ||
if hyokCustomerKeyVersionId == "" { | ||
t.Skip("HYOK_CUSTOMER_KEY_VERSION_ID environment variable must be set to run this test") | ||
} | ||
|
||
resource.Test(t, resource.TestCase{ | ||
PreCheck: func() { testAccPreCheck(t) }, | ||
ProtoV6ProviderFactories: testAccMuxedProviders, | ||
Steps: []resource.TestStep{ | ||
{ | ||
Config: testAccTFEHYOKCustomerKeyVersionDataSourceConfig(hyokCustomerKeyVersionId), | ||
Check: resource.ComposeAggregateTestCheckFunc( | ||
resource.TestCheckResourceAttr("data.tfe_hyok_customer_key_version.test", "id", hyokCustomerKeyVersionId), | ||
resource.TestCheckResourceAttrSet("data.tfe_hyok_customer_key_version.test", "status"), | ||
resource.TestCheckResourceAttrSet("data.tfe_hyok_customer_key_version.test", "key_version"), | ||
resource.TestCheckResourceAttrSet("data.tfe_hyok_customer_key_version.test", "created_at"), | ||
resource.TestCheckResourceAttrSet("data.tfe_hyok_customer_key_version.test", "workspaces_secured"), | ||
), | ||
}, | ||
}, | ||
}) | ||
} | ||
|
||
func testAccTFEHYOKCustomerKeyVersionDataSourceConfig(id string) string { | ||
return ` | ||
data "tfe_hyok_customer_key_version" "test" { | ||
id = "` + id + `" | ||
} | ||
` | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
// Copyright (c) HashiCorp, Inc. | ||
// SPDX-License-Identifier: MPL-2.0 | ||
|
||
package provider | ||
|
||
import ( | ||
"context" | ||
"fmt" | ||
"github.com/hashicorp/terraform-plugin-framework/datasource" | ||
"github.com/hashicorp/terraform-plugin-framework/datasource/schema" | ||
"github.com/hashicorp/terraform-plugin-framework/types" | ||
"time" | ||
) | ||
|
||
var ( | ||
_ datasource.DataSource = &dataSourceHYOKEncryptedDataKey{} | ||
_ datasource.DataSourceWithConfigure = &dataSourceHYOKEncryptedDataKey{} | ||
) | ||
|
||
func NewHYOKEncryptedDataKeyDataSource() datasource.DataSource { | ||
return &dataSourceHYOKEncryptedDataKey{} | ||
} | ||
|
||
type dataSourceHYOKEncryptedDataKey struct { | ||
config ConfiguredClient | ||
} | ||
|
||
type HYOKEncryptedDataKeyDataSourceModel struct { | ||
ID types.String `tfsdk:"id"` | ||
EncryptedDEK types.String `tfsdk:"encrypted_dek"` | ||
CustomerKeyName types.String `tfsdk:"customer_key_name"` | ||
CreatedAt types.String `tfsdk:"created_at"` | ||
} | ||
|
||
func (d *dataSourceHYOKEncryptedDataKey) Configure(_ context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { | ||
if req.ProviderData == nil { | ||
return | ||
} | ||
|
||
client, ok := req.ProviderData.(ConfiguredClient) | ||
if !ok { | ||
resp.Diagnostics.AddError( | ||
"Unexpected Data Source Configure Type", | ||
fmt.Sprintf("Expected tfe.ConfiguredClient, got %T. This is a bug in the tfe provider, so please report it on GitHub.", req.ProviderData), | ||
) | ||
|
||
return | ||
} | ||
d.config = client | ||
} | ||
|
||
func (d *dataSourceHYOKEncryptedDataKey) Metadata(ctx context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { | ||
resp.TypeName = req.ProviderTypeName + "_hyok_encrypted_data_key" | ||
} | ||
|
||
func (d *dataSourceHYOKEncryptedDataKey) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) { | ||
resp.Schema = schema.Schema{ | ||
Description: "This data source can be used to retrieve a HYOK customer key version.", | ||
Attributes: map[string]schema.Attribute{ | ||
"id": schema.StringAttribute{ | ||
Description: "The ID of the HYOK encrypted data key.", | ||
Required: true, | ||
}, | ||
"encrypted_dek": schema.StringAttribute{ | ||
Description: "The encrypted data encryption key of the HYOK encrypted data key.", | ||
Computed: true, | ||
}, | ||
"customer_key_name": schema.StringAttribute{ | ||
Description: "The customer provided name of the HYOK encrypted data key.", | ||
Computed: true, | ||
}, | ||
"created_at": schema.StringAttribute{ | ||
Description: "The timestamp when the key version was created.", | ||
Computed: true, | ||
}, | ||
}, | ||
} | ||
} | ||
|
||
func (d *dataSourceHYOKEncryptedDataKey) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { | ||
var data HYOKEncryptedDataKeyDataSourceModel | ||
|
||
// Read Terraform configuration data into the model | ||
resp.Diagnostics.Append(req.Config.Get(ctx, &data)...) | ||
if resp.Diagnostics.HasError() { | ||
return | ||
} | ||
|
||
// Make API call to fetch the HYOK customer key version | ||
keyVersion, err := d.config.Client.HYOKEncryptedDataKeys.Read(ctx, data.ID.ValueString()) | ||
Check failure on line 90 in internal/provider/data_source_hyok_encrypted_data_key.go
|
||
if err != nil { | ||
resp.Diagnostics.AddError("Unable to read HYOK customer key version", err.Error()) | ||
return | ||
} | ||
|
||
// Set the computed attributes from the API response | ||
data.EncryptedDEK = types.StringValue(keyVersion.EncryptedDEK) | ||
data.CustomerKeyName = types.StringValue(keyVersion.CustomerKeyName) | ||
data.CreatedAt = types.StringValue(keyVersion.CreatedAt.Format(time.RFC3339)) // TODO DOM: Check this format | ||
dominic-retli-hashi marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
||
// Save data into Terraform state | ||
resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
package provider | ||
|
||
import ( | ||
"os" | ||
"testing" | ||
|
||
"github.com/hashicorp/terraform-plugin-testing/helper/resource" | ||
) | ||
|
||
func TestAccTFEHYOKEncryptedDataKeyDataSource_basic(t *testing.T) { | ||
hyokEncryptedDataKeyID := os.Getenv("HYOK_ENCRYPTED_DATA_KEY_ID") | ||
if hyokEncryptedDataKeyID == "" { | ||
t.Skip("HYOK_ENCRYPTED_DATA_KEY_ID environment variable must be set to run this test") | ||
} | ||
|
||
resource.Test(t, resource.TestCase{ | ||
PreCheck: func() { testAccPreCheck(t) }, | ||
ProtoV6ProviderFactories: testAccMuxedProviders, | ||
Steps: []resource.TestStep{ | ||
{ | ||
Config: testAccTFEHYOKEncryptedDataKeyDataSourceConfig(hyokEncryptedDataKeyID), | ||
Check: resource.ComposeAggregateTestCheckFunc( | ||
resource.TestCheckResourceAttr("data.tfe_hyok_encrypted_data_key.test", "id", hyokEncryptedDataKeyID), | ||
resource.TestCheckResourceAttrSet("data.tfe_hyok_encrypted_data_key.test", "encrypted_dek"), | ||
resource.TestCheckResourceAttrSet("data.tfe_hyok_encrypted_data_key.test", "customer_key_name"), | ||
resource.TestCheckResourceAttrSet("data.tfe_hyok_encrypted_data_key.test", "created_at"), | ||
), | ||
}, | ||
}, | ||
}) | ||
} | ||
|
||
func testAccTFEHYOKEncryptedDataKeyDataSourceConfig(id string) string { | ||
return ` | ||
data "tfe_hyok_encrypted_data_key" "test" { | ||
id = "` + id + `" | ||
} | ||
` | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
--- | ||
layout: "tfe" | ||
page_title: "Terraform Enterprise: tfe_agent_pool" | ||
description: |- | ||
Get information on an agent pool. | ||
--- | ||
helenjw marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
# Data Source: tfe_hyok_customer_key_version | ||
|
||
Use this data source to get information about a Hold Your Own Keys (HYOK) customer key version. | ||
|
||
## Example Usage | ||
|
||
```hcl | ||
data "tfe_hyok_customer_key_version" "tfe_hyok_customer_key_version1" { | ||
id = "keyv-<your-id>" | ||
dominic-retli-hashi marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
} | ||
``` | ||
|
||
## Argument Reference | ||
|
||
The following arguments are supported: | ||
|
||
* `id` - (Required) The ID of the HYOK customer key version. | ||
|
||
## Attributes Reference | ||
|
||
In addition to all arguments above, the following attributes are exported: | ||
|
||
* `created_at` - The time when the customer key version was created. | ||
* `error` - Any error message associated with the customer key version. | ||
* `id` - The ID of the customer key version. | ||
* `key_version` - The version number of the customer key. | ||
* `status` - The status of the customer key version. | ||
* `workspaces_secured` - The number of workspaces securefd by this customer key version. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
--- | ||
layout: "tfe" | ||
page_title: "Terraform Enterprise: tfe_agent_pool" | ||
description: |- | ||
Get information on an agent pool. | ||
--- | ||
|
||
# Data Source: tfe_hyok_encrypted_data_key | ||
|
||
Use this data source to get information about a Hold Your Own Keys (HYOK) encrypted data key. | ||
|
||
## Example Usage | ||
|
||
```hcl | ||
data "tfe_hyok_encrypted_data_key" "tfe_hyok_encrypted_data_key1" { | ||
id = "dek-<your-id>" | ||
} | ||
``` | ||
|
||
## Argument Reference | ||
|
||
The following arguments are supported: | ||
|
||
* `id` - (Required) The ID of the HYOK encrypted data key. | ||
|
||
## Attributes Reference | ||
|
||
In addition to all arguments above, the following attributes are exported: | ||
|
||
* `created_at` - The time when the encrypted data key was created. | ||
* `customer_key_name` - The name of the customer key used to encrypt the data key. | ||
* `encrypted_dek` - The encrypted data encryption key (DEK). | ||
* `id` - The ID of the encrypted data key. |
Uh oh!
There was an error while loading. Please reload this page.