(out var elasticsearch))
{
+ model.ElasticsearchEnvironmentType = elasticsearch.GetEnvironmentType();
model.ElasticsearchUrl = elasticsearch.Url;
+ model.ElasticsearchCloudId = elasticsearch.CloudId;
model.ElasticsearchAuthenticationType = elasticsearch.GetAuthenticationType();
model.ElasticsearchIndexName = elasticsearch.IndexName;
model.ElasticsearchUsername = elasticsearch.Username;
+ model.ElasticsearchApiKeyId = elasticsearch.ApiKeyId;
model.ElasticsearchCertificateFingerprint = elasticsearch.CertificateFingerprint;
}
@@ -120,20 +133,28 @@ public void ApplyTo(AIDataSource ds, IDataProtector protector)
if (string.Equals(ds.SourceType, AIDataSourceSourceTypes.Elasticsearch, StringComparison.OrdinalIgnoreCase))
{
- var authenticationType = string.Equals(ElasticsearchAuthenticationType, ElasticsearchSourceMetadata.BasicAuthenticationType, StringComparison.OrdinalIgnoreCase)
- ? ElasticsearchSourceMetadata.BasicAuthenticationType
- : ElasticsearchSourceMetadata.NoneAuthenticationType;
+ var environmentType = NormalizeElasticsearchEnvironmentType(ElasticsearchEnvironmentType);
+ var authenticationType = NormalizeElasticsearchAuthenticationType(ElasticsearchAuthenticationType);
+
ds.Put(new ElasticsearchSourceMetadata
{
- Url = ElasticsearchUrl?.Trim(),
+ EnvironmentType = environmentType,
+ Url = environmentType == ElasticsearchSourceMetadata.SelfManagedEnvironmentType ? ElasticsearchUrl?.Trim() : null,
+ CloudId = environmentType == ElasticsearchSourceMetadata.CloudHostedEnvironmentType ? ElasticsearchCloudId?.Trim() : null,
AuthenticationType = authenticationType,
IndexName = ElasticsearchIndexName?.Trim(),
Username = authenticationType == ElasticsearchSourceMetadata.BasicAuthenticationType ? ElasticsearchUsername?.Trim() : null,
Password = authenticationType == ElasticsearchSourceMetadata.BasicAuthenticationType
- ? string.IsNullOrWhiteSpace(ElasticsearchPassword)
- ? existingElasticsearchMetadata?.Password
- : protector.Protect(ElasticsearchPassword)
+ ? ProtectSecret(ElasticsearchPassword, existingElasticsearchMetadata?.Password, protector)
+ : null,
+ ApiKey = authenticationType == ElasticsearchSourceMetadata.ApiKeyAuthenticationType ||
+ authenticationType == ElasticsearchSourceMetadata.KeyIdAndKeyAuthenticationType
+ ? ProtectSecret(ElasticsearchApiKey, existingElasticsearchMetadata?.ApiKey, protector)
+ : null,
+ Base64ApiKey = authenticationType == ElasticsearchSourceMetadata.Base64ApiKeyAuthenticationType
+ ? ProtectSecret(ElasticsearchBase64ApiKey, existingElasticsearchMetadata?.Base64ApiKey, protector)
: null,
+ ApiKeyId = authenticationType == ElasticsearchSourceMetadata.KeyIdAndKeyAuthenticationType ? ElasticsearchApiKeyId?.Trim() : null,
CertificateFingerprint = ElasticsearchCertificateFingerprint?.Trim(),
});
}
@@ -172,4 +193,46 @@ public void ApplyTo(AIDataSource ds, IDataProtector protector)
});
}
}
+
+ private static string NormalizeElasticsearchEnvironmentType(string environmentType)
+ {
+ if (string.Equals(environmentType, ElasticsearchSourceMetadata.CloudHostedEnvironmentType, StringComparison.OrdinalIgnoreCase))
+ {
+ return ElasticsearchSourceMetadata.CloudHostedEnvironmentType;
+ }
+
+ return ElasticsearchSourceMetadata.SelfManagedEnvironmentType;
+ }
+
+ private static string NormalizeElasticsearchAuthenticationType(string authenticationType)
+ {
+ if (string.Equals(authenticationType, ElasticsearchSourceMetadata.BasicAuthenticationType, StringComparison.OrdinalIgnoreCase))
+ {
+ return ElasticsearchSourceMetadata.BasicAuthenticationType;
+ }
+
+ if (string.Equals(authenticationType, ElasticsearchSourceMetadata.ApiKeyAuthenticationType, StringComparison.OrdinalIgnoreCase))
+ {
+ return ElasticsearchSourceMetadata.ApiKeyAuthenticationType;
+ }
+
+ if (string.Equals(authenticationType, ElasticsearchSourceMetadata.Base64ApiKeyAuthenticationType, StringComparison.OrdinalIgnoreCase))
+ {
+ return ElasticsearchSourceMetadata.Base64ApiKeyAuthenticationType;
+ }
+
+ if (string.Equals(authenticationType, ElasticsearchSourceMetadata.KeyIdAndKeyAuthenticationType, StringComparison.OrdinalIgnoreCase))
+ {
+ return ElasticsearchSourceMetadata.KeyIdAndKeyAuthenticationType;
+ }
+
+ return ElasticsearchSourceMetadata.NoneAuthenticationType;
+ }
+
+ private static string ProtectSecret(string value, string existingValue, IDataProtector protector)
+ {
+ return string.IsNullOrWhiteSpace(value)
+ ? existingValue
+ : protector.Protect(value);
+ }
}
diff --git a/src/Startup/CrestApps.Core.Mvc.Web/Areas/DataSources/Views/AIDataSource/Create.cshtml b/src/Startup/CrestApps.Core.Mvc.Web/Areas/DataSources/Views/AIDataSource/Create.cshtml
index e7f2cc5c..93298e0b 100644
--- a/src/Startup/CrestApps.Core.Mvc.Web/Areas/DataSources/Views/AIDataSource/Create.cshtml
+++ b/src/Startup/CrestApps.Core.Mvc.Web/Areas/DataSources/Views/AIDataSource/Create.cshtml
@@ -48,9 +48,32 @@
+
+
+
+
+
+
+
Required for self-managed clusters or endpoint-based hosted deployments.
+
+
+
+
+
+
+
Required for Elastic Cloud hosted deployments.
+
+
+
+
+
+
@@ -58,16 +81,13 @@
-
-
-
-
-
-
@@ -82,6 +102,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -102,6 +146,12 @@
+
+
+
+
+
+
-
-
-
-
-
-
diff --git a/src/Startup/CrestApps.Core.Mvc.Web/Areas/DataSources/Views/AIDataSource/Edit.cshtml b/src/Startup/CrestApps.Core.Mvc.Web/Areas/DataSources/Views/AIDataSource/Edit.cshtml
index ef8de8e4..94b5cbb2 100644
--- a/src/Startup/CrestApps.Core.Mvc.Web/Areas/DataSources/Views/AIDataSource/Edit.cshtml
+++ b/src/Startup/CrestApps.Core.Mvc.Web/Areas/DataSources/Views/AIDataSource/Edit.cshtml
@@ -49,9 +49,32 @@
+
+
+
+
+
+
+
Required for self-managed clusters or endpoint-based hosted deployments.
+
+
+
+
+
+
+
Required for Elastic Cloud hosted deployments.
+
+
+
+
+
+
@@ -59,16 +82,13 @@
-
-
-
-
-
-
@@ -83,6 +103,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -103,6 +147,12 @@
+
+
+
+
+
+
-
-
-
-
-
-
diff --git a/src/Startup/CrestApps.Core.Mvc.Web/Areas/DataSources/Views/AIDataSource/_SourceSettingsScript.cshtml b/src/Startup/CrestApps.Core.Mvc.Web/Areas/DataSources/Views/AIDataSource/_SourceSettingsScript.cshtml
index 8e675a51..bca8955b 100644
--- a/src/Startup/CrestApps.Core.Mvc.Web/Areas/DataSources/Views/AIDataSource/_SourceSettingsScript.cshtml
+++ b/src/Startup/CrestApps.Core.Mvc.Web/Areas/DataSources/Views/AIDataSource/_SourceSettingsScript.cshtml
@@ -1,6 +1,7 @@