diff --git a/CHANGELOG.md b/CHANGELOG.md index 114425c58..f2ca021e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,13 @@ ## [Unreleased] +- Add support for the `.gemini` connector type for Kibana action connectors ([#819](https://github.com/elastic/terraform-provider-elasticstack/pull/819)) - Fix secret handling `elasticstack_fleet_integration_policy` resource. ([#821](https://github.com/elastic/terraform-provider-elasticstack/pull/821)) - Add `aliases` attribute to `elasticstack_elasticsearch_transform` resource. ([#825](https://github.com/elastic/terraform-provider-elasticstack/pull/825)) - Add `description` attribute to `elasticstack_elasticsearch_security_role` resource. ([#824](https://github.com/elastic/terraform-provider-elasticstack/pull/824)) - Fix merge values for `elasticstack_kibana_synthetics_monitor` monitor locations ([#823](https://github.com/elastic/terraform-provider-elasticstack/pull/823) - Add `elasticstack_elasticsearch_index_template` data source ([#828](https://github.com/elastic/terraform-provider-elasticstack/pull/828)) + ## [0.11.8] - 2024-10-02 - Add key_id to the `elasticstack_elasticsearch_api_key` resource. ([#789](https://github.com/elastic/terraform-provider-elasticstack/pull/789)) diff --git a/generated/alerting/api_alerting_mocks.go b/generated/alerting/api_alerting_mocks.go index ffab4e81f..d29559207 100644 --- a/generated/alerting/api_alerting_mocks.go +++ b/generated/alerting/api_alerting_mocks.go @@ -1,9 +1,9 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: ./api_alerting.go +// Source: ../generated/alerting/api_alerting.go // // Generated by this command: // -// mockgen -destination=./api_alerting_mocks.go -package=alerting -source ./api_alerting.go AlertingAPI +// mockgen -destination=../generated/alerting/api_alerting_mocks.go -package=alerting -source ../generated/alerting/api_alerting.go AlertingAPI // // Package alerting is a generated GoMock package. diff --git a/generated/connectors/README.md b/generated/connectors/README.md index 94b8a4392..e4e3c852d 100644 --- a/generated/connectors/README.md +++ b/generated/connectors/README.md @@ -1,5 +1,6 @@ [OpenAPI specs](./bundled.yaml) is copied from [Kibana repo](https://raw.githubusercontent.com/elastic/kibana/8.7/x-pack/plugins/actions/docs/openapi/bundled.yaml) with some modifications: +- added `.gemini` as a possible value for `connector_types`; - `.slack_api` connector support comes from version 8.8 of the API specification; - added `.slack_api` as a possible value for `connector_types`; - added mapping section for discriminator field in `POST` `/s/{spaceId}/api/actions/connector`; diff --git a/generated/connectors/bundled.yaml b/generated/connectors/bundled.yaml index ce0dfa811..f93c47be6 100644 --- a/generated/connectors/bundled.yaml +++ b/generated/connectors/bundled.yaml @@ -36,6 +36,7 @@ paths: oneOf: - $ref: '#/components/schemas/create_connector_request_cases_webhook' - $ref: '#/components/schemas/create_connector_request_email' + - $ref: '#/components/schemas/create_connector_request_gemini' - $ref: '#/components/schemas/create_connector_request_index' - $ref: '#/components/schemas/create_connector_request_jira' - $ref: '#/components/schemas/create_connector_request_opsgenie' @@ -57,6 +58,7 @@ paths: mapping: .cases-webhook: '#/components/schemas/create_connector_request_cases_webhook' .email: '#/components/schemas/create_connector_request_email' + .gemini: '#/components/schemas/create_connector_request_gemini' .index: '#/components/schemas/create_connector_request_index' .jira: '#/components/schemas/create_connector_request_jira' .opsgenie: '#/components/schemas/create_connector_request_opsgenie' @@ -206,6 +208,7 @@ paths: oneOf: - $ref: '#/components/schemas/update_connector_request_cases_webhook' - $ref: '#/components/schemas/update_connector_request_email' + - $ref: '#/components/schemas/update_connector_request_gemini' - $ref: '#/components/schemas/update_connector_request_index' - $ref: '#/components/schemas/update_connector_request_jira' - $ref: '#/components/schemas/update_connector_request_opsgenie' @@ -975,6 +978,63 @@ components: example: my-connector secrets: $ref: '#/components/schemas/secrets_properties_email' + config_properties_gemini: + title: Connector request properties for an Google Gemini connector + description: Defines properties for connectors when type is `.gemini`. + required: + - apiUrl + - gcpRegion + - gcpProjectID + type: object + properties: + apiUrl: + type: string + description: The Google Gemini request URL. + defaultModel: + type: string + description: The generative artificial intelligence model for Google Gemini to use. + default: gemini-1.5-pro-001 + gcpRegion: + type: string + description: The GCP region where the Vertex AI endpoint enabled. + gcpProjectID: + type: string + description: The Google ProjectID that has Vertex AI endpoint enabled. + secrets_properties_gemini: + title: Connector secrets properties for a Google Gemini connector + description: Defines secrets for connectors when type is `.gemini`. + type: object + required: + - credentialsJson + properties: + credentialsJson: + type: string + description: The service account credentials JSON file. The service account should have Vertex AI user IAM role assigned to it. + create_connector_request_gemini: + title: Create Google Gemini connector request + description: | + The Google Gemini connector uses axios to send a POST request to Google Gemini. + type: object + required: + - config + - connector_type_id + - name + - secrets + properties: + config: + $ref: '#/components/schemas/config_properties_gemini' + connector_type_id: + type: string + description: The type of connector. + enum: + - .gemini + example: .gemini + name: + type: string + description: The display name for the connector. + example: my-connector + secrets: + $ref: '#/components/schemas/secrets_properties_gemini' config_properties_index: title: Connector request properties for an index connector required: @@ -1875,6 +1935,35 @@ components: name: type: string description: The display name for the connector. + connector_response_properties_gemini: + title: Connector response properties for a Google Gemini connector + type: object + required: + - config + - connector_type_id + - id + - is_preconfigured + - name + properties: + config: + $ref: '#/components/schemas/config_properties_gemini' + connector_type_id: + type: string + description: The type of connector. + enum: + - .gemini + id: + type: string + description: The identifier for the connector. + is_deprecated: + $ref: '#/components/schemas/is_deprecated' + is_missing_secrets: + $ref: '#/components/schemas/is_missing_secrets' + is_preconfigured: + $ref: '#/components/schemas/is_preconfigured' + name: + type: string + description: The display name for the connector. connector_response_properties_index: title: Connector response properties for an index connector type: object @@ -2337,6 +2426,7 @@ components: oneOf: - $ref: '#/components/schemas/connector_response_properties_cases_webhook' - $ref: '#/components/schemas/connector_response_properties_email' + - $ref: '#/components/schemas/connector_response_properties_gemini' - $ref: '#/components/schemas/connector_response_properties_index' - $ref: '#/components/schemas/connector_response_properties_jira' - $ref: '#/components/schemas/connector_response_properties_opsgenie' @@ -2358,6 +2448,7 @@ components: mapping: .cases-webhook: '#/components/schemas/connector_response_properties_cases_webhook' .email: '#/components/schemas/connector_response_properties_email' + .gemini: '#/components/schemas/connector_response_properties_gemini' .index: '#/components/schemas/connector_response_properties_index' .jira: '#/components/schemas/connector_response_properties_jira' .opsgenie: '#/components/schemas/connector_response_properties_opsgenie' @@ -2405,6 +2496,21 @@ components: example: my-connector secrets: $ref: '#/components/schemas/secrets_properties_email' + update_connector_request_gemini: + title: Update Google Gemini connector request + type: object + required: + - config + - name + properties: + config: + $ref: '#/components/schemas/config_properties_gemini' + name: + type: string + description: The display name for the connector. + example: my-connector + secrets: + $ref: '#/components/schemas/secrets_properties_gemini' update_connector_request_index: title: Update index connector request type: object @@ -2654,6 +2760,7 @@ components: enum: - .cases-webhook - .email + - .gemini - .index - .jira - .opsgenie diff --git a/generated/connectors/connectors.gen.go b/generated/connectors/connectors.gen.go index c60db1be8..b059ea87e 100644 --- a/generated/connectors/connectors.gen.go +++ b/generated/connectors/connectors.gen.go @@ -1,6 +1,6 @@ // Package connectors provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/deepmap/oapi-codegen/v2 version v2.1.0 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.4.1 DO NOT EDIT. package connectors import ( @@ -87,6 +87,11 @@ const ( ConnectorResponsePropertiesEmailConnectorTypeIdDotEmail ConnectorResponsePropertiesEmailConnectorTypeId = ".email" ) +// Defines values for ConnectorResponsePropertiesGeminiConnectorTypeId. +const ( + ConnectorResponsePropertiesGeminiConnectorTypeIdDotGemini ConnectorResponsePropertiesGeminiConnectorTypeId = ".gemini" +) + // Defines values for ConnectorResponsePropertiesIndexConnectorTypeId. const ( ConnectorResponsePropertiesIndexConnectorTypeIdDotIndex ConnectorResponsePropertiesIndexConnectorTypeId = ".index" @@ -171,6 +176,7 @@ const ( const ( ConnectorTypesDotCasesWebhook ConnectorTypes = ".cases-webhook" ConnectorTypesDotEmail ConnectorTypes = ".email" + ConnectorTypesDotGemini ConnectorTypes = ".gemini" ConnectorTypesDotIndex ConnectorTypes = ".index" ConnectorTypesDotJira ConnectorTypes = ".jira" ConnectorTypesDotOpsgenie ConnectorTypes = ".opsgenie" @@ -199,6 +205,11 @@ const ( CreateConnectorRequestEmailConnectorTypeIdDotEmail CreateConnectorRequestEmailConnectorTypeId = ".email" ) +// Defines values for CreateConnectorRequestGeminiConnectorTypeId. +const ( + CreateConnectorRequestGeminiConnectorTypeIdDotGemini CreateConnectorRequestGeminiConnectorTypeId = ".gemini" +) + // Defines values for CreateConnectorRequestIndexConnectorTypeId. const ( CreateConnectorRequestIndexConnectorTypeIdDotIndex CreateConnectorRequestIndexConnectorTypeId = ".index" @@ -504,6 +515,21 @@ type ConfigPropertiesEmail struct { TenantId *string `json:"tenantId"` } +// ConfigPropertiesGemini Defines properties for connectors when type is `.gemini`. +type ConfigPropertiesGemini struct { + // ApiUrl The Google Gemini request URL. + ApiUrl string `json:"apiUrl"` + + // DefaultModel The generative artificial intelligence model for Google Gemini to use. + DefaultModel *string `json:"defaultModel,omitempty"` + + // GcpProjectID The Google ProjectID that has Vertex AI endpoint enabled. + GcpProjectID string `json:"gcpProjectID"` + + // GcpRegion The GCP region where the Vertex AI endpoint enabled. + GcpRegion string `json:"gcpRegion"` +} + // ConfigPropertiesIndex Defines properties for connectors when type is `.index`. type ConfigPropertiesIndex struct { // ExecutionTimeField Specifies a field that will contain the time the alert condition was detected. @@ -791,6 +817,33 @@ type ConnectorResponsePropertiesEmail struct { // ConnectorResponsePropertiesEmailConnectorTypeId The type of connector. type ConnectorResponsePropertiesEmailConnectorTypeId string +// ConnectorResponsePropertiesGemini defines model for connector_response_properties_gemini. +type ConnectorResponsePropertiesGemini struct { + // Config Defines properties for connectors when type is `.gemini`. + Config ConfigPropertiesGemini `json:"config"` + + // ConnectorTypeId The type of connector. + ConnectorTypeId ConnectorResponsePropertiesGeminiConnectorTypeId `json:"connector_type_id"` + + // Id The identifier for the connector. + Id string `json:"id"` + + // IsDeprecated Indicates whether the connector type is deprecated. + IsDeprecated *IsDeprecated `json:"is_deprecated,omitempty"` + + // IsMissingSecrets Indicates whether secrets are missing for the connector. Secrets configuration properties vary depending on the connector type. + IsMissingSecrets *IsMissingSecrets `json:"is_missing_secrets,omitempty"` + + // IsPreconfigured Indicates whether it is a preconfigured connector. If true, the `config` and `is_missing_secrets` properties are omitted from the response. + IsPreconfigured IsPreconfigured `json:"is_preconfigured"` + + // Name The display name for the connector. + Name string `json:"name"` +} + +// ConnectorResponsePropertiesGeminiConnectorTypeId The type of connector. +type ConnectorResponsePropertiesGeminiConnectorTypeId string + // ConnectorResponsePropertiesIndex defines model for connector_response_properties_index. type ConnectorResponsePropertiesIndex struct { // Config Defines properties for connectors when type is `.index`. @@ -1250,6 +1303,24 @@ type CreateConnectorRequestEmail struct { // CreateConnectorRequestEmailConnectorTypeId The type of connector. type CreateConnectorRequestEmailConnectorTypeId string +// CreateConnectorRequestGemini The Google Gemini connector uses axios to send a POST request to Google Gemini. +type CreateConnectorRequestGemini struct { + // Config Defines properties for connectors when type is `.gemini`. + Config ConfigPropertiesGemini `json:"config"` + + // ConnectorTypeId The type of connector. + ConnectorTypeId CreateConnectorRequestGeminiConnectorTypeId `json:"connector_type_id"` + + // Name The display name for the connector. + Name string `json:"name"` + + // Secrets Defines secrets for connectors when type is `.gemini`. + Secrets SecretsPropertiesGemini `json:"secrets"` +} + +// CreateConnectorRequestGeminiConnectorTypeId The type of connector. +type CreateConnectorRequestGeminiConnectorTypeId string + // CreateConnectorRequestIndex The index connector indexes a document into Elasticsearch. type CreateConnectorRequestIndex struct { // Config Defines properties for connectors when type is `.index`. @@ -1982,6 +2053,12 @@ type SecretsPropertiesCasesWebhook struct { // SecretsPropertiesEmail Defines secrets for connectors when type is `.email`. type SecretsPropertiesEmail map[string]interface{} +// SecretsPropertiesGemini Defines secrets for connectors when type is `.gemini`. +type SecretsPropertiesGemini struct { + // CredentialsJson The service account credentials JSON file. The service account should have Vertex AI user IAM role assigned to it. + CredentialsJson string `json:"credentialsJson"` +} + // SecretsPropertiesJira Defines secrets for connectors when type is `.jira`. type SecretsPropertiesJira struct { // ApiToken The Jira API authentication token for HTTP basic authentication. @@ -2076,6 +2153,18 @@ type UpdateConnectorRequestEmail struct { Secrets SecretsPropertiesEmail `json:"secrets"` } +// UpdateConnectorRequestGemini defines model for update_connector_request_gemini. +type UpdateConnectorRequestGemini struct { + // Config Defines properties for connectors when type is `.gemini`. + Config ConfigPropertiesGemini `json:"config"` + + // Name The display name for the connector. + Name string `json:"name"` + + // Secrets Defines secrets for connectors when type is `.gemini`. + Secrets *SecretsPropertiesGemini `json:"secrets,omitempty"` +} + // UpdateConnectorRequestIndex defines model for update_connector_request_index. type UpdateConnectorRequestIndex struct { // Config Defines properties for connectors when type is `.index`. @@ -2451,6 +2540,34 @@ func (t *ConnectorResponseProperties) MergeConnectorResponsePropertiesEmail(v Co return err } +// AsConnectorResponsePropertiesGemini returns the union data inside the ConnectorResponseProperties as a ConnectorResponsePropertiesGemini +func (t ConnectorResponseProperties) AsConnectorResponsePropertiesGemini() (ConnectorResponsePropertiesGemini, error) { + var body ConnectorResponsePropertiesGemini + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromConnectorResponsePropertiesGemini overwrites any union data inside the ConnectorResponseProperties as the provided ConnectorResponsePropertiesGemini +func (t *ConnectorResponseProperties) FromConnectorResponsePropertiesGemini(v ConnectorResponsePropertiesGemini) error { + v.ConnectorTypeId = ".gemini" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeConnectorResponsePropertiesGemini performs a merge with any union data inside the ConnectorResponseProperties, using the provided ConnectorResponsePropertiesGemini +func (t *ConnectorResponseProperties) MergeConnectorResponsePropertiesGemini(v ConnectorResponsePropertiesGemini) error { + v.ConnectorTypeId = ".gemini" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + // AsConnectorResponsePropertiesIndex returns the union data inside the ConnectorResponseProperties as a ConnectorResponsePropertiesIndex func (t ConnectorResponseProperties) AsConnectorResponsePropertiesIndex() (ConnectorResponsePropertiesIndex, error) { var body ConnectorResponsePropertiesIndex @@ -2917,6 +3034,8 @@ func (t ConnectorResponseProperties) ValueByDiscriminator() (interface{}, error) return t.AsConnectorResponsePropertiesCasesWebhook() case ".email": return t.AsConnectorResponsePropertiesEmail() + case ".gemini": + return t.AsConnectorResponsePropertiesGemini() case ".index": return t.AsConnectorResponsePropertiesIndex() case ".jira": diff --git a/generated/fleet/fleet.gen.go b/generated/fleet/fleet.gen.go index 37fc86c65..135643e8d 100644 --- a/generated/fleet/fleet.gen.go +++ b/generated/fleet/fleet.gen.go @@ -1,6 +1,6 @@ // Package fleet provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.4.0 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.4.1 DO NOT EDIT. package fleet import ( diff --git a/internal/clients/kibana/connector.go b/internal/clients/kibana/connector.go index 027dc5c19..050cdbd08 100644 --- a/internal/clients/kibana/connector.go +++ b/internal/clients/kibana/connector.go @@ -248,6 +248,9 @@ func ConnectorConfigWithDefaults(connectorTypeID, plan, backend, state string) ( case connectors.ConnectorTypesDotEmail: return connectorConfigWithDefaultsEmail(plan) + case connectors.ConnectorTypesDotGemini: + return connectorConfigWithDefaultsGemini(plan) + case connectors.ConnectorTypesDotIndex: return connectorConfigWithDefaultsIndex(plan) @@ -345,6 +348,10 @@ func connectorConfigWithDefaultsEmail(plan string) (string, error) { 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 { @@ -464,6 +471,9 @@ func createConnectorRequestBody(connector models.KibanaActionConnector) (io.Read case connectors.ConnectorTypesDotEmail: return createConnectorRequestEmail(connector) + case connectors.ConnectorTypesDotGemini: + return createConnectorRequestGemini(connector) + case connectors.ConnectorTypesDotIndex: return createConnectorRequestIndex(connector) @@ -525,6 +535,9 @@ func updateConnectorRequestBody(connector models.KibanaActionConnector) (io.Read case connectors.ConnectorTypesDotEmail: return updateConnectorRequestEmail(connector) + case connectors.ConnectorTypesDotGemini: + return updateConnectorRequestGemini(connector) + case connectors.ConnectorTypesDotIndex: return updateConnectorRequestIndex(connector) @@ -616,6 +629,15 @@ func createConnectorRequestEmail(connector models.KibanaActionConnector) (io.Rea 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, @@ -776,6 +798,14 @@ func updateConnectorRequestEmail(connector models.KibanaActionConnector) (io.Rea 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, @@ -918,6 +948,9 @@ func connectorResponseToModel(spaceID string, properties connectors.ConnectorRes case connectors.ConnectorTypesDotEmail: return connectorResponseToModelEmail(discriminator, spaceID, properties) + case connectors.ConnectorTypesDotGemini: + return connectorResponseToModelGemini(discriminator, spaceID, properties) + case connectors.ConnectorTypesDotIndex: return connectorResponseToModelIndex(discriminator, spaceID, properties) @@ -1042,6 +1075,42 @@ func connectorResponseToModelEmail(discriminator, spaceID string, properties con 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 { diff --git a/internal/clients/kibana/connector_test.go b/internal/clients/kibana/connector_test.go index 566611cab..44a352fc2 100644 --- a/internal/clients/kibana/connector_test.go +++ b/internal/clients/kibana/connector_test.go @@ -70,6 +70,9 @@ func Test_connectorResponseToModel(t *testing.T) { generator(".email", connectors.ConfigPropertiesEmail{}, func(props *connectors.ConnectorResponseProperties) error { return props.FromConnectorResponsePropertiesEmail(connectors.ConnectorResponsePropertiesEmail{}) }), + generator(".gemini", connectors.ConfigPropertiesGemini{}, func(props *connectors.ConnectorResponseProperties) error { + return props.FromConnectorResponsePropertiesGemini(connectors.ConnectorResponsePropertiesGemini{}) + }), generator(".index", connectors.ConfigPropertiesIndex{}, func(props *connectors.ConnectorResponseProperties) error { return props.FromConnectorResponsePropertiesIndex(connectors.ConnectorResponsePropertiesIndex{}) }), diff --git a/internal/kibana/connector_test.go b/internal/kibana/connector_test.go index 0c187553b..c98658a16 100644 --- a/internal/kibana/connector_test.go +++ b/internal/kibana/connector_test.go @@ -210,6 +210,94 @@ func TestAccResourceKibanaConnectorEmail(t *testing.T) { }) } +func TestAccResourceKibanaConnectorGemini(t *testing.T) { + minSupportedVersion := version.Must(version.NewSemver("8.15.0")) + + connectorName := sdkacctest.RandStringFromCharSet(22, sdkacctest.CharSetAlphaNum) + + create := func(name string) string { + return fmt.Sprintf(` + provider "elasticstack" { + elasticsearch {} + kibana {} + } + + resource "elasticstack_kibana_action_connector" "test" { + name = "%s" + config = jsonencode({ + apiUrl = "https://elastic.co", + gcpRegion = "us-central1", + gcpProjectID = "project1", + defaultModel = "gemini-1.5-pro-001" + }) + secrets = jsonencode({ + credentialsJson = "secret1" + }) + connector_type_id = ".gemini" + }`, + name) + } + + update := func(name string) string { + return fmt.Sprintf(` + provider "elasticstack" { + elasticsearch {} + kibana {} + } + + resource "elasticstack_kibana_action_connector" "test" { + name = "Updated %s" + config = jsonencode({ + apiUrl = "https://elasticsearch.com", + gcpRegion = "us-east4", + gcpProjectID = "project2", + defaultModel = "gemini-1.5-pro-001" + }) + secrets = jsonencode({ + credentialsJson = "secret2" + }) + connector_type_id = ".gemini" + }`, + name) + } + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(t) }, + CheckDestroy: checkResourceKibanaConnectorDestroy, + ProtoV6ProviderFactories: acctest.Providers, + Steps: []resource.TestStep{ + { + SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedVersion), + Config: create(connectorName), + Check: resource.ComposeTestCheckFunc( + testCommonAttributes(connectorName, ".gemini"), + + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiUrl\":\"https://elastic\.co\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"gcpRegion\":\"us-central1\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"gcpProjectID\":\"project1\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"defaultModel\":\"gemini-1.5-pro-001\"`)), + + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "secrets", regexp.MustCompile(`\"credentialsJson\":\"secret1\"`)), + ), + }, + { + SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedVersion), + Config: update(connectorName), + Check: resource.ComposeTestCheckFunc( + testCommonAttributes(fmt.Sprintf("Updated %s", connectorName), ".gemini"), + + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiUrl\":\"https://elasticsearch\.com\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"gcpRegion\":\"us-east4\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"gcpProjectID\":\"project2\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"defaultModel\":\"gemini-1.5-pro-001\"`)), + + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "secrets", regexp.MustCompile(`\"credentialsJson\":\"secret2\"`)), + ), + }, + }, + }) +} + func TestAccResourceKibanaConnectorIndex(t *testing.T) { minSupportedVersion := version.Must(version.NewSemver("7.14.0"))