internal/fleet/output/models.go (204 lines of code) (raw):

package output import ( "context" "fmt" "github.com/elastic/terraform-provider-elasticstack/generated/kbapi" "github.com/elastic/terraform-provider-elasticstack/internal/utils" "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/hashicorp/terraform-plugin-framework/path" "github.com/hashicorp/terraform-plugin-framework/types" ) type outputModel struct { ID types.String `tfsdk:"id"` OutputID types.String `tfsdk:"output_id"` Name types.String `tfsdk:"name"` Type types.String `tfsdk:"type"` Hosts types.List `tfsdk:"hosts"` //> string CaSha256 types.String `tfsdk:"ca_sha256"` CaTrustedFingerprint types.String `tfsdk:"ca_trusted_fingerprint"` DefaultIntegrations types.Bool `tfsdk:"default_integrations"` DefaultMonitoring types.Bool `tfsdk:"default_monitoring"` Ssl types.List `tfsdk:"ssl"` //> outputSslModel ConfigYaml types.String `tfsdk:"config_yaml"` } type outputSslModel struct { CertificateAuthorities types.List `tfsdk:"certificate_authorities"` //> string Certificate types.String `tfsdk:"certificate"` Key types.String `tfsdk:"key"` } func (model *outputModel) populateFromAPI(ctx context.Context, union *kbapi.OutputUnion) (diags diag.Diagnostics) { if union == nil { return } doSsl := func(ssl *kbapi.OutputSsl) types.List { if ssl != nil { p := path.Root("ssl") sslModels := []outputSslModel{{ CertificateAuthorities: utils.SliceToListType_String(ctx, utils.Deref(ssl.CertificateAuthorities), p.AtName("certificate_authorities"), &diags), Certificate: types.StringPointerValue(ssl.Certificate), Key: types.StringPointerValue(ssl.Key), }} list, nd := types.ListValueFrom(ctx, getSslAttrTypes(), sslModels) diags.Append(nd...) return list } else { return types.ListNull(getSslAttrTypes()) } } discriminator, err := union.Discriminator() if err != nil { diags.AddError(err.Error(), "") return } switch discriminator { case "elasticsearch": data, err := union.AsOutputElasticsearch() if err != nil { diags.AddError(err.Error(), "") return } model.ID = types.StringPointerValue(data.Id) model.OutputID = types.StringPointerValue(data.Id) model.Name = types.StringValue(data.Name) model.Type = types.StringValue(string(data.Type)) model.Hosts = utils.SliceToListType_String(ctx, data.Hosts, path.Root("hosts"), &diags) model.CaSha256 = types.StringPointerValue(data.CaSha256) model.CaTrustedFingerprint = types.StringPointerValue(data.CaTrustedFingerprint) model.DefaultIntegrations = types.BoolPointerValue(data.IsDefault) model.DefaultMonitoring = types.BoolPointerValue(data.IsDefaultMonitoring) model.ConfigYaml = types.StringPointerValue(data.ConfigYaml) model.Ssl = doSsl(data.Ssl) case "logstash": data, err := union.AsOutputLogstash() if err != nil { diags.AddError(err.Error(), "") return } model.ID = types.StringPointerValue(data.Id) model.OutputID = types.StringPointerValue(data.Id) model.Name = types.StringValue(data.Name) model.Type = types.StringValue(string(data.Type)) model.Hosts = utils.SliceToListType_String(ctx, data.Hosts, path.Root("hosts"), &diags) model.CaSha256 = types.StringPointerValue(data.CaSha256) model.CaTrustedFingerprint = types.StringPointerValue(data.CaTrustedFingerprint) model.DefaultIntegrations = types.BoolPointerValue(data.IsDefault) model.DefaultMonitoring = types.BoolPointerValue(data.IsDefaultMonitoring) model.ConfigYaml = types.StringPointerValue(data.ConfigYaml) model.Ssl = doSsl(data.Ssl) default: diags.AddError(fmt.Sprintf("unhandled output type: %s", discriminator), "") } return } func (model outputModel) toAPICreateModel(ctx context.Context) (union kbapi.NewOutputUnion, diags diag.Diagnostics) { doSsl := func() *kbapi.NewOutputSsl { if utils.IsKnown(model.Ssl) { sslModels := utils.ListTypeAs[outputSslModel](ctx, model.Ssl, path.Root("ssl"), &diags) if len(sslModels) > 0 { return &kbapi.NewOutputSsl{ Certificate: sslModels[0].Certificate.ValueStringPointer(), CertificateAuthorities: utils.SliceRef(utils.ListTypeToSlice_String(ctx, sslModels[0].CertificateAuthorities, path.Root("certificate_authorities"), &diags)), Key: sslModels[0].Key.ValueStringPointer(), } } } return nil } outputType := model.Type.ValueString() switch outputType { case "elasticsearch": body := kbapi.NewOutputElasticsearch{ Type: kbapi.NewOutputElasticsearchTypeElasticsearch, CaSha256: model.CaSha256.ValueStringPointer(), CaTrustedFingerprint: model.CaTrustedFingerprint.ValueStringPointer(), ConfigYaml: model.ConfigYaml.ValueStringPointer(), Hosts: utils.ListTypeToSlice_String(ctx, model.Hosts, path.Root("hosts"), &diags), Id: model.OutputID.ValueStringPointer(), IsDefault: model.DefaultIntegrations.ValueBoolPointer(), IsDefaultMonitoring: model.DefaultMonitoring.ValueBoolPointer(), Name: model.Name.ValueString(), Ssl: doSsl(), } err := union.FromNewOutputElasticsearch(body) if err != nil { diags.AddError(err.Error(), "") return } case "logstash": body := kbapi.NewOutputLogstash{ Type: kbapi.NewOutputLogstashTypeLogstash, CaSha256: model.CaSha256.ValueStringPointer(), CaTrustedFingerprint: model.CaTrustedFingerprint.ValueStringPointer(), ConfigYaml: model.ConfigYaml.ValueStringPointer(), Hosts: utils.ListTypeToSlice_String(ctx, model.Hosts, path.Root("hosts"), &diags), Id: model.OutputID.ValueStringPointer(), IsDefault: model.DefaultIntegrations.ValueBoolPointer(), IsDefaultMonitoring: model.DefaultMonitoring.ValueBoolPointer(), Name: model.Name.ValueString(), Ssl: doSsl(), } err := union.FromNewOutputLogstash(body) if err != nil { diags.AddError(err.Error(), "") return } default: diags.AddError(fmt.Sprintf("unhandled output type: %s", outputType), "") } return } func (model outputModel) toAPIUpdateModel(ctx context.Context) (union kbapi.UpdateOutputUnion, diags diag.Diagnostics) { doSsl := func() *kbapi.UpdateOutputSsl { if utils.IsKnown(model.Ssl) { sslModels := utils.ListTypeAs[outputSslModel](ctx, model.Ssl, path.Root("ssl"), &diags) if len(sslModels) > 0 { return &kbapi.UpdateOutputSsl{ Certificate: sslModels[0].Certificate.ValueStringPointer(), CertificateAuthorities: utils.SliceRef(utils.ListTypeToSlice_String(ctx, sslModels[0].CertificateAuthorities, path.Root("certificate_authorities"), &diags)), Key: sslModels[0].Key.ValueStringPointer(), } } } return nil } outputType := model.Type.ValueString() switch outputType { case "elasticsearch": body := kbapi.UpdateOutputElasticsearch{ Type: utils.Pointer(kbapi.Elasticsearch), CaSha256: model.CaSha256.ValueStringPointer(), CaTrustedFingerprint: model.CaTrustedFingerprint.ValueStringPointer(), ConfigYaml: model.ConfigYaml.ValueStringPointer(), Hosts: utils.SliceRef(utils.ListTypeToSlice_String(ctx, model.Hosts, path.Root("hosts"), &diags)), IsDefault: model.DefaultIntegrations.ValueBoolPointer(), IsDefaultMonitoring: model.DefaultMonitoring.ValueBoolPointer(), Name: model.Name.ValueStringPointer(), Ssl: doSsl(), } err := union.FromUpdateOutputElasticsearch(body) if err != nil { diags.AddError(err.Error(), "") return } case "logstash": body := kbapi.UpdateOutputLogstash{ Type: utils.Pointer(kbapi.Logstash), CaSha256: model.CaSha256.ValueStringPointer(), CaTrustedFingerprint: model.CaTrustedFingerprint.ValueStringPointer(), ConfigYaml: model.ConfigYaml.ValueStringPointer(), Hosts: utils.SliceRef(utils.ListTypeToSlice_String(ctx, model.Hosts, path.Root("hosts"), &diags)), IsDefault: model.DefaultIntegrations.ValueBoolPointer(), IsDefaultMonitoring: model.DefaultMonitoring.ValueBoolPointer(), Name: model.Name.ValueStringPointer(), Ssl: doSsl(), } err := union.FromUpdateOutputLogstash(body) if err != nil { diags.AddError(err.Error(), "") return } default: diags.AddError(fmt.Sprintf("unhandled output type: %s", outputType), "") } return }