Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
## Unreleased
FEATURES:
* **New Data Source:** `d/hyok_customer_key_version` is a new data source for finding
HYOK customer key versions by @dominicretli [#1842](https://github.com/hashicorp/terraform-provider-tfe/pull/1842)
* **New Data Source:** `d/hyok_encrypted_data_key` is a new data source for finding
HYOK encrypted data keys by @dominicretli [#1842](https://github.com/hashicorp/terraform-provider-tfe/pull/1842)

## v0.69.0

Expand Down
2 changes: 2 additions & 0 deletions docs/testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ these values with the environment variables specified below:
1. `RUN_TASKS_HMAC` - The optional HMAC Key that should be used for Run Task operations. The default is no key.
1. `GITHUB_APP_INSTALLATION_ID` - GitHub App installation internal id in the format `ghain-xxxxxxx`. Required for running any tests that use GitHub App VCS (workspace, policy sets, registry module).
1. `GITHUB_APP_INSTALLATION_NAME` - GitHub App installation name. Required for running tfe_github_app_installation data source test.
1. `HYOK_ENCRYPTED_DATA_KEY_ID` - HYOK encrypted data key id. Required for running hyok_encrypted_data_key data source test.
1. `HYOK_CUSTOMER_KEY_VERSION_ID` - HYOK customer key version id. Required for running hyok_customer_key_version data source test.

**Note:** In order to run integration tests for **Paid** features you will need a token `TFE_TOKEN` with HCP Terraform or Terraform Enterprise administrator privileges, otherwise the attempt to upgrade an organization's feature set will fail.

Expand Down
124 changes: 124 additions & 0 deletions internal/provider/data_source_hyok_customer_key_version.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
// 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"
"log"
"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"`
UpdatedAt types.String `tfsdk:"updated_at"`
RevokedAt types.String `tfsdk:"revoked_at"`
}

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.",
Computed: true,
},
"created_at": schema.StringAttribute{
Description: "The timestamp when the key version was created.",
Computed: true,
},
"updated_at": schema.StringAttribute{
Description: "The timestamp when the key version was last updated.",
Computed: true,
},
"revoked_at": schema.StringAttribute{
Description: "The timestamp when the key version was revoked, if applicable.",
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
}

log.Printf("[DEBUG] Reading HYOK customer key version: %s", data.ID.ValueString())

// 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 108 in internal/provider/data_source_hyok_customer_key_version.go

View workflow job for this annotation

GitHub Actions / lint

d.config.Client.HYOKCustomerKeyVersions undefined (type *tfe.Client has no field or method HYOKCustomerKeyVersions)

Check failure on line 108 in internal/provider/data_source_hyok_customer_key_version.go

View workflow job for this annotation

GitHub Actions / Go 1.24.0 freebsd 386 build

d.config.Client.HYOKCustomerKeyVersions undefined (type *tfe.Client has no field or method HYOKCustomerKeyVersions)

Check failure on line 108 in internal/provider/data_source_hyok_customer_key_version.go

View workflow job for this annotation

GitHub Actions / Go 1.24.0 freebsd arm build

d.config.Client.HYOKCustomerKeyVersions undefined (type *tfe.Client has no field or method HYOKCustomerKeyVersions)

Check failure on line 108 in internal/provider/data_source_hyok_customer_key_version.go

View workflow job for this annotation

GitHub Actions / Go 1.24.0 freebsd amd64 build

d.config.Client.HYOKCustomerKeyVersions undefined (type *tfe.Client has no field or method HYOKCustomerKeyVersions)

Check failure on line 108 in internal/provider/data_source_hyok_customer_key_version.go

View workflow job for this annotation

GitHub Actions / Go 1.24.0 windows amd64 build

d.config.Client.HYOKCustomerKeyVersions undefined (type *tfe.Client has no field or method HYOKCustomerKeyVersions)

Check failure on line 108 in internal/provider/data_source_hyok_customer_key_version.go

View workflow job for this annotation

GitHub Actions / Go 1.24.0 linux arm build

d.config.Client.HYOKCustomerKeyVersions undefined (type *tfe.Client has no field or method HYOKCustomerKeyVersions)

Check failure on line 108 in internal/provider/data_source_hyok_customer_key_version.go

View workflow job for this annotation

GitHub Actions / Go 1.24.0 linux 386 build

d.config.Client.HYOKCustomerKeyVersions undefined (type *tfe.Client has no field or method HYOKCustomerKeyVersions)

Check failure on line 108 in internal/provider/data_source_hyok_customer_key_version.go

View workflow job for this annotation

GitHub Actions / Go 1.24.0 linux amd64 build

d.config.Client.HYOKCustomerKeyVersions undefined (type *tfe.Client has no field or method HYOKCustomerKeyVersions)

Check failure on line 108 in internal/provider/data_source_hyok_customer_key_version.go

View workflow job for this annotation

GitHub Actions / Go 1.24.0 linux arm64 build

d.config.Client.HYOKCustomerKeyVersions undefined (type *tfe.Client has no field or method HYOKCustomerKeyVersions)
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)) // TODO DOM: Check this format
data.UpdatedAt = types.StringValue(keyVersion.UpdatedAt.Format(time.RFC3339)) // TODO DOM: Check this format
data.RevokedAt = types.StringValue(keyVersion.RevokedAt.Format(time.RFC3339)) // TODO DOM: Check this format
data.Error = types.StringValue(keyVersion.Error)

// Save data into Terraform state
resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)
}
45 changes: 45 additions & 0 deletions internal/provider/data_source_hyok_customer_key_version_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package provider

import (
"os"
"testing"

"github.com/hashicorp/terraform-plugin-go/tfprotov6"
"github.com/hashicorp/terraform-plugin-testing/echoprovider"
"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) },
ProtoV5ProviderFactories: testAccMuxedProviders,
ProtoV6ProviderFactories: map[string]func() (tfprotov6.ProviderServer, error){
"echo": echoprovider.NewProviderServer(),
},
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", "updated_at"),
),
},
},
})
}

func testAccTFEHYOKCustomerKeyVersionDataSourceConfig(id string) string {
return `
data "tfe_hyok_customer_key_version" "test" {
id = "` + id + `"
}
`
}
103 changes: 103 additions & 0 deletions internal/provider/data_source_hyok_encrypted_data_key.go
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

View workflow job for this annotation

GitHub Actions / lint

d.config.Client.HYOKEncryptedDataKeys undefined (type *tfe.Client has no field or method HYOKEncryptedDataKeys)

Check failure on line 90 in internal/provider/data_source_hyok_encrypted_data_key.go

View workflow job for this annotation

GitHub Actions / Go 1.24.0 freebsd 386 build

d.config.Client.HYOKEncryptedDataKeys undefined (type *tfe.Client has no field or method HYOKEncryptedDataKeys)

Check failure on line 90 in internal/provider/data_source_hyok_encrypted_data_key.go

View workflow job for this annotation

GitHub Actions / Go 1.24.0 freebsd arm build

d.config.Client.HYOKEncryptedDataKeys undefined (type *tfe.Client has no field or method HYOKEncryptedDataKeys)

Check failure on line 90 in internal/provider/data_source_hyok_encrypted_data_key.go

View workflow job for this annotation

GitHub Actions / Go 1.24.0 freebsd amd64 build

d.config.Client.HYOKEncryptedDataKeys undefined (type *tfe.Client has no field or method HYOKEncryptedDataKeys)

Check failure on line 90 in internal/provider/data_source_hyok_encrypted_data_key.go

View workflow job for this annotation

GitHub Actions / Go 1.24.0 windows amd64 build

d.config.Client.HYOKEncryptedDataKeys undefined (type *tfe.Client has no field or method HYOKEncryptedDataKeys)

Check failure on line 90 in internal/provider/data_source_hyok_encrypted_data_key.go

View workflow job for this annotation

GitHub Actions / Go 1.24.0 linux arm build

d.config.Client.HYOKEncryptedDataKeys undefined (type *tfe.Client has no field or method HYOKEncryptedDataKeys)

Check failure on line 90 in internal/provider/data_source_hyok_encrypted_data_key.go

View workflow job for this annotation

GitHub Actions / Go 1.24.0 linux 386 build

d.config.Client.HYOKEncryptedDataKeys undefined (type *tfe.Client has no field or method HYOKEncryptedDataKeys)

Check failure on line 90 in internal/provider/data_source_hyok_encrypted_data_key.go

View workflow job for this annotation

GitHub Actions / Go 1.24.0 linux amd64 build

d.config.Client.HYOKEncryptedDataKeys undefined (type *tfe.Client has no field or method HYOKEncryptedDataKeys)

Check failure on line 90 in internal/provider/data_source_hyok_encrypted_data_key.go

View workflow job for this annotation

GitHub Actions / Go 1.24.0 linux arm64 build

d.config.Client.HYOKEncryptedDataKeys undefined (type *tfe.Client has no field or method HYOKEncryptedDataKeys)
if err != nil {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we have that same condition Helen's PR for "Resource not found" if-statement?

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(string(keyVersion.EncryptedDEK))
data.CustomerKeyName = types.StringValue(keyVersion.CustomerKeyName)
data.CreatedAt = types.StringValue(keyVersion.CreatedAt.Format(time.RFC3339)) // TODO DOM: Check this format
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: this can probably be removed!


// Save data into Terraform state
resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)
}
44 changes: 44 additions & 0 deletions internal/provider/data_source_hyok_encrypted_data_key_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package provider

import (
"os"
"testing"

"github.com/hashicorp/terraform-plugin-go/tfprotov6"
"github.com/hashicorp/terraform-plugin-testing/echoprovider"
"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) },
ProtoV5ProviderFactories: testAccMuxedProviders,
ProtoV6ProviderFactories: map[string]func() (tfprotov6.ProviderServer, error){
"echo": echoprovider.NewProviderServer(),
},
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 + `"
}
`
}
2 changes: 2 additions & 0 deletions internal/provider/provider_next.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,8 @@ func (p *frameworkProvider) Configure(ctx context.Context, req provider.Configur

func (p *frameworkProvider) DataSources(ctx context.Context) []func() datasource.DataSource {
return []func() datasource.DataSource{
NewHYOKCustomerKeyVersionDataSource,
NewHYOKEncryptedDataKeyDataSource,
NewNoCodeModuleDataSource,
NewOrganizationRunTaskDataSource,
NewOrganizationRunTaskGlobalSettingsDataSource,
Expand Down
Loading