Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
## [Unreleased]

- Add `ignore_missing_component_templates` to `elasticstack_elasticsearch_index_template` ([#1206](https://github.com/elastic/terraform-provider-elasticstack/pull/1206))
- Migrate `elasticstack_elasticsearch_enrich_policy` resource and data source to Terraform Plugin Framework

## [0.11.17] - 2025-07-21

Expand Down
200 changes: 200 additions & 0 deletions internal/elasticsearch/enrich/acc_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
package enrich_test

import (
"encoding/json"
"fmt"
"net/http"
"testing"

"github.com/elastic/terraform-provider-elasticstack/internal/acctest"
"github.com/elastic/terraform-provider-elasticstack/internal/clients"
sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
)

func TestAccResourceEnrichPolicyFW(t *testing.T) {
name := sdkacctest.RandStringFromCharSet(10, sdkacctest.CharSetAlphaNum)
resource.Test(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(t) },
CheckDestroy: checkEnrichPolicyDestroyFW(name),
ProtoV6ProviderFactories: acctest.Providers,
Steps: []resource.TestStep{
{
Config: testAccEnrichPolicyFW(name),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("elasticstack_elasticsearch_enrich_policy.policy", "name", name),
resource.TestCheckResourceAttr("elasticstack_elasticsearch_enrich_policy.policy", "policy_type", "match"),
resource.TestCheckResourceAttr("elasticstack_elasticsearch_enrich_policy.policy", "match_field", `email`),
resource.TestCheckResourceAttr("elasticstack_elasticsearch_enrich_policy.policy", "indices.0", name),
resource.TestCheckResourceAttr("elasticstack_elasticsearch_enrich_policy.policy", "enrich_fields.0", "first_name"),
resource.TestCheckResourceAttr("elasticstack_elasticsearch_enrich_policy.policy", "enrich_fields.1", "last_name"),
resource.TestCheckResourceAttr("elasticstack_elasticsearch_enrich_policy.policy", "query", "{\"match_all\":{}}"),
resource.TestCheckResourceAttr("elasticstack_elasticsearch_enrich_policy.policy", "execute", "true"),
),
},
},
})
}

func TestAccDataSourceEnrichPolicyFW(t *testing.T) {
name := sdkacctest.RandStringFromCharSet(10, sdkacctest.CharSetAlphaNum)
resource.Test(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(t) },
ProtoV6ProviderFactories: acctest.Providers,
Steps: []resource.TestStep{
{
Config: testAccEnrichPolicyDataSourceFW(name),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_enrich_policy.test", "name", name),
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_enrich_policy.test", "policy_type", "match"),
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_enrich_policy.test", "match_field", "email"),
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_enrich_policy.test", "indices.0", name),
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_enrich_policy.test", "enrich_fields.0", "first_name"),
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_enrich_policy.test", "enrich_fields.1", "last_name"),
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_enrich_policy.test", "query", "{\"match_all\":{}}"),
),
},
},
})
}

func TestAccResourceEnrichPolicyFromSDK(t *testing.T) {
name := sdkacctest.RandStringFromCharSet(10, sdkacctest.CharSetAlphaNum)
resource.Test(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(t) },
Steps: []resource.TestStep{
{
// Create the enrich policy with the last provider version where the enrich policy resource was built on the SDK
ExternalProviders: map[string]resource.ExternalProvider{
"elasticstack": {
Source: "elastic/elasticstack",
VersionConstraint: "0.11.15",
},
},
Config: testAccEnrichPolicyFW(name),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("elasticstack_elasticsearch_enrich_policy.policy", "name", name),
resource.TestCheckResourceAttr("elasticstack_elasticsearch_enrich_policy.policy", "policy_type", "match"),
resource.TestCheckResourceAttr("elasticstack_elasticsearch_enrich_policy.policy", "execute", "true"),
),
},
{
ProtoV6ProviderFactories: acctest.Providers,
Config: testAccEnrichPolicyFW(name),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("elasticstack_elasticsearch_enrich_policy.policy", "name", name),
resource.TestCheckResourceAttr("elasticstack_elasticsearch_enrich_policy.policy", "policy_type", "match"),
resource.TestCheckResourceAttr("elasticstack_elasticsearch_enrich_policy.policy", "execute", "true"),
),
},
},
})
}

func testAccEnrichPolicyFW(name string) string {
return fmt.Sprintf(`
provider "elasticstack" {
elasticsearch {}
}
resource "elasticstack_elasticsearch_index" "my_index" {
name = "%s"
mappings = jsonencode({
properties = {
email = { type = "text" }
first_name = { type = "text" }
last_name = { type = "text" }
}
})
deletion_protection = false
}
resource "elasticstack_elasticsearch_enrich_policy" "policy" {
name = "%s"
policy_type = "match"
indices = [elasticstack_elasticsearch_index.my_index.name]
match_field = "email"
enrich_fields = ["first_name", "last_name"]
query = <<-EOD
{"match_all": {}}
EOD
}
`, name, name)
}

func testAccEnrichPolicyDataSourceFW(name string) string {
return fmt.Sprintf(`
provider "elasticstack" {
elasticsearch {}
}
resource "elasticstack_elasticsearch_index" "my_index" {
name = "%s"
mappings = jsonencode({
properties = {
email = { type = "text" }
first_name = { type = "text" }
last_name = { type = "text" }
}
})
deletion_protection = false
}
resource "elasticstack_elasticsearch_enrich_policy" "policy" {
name = "%s"
policy_type = "match"
indices = [elasticstack_elasticsearch_index.my_index.name]
match_field = "email"
enrich_fields = ["first_name", "last_name"]
query = <<-EOD
{"match_all": {}}
EOD
}
data "elasticstack_elasticsearch_enrich_policy" "test" {
name = elasticstack_elasticsearch_enrich_policy.policy.name
}
`, name, name)
}

func checkEnrichPolicyDestroyFW(name string) func(s *terraform.State) error {
return func(s *terraform.State) error {
client, err := clients.NewAcceptanceTestingClient()
if err != nil {
return err
}

for _, rs := range s.RootModule().Resources {
if rs.Type != "elasticstack_elasticsearch_enrich_policy" {
continue
}
compId, _ := clients.CompositeIdFromStr(rs.Primary.ID)
if compId.ResourceId != name {
return fmt.Errorf("Found unexpectedly enrich policy: %s", compId.ResourceId)
}
esClient, err := client.GetESClient()
if err != nil {
return err
}
req := esClient.EnrichGetPolicy.WithName(compId.ResourceId)
res, err := esClient.EnrichGetPolicy(req)
if err != nil {
return err
}
defer res.Body.Close()
if res.StatusCode == http.StatusFound {
var policiesResponse map[string]any
if err := json.NewDecoder(res.Body).Decode(&policiesResponse); err != nil {
return err
}
if len(policiesResponse["policies"].([]any)) != 0 {
return fmt.Errorf("Enrich policy (%s) still exists", compId.ResourceId)
}
}
}
return nil
}
}
94 changes: 94 additions & 0 deletions internal/elasticsearch/enrich/create.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package enrich

import (
"context"

"github.com/elastic/terraform-provider-elasticstack/internal/clients"
"github.com/elastic/terraform-provider-elasticstack/internal/clients/elasticsearch"
"github.com/elastic/terraform-provider-elasticstack/internal/models"
"github.com/elastic/terraform-provider-elasticstack/internal/utils"
"github.com/hashicorp/terraform-plugin-framework/diag"
"github.com/hashicorp/terraform-plugin-framework/path"
"github.com/hashicorp/terraform-plugin-framework/resource"
"github.com/hashicorp/terraform-plugin-framework/tfsdk"
"github.com/hashicorp/terraform-plugin-framework/types"
)

func (r *enrichPolicyResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
diags := r.upsert(ctx, req.Plan, &resp.State)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}
}

func (r *enrichPolicyResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) {
diags := r.upsert(ctx, req.Plan, &resp.State)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}
}

func (r *enrichPolicyResource) upsert(ctx context.Context, plan tfsdk.Plan, state *tfsdk.State) diag.Diagnostics {
var data EnrichPolicyData
var diags diag.Diagnostics
diags.Append(plan.Get(ctx, &data)...)
if diags.HasError() {
return diags
}

policyName := data.Name.ValueString()
id, sdkDiags := r.client.ID(ctx, policyName)
diags.Append(utils.FrameworkDiagsFromSDK(sdkDiags)...)
if diags.HasError() {
return diags
}

client, diags := clients.MaybeNewApiClientFromFrameworkResource(ctx, data.ElasticsearchConnection, r.client)
diags.Append(diags...)
if diags.HasError() {
return diags
}

// Convert framework types to model
indices := utils.ListTypeToSlice_String(ctx, data.Indices, path.Empty(), &diags)
if diags.HasError() {
return diags
}

enrichFields := utils.ListTypeToSlice_String(ctx, data.EnrichFields, path.Empty(), &diags)
if diags.HasError() {
return diags
}

policy := &models.EnrichPolicy{
Type: data.PolicyType.ValueString(),
Name: policyName,
Indices: indices,
MatchField: data.MatchField.ValueString(),
EnrichFields: enrichFields,
}

if !data.Query.IsNull() && !data.Query.IsUnknown() {
policy.Query = data.Query.ValueString()
}

if sdkDiags := elasticsearch.PutEnrichPolicy(ctx, client, policy); sdkDiags.HasError() {
diags.Append(utils.FrameworkDiagsFromSDK(sdkDiags)...)
return diags
}

data.Id = types.StringValue(id.String())

// Execute policy if requested
if !data.Execute.IsNull() && !data.Execute.IsUnknown() && data.Execute.ValueBool() {
if sdkDiags := elasticsearch.ExecuteEnrichPolicy(ctx, client, policyName); sdkDiags.HasError() {
diags.Append(utils.FrameworkDiagsFromSDK(sdkDiags)...)
return diags
}
}

diags.Append(state.Set(ctx, &data)...)
return diags
}
34 changes: 34 additions & 0 deletions internal/elasticsearch/enrich/delete.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package enrich

import (
"context"

"github.com/elastic/terraform-provider-elasticstack/internal/clients"
"github.com/elastic/terraform-provider-elasticstack/internal/clients/elasticsearch"
"github.com/elastic/terraform-provider-elasticstack/internal/utils"
"github.com/hashicorp/terraform-plugin-framework/resource"
)

func (r *enrichPolicyResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) {
var data EnrichPolicyData
resp.Diagnostics.Append(req.State.Get(ctx, &data)...)
if resp.Diagnostics.HasError() {
return
}

compId, diags := clients.CompositeIdFromStrFw(data.Id.ValueString())
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}
policyName := compId.ResourceId

client, diags := clients.MaybeNewApiClientFromFrameworkResource(ctx, data.ElasticsearchConnection, r.client)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}

sdkDiags := elasticsearch.DeleteEnrichPolicy(ctx, client, policyName)
resp.Diagnostics.Append(utils.FrameworkDiagsFromSDK(sdkDiags)...)
}
17 changes: 17 additions & 0 deletions internal/elasticsearch/enrich/models.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package enrich

import (
"github.com/hashicorp/terraform-plugin-framework/types"
)

type EnrichPolicyData struct {
Id types.String `tfsdk:"id"`
ElasticsearchConnection types.List `tfsdk:"elasticsearch_connection"`
Name types.String `tfsdk:"name"`
PolicyType types.String `tfsdk:"policy_type"`
Indices types.List `tfsdk:"indices"`
MatchField types.String `tfsdk:"match_field"`
EnrichFields types.List `tfsdk:"enrich_fields"`
Query types.String `tfsdk:"query"`
Execute types.Bool `tfsdk:"execute"`
}
Loading
Loading