internal/clients/kibana/connector.go (1,302 lines of code) (raw):

package kibana import ( "bytes" "context" "encoding/json" "fmt" "io" "github.com/elastic/terraform-provider-elasticstack/generated/connectors" "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-log/tflog" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" ) func CreateConnector(ctx context.Context, apiClient *clients.ApiClient, connectorOld models.KibanaActionConnector) (string, diag.Diagnostics) { client, err := apiClient.GetKibanaConnectorsClient(ctx) if err != nil { return "", diag.FromErr(err) } body, err := createConnectorRequestBody(connectorOld) if err != nil { return "", diag.FromErr(err) } httpResp, err := client.CreateConnectorWithBody(ctx, connectorOld.SpaceID, &connectors.CreateConnectorParams{KbnXsrf: connectors.KbnXsrf("true")}, "application/json", body) if err != nil { return "", diag.Errorf("unable to create connector: [%v]", err) } defer httpResp.Body.Close() resp, err := connectors.ParseCreateConnectorResponse(httpResp) if err != nil { return "", diag.Errorf("unable to parse connector create response: [%v]", err) } if resp.JSON400 != nil { return "", diag.Errorf("%s: %s", *resp.JSON400.Error, *resp.JSON400.Message) } if resp.JSON401 != nil { return "", diag.Errorf("%s: %s", *resp.JSON401.Error, *resp.JSON401.Message) } if resp.JSON200 == nil { return "", diag.Errorf("%s: %s", resp.Status(), string(resp.Body)) } connectorNew, err := connectorResponseToModel(connectorOld.SpaceID, *resp.JSON200) if err != nil { return "", diag.FromErr(err) } return connectorNew.ConnectorID, nil } func UpdateConnector(ctx context.Context, apiClient *clients.ApiClient, connectorOld models.KibanaActionConnector) (string, diag.Diagnostics) { client, err := apiClient.GetKibanaConnectorsClient(ctx) if err != nil { return "", diag.FromErr(err) } body, err := updateConnectorRequestBody(connectorOld) if err != nil { return "", diag.FromErr(err) } httpResp, err := client.UpdateConnectorWithBody(ctx, connectorOld.SpaceID, connectorOld.ConnectorID, &connectors.UpdateConnectorParams{KbnXsrf: connectors.KbnXsrf("true")}, "application/json", body) if err != nil { return "", diag.Errorf("unable to update connector: [%v]", err) } defer httpResp.Body.Close() resp, err := connectors.ParseCreateConnectorResponse(httpResp) if err != nil { return "", diag.Errorf("unable to parse connector update response: [%v]", err) } if resp.JSON400 != nil { return "", diag.Errorf("%s: %s", *resp.JSON400.Error, *resp.JSON400.Message) } if resp.JSON401 != nil { return "", diag.Errorf("%s: %s", *resp.JSON401.Error, *resp.JSON401.Message) } if resp.JSON200 == nil { return "", diag.Errorf("%s: %s", resp.Status(), string(resp.Body)) } connectorNew, err := connectorResponseToModel(connectorOld.SpaceID, *resp.JSON200) if err != nil { return "", diag.FromErr(err) } return connectorNew.ConnectorID, nil } func GetConnector(ctx context.Context, apiClient *clients.ApiClient, connectorID, spaceID string) (*models.KibanaActionConnector, diag.Diagnostics) { client, err := apiClient.GetKibanaConnectorsClient(ctx) if err != nil { return nil, diag.FromErr(err) } httpResp, err := client.GetConnector(ctx, spaceID, connectorID) if err != nil { return nil, diag.Errorf("unable to get connector: [%v]", err) } defer httpResp.Body.Close() resp, err := connectors.ParseGetConnectorResponse(httpResp) if err != nil { return nil, diag.Errorf("unable to parse connector get response: [%v]", err) } if resp.JSON401 != nil { return nil, diag.Errorf("%s: %s", *resp.JSON401.Error, *resp.JSON401.Message) } if resp.JSON404 != nil { return nil, nil } if resp.JSON200 == nil { return nil, diag.Errorf("%s: %s", resp.Status(), string(resp.Body)) } connector, err := connectorResponseToModel(spaceID, *resp.JSON200) if err != nil { return nil, diag.Errorf("unable to convert response to model: %v", err) } return connector, nil } func SearchConnectors(ctx context.Context, apiClient *clients.ApiClient, connectorName, spaceID, connectorTypeID string) ([]*models.KibanaActionConnector, diag.Diagnostics) { client, err := apiClient.GetKibanaConnectorsClient(ctx) if err != nil { return nil, diag.FromErr(err) } httpResp, err := client.GetConnectors(ctx, spaceID) if err != nil { return nil, diag.Errorf("unable to get connectors: [%v]", err) } defer httpResp.Body.Close() resp, err := connectors.ParseGetConnectorsResponse(httpResp) if err != nil { return nil, diag.Errorf("unable to parse connectors get response: [%v]", err) } if resp.JSON401 != nil { return nil, diag.Errorf("%s: %s", *resp.JSON401.Error, *resp.JSON401.Message) } if resp.JSON200 == nil { return nil, diag.Errorf("%s: %s", resp.Status(), string(resp.Body)) } foundConnectors := []*models.KibanaActionConnector{} for _, connector := range *resp.JSON200 { if connector.Name != connectorName { continue } if connectorTypeID != "" && string(connector.ConnectorTypeId) != connectorTypeID { continue } //this marshaling and unmarshaling business allows us to create a type with unexported fields. bytes, err := json.Marshal(connector) if err != nil { return nil, diag.Errorf("cannot marshal connector: %v", err) } var respProps connectors.ConnectorResponseProperties err = json.Unmarshal(bytes, &respProps) if err != nil { return nil, diag.Errorf("cannot unmarshal connector: %v", err) } c, err := connectorResponseToModel(spaceID, respProps) if err != nil { return nil, diag.Errorf("unable to convert response to model: %v", err) } foundConnectors = append(foundConnectors, c) } if len(foundConnectors) == 0 { tflog.Debug(ctx, fmt.Sprintf("no connectors found with name [%s/%s] and type [%s]", spaceID, connectorName, connectorTypeID)) } return foundConnectors, nil } func DeleteConnector(ctx context.Context, apiClient *clients.ApiClient, connectorID string, spaceID string) diag.Diagnostics { client, err := apiClient.GetKibanaConnectorsClient(ctx) if err != nil { return diag.FromErr(err) } httpResp, err := client.DeleteConnector(ctx, spaceID, connectorID, &connectors.DeleteConnectorParams{KbnXsrf: "true"}) if err != nil { return diag.Errorf("unable to delete connector: [%v]", err) } defer httpResp.Body.Close() resp, err := connectors.ParseDeleteConnectorResponse(httpResp) if err != nil { return diag.Errorf("unable to parse connector get response: [%v]", err) } if resp.JSON404 != nil { return diag.Errorf("%s: %s", *resp.JSON404.Error, *resp.JSON404.Message) } if resp.JSON401 != nil { return diag.Errorf("%s: %s", *resp.JSON401.Error, *resp.JSON401.Message) } if resp.StatusCode() != 200 && resp.StatusCode() != 204 { return diag.Errorf("failed to delete connector: got status [%v] [%s]", resp.StatusCode(), resp.Status()) } return nil } func ConnectorConfigWithDefaults(connectorTypeID, plan, backend, state string) (string, error) { switch connectors.ConnectorTypes(connectorTypeID) { case connectors.ConnectorTypesDotCasesWebhook: return connectorConfigWithDefaultsCasesWebhook(plan) case connectors.ConnectorTypesDotEmail: return connectorConfigWithDefaultsEmail(plan) case connectors.ConnectorTypesDotGemini: return connectorConfigWithDefaultsGemini(plan) case connectors.ConnectorTypesDotIndex: return connectorConfigWithDefaultsIndex(plan) case connectors.ConnectorTypesDotJira: return connectorConfigWithDefaultsJira(plan) case connectors.ConnectorTypesDotOpsgenie: return connectorConfigWithDefaultsOpsgenie(plan) case connectors.ConnectorTypesDotPagerduty: return connectorConfigWithDefaultsPagerduty(plan) case connectors.ConnectorTypesDotResilient: return connectorConfigWithDefaultsResilient(plan) case connectors.ConnectorTypesDotServicenow: return connectorConfigWithDefaultsServicenow(plan, backend) case connectors.ConnectorTypesDotServicenowItom: return connectorConfigWithDefaultsServicenowItom(plan) case connectors.ConnectorTypesDotServicenowSir: return connectorConfigWithDefaultsServicenowSir(plan, backend) case connectors.ConnectorTypesDotSwimlane: return connectorConfigWithDefaultsSwimlane(plan) case connectors.ConnectorTypesDotTines: return connectorConfigWithDefaultsTines(plan) case connectors.ConnectorTypesDotWebhook: return connectorConfigWithDefaultsWebhook(plan) case connectors.ConnectorTypesDotXmatters: return connectorConfigWithDefaultsXmatters(plan) } return plan, nil } // User can omit optonal fields in config JSON. // The func adds empty optional fields to the diff. // Otherwise plan command shows omitted fields as the diff, // because backend returns all fields. func connectorConfigWithDefaults[T any](plan string) (string, error) { var config T if err := json.Unmarshal([]byte(plan), &config); err != nil { return "", err } customJSON, err := json.Marshal(config) if err != nil { return "", err } return string(customJSON), nil } func connectorConfigWithDefaultsCasesWebhook(plan string) (string, error) { var custom connectors.ConfigPropertiesCasesWebhook if err := json.Unmarshal([]byte(plan), &custom); err != nil { return "", err } if custom.CreateIncidentMethod == nil { custom.CreateIncidentMethod = new(connectors.ConfigPropertiesCasesWebhookCreateIncidentMethod) *custom.CreateIncidentMethod = connectors.ConfigPropertiesCasesWebhookCreateIncidentMethodPost } if custom.HasAuth == nil { custom.HasAuth = utils.Pointer(true) } if custom.UpdateIncidentMethod == nil { custom.UpdateIncidentMethod = new(connectors.ConfigPropertiesCasesWebhookUpdateIncidentMethod) *custom.UpdateIncidentMethod = connectors.ConfigPropertiesCasesWebhookUpdateIncidentMethodPut } customJSON, err := json.Marshal(custom) if err != nil { return "", err } return string(customJSON), nil } func connectorConfigWithDefaultsEmail(plan string) (string, error) { var custom connectors.ConfigPropertiesEmail if err := json.Unmarshal([]byte(plan), &custom); err != nil { return "", err } if custom.HasAuth == nil { custom.HasAuth = utils.Pointer(true) } if custom.Service == nil { custom.Service = new(string) *custom.Service = "other" } customJSON, err := json.Marshal(custom) if err != nil { return "", err } return string(customJSON), nil } func connectorConfigWithDefaultsGemini(plan string) (string, error) { return plan, nil } func connectorConfigWithDefaultsIndex(plan string) (string, error) { var custom connectors.ConfigPropertiesIndex if err := json.Unmarshal([]byte(plan), &custom); err != nil { return "", err } if custom.Refresh == nil { custom.Refresh = utils.Pointer(false) } customJSON, err := json.Marshal(custom) if err != nil { return "", err } return string(customJSON), nil } func connectorConfigWithDefaultsJira(plan string) (string, error) { return connectorConfigWithDefaults[connectors.ConfigPropertiesJira](plan) } func connectorConfigWithDefaultsOpsgenie(plan string) (string, error) { return plan, nil } func connectorConfigWithDefaultsPagerduty(plan string) (string, error) { return connectorConfigWithDefaults[connectors.ConfigPropertiesPagerduty](plan) } func connectorConfigWithDefaultsResilient(plan string) (string, error) { return plan, nil } func connectorConfigWithDefaultsServicenow(plan, backend string) (string, error) { var planConfig connectors.ConfigPropertiesServicenow if err := json.Unmarshal([]byte(plan), &planConfig); err != nil { return "", err } var backendConfig connectors.ConfigPropertiesServicenow if err := json.Unmarshal([]byte(backend), &backendConfig); err != nil { return "", err } if planConfig.IsOAuth == nil && backendConfig.IsOAuth != nil && !*backendConfig.IsOAuth { planConfig.IsOAuth = utils.Pointer(false) } if planConfig.UsesTableApi == nil { planConfig.UsesTableApi = utils.Pointer(true) } customJSON, err := json.Marshal(planConfig) if err != nil { return "", err } return string(customJSON), nil } func connectorConfigWithDefaultsServicenowItom(plan string) (string, error) { var custom connectors.ConfigPropertiesServicenowItom if err := json.Unmarshal([]byte(plan), &custom); err != nil { return "", err } if custom.IsOAuth == nil { custom.IsOAuth = utils.Pointer(false) } customJSON, err := json.Marshal(custom) if err != nil { return "", err } return string(customJSON), nil } func connectorConfigWithDefaultsServicenowSir(plan, backend string) (string, error) { return connectorConfigWithDefaultsServicenow(plan, backend) } func connectorConfigWithDefaultsSwimlane(plan string) (string, error) { var custom connectors.ConfigPropertiesSwimlane if err := json.Unmarshal([]byte(plan), &custom); err != nil { return "", err } if custom.Mappings == nil { custom.Mappings = &connectors.ConfigPropertiesSwimlaneMappings{} } customJSON, err := json.Marshal(custom) if err != nil { return "", err } return string(customJSON), nil } func connectorConfigWithDefaultsTines(plan string) (string, error) { return plan, nil } func connectorConfigWithDefaultsWebhook(plan string) (string, error) { return plan, nil } func connectorConfigWithDefaultsXmatters(plan string) (string, error) { var custom connectors.ConfigPropertiesXmatters if err := json.Unmarshal([]byte(plan), &custom); err != nil { return "", err } if custom.UsesBasic == nil { custom.UsesBasic = utils.Pointer(true) } customJSON, err := json.Marshal(custom) if err != nil { return "", err } return string(customJSON), nil } func createConnectorRequestBody(connector models.KibanaActionConnector) (io.Reader, error) { switch connectors.ConnectorTypes(connector.ConnectorTypeID) { case connectors.ConnectorTypesDotCasesWebhook: return createConnectorRequestCasesWebhook(connector) case connectors.ConnectorTypesDotEmail: return createConnectorRequestEmail(connector) case connectors.ConnectorTypesDotGemini: return createConnectorRequestGemini(connector) case connectors.ConnectorTypesDotIndex: return createConnectorRequestIndex(connector) case connectors.ConnectorTypesDotJira: return createConnectorRequestJira(connector) case connectors.ConnectorTypesDotOpsgenie: return createConnectorRequestOpsgenie(connector) case connectors.ConnectorTypesDotPagerduty: return createConnectorRequestPagerduty(connector) case connectors.ConnectorTypesDotResilient: return createConnectorRequestResilient(connector) case connectors.ConnectorTypesDotServicenow: return createConnectorRequestServicenow(connector) case connectors.ConnectorTypesDotServicenowItom: return createConnectorRequestServicenowItom(connector) case connectors.ConnectorTypesDotServicenowSir: return createConnectorRequestServicenowSir(connector) case connectors.ConnectorTypesDotServerLog: return createConnectorRequestServerLog(connector) case connectors.ConnectorTypesDotSlack: return createConnectorRequestSlack(connector) case connectors.ConnectorTypesDotSlackApi: return createConnectorRequestSlackApi(connector) case connectors.ConnectorTypesDotSwimlane: return createConnectorRequestSwimlane(connector) case connectors.ConnectorTypesDotTeams: return createConnectorRequestTeams(connector) case connectors.ConnectorTypesDotTines: return createConnectorRequestTines(connector) case connectors.ConnectorTypesDotWebhook: return createConnectorRequestWebhook(connector) case connectors.ConnectorTypesDotXmatters: return createConnectorRequestXmatters(connector) } return nil, fmt.Errorf("unknown connector type [%s]", connector.ConnectorTypeID) } func updateConnectorRequestBody(connector models.KibanaActionConnector) (io.Reader, error) { switch connectors.ConnectorTypes(connector.ConnectorTypeID) { case connectors.ConnectorTypesDotCasesWebhook: return updateConnectorRequestCasesWebhook(connector) case connectors.ConnectorTypesDotEmail: return updateConnectorRequestEmail(connector) case connectors.ConnectorTypesDotGemini: return updateConnectorRequestGemini(connector) case connectors.ConnectorTypesDotIndex: return updateConnectorRequestIndex(connector) case connectors.ConnectorTypesDotJira: return updateConnectorRequestJira(connector) case connectors.ConnectorTypesDotOpsgenie: return updateConnectorRequestOpsgenie(connector) case connectors.ConnectorTypesDotPagerduty: return updateConnectorRequestPagerduty(connector) case connectors.ConnectorTypesDotResilient: return updateConnectorRequestResilient(connector) case connectors.ConnectorTypesDotServicenow: return updateConnectorRequestServicenow(connector) case connectors.ConnectorTypesDotServicenowItom: return updateConnectorRequestServicenowItom(connector) case connectors.ConnectorTypesDotServicenowSir: return updateConnectorRequestServicenowSir(connector) case connectors.ConnectorTypesDotServerLog: return updateConnectorRequestServerlog(connector) case connectors.ConnectorTypesDotSlack: return updateConnectorRequestSlack(connector) case connectors.ConnectorTypesDotSlackApi: return updateConnectorRequestSlackApi(connector) case connectors.ConnectorTypesDotSwimlane: return updateConnectorRequestSwimlane(connector) case connectors.ConnectorTypesDotTeams: return updateConnectorRequestTeams(connector) case connectors.ConnectorTypesDotTines: return updateConnectorRequestTines(connector) case connectors.ConnectorTypesDotWebhook: return updateConnectorRequestWebhook(connector) case connectors.ConnectorTypesDotXmatters: return updateConnectorRequestXmatters(connector) } return nil, fmt.Errorf("unknown connector type [%s]", connector.ConnectorTypeID) } func marshalConnectorRequest[C, S, R any](connector models.KibanaActionConnector, config *C, secrets *S, request *R) (io.Reader, error) { if config != nil && len(connector.ConfigJSON) > 0 { if err := json.Unmarshal([]byte(connector.ConfigJSON), config); err != nil { return nil, fmt.Errorf("failed to unmarshal [config] attribute: %w", err) } } if secrets != nil && len(connector.SecretsJSON) > 0 { if err := json.Unmarshal([]byte(connector.SecretsJSON), secrets); err != nil { return nil, fmt.Errorf("failed to unmarshal [secrets] attribute: %w", err) } } bt, err := json.Marshal(request) if err != nil { return nil, fmt.Errorf("failed to marshal request: %w", err) } return bytes.NewReader(bt), nil } func createConnectorRequestCasesWebhook(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestCasesWebhook{ ConnectorTypeId: connectors.DotCasesWebhook, Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func createConnectorRequestEmail(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestEmail{ ConnectorTypeId: connectors.CreateConnectorRequestEmailConnectorTypeIdDotEmail, Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func createConnectorRequestGemini(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestGemini{ ConnectorTypeId: connectors.CreateConnectorRequestGeminiConnectorTypeIdDotGemini, Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func createConnectorRequestIndex(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestIndex{ ConnectorTypeId: connectors.CreateConnectorRequestIndexConnectorTypeIdDotIndex, Name: connector.Name, } return marshalConnectorRequest[connectors.ConfigPropertiesIndex, any](connector, &request.Config, nil, &request) } func createConnectorRequestJira(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestJira{ ConnectorTypeId: connectors.CreateConnectorRequestJiraConnectorTypeIdDotJira, Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func createConnectorRequestOpsgenie(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestOpsgenie{ ConnectorTypeId: connectors.CreateConnectorRequestOpsgenieConnectorTypeIdDotOpsgenie, Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func createConnectorRequestPagerduty(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestPagerduty{ ConnectorTypeId: connectors.CreateConnectorRequestPagerdutyConnectorTypeIdDotPagerduty, Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func createConnectorRequestResilient(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestResilient{ ConnectorTypeId: connectors.CreateConnectorRequestResilientConnectorTypeIdDotResilient, Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func createConnectorRequestServicenow(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestServicenow{ ConnectorTypeId: connectors.CreateConnectorRequestServicenowConnectorTypeIdDotServicenow, Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func createConnectorRequestServicenowItom(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestServicenowItom{ ConnectorTypeId: connectors.CreateConnectorRequestServicenowItomConnectorTypeIdDotServicenowItom, Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func createConnectorRequestServicenowSir(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestServicenowSir{ ConnectorTypeId: connectors.CreateConnectorRequestServicenowSirConnectorTypeIdDotServicenowSir, Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func createConnectorRequestServerLog(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestServerlog{ ConnectorTypeId: connectors.CreateConnectorRequestServerlogConnectorTypeIdDotServerLog, Name: connector.Name, } return marshalConnectorRequest[any, any](connector, nil, nil, &request) } func createConnectorRequestSlack(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestSlack{ ConnectorTypeId: connectors.CreateConnectorRequestSlackConnectorTypeIdDotSlack, Name: connector.Name, } return marshalConnectorRequest[any](connector, nil, &request.Secrets, &request) } func createConnectorRequestSlackApi(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestSlackApi{ ConnectorTypeId: connectors.CreateConnectorRequestSlackApiConnectorTypeIdDotSlackApi, Name: connector.Name, } return marshalConnectorRequest[any](connector, nil, &request.Secrets, &request) } func createConnectorRequestSwimlane(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestSwimlane{ ConnectorTypeId: connectors.CreateConnectorRequestSwimlaneConnectorTypeIdDotSwimlane, Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func createConnectorRequestTeams(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestTeams{ ConnectorTypeId: connectors.CreateConnectorRequestTeamsConnectorTypeIdDotTeams, Name: connector.Name, } return marshalConnectorRequest[any](connector, nil, &request.Secrets, &request) } func createConnectorRequestTines(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestTines{ ConnectorTypeId: connectors.CreateConnectorRequestTinesConnectorTypeIdDotTines, Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func createConnectorRequestWebhook(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestWebhook{ ConnectorTypeId: connectors.CreateConnectorRequestWebhookConnectorTypeIdDotWebhook, Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func createConnectorRequestXmatters(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.CreateConnectorRequestXmatters{ ConnectorTypeId: connectors.CreateConnectorRequestXmattersConnectorTypeIdDotXmatters, Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func updateConnectorRequestCasesWebhook(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestCasesWebhook{ Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func updateConnectorRequestEmail(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestEmail{ Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func updateConnectorRequestGemini(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestGemini{ Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func updateConnectorRequestIndex(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestIndex{ Name: connector.Name, } return marshalConnectorRequest[connectors.ConfigPropertiesIndex, any](connector, &request.Config, nil, &request) } func updateConnectorRequestJira(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestJira{ Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func updateConnectorRequestOpsgenie(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestOpsgenie{ Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func updateConnectorRequestPagerduty(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestPagerduty{ Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func updateConnectorRequestResilient(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestResilient{ Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func updateConnectorRequestServicenow(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestServicenow{ Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func updateConnectorRequestServicenowItom(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestServicenowItom{ Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func updateConnectorRequestServicenowSir(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestServicenowSir{ Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func updateConnectorRequestServerlog(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestServerlog{ Name: connector.Name, } return marshalConnectorRequest[any, any](connector, nil, nil, &request) } func updateConnectorRequestSlack(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestSlack{ Name: connector.Name, } return marshalConnectorRequest[any](connector, nil, &request.Secrets, &request) } func updateConnectorRequestSlackApi(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestSlackApi{ Name: connector.Name, } return marshalConnectorRequest[any](connector, nil, &request.Secrets, &request) } func updateConnectorRequestSwimlane(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestSwimlane{ Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func updateConnectorRequestTeams(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestTeams{ Name: connector.Name, } return marshalConnectorRequest[any](connector, nil, &request.Secrets, &request) } func updateConnectorRequestTines(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestTines{ Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func updateConnectorRequestWebhook(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestWebhook{ Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func updateConnectorRequestXmatters(connector models.KibanaActionConnector) (io.Reader, error) { request := connectors.UpdateConnectorRequestXmatters{ Name: connector.Name, } return marshalConnectorRequest(connector, &request.Config, &request.Secrets, &request) } func connectorResponseToModel(spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { discriminator, err := properties.Discriminator() if err != nil { return nil, err } switch connectors.ConnectorTypes(discriminator) { case connectors.ConnectorTypesDotCasesWebhook: return connectorResponseToModelCasesWebhook(discriminator, spaceID, properties) case connectors.ConnectorTypesDotEmail: return connectorResponseToModelEmail(discriminator, spaceID, properties) case connectors.ConnectorTypesDotGemini: return connectorResponseToModelGemini(discriminator, spaceID, properties) case connectors.ConnectorTypesDotIndex: return connectorResponseToModelIndex(discriminator, spaceID, properties) case connectors.ConnectorTypesDotJira: return connectorResponseToModelJira(discriminator, spaceID, properties) case connectors.ConnectorTypesDotOpsgenie: return connectorResponseToModelOpsgenie(discriminator, spaceID, properties) case connectors.ConnectorTypesDotPagerduty: return connectorResponseToModelPagerduty(discriminator, spaceID, properties) case connectors.ConnectorTypesDotResilient: return connectorResponseToModelResilient(discriminator, spaceID, properties) case connectors.ConnectorTypesDotServerLog: return connectorResponseToModelServerlog(discriminator, spaceID, properties) case connectors.ConnectorTypesDotServicenow: return connectorResponseToModelServicenow(discriminator, spaceID, properties) case connectors.ConnectorTypesDotServicenowItom: return connectorResponseToModelServicenowItom(discriminator, spaceID, properties) case connectors.ConnectorTypesDotServicenowSir: return connectorResponseToModelServicenowSir(discriminator, spaceID, properties) case connectors.ConnectorTypesDotSlack: return connectorResponseToModelSlack(discriminator, spaceID, properties) case connectors.ConnectorTypesDotSlackApi: return connectorResponseToModelSlackApi(discriminator, spaceID, properties) case connectors.ConnectorTypesDotSwimlane: return connectorResponseToModelSwimlane(discriminator, spaceID, properties) case connectors.ConnectorTypesDotTeams: return connectorResponseToModelTeams(discriminator, spaceID, properties) case connectors.ConnectorTypesDotTines: return connectorResponseToModelTines(discriminator, spaceID, properties) case connectors.ConnectorTypesDotWebhook: return connectorResponseToModelWebhook(discriminator, spaceID, properties) case connectors.ConnectorTypesDotXmatters: return connectorResponseToModelXmatters(discriminator, spaceID, properties) } return nil, fmt.Errorf("unknown connector type [%s]", discriminator) } func connectorResponseToModelCasesWebhook(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesCasesWebhook() if err != nil { return nil, err } config, err := json.Marshal(resp.Config) if err != nil { return nil, fmt.Errorf("unable to marshal config: %w", err) } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), ConfigJSON: string(config), } return &connector, nil } func connectorResponseToModelEmail(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesEmail() if err != nil { return nil, err } config, err := json.Marshal(resp.Config) if err != nil { return nil, fmt.Errorf("unable to marshal config: %w", err) } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), ConfigJSON: string(config), } return &connector, nil } func connectorResponseToModelGemini(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesGemini() if err != nil { return nil, err } config, err := json.Marshal(resp.Config) if err != nil { return nil, fmt.Errorf("unable to marshal config: %w", err) } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), ConfigJSON: string(config), } return &connector, nil } func connectorResponseToModelIndex(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesIndex() if err != nil { return nil, err } config, err := json.Marshal(resp.Config) if err != nil { return nil, fmt.Errorf("unable to marshal config: %w", err) } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), ConfigJSON: string(config), } return &connector, nil } func connectorResponseToModelJira(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesJira() if err != nil { return nil, err } config, err := json.Marshal(resp.Config) if err != nil { return nil, fmt.Errorf("unable to marshal config: %w", err) } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), ConfigJSON: string(config), } return &connector, nil } func connectorResponseToModelOpsgenie(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesOpsgenie() if err != nil { return nil, err } config, err := json.Marshal(resp.Config) if err != nil { return nil, fmt.Errorf("unable to marshal config: %w", err) } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), ConfigJSON: string(config), } return &connector, nil } func connectorResponseToModelPagerduty(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesPagerduty() if err != nil { return nil, err } config, err := json.Marshal(resp.Config) if err != nil { return nil, fmt.Errorf("unable to marshal config: %w", err) } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), ConfigJSON: string(config), } return &connector, nil } func connectorResponseToModelResilient(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesResilient() if err != nil { return nil, err } config, err := json.Marshal(resp.Config) if err != nil { return nil, fmt.Errorf("unable to marshal config: %w", err) } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), ConfigJSON: string(config), } return &connector, nil } func connectorResponseToModelServerlog(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesServerlog() if err != nil { return nil, err } config, err := json.Marshal(resp.Config) if err != nil { return nil, fmt.Errorf("unable to marshal config: %w", err) } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), ConfigJSON: string(config), } return &connector, nil } func connectorResponseToModelServicenow(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesServicenow() if err != nil { return nil, err } config, err := json.Marshal(resp.Config) if err != nil { return nil, fmt.Errorf("unable to marshal config: %w", err) } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), ConfigJSON: string(config), } return &connector, nil } func connectorResponseToModelServicenowItom(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesServicenowItom() if err != nil { return nil, err } config, err := json.Marshal(resp.Config) if err != nil { return nil, fmt.Errorf("unable to marshal config: %w", err) } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), ConfigJSON: string(config), } return &connector, nil } func connectorResponseToModelServicenowSir(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesServicenowSir() if err != nil { return nil, err } config, err := json.Marshal(resp.Config) if err != nil { return nil, fmt.Errorf("unable to marshal config: %w", err) } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), ConfigJSON: string(config), } return &connector, nil } func connectorResponseToModelSlack(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesSlack() if err != nil { return nil, err } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), } return &connector, nil } func connectorResponseToModelSlackApi(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesSlackApi() if err != nil { return nil, err } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), } return &connector, nil } func connectorResponseToModelSwimlane(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesSwimlane() if err != nil { return nil, err } config, err := json.Marshal(resp.Config) if err != nil { return nil, fmt.Errorf("unable to marshal config: %w", err) } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), ConfigJSON: string(config), } return &connector, nil } func connectorResponseToModelTeams(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesTeams() if err != nil { return nil, err } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), } return &connector, nil } func connectorResponseToModelTines(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesTines() if err != nil { return nil, err } config, err := json.Marshal(resp.Config) if err != nil { return nil, fmt.Errorf("unable to marshal config: %w", err) } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), ConfigJSON: string(config), } return &connector, nil } func connectorResponseToModelWebhook(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesWebhook() if err != nil { return nil, err } config, err := json.Marshal(resp.Config) if err != nil { return nil, fmt.Errorf("unable to marshal config: %w", err) } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), ConfigJSON: string(config), } return &connector, nil } func connectorResponseToModelXmatters(discriminator, spaceID string, properties connectors.ConnectorResponseProperties) (*models.KibanaActionConnector, error) { resp, err := properties.AsConnectorResponsePropertiesXmatters() if err != nil { return nil, err } config, err := json.Marshal(resp.Config) if err != nil { return nil, fmt.Errorf("unable to marshal config: %w", err) } isDeprecated := false isMissingSecrets := false if resp.IsDeprecated != nil { isDeprecated = *resp.IsDeprecated } if resp.IsMissingSecrets != nil { isMissingSecrets = *resp.IsMissingSecrets } connector := models.KibanaActionConnector{ ConnectorID: resp.Id, SpaceID: spaceID, Name: resp.Name, ConnectorTypeID: discriminator, IsDeprecated: isDeprecated, IsMissingSecrets: isMissingSecrets, IsPreconfigured: bool(resp.IsPreconfigured), ConfigJSON: string(config), } return &connector, nil }