func flattenElasticsearchTopology()

in ec/ecdatasource/deploymentdatasource/flatteners_elasticsearch.go [94:181]


func flattenElasticsearchTopology(ctx context.Context, plan *models.ElasticsearchClusterPlan) (types.List, diag.Diagnostics) {
	var diags diag.Diagnostics
	var result = make([]elasticsearchTopologyModelV0, 0, len(plan.ClusterTopology))
	for _, topology := range plan.ClusterTopology {
		model := elasticsearchTopologyModelV0{
			NodeRoles:   types.SetNull(types.StringType),
			Autoscaling: types.ListNull(elasticsearchAutoscalingElemType()),
		}

		if isElasticsearchSizePopulated(topology) && *topology.Size.Value == 0 {
			continue
		}

		model.InstanceConfigurationID = types.StringValue(topology.InstanceConfigurationID)

		if isElasticsearchSizePopulated(topology) {
			model.Size = types.StringValue(util.MemoryToState(*topology.Size.Value))
			model.SizeResource = types.StringValue(*topology.Size.Resource)
		}

		model.ZoneCount = types.Int64Value(int64(topology.ZoneCount))

		if topology.NodeType != nil {
			if topology.NodeType.Data != nil {
				model.NodeTypeData = types.BoolValue(*topology.NodeType.Data)
			}

			if topology.NodeType.Ingest != nil {
				model.NodeTypeIngest = types.BoolValue(*topology.NodeType.Ingest)
			}

			if topology.NodeType.Master != nil {
				model.NodeTypeMaster = types.BoolValue(*topology.NodeType.Master)
			}

			if topology.NodeType.Ml != nil {
				model.NodeTypeMl = types.BoolValue(*topology.NodeType.Ml)
			}
		}

		if len(topology.NodeRoles) > 0 {
			var d diag.Diagnostics
			model.NodeRoles, d = types.SetValueFrom(ctx, types.StringType, topology.NodeRoles)
			diags.Append(d...)
		}

		var autoscaling elasticsearchAutoscalingModel
		var hasAutoscalingModel = false
		if limit := topology.AutoscalingMax; limit != nil {
			autoscaling.MaxSizeResource = types.StringValue(*limit.Resource)
			autoscaling.MaxSize = types.StringValue(util.MemoryToState(*limit.Value))
			hasAutoscalingModel = true
		}

		if limit := topology.AutoscalingMin; limit != nil {
			autoscaling.MinSizeResource = types.StringValue(*limit.Resource)
			autoscaling.MinSize = types.StringValue(util.MemoryToState(*limit.Value))
			hasAutoscalingModel = true
		}

		if topology.AutoscalingPolicyOverrideJSON != nil {
			b, err := json.Marshal(topology.AutoscalingPolicyOverrideJSON)
			if err != nil {
				diags.AddError(
					"Invalid elasticsearch topology policy_override_json",
					fmt.Sprintf("elasticsearch topology %s: unable to persist policy_override_json: %v", topology.ID, err),
				)
			} else {
				autoscaling.PolicyOverrideJson = types.StringValue(string(b))
				hasAutoscalingModel = true
			}
		}

		if hasAutoscalingModel {
			var d diag.Diagnostics
			model.Autoscaling, d = types.ListValueFrom(ctx, elasticsearchAutoscalingElemType(), []elasticsearchAutoscalingModel{autoscaling})
			diags.Append(d...)
		}

		result = append(result, model)
	}

	var d diag.Diagnostics
	target, d := types.ListValueFrom(ctx, types.ObjectType{AttrTypes: elasticsearchTopologyAttrTypes()}, result)
	diags.Append(d...)

	return target, diags
}