Skip to content

Commit

Permalink
Don't panic when the template is not defined (#598)
Browse files Browse the repository at this point in the history
* Don't panic when the template is not defined

* Add acceptance tests

* Changelog
  • Loading branch information
tobio committed Apr 2, 2024
1 parent a0b5596 commit 573c2fa
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 80 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
## [Unreleased]

### Fixed

- Prevent a provider panic when an `elasticstack_elasticsearch_template` or `elasticstack_elasticsearch_component_template` includes an empty `template` (`template {}`) block. ([#598](https://github.com/elastic/terraform-provider-elasticstack/pull/598))

## [0.11.2] - 2024-03-13

### Fixed
Expand Down
58 changes: 5 additions & 53 deletions internal/elasticsearch/index/component_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,62 +156,14 @@ func resourceComponentTemplatePut(ctx context.Context, d *schema.ResourceData, m
}

if v, ok := d.GetOk("template"); ok {
// only one template block allowed to be declared
definedTempl := v.([]interface{})[0].(map[string]interface{})
definedAliases := definedTempl["alias"].(*schema.Set)
templ := models.Template{}

aliases := make(map[string]models.IndexAlias, definedAliases.Len())
for _, a := range definedAliases.List() {
alias := a.(map[string]interface{})
templAlias := models.IndexAlias{}

if f, ok := alias["filter"]; ok {
if f.(string) != "" {
filterMap := make(map[string]interface{})
if err := json.Unmarshal([]byte(f.(string)), &filterMap); err != nil {
return diag.FromErr(err)
}
templAlias.Filter = filterMap
}
}
if ir, ok := alias["index_routing"]; ok {
templAlias.IndexRouting = ir.(string)
}
templAlias.IsHidden = alias["is_hidden"].(bool)
templAlias.IsWriteIndex = alias["is_write_index"].(bool)
if r, ok := alias["routing"]; ok {
templAlias.Routing = r.(string)
}
if sr, ok := alias["search_routing"]; ok {
templAlias.SearchRouting = sr.(string)
}

aliases[alias["name"].(string)] = templAlias
}
templ.Aliases = aliases

if mappings, ok := definedTempl["mappings"]; ok {
if mappings.(string) != "" {
maps := make(map[string]interface{})
if err := json.Unmarshal([]byte(mappings.(string)), &maps); err != nil {
return diag.FromErr(err)
}
templ.Mappings = maps
}
templ, ok, diags := expandTemplate(v)
if diags != nil {
return diags
}

if settings, ok := definedTempl["settings"]; ok {
if settings.(string) != "" {
sets := make(map[string]interface{})
if err := json.Unmarshal([]byte(settings.(string)), &sets); err != nil {
return diag.FromErr(err)
}
templ.Settings = sets
}
if ok {
componentTemplate.Template = &templ
}

componentTemplate.Template = &templ
}

if v, ok := d.GetOk("version"); ok {
Expand Down
68 changes: 41 additions & 27 deletions internal/elasticsearch/index/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -257,37 +257,14 @@ func resourceIndexTemplatePut(ctx context.Context, d *schema.ResourceData, meta
}

if v, ok := d.GetOk("template"); ok {
templ := models.Template{}
// only one template block allowed to be declared
definedTempl := v.([]interface{})[0].(map[string]interface{})

aliases, diags := ExpandIndexAliases(definedTempl["alias"].(*schema.Set))
if diags.HasError() {
templ, ok, diags := expandTemplate(v)
if diags != nil {
return diags
}
templ.Aliases = aliases

if mappings, ok := definedTempl["mappings"]; ok {
if mappings.(string) != "" {
maps := make(map[string]interface{})
if err := json.Unmarshal([]byte(mappings.(string)), &maps); err != nil {
return diag.FromErr(err)
}
templ.Mappings = maps
}
}

if settings, ok := definedTempl["settings"]; ok {
if settings.(string) != "" {
sets := make(map[string]interface{})
if err := json.Unmarshal([]byte(settings.(string)), &sets); err != nil {
return diag.FromErr(err)
}
templ.Settings = sets
}
if ok {
indexTemplate.Template = &templ
}

indexTemplate.Template = &templ
}

if v, ok := d.GetOk("version"); ok {
Expand All @@ -303,6 +280,43 @@ func resourceIndexTemplatePut(ctx context.Context, d *schema.ResourceData, meta
return resourceIndexTemplateRead(ctx, d, meta)
}

func expandTemplate(config interface{}) (models.Template, bool, diag.Diagnostics) {
templ := models.Template{}
// only one template block allowed to be declared
definedTempl, ok := config.([]interface{})[0].(map[string]interface{})
if !ok {
return templ, false, nil
}

aliases, diags := ExpandIndexAliases(definedTempl["alias"].(*schema.Set))
if diags.HasError() {
return templ, false, diags
}
templ.Aliases = aliases

if mappings, ok := definedTempl["mappings"]; ok {
if mappings.(string) != "" {
maps := make(map[string]interface{})
if err := json.Unmarshal([]byte(mappings.(string)), &maps); err != nil {
return templ, false, diag.FromErr(err)
}
templ.Mappings = maps
}
}

if settings, ok := definedTempl["settings"]; ok {
if settings.(string) != "" {
sets := make(map[string]interface{})
if err := json.Unmarshal([]byte(settings.(string)), &sets); err != nil {
return templ, false, diag.FromErr(err)
}
templ.Settings = sets
}
}

return templ, true, nil
}

func resourceIndexTemplateRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client, diags := clients.NewApiClientFromSDKResource(d, meta)
if diags.HasError() {
Expand Down
2 changes: 2 additions & 0 deletions internal/elasticsearch/index/template_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ resource "elasticstack_elasticsearch_index_template" "test2" {
data_stream {
hidden = false
}
template {}
}
`, name, name, name)
}
Expand Down

0 comments on commit 573c2fa

Please sign in to comment.