internal/elasticsearch/index/data_stream_lifecycle/models.go (93 lines of code) (raw):
package data_stream_lifecycle
import (
"context"
"github.com/elastic/terraform-provider-elasticstack/internal/clients"
"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/types"
)
type tfModel struct {
ID types.String `tfsdk:"id"`
ElasticsearchConnection types.List `tfsdk:"elasticsearch_connection"`
Name types.String `tfsdk:"name"`
DataRetention types.String `tfsdk:"data_retention"`
ExpandWildcards types.String `tfsdk:"expand_wildcards"`
Enabled types.Bool `tfsdk:"enabled"`
Downsampling types.List `tfsdk:"downsampling"`
}
type downsamplingTfModel struct {
After types.String `tfsdk:"after"`
FixedInterval types.String `tfsdk:"fixed_interval"`
}
func (model tfModel) GetID() (*clients.CompositeId, diag.Diagnostics) {
compId, sdkDiags := clients.CompositeIdFromStr(model.ID.ValueString())
if sdkDiags.HasError() {
return nil, utils.FrameworkDiagsFromSDK(sdkDiags)
}
return compId, nil
}
func (model tfModel) toAPIModel(ctx context.Context) (models.LifecycleSettings, diag.Diagnostics) {
var diags diag.Diagnostics
apiModel := models.LifecycleSettings{
DataRetention: model.DataRetention.ValueString(),
Enabled: model.Enabled.ValueBool(),
}
if !model.Downsampling.IsNull() && !model.Downsampling.IsUnknown() && len(model.Downsampling.Elements()) > 0 {
downsampling := make([]downsamplingTfModel, len(model.Downsampling.Elements()))
if diags := model.Downsampling.ElementsAs(ctx, &downsampling, true); diags.HasError() {
return models.LifecycleSettings{}, diags
}
apiModel.Downsampling = make([]models.Downsampling, len(model.Downsampling.Elements()))
for i, ds := range downsampling {
apiModel.Downsampling[i] = models.Downsampling{
After: ds.After.ValueString(),
FixedInterval: ds.FixedInterval.ValueString(),
}
}
}
return apiModel, diags
}
func (model *tfModel) populateFromAPI(ctx context.Context, ds []models.DataStreamLifecycle) diag.Diagnostics {
actualRetention := model.DataRetention.ValueString()
actualDownsampling := make([]downsamplingTfModel, len(model.Downsampling.Elements()))
if diags := model.Downsampling.ElementsAs(ctx, &actualDownsampling, true); diags.HasError() {
return nil
}
for _, lf := range ds {
if lf.Lifecycle.DataRetention != actualRetention {
model.DataRetention = types.StringValue(lf.Lifecycle.DataRetention)
}
var updateDownsampling bool
if len(lf.Lifecycle.Downsampling) != len(actualDownsampling) {
updateDownsampling = true
} else {
for i, ds := range actualDownsampling {
if ds.After.ValueString() != lf.Lifecycle.Downsampling[i].After || ds.FixedInterval.ValueString() != lf.Lifecycle.Downsampling[i].FixedInterval {
updateDownsampling = true
break
}
}
}
if updateDownsampling {
listValue, diags := convertDownsamplingToModel(ctx, lf.Lifecycle.Downsampling)
diags.Append(diags...)
if diags.HasError() {
return diags
}
model.Downsampling = listValue
}
}
return nil
}
func convertDownsamplingToModel(ctx context.Context, apiDownsamplings []models.Downsampling) (types.List, diag.Diagnostics) {
var downsamplings []downsamplingTfModel
for _, apiDs := range apiDownsamplings {
downsamplings = append(downsamplings, downsamplingTfModel{
After: types.StringValue(apiDs.After),
FixedInterval: types.StringValue(apiDs.FixedInterval),
})
}
listValue, diags := types.ListValueFrom(ctx, downsamplingElementType(), downsamplings)
return listValue, diags
}