Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
115 changes: 115 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,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

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

View workflow job for this annotation

GitHub Actions / Go 1.24.0 windows 386 build

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

Check failure on line 100 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 100 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 100 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)

Check failure on line 100 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 100 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 100 in internal/provider/data_source_hyok_customer_key_version.go

View workflow job for this annotation

GitHub Actions / Go 1.24.0 darwin arm64 build

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

Check failure on line 100 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 100 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 100 in internal/provider/data_source_hyok_customer_key_version.go

View workflow job for this annotation

GitHub Actions / Go 1.24.0 darwin amd64 build

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

Check failure on line 100 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)
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)...)
}
40 changes: 40 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,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 + `"
}
`
}
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 windows 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 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 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 linux arm64 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 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 darwin arm64 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 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 darwin 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 freebsd 386 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(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)...)
}
39 changes: 39 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,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 + `"
}
`
}
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
35 changes: 35 additions & 0 deletions website/docs/d/hyok_customer_key_version.markdown
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.
---
Comment on lines +1 to +6
Copy link

Choose a reason for hiding this comment

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

This and the section at website/docs/d/hyok_encrypted_data_key.markdown should probably be changed from agent pool stuff


# 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>"
Copy link

Choose a reason for hiding this comment

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

Non blocker: but it seems like some other id examples do not include <>. (eg. website/docs/d/team_project_access.html.markdown)

So maybe something like

Suggested change
id = "keyv-<your-id>"
id = "my-key-version-id"

Choose a reason for hiding this comment

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

Helen, that's because the customer key version follows the pattern "keyv-####" where # is some id.

}
```

## 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.
33 changes: 33 additions & 0 deletions website/docs/d/hyok_encrypted_data_key.markdown
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.
Loading