func resourceIndexTemplatePut()

in internal/elasticsearch/index/template.go [203:300]


func resourceIndexTemplatePut(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
	client, diags := clients.NewApiClientFromSDKResource(d, meta)
	if diags.HasError() {
		return diags
	}
	templateId := d.Get("name").(string)
	id, diags := client.ID(ctx, templateId)
	if diags.HasError() {
		return diags
	}
	var indexTemplate models.IndexTemplate
	indexTemplate.Name = templateId

	compsOf := make([]string, 0)
	if v, ok := d.GetOk("composed_of"); ok {
		for _, c := range v.([]interface{}) {
			compsOf = append(compsOf, c.(string))
		}
	}
	indexTemplate.ComposedOf = compsOf

	if v, ok := d.GetOk("data_stream"); ok {
		// 8.x workaround
		hasAllowCustomRouting := false
		if d.HasChange("data_stream") {
			old, _ := d.GetChange("data_stream")

			if old != nil && len(old.([]interface{})) == 1 {
				if old.([]interface{})[0] != nil {
					setting := old.([]interface{})[0].(map[string]interface{})
					if acr, ok := setting["allow_custom_routing"]; ok && acr.(bool) {
						hasAllowCustomRouting = true
					}
				}
			}
		}

		// only one definition of stream allowed
		if v.([]interface{})[0] != nil {
			stream := v.([]interface{})[0].(map[string]interface{})
			dSettings := &models.DataStreamSettings{}
			if s, ok := stream["hidden"]; ok {
				hidden := s.(bool)
				dSettings.Hidden = &hidden
			}
			if s, ok := stream["allow_custom_routing"]; ok && (hasAllowCustomRouting || s.(bool)) {
				allow := s.(bool)
				dSettings.AllowCustomRouting = &allow
			}
			indexTemplate.DataStream = dSettings
		}
	}

	if v, ok := d.GetOk("index_patterns"); ok {
		definedIndPats := v.(*schema.Set)
		indPats := make([]string, definedIndPats.Len())
		for i, p := range definedIndPats.List() {
			indPats[i] = p.(string)
		}
		indexTemplate.IndexPatterns = indPats
	}

	if v, ok := d.GetOk("metadata"); ok {
		metadata := make(map[string]interface{})
		if err := json.NewDecoder(strings.NewReader(v.(string))).Decode(&metadata); err != nil {
			return diag.FromErr(err)
		}
		indexTemplate.Meta = metadata
	}

	if v, ok := d.GetOk("priority"); ok {
		definedPr := v.(int)
		indexTemplate.Priority = &definedPr
	}

	if v, ok := d.GetOk("template"); ok {
		templ, ok, diags := expandTemplate(v)
		if diags != nil {
			return diags
		}

		if ok {
			indexTemplate.Template = &templ
		}
	}

	if v, ok := d.GetOk("version"); ok {
		definedVer := v.(int)
		indexTemplate.Version = &definedVer
	}

	if diags := elasticsearch.PutIndexTemplate(ctx, client, &indexTemplate); diags.HasError() {
		return diags
	}

	d.SetId(id.String())
	return resourceIndexTemplateRead(ctx, d, meta)
}