internal/fleet/agent_policy/models.go (177 lines of code) (raw):

package agent_policy import ( "context" "fmt" "slices" "github.com/elastic/terraform-provider-elasticstack/generated/kbapi" "github.com/elastic/terraform-provider-elasticstack/internal/utils" "github.com/hashicorp/go-version" "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/hashicorp/terraform-plugin-framework/path" "github.com/hashicorp/terraform-plugin-framework/types" ) type globalDataTagsItemModel struct { StringValue types.String `tfsdk:"string_value"` NumberValue types.Float32 `tfsdk:"number_value"` } type agentPolicyModel struct { ID types.String `tfsdk:"id"` PolicyID types.String `tfsdk:"policy_id"` Name types.String `tfsdk:"name"` Namespace types.String `tfsdk:"namespace"` Description types.String `tfsdk:"description"` DataOutputId types.String `tfsdk:"data_output_id"` MonitoringOutputId types.String `tfsdk:"monitoring_output_id"` FleetServerHostId types.String `tfsdk:"fleet_server_host_id"` DownloadSourceId types.String `tfsdk:"download_source_id"` MonitorLogs types.Bool `tfsdk:"monitor_logs"` MonitorMetrics types.Bool `tfsdk:"monitor_metrics"` SysMonitoring types.Bool `tfsdk:"sys_monitoring"` SkipDestroy types.Bool `tfsdk:"skip_destroy"` GlobalDataTags types.Map `tfsdk:"global_data_tags"` //> globalDataTagsModel } func (model *agentPolicyModel) populateFromAPI(ctx context.Context, data *kbapi.AgentPolicy) diag.Diagnostics { if data == nil { return nil } model.ID = types.StringValue(data.Id) model.PolicyID = types.StringValue(data.Id) model.DataOutputId = types.StringPointerValue(data.DataOutputId) model.Description = types.StringPointerValue(data.Description) model.DownloadSourceId = types.StringPointerValue(data.DownloadSourceId) model.FleetServerHostId = types.StringPointerValue(data.FleetServerHostId) if data.MonitoringEnabled != nil { if slices.Contains(*data.MonitoringEnabled, kbapi.AgentPolicyMonitoringEnabledLogs) { model.MonitorLogs = types.BoolValue(true) } if slices.Contains(*data.MonitoringEnabled, kbapi.AgentPolicyMonitoringEnabledMetrics) { model.MonitorMetrics = types.BoolValue(true) } } if !utils.IsKnown(model.MonitorLogs) { model.MonitorLogs = types.BoolValue(false) } if !utils.IsKnown(model.MonitorMetrics) { model.MonitorMetrics = types.BoolValue(false) } model.MonitoringOutputId = types.StringPointerValue(data.MonitoringOutputId) model.Name = types.StringValue(data.Name) model.Namespace = types.StringValue(data.Namespace) if utils.Deref(data.GlobalDataTags) != nil { diags := diag.Diagnostics{} var map0 = make(map[string]globalDataTagsItemModel) for _, v := range utils.Deref(data.GlobalDataTags) { maybeFloat, error := v.Value.AsAgentPolicyGlobalDataTagsItemValue1() if error != nil { maybeString, error := v.Value.AsAgentPolicyGlobalDataTagsItemValue0() if error != nil { diags.AddError("Failed to unmarshal global data tags", error.Error()) } map0[v.Name] = globalDataTagsItemModel{ StringValue: types.StringValue(maybeString), } } else { map0[v.Name] = globalDataTagsItemModel{ NumberValue: types.Float32Value(float32(maybeFloat)), } } } model.GlobalDataTags = utils.MapValueFrom(ctx, map0, getGlobalDataTagsAttrTypes().(attr.TypeWithElementType).ElementType(), path.Root("global_data_tags"), &diags) if diags.HasError() { return diags } } return nil } // convertGlobalDataTags converts the global data tags from terraform model to API model // and performs version validation func (model *agentPolicyModel) convertGlobalDataTags(ctx context.Context, serverVersion *version.Version) (*[]kbapi.AgentPolicyGlobalDataTagsItem, diag.Diagnostics) { var diags diag.Diagnostics if len(model.GlobalDataTags.Elements()) == 0 { if serverVersion.GreaterThanOrEqual(MinVersionGlobalDataTags) { emptyList := make([]kbapi.AgentPolicyGlobalDataTagsItem, 0) return &emptyList, diags } return nil, diags } if serverVersion.LessThan(MinVersionGlobalDataTags) { diags.AddError("global_data_tags ES version error", fmt.Sprintf("Global data tags are only supported in Elastic Stack %s and above", MinVersionGlobalDataTags)) return nil, diags } items := utils.MapTypeToMap(ctx, model.GlobalDataTags, path.Root("global_data_tags"), &diags, func(item globalDataTagsItemModel, meta utils.MapMeta) kbapi.AgentPolicyGlobalDataTagsItem { var value kbapi.AgentPolicyGlobalDataTagsItem_Value var err error if item.StringValue.ValueStringPointer() != nil { err = value.FromAgentPolicyGlobalDataTagsItemValue0(*item.StringValue.ValueStringPointer()) } else { err = value.FromAgentPolicyGlobalDataTagsItemValue1(*item.NumberValue.ValueFloat32Pointer()) } if err != nil { diags.AddError("global_data_tags validation_error_converting_values", err.Error()) return kbapi.AgentPolicyGlobalDataTagsItem{} } return kbapi.AgentPolicyGlobalDataTagsItem{ Name: meta.Key, Value: value, } }) if diags.HasError() { return nil, diags } itemsList := make([]kbapi.AgentPolicyGlobalDataTagsItem, 0, len(items)) for _, v := range items { itemsList = append(itemsList, v) } return &itemsList, diags } func (model *agentPolicyModel) toAPICreateModel(ctx context.Context, serverVersion *version.Version) (kbapi.PostFleetAgentPoliciesJSONRequestBody, diag.Diagnostics) { monitoring := make([]kbapi.PostFleetAgentPoliciesJSONBodyMonitoringEnabled, 0, 2) if model.MonitorLogs.ValueBool() { monitoring = append(monitoring, kbapi.PostFleetAgentPoliciesJSONBodyMonitoringEnabledLogs) } if model.MonitorMetrics.ValueBool() { monitoring = append(monitoring, kbapi.PostFleetAgentPoliciesJSONBodyMonitoringEnabledMetrics) } body := kbapi.PostFleetAgentPoliciesJSONRequestBody{ DataOutputId: model.DataOutputId.ValueStringPointer(), Description: model.Description.ValueStringPointer(), DownloadSourceId: model.DownloadSourceId.ValueStringPointer(), FleetServerHostId: model.FleetServerHostId.ValueStringPointer(), Id: model.PolicyID.ValueStringPointer(), MonitoringEnabled: &monitoring, MonitoringOutputId: model.MonitoringOutputId.ValueStringPointer(), Name: model.Name.ValueString(), Namespace: model.Namespace.ValueString(), } tags, diags := model.convertGlobalDataTags(ctx, serverVersion) if diags.HasError() { return kbapi.PostFleetAgentPoliciesJSONRequestBody{}, diags } body.GlobalDataTags = tags return body, nil } func (model *agentPolicyModel) toAPIUpdateModel(ctx context.Context, serverVersion *version.Version) (kbapi.PutFleetAgentPoliciesAgentpolicyidJSONRequestBody, diag.Diagnostics) { monitoring := make([]kbapi.PutFleetAgentPoliciesAgentpolicyidJSONBodyMonitoringEnabled, 0, 2) if model.MonitorLogs.ValueBool() { monitoring = append(monitoring, kbapi.Logs) } if model.MonitorMetrics.ValueBool() { monitoring = append(monitoring, kbapi.Metrics) } body := kbapi.PutFleetAgentPoliciesAgentpolicyidJSONRequestBody{ DataOutputId: model.DataOutputId.ValueStringPointer(), Description: model.Description.ValueStringPointer(), DownloadSourceId: model.DownloadSourceId.ValueStringPointer(), FleetServerHostId: model.FleetServerHostId.ValueStringPointer(), MonitoringEnabled: &monitoring, MonitoringOutputId: model.MonitoringOutputId.ValueStringPointer(), Name: model.Name.ValueString(), Namespace: model.Namespace.ValueString(), } tags, diags := model.convertGlobalDataTags(ctx, serverVersion) if diags.HasError() { return kbapi.PutFleetAgentPoliciesAgentpolicyidJSONRequestBody{}, diags } body.GlobalDataTags = tags return body, nil }