From cbe6dc462e4a74ff0b95522294e2cd750c440a27 Mon Sep 17 00:00:00 2001 From: tehbooom Date: Wed, 2 Oct 2024 10:23:59 -0400 Subject: [PATCH 1/7] test --- internal/clients/kibana/connector.go | 69 ++++++++++++++++++ internal/clients/kibana/connector_test.go | 3 + internal/kibana/connector_test.go | 88 +++++++++++++++++++++++ 3 files changed, 160 insertions(+) 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..c3b53a513 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 = "url1", + 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 = "url2", + 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\":\"url1\"`)), + 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\":\"url2\"`)), + 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")) From 152f53b3f496b9b9aa0a5a7e0f7f2a115afed2d3 Mon Sep 17 00:00:00 2001 From: tehbooom Date: Wed, 2 Oct 2024 10:24:16 -0400 Subject: [PATCH 2/7] test --- generated/connectors/connectors.gen.go | 119 +++++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/generated/connectors/connectors.gen.go b/generated/connectors/connectors.gen.go index c60db1be8..709ab6058 100644 --- a/generated/connectors/connectors.gen.go +++ b/generated/connectors/connectors.gen.go @@ -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. `https://us-central1-aiplatform.googleapis.com` + ApiUrl *string `json:"apiUrl"` + + // GcpRegion The GCP region where the Vertex AI endpoint enabled + GcpRegion *string `json:"gcpRegion"` + + // GcpProjectID The project which has Vertex AI endpoint enabled + GcpProjectID *string `json:"gcpProjectID"` + + // DefaultModel The GAI model for Google Gemini to use. + DefaultModel *string `json:"defaultModel"` +} + // 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 Send requests 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 { + // Service account json credentials to authenticate to GCP Console + 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"` +} + // 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": From 604fc7361b6ef5a38c0d6aa7e948d979c71c6d6a Mon Sep 17 00:00:00 2001 From: tehbooom Date: Wed, 2 Oct 2024 12:15:55 -0400 Subject: [PATCH 3/7] updated connector bundle --- generated/alerting/api_alerting_mocks.go | 4 +- generated/connectors/README.md | 1 + generated/connectors/bundled.yaml | 102 +++++++++++++++++++++++ generated/connectors/connectors.gen.go | 16 ++-- generated/fleet/fleet.gen.go | 2 +- 5 files changed, 114 insertions(+), 11 deletions(-) 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..523766826 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,57 @@ components: example: my-connector secrets: $ref: '#/components/schemas/secrets_properties_email' + config_properties_gemini: + title: Connector request properties for an gemini connector + description: Defines properties for connectors when type is `.gemini`. + type: object + properties: + apiUrl: + type: string + description: The Google Gemini request URL. `https://us-central1-aiplatform.googleapis.com` + gcpRegion: + type: string + description: The GCP region where the Vertex AI endpoint enabled + gcpProjectID: + type: string + description: The project which has Vertex AI endpoint enabled + defaultModel: + type: string + description: The GAI model for Google Gemini to use. + secrets_properties_gemini: + required: + - credentialsJson + description: Defines secrets for connectors when type is `.gemini`. + type: object + properties: + credentialsJson: + description: Service account json credentials to authenticate to GCP Console + type: string + create_connector_request_gemini: + title: Create gemini connector request + description: | + Send requests 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 +1929,35 @@ components: name: type: string description: The display name for the connector. + connector_response_properties_gemini: + title: Connector response properties for an 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 +2420,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 +2442,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 +2490,22 @@ components: example: my-connector secrets: $ref: '#/components/schemas/secrets_properties_email' + update_connector_request_gemini: + title: Update gemini connector request + type: object + required: + - config + - name + - secrets + 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 +2755,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 709ab6058..c8a75ccdf 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 ( @@ -518,16 +518,16 @@ type ConfigPropertiesEmail struct { // ConfigPropertiesGemini Defines properties for connectors when type is `.gemini`. type ConfigPropertiesGemini struct { // ApiUrl The Google Gemini request URL. `https://us-central1-aiplatform.googleapis.com` - ApiUrl *string `json:"apiUrl"` + ApiUrl *string `json:"apiUrl,omitempty"` - // GcpRegion The GCP region where the Vertex AI endpoint enabled - GcpRegion *string `json:"gcpRegion"` + // DefaultModel The GAI model for Google Gemini to use. + DefaultModel *string `json:"defaultModel,omitempty"` // GcpProjectID The project which has Vertex AI endpoint enabled - GcpProjectID *string `json:"gcpProjectID"` + GcpProjectID *string `json:"gcpProjectID,omitempty"` - // DefaultModel The GAI model for Google Gemini to use. - DefaultModel *string `json:"defaultModel"` + // GcpRegion The GCP region where the Vertex AI endpoint enabled + GcpRegion *string `json:"gcpRegion,omitempty"` } // ConfigPropertiesIndex Defines properties for connectors when type is `.index`. @@ -2055,7 +2055,7 @@ type SecretsPropertiesEmail map[string]interface{} // SecretsPropertiesGemini Defines secrets for connectors when type is `.gemini`. type SecretsPropertiesGemini struct { - // Service account json credentials to authenticate to GCP Console + // CredentialsJson Service account json credentials to authenticate to GCP Console CredentialsJson string `json:"credentialsJson"` } 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 ( From 4dc7523e52df32080a190e8c603a2335cffcd929 Mon Sep 17 00:00:00 2001 From: tehbooom Date: Wed, 2 Oct 2024 12:59:44 -0400 Subject: [PATCH 4/7] Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b68d17fc0..8a774f2d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ ## [Unreleased] +- Add support for the `.gemini` connector type for Kibana action connectors ([#819](https://github.com/elastic/terraform-provider-elasticstack/pull/819)) + ## [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)) From 19a102a0f5586b3e1667f852bb5d53f9018da1c0 Mon Sep 17 00:00:00 2001 From: tehbooom Date: Wed, 2 Oct 2024 13:21:51 -0400 Subject: [PATCH 5/7] Update url for test --- internal/kibana/connector_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/kibana/connector_test.go b/internal/kibana/connector_test.go index c3b53a513..c98658a16 100644 --- a/internal/kibana/connector_test.go +++ b/internal/kibana/connector_test.go @@ -225,7 +225,7 @@ func TestAccResourceKibanaConnectorGemini(t *testing.T) { resource "elasticstack_kibana_action_connector" "test" { name = "%s" config = jsonencode({ - apiUrl = "url1", + apiUrl = "https://elastic.co", gcpRegion = "us-central1", gcpProjectID = "project1", defaultModel = "gemini-1.5-pro-001" @@ -248,7 +248,7 @@ func TestAccResourceKibanaConnectorGemini(t *testing.T) { resource "elasticstack_kibana_action_connector" "test" { name = "Updated %s" config = jsonencode({ - apiUrl = "url2", + apiUrl = "https://elasticsearch.com", gcpRegion = "us-east4", gcpProjectID = "project2", defaultModel = "gemini-1.5-pro-001" @@ -272,7 +272,7 @@ func TestAccResourceKibanaConnectorGemini(t *testing.T) { Check: resource.ComposeTestCheckFunc( testCommonAttributes(connectorName, ".gemini"), - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiUrl\":\"url1\"`)), + 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\"`)), @@ -286,7 +286,7 @@ func TestAccResourceKibanaConnectorGemini(t *testing.T) { Check: resource.ComposeTestCheckFunc( testCommonAttributes(fmt.Sprintf("Updated %s", connectorName), ".gemini"), - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiUrl\":\"url2\"`)), + 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\"`)), From c1e6383fcd015998ea1e7897cc8441b7690384c7 Mon Sep 17 00:00:00 2001 From: tehbooom Date: Thu, 3 Oct 2024 06:44:55 -0400 Subject: [PATCH 6/7] fix: Upadte with Kibana openapi spec --- generated/connectors/bundled.yaml | 37 +++++++++++++++----------- generated/connectors/connectors.gen.go | 22 +++++++-------- 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/generated/connectors/bundled.yaml b/generated/connectors/bundled.yaml index 523766826..eb33d015e 100644 --- a/generated/connectors/bundled.yaml +++ b/generated/connectors/bundled.yaml @@ -979,35 +979,41 @@ components: secrets: $ref: '#/components/schemas/secrets_properties_email' config_properties_gemini: - title: Connector request properties for an gemini connector + 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. `https://us-central1-aiplatform.googleapis.com` + 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 + description: The GCP region where the Vertex AI endpoint enabled. gcpProjectID: type: string - description: The project which has Vertex AI endpoint enabled - defaultModel: - type: string - description: The GAI model for Google Gemini to use. + description: The Google ProjectID that has Vertex AI endpoint enabled. secrets_properties_gemini: - required: - - credentialsJson + title: Connector secrets properties for a Google Gemini connector description: Defines secrets for connectors when type is `.gemini`. type: object + required: + - credentialsJSON properties: - credentialsJson: - description: Service account json credentials to authenticate to GCP Console + 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 gemini connector request + title: Create Google Gemini connector request description: | - Send requests to Google Gemini + The Google Gemini connector uses axios to send a POST request to Google Gemini. type: object required: - config @@ -1930,7 +1936,7 @@ components: type: string description: The display name for the connector. connector_response_properties_gemini: - title: Connector response properties for an gemini connector + title: Connector response properties for a Google Gemini connector type: object required: - config @@ -2491,12 +2497,11 @@ components: secrets: $ref: '#/components/schemas/secrets_properties_email' update_connector_request_gemini: - title: Update gemini connector request + title: Update Google Gemini connector request type: object required: - config - name - - secrets properties: config: $ref: '#/components/schemas/config_properties_gemini' diff --git a/generated/connectors/connectors.gen.go b/generated/connectors/connectors.gen.go index c8a75ccdf..484800ad6 100644 --- a/generated/connectors/connectors.gen.go +++ b/generated/connectors/connectors.gen.go @@ -517,17 +517,17 @@ type ConfigPropertiesEmail struct { // ConfigPropertiesGemini Defines properties for connectors when type is `.gemini`. type ConfigPropertiesGemini struct { - // ApiUrl The Google Gemini request URL. `https://us-central1-aiplatform.googleapis.com` - ApiUrl *string `json:"apiUrl,omitempty"` + // ApiUrl The Google Gemini request URL. + ApiUrl string `json:"apiUrl"` - // DefaultModel The GAI model for Google Gemini to use. + // DefaultModel The generative artificial intelligence model for Google Gemini to use. DefaultModel *string `json:"defaultModel,omitempty"` - // GcpProjectID The project which has Vertex AI endpoint enabled - GcpProjectID *string `json:"gcpProjectID,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,omitempty"` + // GcpRegion The GCP region where the Vertex AI endpoint enabled. + GcpRegion string `json:"gcpRegion"` } // ConfigPropertiesIndex Defines properties for connectors when type is `.index`. @@ -1303,7 +1303,7 @@ type CreateConnectorRequestEmail struct { // CreateConnectorRequestEmailConnectorTypeId The type of connector. type CreateConnectorRequestEmailConnectorTypeId string -// CreateConnectorRequestGemini Send requests to Google Gemini +// 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"` @@ -2055,8 +2055,8 @@ type SecretsPropertiesEmail map[string]interface{} // SecretsPropertiesGemini Defines secrets for connectors when type is `.gemini`. type SecretsPropertiesGemini struct { - // CredentialsJson Service account json credentials to authenticate to GCP Console - CredentialsJson string `json:"credentialsJson"` + // 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`. @@ -2162,7 +2162,7 @@ type UpdateConnectorRequestGemini struct { Name string `json:"name"` // Secrets Defines secrets for connectors when type is `.gemini`. - Secrets SecretsPropertiesGemini `json:"secrets"` + Secrets *SecretsPropertiesGemini `json:"secrets,omitempty"` } // UpdateConnectorRequestIndex defines model for update_connector_request_index. From d5901caf6945ba640c140ad68e9bbb3d5d0af655 Mon Sep 17 00:00:00 2001 From: tehbooom Date: Mon, 7 Oct 2024 08:23:15 -0400 Subject: [PATCH 7/7] fix: OpenAPI spec credentialsJson naming --- generated/connectors/bundled.yaml | 4 ++-- generated/connectors/connectors.gen.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/generated/connectors/bundled.yaml b/generated/connectors/bundled.yaml index eb33d015e..f93c47be6 100644 --- a/generated/connectors/bundled.yaml +++ b/generated/connectors/bundled.yaml @@ -1005,9 +1005,9 @@ components: description: Defines secrets for connectors when type is `.gemini`. type: object required: - - credentialsJSON + - credentialsJson properties: - credentialsJSON: + 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: diff --git a/generated/connectors/connectors.gen.go b/generated/connectors/connectors.gen.go index 484800ad6..b059ea87e 100644 --- a/generated/connectors/connectors.gen.go +++ b/generated/connectors/connectors.gen.go @@ -2055,8 +2055,8 @@ 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"` + // 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`.