From f8a936fefae626aa3aaedaabcb9297e1e84d4c03 Mon Sep 17 00:00:00 2001 From: Jan Kazlouski Date: Fri, 20 Feb 2026 00:26:18 +0200 Subject: [PATCH 1/4] Add updateServiceSettings method to AlibabaCloudSearchCompletionServiceSettings and related classes --- .../AlibabaCloudSearchService.java | 2 +- .../AlibabaCloudSearchServiceSettings.java | 70 ++++-- ...aCloudSearchCompletionServiceSettings.java | 16 +- ...aCloudSearchEmbeddingsServiceSettings.java | 51 +++-- ...ibabaCloudSearchRerankServiceSettings.java | 14 +- ...ibabaCloudSearchSparseServiceSettings.java | 16 +- ...libabaCloudSearchServiceSettingsTests.java | 200 +++++++++++++++--- .../AlibabaCloudSearchServiceTests.java | 9 +- ...dSearchCompletionServiceSettingsTests.java | 126 +++++++++-- ...dSearchEmbeddingsServiceSettingsTests.java | 190 ++++++++++++++--- ...CloudSearchRerankServiceSettingsTests.java | 170 +++++++++++++++ ...CloudSearchSparseServiceSettingsTests.java | 127 +++++++++-- 12 files changed, 837 insertions(+), 154 deletions(-) create mode 100644 x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/rerank/AlibabaCloudSearchRerankServiceSettingsTests.java diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchService.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchService.java index db206af40a3d9..5772176e4c0e6 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchService.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchService.java @@ -239,7 +239,7 @@ public AlibabaCloudSearchModel buildModelFromConfigAndSecrets(ModelConfiguration config.getInferenceEntityId(), config.getTaskType(), config.getService(), - ConfigurationParseContext.PERSISTENT + ConfigurationParseContext.REQUEST ).createFromModelConfigurationsAndSecrets(config, secrets); } diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettings.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettings.java index 6583fe92589ac..fc493fbe3e198 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettings.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettings.java @@ -38,25 +38,21 @@ public class AlibabaCloudSearchServiceSettings extends FilteredXContentObject public static final String HOST = "host"; public static final String WORKSPACE_NAME = "workspace"; public static final String HTTP_SCHEMA_NAME = "http_schema"; + private static final Set VALID_SCHEMAS = Set.of("https", "http"); private static final RateLimitSettings DEFAULT_RATE_LIMIT_SETTINGS = new RateLimitSettings(1_000); public static AlibabaCloudSearchServiceSettings fromMap(Map map, ConfigurationParseContext context) { - ValidationException validationException = new ValidationException(); + var validationException = new ValidationException(); - String modelId = extractRequiredString(map, SERVICE_ID, ModelConfigurations.SERVICE_SETTINGS, validationException); - String host = extractRequiredString(map, HOST, ModelConfigurations.SERVICE_SETTINGS, validationException); + var serviceId = extractRequiredString(map, SERVICE_ID, ModelConfigurations.SERVICE_SETTINGS, validationException); + var host = extractRequiredString(map, HOST, ModelConfigurations.SERVICE_SETTINGS, validationException); var workspaceName = extractRequiredString(map, WORKSPACE_NAME, ModelConfigurations.SERVICE_SETTINGS, validationException); var httpSchema = extractOptionalString(map, HTTP_SCHEMA_NAME, ModelConfigurations.SERVICE_SETTINGS, validationException); - if (httpSchema != null) { - var validSchemas = Set.of("https", "http"); - if (validSchemas.contains(httpSchema) == false) { - validationException.addValidationError("Invalid value for [http_schema]. Must be one of [https, http]"); - } - } + validateHttpSchema(httpSchema, validationException); - RateLimitSettings rateLimitSettings = RateLimitSettings.of( + var rateLimitSettings = RateLimitSettings.of( map, DEFAULT_RATE_LIMIT_SETTINGS, validationException, @@ -64,11 +60,15 @@ public static AlibabaCloudSearchServiceSettings fromMap(Map map, context ); - if (validationException.validationErrors().isEmpty() == false) { - throw validationException; - } + validationException.throwIfValidationErrorsExist(); - return new AlibabaCloudSearchServiceSettings(modelId, host, workspaceName, httpSchema, rateLimitSettings); + return new AlibabaCloudSearchServiceSettings(serviceId, host, workspaceName, httpSchema, rateLimitSettings); + } + + static void validateHttpSchema(String httpSchema, ValidationException validationException) { + if (httpSchema != null && VALID_SCHEMAS.contains(httpSchema) == false) { + validationException.addValidationError("Invalid value for [http_schema]. Must be one of [https, http]"); + } } private final String serviceId; @@ -92,11 +92,11 @@ public AlibabaCloudSearchServiceSettings( } public AlibabaCloudSearchServiceSettings(StreamInput in) throws IOException { - serviceId = in.readString(); - host = in.readString(); - workspaceName = in.readString(); - httpSchema = in.readOptionalString(); - rateLimitSettings = new RateLimitSettings(in); + this.serviceId = in.readString(); + this.host = in.readString(); + this.workspaceName = in.readString(); + this.httpSchema = in.readOptionalString(); + this.rateLimitSettings = new RateLimitSettings(in); } @Override @@ -104,6 +104,38 @@ public String modelId() { return serviceId; } + @Override + public AlibabaCloudSearchServiceSettings updateServiceSettings(Map serviceSettings) { + var validationException = new ValidationException(); + + var extractedHttpSchema = extractOptionalString( + serviceSettings, + HTTP_SCHEMA_NAME, + ModelConfigurations.SERVICE_SETTINGS, + validationException + ); + + validateHttpSchema(extractedHttpSchema, validationException); + + var extractedRateLimitSettings = RateLimitSettings.of( + serviceSettings, + this.rateLimitSettings, + validationException, + AlibabaCloudSearchService.NAME, + ConfigurationParseContext.REQUEST + ); + + validationException.throwIfValidationErrorsExist(); + + return new AlibabaCloudSearchServiceSettings( + this.serviceId, + this.host, + this.workspaceName, + extractedHttpSchema != null ? extractedHttpSchema : this.httpSchema, + extractedRateLimitSettings + ); + } + public String getHost() { return host; } diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/completion/AlibabaCloudSearchCompletionServiceSettings.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/completion/AlibabaCloudSearchCompletionServiceSettings.java index 8c579b0adb04b..fb7655cce9e69 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/completion/AlibabaCloudSearchCompletionServiceSettings.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/completion/AlibabaCloudSearchCompletionServiceSettings.java @@ -8,7 +8,6 @@ package org.elasticsearch.xpack.inference.services.alibabacloudsearch.completion; import org.elasticsearch.TransportVersion; -import org.elasticsearch.common.ValidationException; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.inference.ServiceSettings; @@ -25,13 +24,7 @@ public class AlibabaCloudSearchCompletionServiceSettings implements ServiceSetti public static final String NAME = "alibabacloud_search_completion_service_settings"; public static AlibabaCloudSearchCompletionServiceSettings fromMap(Map map, ConfigurationParseContext context) { - ValidationException validationException = new ValidationException(); - var commonServiceSettings = AlibabaCloudSearchServiceSettings.fromMap(map, context); - if (validationException.validationErrors().isEmpty() == false) { - throw validationException; - } - - return new AlibabaCloudSearchCompletionServiceSettings(commonServiceSettings); + return new AlibabaCloudSearchCompletionServiceSettings(AlibabaCloudSearchServiceSettings.fromMap(map, context)); } private final AlibabaCloudSearchServiceSettings commonSettings; @@ -41,7 +34,7 @@ public AlibabaCloudSearchCompletionServiceSettings(AlibabaCloudSearchServiceSett } public AlibabaCloudSearchCompletionServiceSettings(StreamInput in) throws IOException { - commonSettings = new AlibabaCloudSearchServiceSettings(in); + this.commonSettings = new AlibabaCloudSearchServiceSettings(in); } public AlibabaCloudSearchServiceSettings getCommonSettings() { @@ -53,6 +46,11 @@ public String modelId() { return commonSettings.modelId(); } + @Override + public AlibabaCloudSearchCompletionServiceSettings updateServiceSettings(Map serviceSettings) { + return new AlibabaCloudSearchCompletionServiceSettings(commonSettings.updateServiceSettings(serviceSettings)); + } + @Override public String getWriteableName() { return NAME; diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/embeddings/AlibabaCloudSearchEmbeddingsServiceSettings.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/embeddings/AlibabaCloudSearchEmbeddingsServiceSettings.java index 363e022b3b06b..806c7c3b972b6 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/embeddings/AlibabaCloudSearchEmbeddingsServiceSettings.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/embeddings/AlibabaCloudSearchEmbeddingsServiceSettings.java @@ -28,25 +28,28 @@ import static org.elasticsearch.xpack.inference.services.ServiceFields.DIMENSIONS; import static org.elasticsearch.xpack.inference.services.ServiceFields.MAX_INPUT_TOKENS; import static org.elasticsearch.xpack.inference.services.ServiceFields.SIMILARITY; +import static org.elasticsearch.xpack.inference.services.ServiceUtils.extractOptionalPositiveInteger; import static org.elasticsearch.xpack.inference.services.ServiceUtils.extractSimilarity; -import static org.elasticsearch.xpack.inference.services.ServiceUtils.removeAsType; public class AlibabaCloudSearchEmbeddingsServiceSettings implements ServiceSettings { public static final String NAME = "alibabacloud_search_embeddings_service_settings"; public static AlibabaCloudSearchEmbeddingsServiceSettings fromMap(Map map, ConfigurationParseContext context) { - ValidationException validationException = new ValidationException(); + var validationException = new ValidationException(); var commonServiceSettings = AlibabaCloudSearchServiceSettings.fromMap(map, context); - SimilarityMeasure similarity = extractSimilarity(map, ModelConfigurations.SERVICE_SETTINGS, validationException); - Integer dims = removeAsType(map, DIMENSIONS, Integer.class); - Integer maxInputTokens = removeAsType(map, MAX_INPUT_TOKENS, Integer.class); + var similarity = extractSimilarity(map, ModelConfigurations.SERVICE_SETTINGS, validationException); + var dimensions = extractOptionalPositiveInteger(map, DIMENSIONS, ModelConfigurations.SERVICE_SETTINGS, validationException); + var maxInputTokens = extractOptionalPositiveInteger( + map, + MAX_INPUT_TOKENS, + ModelConfigurations.SERVICE_SETTINGS, + validationException + ); - if (validationException.validationErrors().isEmpty() == false) { - throw validationException; - } + validationException.throwIfValidationErrorsExist(); - return new AlibabaCloudSearchEmbeddingsServiceSettings(commonServiceSettings, similarity, dims, maxInputTokens); + return new AlibabaCloudSearchEmbeddingsServiceSettings(commonServiceSettings, similarity, dimensions, maxInputTokens); } private final AlibabaCloudSearchServiceSettings commonSettings; @@ -67,10 +70,10 @@ public AlibabaCloudSearchEmbeddingsServiceSettings( } public AlibabaCloudSearchEmbeddingsServiceSettings(StreamInput in) throws IOException { - commonSettings = new AlibabaCloudSearchServiceSettings(in); - similarity = in.readOptionalEnum(SimilarityMeasure.class); - dimensions = in.readOptionalVInt(); - maxInputTokens = in.readOptionalVInt(); + this.commonSettings = new AlibabaCloudSearchServiceSettings(in); + this.similarity = in.readOptionalEnum(SimilarityMeasure.class); + this.dimensions = in.readOptionalVInt(); + this.maxInputTokens = in.readOptionalVInt(); } public AlibabaCloudSearchServiceSettings getCommonSettings() { @@ -105,6 +108,28 @@ public String modelId() { return commonSettings.modelId(); } + @Override + public AlibabaCloudSearchEmbeddingsServiceSettings updateServiceSettings(Map serviceSettings) { + var validationException = new ValidationException(); + var commonServiceSettings = commonSettings.updateServiceSettings(serviceSettings); + + var extractedMaxInputTokens = extractOptionalPositiveInteger( + serviceSettings, + MAX_INPUT_TOKENS, + ModelConfigurations.SERVICE_SETTINGS, + validationException + ); + + validationException.throwIfValidationErrorsExist(); + + return new AlibabaCloudSearchEmbeddingsServiceSettings( + commonServiceSettings, + this.similarity, + this.dimensions, + extractedMaxInputTokens != null ? extractedMaxInputTokens : this.maxInputTokens + ); + } + @Override public String getWriteableName() { return NAME; diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/rerank/AlibabaCloudSearchRerankServiceSettings.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/rerank/AlibabaCloudSearchRerankServiceSettings.java index 556bd0ad3500d..474a4f977d7ac 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/rerank/AlibabaCloudSearchRerankServiceSettings.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/rerank/AlibabaCloudSearchRerankServiceSettings.java @@ -8,7 +8,6 @@ package org.elasticsearch.xpack.inference.services.alibabacloudsearch.rerank; import org.elasticsearch.TransportVersion; -import org.elasticsearch.common.ValidationException; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.inference.ServiceSettings; @@ -25,13 +24,7 @@ public class AlibabaCloudSearchRerankServiceSettings implements ServiceSettings public static final String NAME = "alibabacloud_search_rerank_service_settings"; public static AlibabaCloudSearchRerankServiceSettings fromMap(Map map, ConfigurationParseContext context) { - ValidationException validationException = new ValidationException(); - var commonServiceSettings = AlibabaCloudSearchServiceSettings.fromMap(map, context); - if (validationException.validationErrors().isEmpty() == false) { - throw validationException; - } - - return new AlibabaCloudSearchRerankServiceSettings(commonServiceSettings); + return new AlibabaCloudSearchRerankServiceSettings(AlibabaCloudSearchServiceSettings.fromMap(map, context)); } private final AlibabaCloudSearchServiceSettings commonSettings; @@ -53,6 +46,11 @@ public String modelId() { return commonSettings.modelId(); } + @Override + public AlibabaCloudSearchRerankServiceSettings updateServiceSettings(Map serviceSettings) { + return new AlibabaCloudSearchRerankServiceSettings(commonSettings.updateServiceSettings(serviceSettings)); + } + @Override public String getWriteableName() { return NAME; diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/sparse/AlibabaCloudSearchSparseServiceSettings.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/sparse/AlibabaCloudSearchSparseServiceSettings.java index 963dd17cba327..bb134fdabee72 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/sparse/AlibabaCloudSearchSparseServiceSettings.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/sparse/AlibabaCloudSearchSparseServiceSettings.java @@ -8,7 +8,6 @@ package org.elasticsearch.xpack.inference.services.alibabacloudsearch.sparse; import org.elasticsearch.TransportVersion; -import org.elasticsearch.common.ValidationException; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.inference.ServiceSettings; @@ -25,13 +24,7 @@ public class AlibabaCloudSearchSparseServiceSettings implements ServiceSettings public static final String NAME = "alibabacloud_search_sparse_embeddings_service_settings"; public static AlibabaCloudSearchSparseServiceSettings fromMap(Map map, ConfigurationParseContext context) { - ValidationException validationException = new ValidationException(); - var commonServiceSettings = AlibabaCloudSearchServiceSettings.fromMap(map, context); - if (validationException.validationErrors().isEmpty() == false) { - throw validationException; - } - - return new AlibabaCloudSearchSparseServiceSettings(commonServiceSettings); + return new AlibabaCloudSearchSparseServiceSettings(AlibabaCloudSearchServiceSettings.fromMap(map, context)); } private final AlibabaCloudSearchServiceSettings commonSettings; @@ -41,7 +34,7 @@ public AlibabaCloudSearchSparseServiceSettings(AlibabaCloudSearchServiceSettings } public AlibabaCloudSearchSparseServiceSettings(StreamInput in) throws IOException { - commonSettings = new AlibabaCloudSearchServiceSettings(in); + this.commonSettings = new AlibabaCloudSearchServiceSettings(in); } public AlibabaCloudSearchServiceSettings getCommonSettings() { @@ -53,6 +46,11 @@ public String modelId() { return commonSettings.modelId(); } + @Override + public AlibabaCloudSearchSparseServiceSettings updateServiceSettings(Map serviceSettings) { + return new AlibabaCloudSearchSparseServiceSettings(commonSettings.updateServiceSettings(serviceSettings)); + } + @Override public String getWriteableName() { return NAME; diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettingsTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettingsTests.java index d7965a38c845b..bc4ec9b371bfe 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettingsTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettingsTests.java @@ -7,97 +7,214 @@ package org.elasticsearch.xpack.inference.services.alibabacloudsearch; +import org.elasticsearch.TransportVersion; import org.elasticsearch.common.Strings; +import org.elasticsearch.common.ValidationException; import org.elasticsearch.common.io.stream.Writeable; -import org.elasticsearch.test.AbstractWireSerializingTestCase; import org.elasticsearch.xcontent.XContentBuilder; import org.elasticsearch.xcontent.XContentFactory; import org.elasticsearch.xcontent.XContentType; +import org.elasticsearch.xpack.core.ml.AbstractBWCWireSerializationTestCase; import org.elasticsearch.xpack.inference.services.settings.RateLimitSettings; import org.elasticsearch.xpack.inference.services.settings.RateLimitSettingsTests; -import org.hamcrest.MatcherAssert; import java.io.IOException; import java.net.URISyntaxException; import java.util.HashMap; import java.util.Map; +import java.util.Objects; +import static org.hamcrest.Matchers.emptyCollectionOf; import static org.hamcrest.Matchers.is; -public class AlibabaCloudSearchServiceSettingsTests extends AbstractWireSerializingTestCase { +public class AlibabaCloudSearchServiceSettingsTests extends AbstractBWCWireSerializationTestCase { + private static final String TEST_SERVICE_ID = "test-service-id"; + private static final String INITIAL_TEST_SERVICE_ID = "initial-test-service-id"; + private static final String TEST_HOST = "test-host"; + private static final String INITIAL_TEST_HOST = "initial-test-host"; + private static final String TEST_WORKSPACE_NAME = "test-workspace-name"; + private static final String INITIAL_TEST_WORKSPACE_NAME = "initial-test-workspace-name"; + private static final String TEST_HTTP_SCHEMA = "https"; + private static final String INITIAL_TEST_HTTP_SCHEMA = "http"; + private static final int TEST_RATE_LIMIT = 20; + private static final int INITIAL_TEST_RATE_LIMIT = 30; + /** * The created settings can have a url set to null. */ public static AlibabaCloudSearchServiceSettings createRandom() { var model = randomAlphaOfLength(15); - String host = randomAlphaOfLength(15); - String workspaceName = randomAlphaOfLength(10); - String httpSchema = "https"; + var host = randomAlphaOfLength(15); + var workspaceName = randomAlphaOfLength(10); + var httpSchema = randomBoolean() ? "https" : "http"; return new AlibabaCloudSearchServiceSettings(model, host, workspaceName, httpSchema, RateLimitSettingsTests.createRandom()); } - public void testFromMap() throws URISyntaxException { - var model = "model"; - var host = "host"; - var workspaceName = "default"; - var httpSchema = "https"; + public void testUpdateServiceSettings_AllFields_Success() { + var serviceSettings = new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + INITIAL_TEST_HTTP_SCHEMA, + new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) + ).updateServiceSettings( + new HashMap<>( + Map.of( + AlibabaCloudSearchServiceSettings.SERVICE_ID, + TEST_SERVICE_ID, + AlibabaCloudSearchServiceSettings.HOST, + TEST_HOST, + AlibabaCloudSearchServiceSettings.WORKSPACE_NAME, + TEST_WORKSPACE_NAME, + AlibabaCloudSearchServiceSettings.HTTP_SCHEMA_NAME, + TEST_HTTP_SCHEMA, + RateLimitSettings.FIELD_NAME, + new HashMap<>(Map.of(RateLimitSettings.REQUESTS_PER_MINUTE_FIELD, TEST_RATE_LIMIT)) + ) + ) + ); + + assertThat( + serviceSettings, + is( + new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + TEST_HTTP_SCHEMA, + new RateLimitSettings(TEST_RATE_LIMIT) + ) + ) + ); + } + + public void testUpdateServiceSettings_EmptyMap_Success() { + var serviceSettings = new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + INITIAL_TEST_HTTP_SCHEMA, + new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) + ).updateServiceSettings(new HashMap<>()); + + assertThat( + serviceSettings, + is( + new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + INITIAL_TEST_HTTP_SCHEMA, + new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) + ) + ) + ); + } + + public void testFromMap_Success() { var serviceSettings = AlibabaCloudSearchServiceSettings.fromMap( new HashMap<>( Map.of( AlibabaCloudSearchServiceSettings.SERVICE_ID, - model, + TEST_SERVICE_ID, AlibabaCloudSearchServiceSettings.HOST, - host, + TEST_HOST, AlibabaCloudSearchServiceSettings.WORKSPACE_NAME, - workspaceName, + TEST_WORKSPACE_NAME, AlibabaCloudSearchServiceSettings.HTTP_SCHEMA_NAME, - httpSchema + TEST_HTTP_SCHEMA ) ), null ); - MatcherAssert.assertThat(serviceSettings, is(new AlibabaCloudSearchServiceSettings(model, host, workspaceName, httpSchema, null))); + assertThat( + serviceSettings, + is(new AlibabaCloudSearchServiceSettings(TEST_SERVICE_ID, TEST_HOST, TEST_WORKSPACE_NAME, TEST_HTTP_SCHEMA, null)) + ); } public void testFromMap_WithRateLimit() { - var model = "model"; - var host = "host"; - var workspaceName = "default"; - var httpSchema = "https"; var serviceSettings = AlibabaCloudSearchServiceSettings.fromMap( new HashMap<>( Map.of( AlibabaCloudSearchServiceSettings.SERVICE_ID, - model, + TEST_SERVICE_ID, AlibabaCloudSearchServiceSettings.HOST, - host, + TEST_HOST, AlibabaCloudSearchServiceSettings.WORKSPACE_NAME, - workspaceName, + TEST_WORKSPACE_NAME, AlibabaCloudSearchServiceSettings.HTTP_SCHEMA_NAME, - httpSchema, + TEST_HTTP_SCHEMA, RateLimitSettings.FIELD_NAME, - new HashMap<>(Map.of(RateLimitSettings.REQUESTS_PER_MINUTE_FIELD, 3)) + new HashMap<>(Map.of(RateLimitSettings.REQUESTS_PER_MINUTE_FIELD, TEST_RATE_LIMIT)) ) ), null ); - MatcherAssert.assertThat( + assertThat( serviceSettings, - is(new AlibabaCloudSearchServiceSettings(model, host, workspaceName, httpSchema, new RateLimitSettings(3))) + is( + new AlibabaCloudSearchServiceSettings( + TEST_SERVICE_ID, + TEST_HOST, + TEST_WORKSPACE_NAME, + TEST_HTTP_SCHEMA, + new RateLimitSettings(TEST_RATE_LIMIT) + ) + ) ); } public void testXContent() throws IOException { - var entity = new AlibabaCloudSearchServiceSettings("model_id_name", "host_name", "workspace_name", null, null); + var entity = new AlibabaCloudSearchServiceSettings( + TEST_SERVICE_ID, + TEST_HOST, + TEST_WORKSPACE_NAME, + TEST_HTTP_SCHEMA, + new RateLimitSettings(TEST_RATE_LIMIT) + ); XContentBuilder builder = XContentFactory.contentBuilder(XContentType.JSON); entity.toXContent(builder, null); String xContentResult = Strings.toString(builder); - assertThat(xContentResult, is(""" - {"service_id":"model_id_name","host":"host_name","workspace":"workspace_name","rate_limit":{"requests_per_minute":1000}}""")); + assertThat( + xContentResult, + is( + Strings.format( + """ + {"service_id":"%s","host":"%s","workspace":"%s","http_schema":"%s","rate_limit":{"requests_per_minute":%d}}""", + TEST_SERVICE_ID, + TEST_HOST, + TEST_WORKSPACE_NAME, + TEST_HTTP_SCHEMA, + TEST_RATE_LIMIT + ) + ) + ); + } + + public void testValidateHttpSchema_InvalidSchema_AddsValidationError() { + var validationException = new ValidationException(); + AlibabaCloudSearchServiceSettings.validateHttpSchema("invalid-http-schema", validationException); + assertThat( + validationException.getMessage(), + is("Validation Failed: 1: Invalid value for [http_schema]. Must be one of [https, http];") + ); + } + + public void testValidateHttpSchema_HttpsSchema_Success() { + var validationException = new ValidationException(); + AlibabaCloudSearchServiceSettings.validateHttpSchema("https", validationException); + assertThat(validationException.validationErrors(), is(emptyCollectionOf(String.class))); + } + + public void testValidateHttpSchema_HttpSchema_Success() { + var validationException = new ValidationException(); + AlibabaCloudSearchServiceSettings.validateHttpSchema("http", validationException); + assertThat(validationException.validationErrors(), is(emptyCollectionOf(String.class))); } @Override @@ -112,7 +229,20 @@ protected AlibabaCloudSearchServiceSettings createTestInstance() { @Override protected AlibabaCloudSearchServiceSettings mutateInstance(AlibabaCloudSearchServiceSettings instance) throws IOException { - return null; + var serviceId = instance.modelId(); + var host = instance.getHost(); + var workspaceName = instance.getWorkspaceName(); + var httpSchema = instance.getHttpSchema(); + var rateLimitSettings = instance.rateLimitSettings(); + + switch (between(0, 3)) { + case 0 -> serviceId = randomValueOtherThan(serviceId, () -> randomAlphaOfLength(8)); + case 1 -> host = randomValueOtherThan(host, () -> randomAlphaOfLength(8)); + case 2 -> workspaceName = randomValueOtherThan(workspaceName, () -> randomAlphaOfLength(8)); + case 3 -> httpSchema = Objects.equals(httpSchema, "http") ? "https" : "http"; + default -> throw new AssertionError("Illegal randomisation branch"); + } + return new AlibabaCloudSearchServiceSettings(serviceId, host, workspaceName, httpSchema, rateLimitSettings); } public static Map getServiceSettingsMap(String serviceId, String host, String workspaceName) { @@ -122,4 +252,12 @@ public static Map getServiceSettingsMap(String serviceId, String map.put(AlibabaCloudSearchServiceSettings.WORKSPACE_NAME, workspaceName); return map; } + + @Override + protected AlibabaCloudSearchServiceSettings mutateInstanceForVersion( + AlibabaCloudSearchServiceSettings instance, + TransportVersion version + ) { + return instance; + } } diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceTests.java index ad310505ded21..49089553f258b 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceTests.java @@ -706,6 +706,7 @@ private AlibabaCloudSearchModel createEmbeddingsModel( secretSettingsMap, null ) { + @Override public ExecutableAction accept(AlibabaCloudSearchActionVisitor visitor, Map taskSettings) { return (inferenceInputs, timeout, listener) -> { DenseEmbeddingFloatResults results = new DenseEmbeddingFloatResults( @@ -737,6 +738,7 @@ private AlibabaCloudSearchModel createSparseEmbeddingsModel( secretSettingsMap, null ) { + @Override public ExecutableAction accept(AlibabaCloudSearchActionVisitor visitor, Map taskSettings) { return (inferenceInputs, timeout, listener) -> { listener.onResponse(SparseEmbeddingResultsTests.createRandomResults(2, 1)); @@ -821,16 +823,11 @@ public void testBuildModelFromConfigAndSecrets_UnsupportedTaskType() throws IOEx thrownException.getMessage(), is( Strings.format( - """ - Failed to parse stored model [%s] for [%s] service, error: [The [%s] service does not support task type [%s]]. \ - Please delete and add the service again""", - INFERENCE_ENTITY_ID_VALUE, - AlibabaCloudSearchService.NAME, + "The [%s] service does not support task type [%s]", AlibabaCloudSearchService.NAME, TaskType.CHAT_COMPLETION ) ) - ); } } diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/completion/AlibabaCloudSearchCompletionServiceSettingsTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/completion/AlibabaCloudSearchCompletionServiceSettingsTests.java index 167a3f2688292..8ffdded569ca6 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/completion/AlibabaCloudSearchCompletionServiceSettingsTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/completion/AlibabaCloudSearchCompletionServiceSettingsTests.java @@ -7,11 +7,12 @@ package org.elasticsearch.xpack.inference.services.alibabacloudsearch.completion; +import org.elasticsearch.TransportVersion; import org.elasticsearch.common.io.stream.Writeable; -import org.elasticsearch.test.AbstractWireSerializingTestCase; +import org.elasticsearch.xpack.core.ml.AbstractBWCWireSerializationTestCase; import org.elasticsearch.xpack.inference.services.alibabacloudsearch.AlibabaCloudSearchServiceSettings; import org.elasticsearch.xpack.inference.services.alibabacloudsearch.AlibabaCloudSearchServiceSettingsTests; -import org.hamcrest.MatcherAssert; +import org.elasticsearch.xpack.inference.services.settings.RateLimitSettings; import java.io.IOException; import java.util.HashMap; @@ -19,39 +20,124 @@ import static org.hamcrest.Matchers.is; -public class AlibabaCloudSearchCompletionServiceSettingsTests extends AbstractWireSerializingTestCase< +public class AlibabaCloudSearchCompletionServiceSettingsTests extends AbstractBWCWireSerializationTestCase< AlibabaCloudSearchCompletionServiceSettings> { + + private static final String TEST_SERVICE_ID = "test-service-id"; + private static final String INITIAL_TEST_SERVICE_ID = "initial-test-service-id"; + private static final String TEST_HOST = "test-host"; + private static final String INITIAL_TEST_HOST = "initial-test-host"; + private static final String TEST_WORKSPACE_NAME = "test-workspace-name"; + private static final String INITIAL_TEST_WORKSPACE_NAME = "initial-test-workspace-name"; + private static final String TEST_HTTP_SCHEMA = "https"; + private static final String INITIAL_TEST_HTTP_SCHEMA = "http"; + private static final int TEST_RATE_LIMIT = 20; + private static final int INITIAL_TEST_RATE_LIMIT = 30; + public static AlibabaCloudSearchCompletionServiceSettings createRandom() { var commonSettings = AlibabaCloudSearchServiceSettingsTests.createRandom(); return new AlibabaCloudSearchCompletionServiceSettings(commonSettings); } - public void testFromMap() { - var model = "model"; - var host = "host"; - var workspaceName = "default"; - var httpSchema = "https"; + public void testUpdateServiceSettings_AllFields_Success() { + var serviceSettings = new AlibabaCloudSearchCompletionServiceSettings( + new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + INITIAL_TEST_HTTP_SCHEMA, + new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) + ) + ).updateServiceSettings( + new HashMap<>( + Map.of( + AlibabaCloudSearchServiceSettings.HOST, + TEST_HOST, + AlibabaCloudSearchServiceSettings.SERVICE_ID, + TEST_SERVICE_ID, + AlibabaCloudSearchServiceSettings.WORKSPACE_NAME, + TEST_WORKSPACE_NAME, + AlibabaCloudSearchServiceSettings.HTTP_SCHEMA_NAME, + TEST_HTTP_SCHEMA, + RateLimitSettings.FIELD_NAME, + new HashMap<>(Map.of(RateLimitSettings.REQUESTS_PER_MINUTE_FIELD, TEST_RATE_LIMIT)) + ) + ) + ); + + assertThat( + serviceSettings, + is( + new AlibabaCloudSearchCompletionServiceSettings( + new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + TEST_HTTP_SCHEMA, + new RateLimitSettings(TEST_RATE_LIMIT) + ) + ) + ) + ); + } + + public void testUpdateServiceSettings_EmptyMap_Success() { + var serviceSettings = new AlibabaCloudSearchCompletionServiceSettings( + new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + INITIAL_TEST_HTTP_SCHEMA, + new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) + ) + ).updateServiceSettings(new HashMap<>()); + + assertThat( + serviceSettings, + is( + new AlibabaCloudSearchCompletionServiceSettings( + new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + INITIAL_TEST_HTTP_SCHEMA, + new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) + ) + ) + ) + ); + } + + public void testFromMap_Success() { var serviceSettings = AlibabaCloudSearchCompletionServiceSettings.fromMap( new HashMap<>( Map.of( AlibabaCloudSearchServiceSettings.HOST, - host, + TEST_HOST, AlibabaCloudSearchServiceSettings.SERVICE_ID, - model, + TEST_SERVICE_ID, AlibabaCloudSearchServiceSettings.WORKSPACE_NAME, - workspaceName, + TEST_WORKSPACE_NAME, AlibabaCloudSearchServiceSettings.HTTP_SCHEMA_NAME, - httpSchema + TEST_HTTP_SCHEMA, + RateLimitSettings.FIELD_NAME, + new HashMap<>(Map.of(RateLimitSettings.REQUESTS_PER_MINUTE_FIELD, TEST_RATE_LIMIT)) ) ), null ); - MatcherAssert.assertThat( + assertThat( serviceSettings, is( new AlibabaCloudSearchCompletionServiceSettings( - new AlibabaCloudSearchServiceSettings(model, host, workspaceName, httpSchema, null) + new AlibabaCloudSearchServiceSettings( + TEST_SERVICE_ID, + TEST_HOST, + TEST_WORKSPACE_NAME, + TEST_HTTP_SCHEMA, + new RateLimitSettings(TEST_RATE_LIMIT) + ) ) ) ); @@ -70,7 +156,9 @@ protected AlibabaCloudSearchCompletionServiceSettings createTestInstance() { @Override protected AlibabaCloudSearchCompletionServiceSettings mutateInstance(AlibabaCloudSearchCompletionServiceSettings instance) throws IOException { - return createRandom(); + return new AlibabaCloudSearchCompletionServiceSettings( + randomValueOtherThan(instance.getCommonSettings(), AlibabaCloudSearchServiceSettingsTests::createRandom) + ); } public static Map getServiceSettingsMap(String serviceId, String host, String workspaceName) { @@ -80,4 +168,12 @@ public static Map getServiceSettingsMap(String serviceId, String map.put(AlibabaCloudSearchServiceSettings.WORKSPACE_NAME, workspaceName); return map; } + + @Override + protected AlibabaCloudSearchCompletionServiceSettings mutateInstanceForVersion( + AlibabaCloudSearchCompletionServiceSettings instance, + TransportVersion version + ) { + return instance; + } } diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/embeddings/AlibabaCloudSearchEmbeddingsServiceSettingsTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/embeddings/AlibabaCloudSearchEmbeddingsServiceSettingsTests.java index 815e6d0311195..8c0fe65618cfc 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/embeddings/AlibabaCloudSearchEmbeddingsServiceSettingsTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/embeddings/AlibabaCloudSearchEmbeddingsServiceSettingsTests.java @@ -7,13 +7,14 @@ package org.elasticsearch.xpack.inference.services.alibabacloudsearch.embeddings; +import org.elasticsearch.TransportVersion; import org.elasticsearch.common.io.stream.Writeable; import org.elasticsearch.inference.SimilarityMeasure; -import org.elasticsearch.test.AbstractWireSerializingTestCase; +import org.elasticsearch.xpack.core.ml.AbstractBWCWireSerializationTestCase; import org.elasticsearch.xpack.inference.services.ServiceFields; import org.elasticsearch.xpack.inference.services.alibabacloudsearch.AlibabaCloudSearchServiceSettings; import org.elasticsearch.xpack.inference.services.alibabacloudsearch.AlibabaCloudSearchServiceSettingsTests; -import org.hamcrest.MatcherAssert; +import org.elasticsearch.xpack.inference.services.settings.RateLimitSettings; import java.io.IOException; import java.util.HashMap; @@ -21,54 +22,163 @@ import static org.hamcrest.Matchers.is; -public class AlibabaCloudSearchEmbeddingsServiceSettingsTests extends AbstractWireSerializingTestCase< +public class AlibabaCloudSearchEmbeddingsServiceSettingsTests extends AbstractBWCWireSerializationTestCase< AlibabaCloudSearchEmbeddingsServiceSettings> { + + private static final SimilarityMeasure TEST_SIMILARITY_MEASURE = SimilarityMeasure.DOT_PRODUCT; + private static final SimilarityMeasure INITIAL_TEST_SIMILARITY_MEASURE = SimilarityMeasure.COSINE; + private static final int TEST_DIMENSIONS = 1536; + private static final int INITIAL_TEST_DIMENSIONS = 1024; + private static final int TEST_MAX_INPUT_TOKENS = 512; + private static final int INITIAL_TEST_MAX_INPUT_TOKENS = 256; + + private static final String TEST_SERVICE_ID = "test-service-id"; + private static final String INITIAL_TEST_SERVICE_ID = "initial-test-service-id"; + private static final String TEST_HOST = "test-host"; + private static final String INITIAL_TEST_HOST = "initial-test-host"; + private static final String TEST_WORKSPACE_NAME = "test-workspace-name"; + private static final String INITIAL_TEST_WORKSPACE_NAME = "initial-test-workspace-name"; + private static final String TEST_HTTP_SCHEMA = "https"; + private static final String INITIAL_TEST_HTTP_SCHEMA = "http"; + private static final int TEST_RATE_LIMIT = 20; + private static final int INITIAL_TEST_RATE_LIMIT = 30; + public static AlibabaCloudSearchEmbeddingsServiceSettings createRandom() { var commonSettings = AlibabaCloudSearchServiceSettingsTests.createRandom(); - var similarity = SimilarityMeasure.DOT_PRODUCT; - var dims = 1536; - var maxInputTokens = 512; - return new AlibabaCloudSearchEmbeddingsServiceSettings(commonSettings, similarity, dims, maxInputTokens); + return new AlibabaCloudSearchEmbeddingsServiceSettings( + commonSettings, + randomFrom(SimilarityMeasure.values()), + randomInt(TEST_DIMENSIONS), + randomInt(TEST_MAX_INPUT_TOKENS) + ); } - public void testFromMap() { - var similarity = SimilarityMeasure.DOT_PRODUCT.toString(); - var dims = 1536; - var maxInputTokens = 512; - var model = "model"; - var host = "host"; - var workspaceName = "default"; - var httpSchema = "https"; + public void testUpdateServiceSettings_AllFields_Success() { + var serviceSettings = new AlibabaCloudSearchEmbeddingsServiceSettings( + new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + INITIAL_TEST_HTTP_SCHEMA, + new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) + ), + INITIAL_TEST_SIMILARITY_MEASURE, + INITIAL_TEST_DIMENSIONS, + INITIAL_TEST_MAX_INPUT_TOKENS + ).updateServiceSettings( + new HashMap<>( + Map.of( + ServiceFields.SIMILARITY, + TEST_SIMILARITY_MEASURE.toString(), + ServiceFields.DIMENSIONS, + TEST_DIMENSIONS, + ServiceFields.MAX_INPUT_TOKENS, + TEST_MAX_INPUT_TOKENS, + AlibabaCloudSearchServiceSettings.HOST, + TEST_HOST, + AlibabaCloudSearchServiceSettings.SERVICE_ID, + TEST_SERVICE_ID, + AlibabaCloudSearchServiceSettings.WORKSPACE_NAME, + TEST_WORKSPACE_NAME, + AlibabaCloudSearchServiceSettings.HTTP_SCHEMA_NAME, + TEST_HTTP_SCHEMA, + RateLimitSettings.FIELD_NAME, + new HashMap<>(Map.of(RateLimitSettings.REQUESTS_PER_MINUTE_FIELD, TEST_RATE_LIMIT)) + ) + ) + ); + + assertThat( + serviceSettings, + is( + new AlibabaCloudSearchEmbeddingsServiceSettings( + new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + TEST_HTTP_SCHEMA, + new RateLimitSettings(TEST_RATE_LIMIT) + ), + INITIAL_TEST_SIMILARITY_MEASURE, + INITIAL_TEST_DIMENSIONS, + TEST_MAX_INPUT_TOKENS + ) + ) + ); + } + + public void testUpdateServiceSettings_EmptyMap_Success() { + var serviceSettings = new AlibabaCloudSearchEmbeddingsServiceSettings( + new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + INITIAL_TEST_HTTP_SCHEMA, + new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) + ), + INITIAL_TEST_SIMILARITY_MEASURE, + INITIAL_TEST_DIMENSIONS, + INITIAL_TEST_MAX_INPUT_TOKENS + ).updateServiceSettings(new HashMap<>()); + + assertThat( + serviceSettings, + is( + new AlibabaCloudSearchEmbeddingsServiceSettings( + new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + INITIAL_TEST_HTTP_SCHEMA, + new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) + ), + INITIAL_TEST_SIMILARITY_MEASURE, + INITIAL_TEST_DIMENSIONS, + INITIAL_TEST_MAX_INPUT_TOKENS + ) + ) + ); + } + + public void testFromMap_Success() { var serviceSettings = AlibabaCloudSearchEmbeddingsServiceSettings.fromMap( new HashMap<>( Map.of( ServiceFields.SIMILARITY, - similarity, + TEST_SIMILARITY_MEASURE.toString(), ServiceFields.DIMENSIONS, - dims, + TEST_DIMENSIONS, ServiceFields.MAX_INPUT_TOKENS, - maxInputTokens, + TEST_MAX_INPUT_TOKENS, AlibabaCloudSearchServiceSettings.HOST, - host, + TEST_HOST, AlibabaCloudSearchServiceSettings.SERVICE_ID, - model, + TEST_SERVICE_ID, AlibabaCloudSearchServiceSettings.WORKSPACE_NAME, - workspaceName, + TEST_WORKSPACE_NAME, AlibabaCloudSearchServiceSettings.HTTP_SCHEMA_NAME, - httpSchema + TEST_HTTP_SCHEMA, + RateLimitSettings.FIELD_NAME, + new HashMap<>(Map.of(RateLimitSettings.REQUESTS_PER_MINUTE_FIELD, TEST_RATE_LIMIT)) ) ), null ); - MatcherAssert.assertThat( + assertThat( serviceSettings, is( new AlibabaCloudSearchEmbeddingsServiceSettings( - new AlibabaCloudSearchServiceSettings(model, host, workspaceName, httpSchema, null), - SimilarityMeasure.DOT_PRODUCT, - dims, - maxInputTokens + new AlibabaCloudSearchServiceSettings( + TEST_SERVICE_ID, + TEST_HOST, + TEST_WORKSPACE_NAME, + TEST_HTTP_SCHEMA, + new RateLimitSettings(TEST_RATE_LIMIT) + ), + TEST_SIMILARITY_MEASURE, + TEST_DIMENSIONS, + TEST_MAX_INPUT_TOKENS ) ) ); @@ -87,10 +197,34 @@ protected AlibabaCloudSearchEmbeddingsServiceSettings createTestInstance() { @Override protected AlibabaCloudSearchEmbeddingsServiceSettings mutateInstance(AlibabaCloudSearchEmbeddingsServiceSettings instance) throws IOException { - return null; + var commonSettings = instance.getCommonSettings(); + var similarity = instance.similarity(); + var dimensions = instance.dimensions(); + var maxInputTokens = instance.getMaxInputTokens(); + + switch (between(0, 3)) { + case 0 -> commonSettings = randomValueOtherThan( + instance.getCommonSettings(), + AlibabaCloudSearchServiceSettingsTests::createRandom + ); + case 1 -> similarity = randomValueOtherThan(similarity, () -> randomFrom(SimilarityMeasure.values())); + case 2 -> dimensions = randomValueOtherThan(dimensions, () -> randomIntBetween(32, 256)); + case 3 -> maxInputTokens = randomValueOtherThan(maxInputTokens, () -> randomIntBetween(16, 1024)); + default -> throw new AssertionError("Illegal randomisation branch"); + } + return new AlibabaCloudSearchEmbeddingsServiceSettings(commonSettings, similarity, dimensions, maxInputTokens); + } public static Map getServiceSettingsMap(String serviceId, String host, String workspaceName) { return AlibabaCloudSearchServiceSettingsTests.getServiceSettingsMap(serviceId, host, workspaceName); } + + @Override + protected AlibabaCloudSearchEmbeddingsServiceSettings mutateInstanceForVersion( + AlibabaCloudSearchEmbeddingsServiceSettings instance, + TransportVersion version + ) { + return instance; + } } diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/rerank/AlibabaCloudSearchRerankServiceSettingsTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/rerank/AlibabaCloudSearchRerankServiceSettingsTests.java new file mode 100644 index 0000000000000..ebd847b5f9657 --- /dev/null +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/rerank/AlibabaCloudSearchRerankServiceSettingsTests.java @@ -0,0 +1,170 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.inference.services.alibabacloudsearch.rerank; + +import org.elasticsearch.TransportVersion; +import org.elasticsearch.common.io.stream.Writeable; +import org.elasticsearch.xpack.core.ml.AbstractBWCWireSerializationTestCase; +import org.elasticsearch.xpack.inference.services.alibabacloudsearch.AlibabaCloudSearchServiceSettings; +import org.elasticsearch.xpack.inference.services.alibabacloudsearch.AlibabaCloudSearchServiceSettingsTests; +import org.elasticsearch.xpack.inference.services.settings.RateLimitSettings; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import static org.hamcrest.Matchers.is; + +public class AlibabaCloudSearchRerankServiceSettingsTests extends AbstractBWCWireSerializationTestCase< + AlibabaCloudSearchRerankServiceSettings> { + + private static final String TEST_SERVICE_ID = "test-service-id"; + private static final String INITIAL_TEST_SERVICE_ID = "initial-test-service-id"; + private static final String TEST_HOST = "test-host"; + private static final String INITIAL_TEST_HOST = "initial-test-host"; + private static final String TEST_WORKSPACE_NAME = "test-workspace-name"; + private static final String INITIAL_TEST_WORKSPACE_NAME = "initial-test-workspace-name"; + private static final String TEST_HTTP_SCHEMA = "https"; + private static final String INITIAL_TEST_HTTP_SCHEMA = "http"; + private static final int TEST_RATE_LIMIT = 20; + private static final int INITIAL_TEST_RATE_LIMIT = 30; + + public static AlibabaCloudSearchRerankServiceSettings createRandom() { + var commonSettings = AlibabaCloudSearchServiceSettingsTests.createRandom(); + return new AlibabaCloudSearchRerankServiceSettings(commonSettings); + } + + public void testUpdateServiceSettings_AllFields_Success() { + var serviceSettings = new AlibabaCloudSearchRerankServiceSettings( + new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + INITIAL_TEST_HTTP_SCHEMA, + new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) + ) + ).updateServiceSettings( + new HashMap<>( + Map.of( + AlibabaCloudSearchServiceSettings.HOST, + TEST_HOST, + AlibabaCloudSearchServiceSettings.SERVICE_ID, + TEST_SERVICE_ID, + AlibabaCloudSearchServiceSettings.WORKSPACE_NAME, + TEST_WORKSPACE_NAME, + AlibabaCloudSearchServiceSettings.HTTP_SCHEMA_NAME, + TEST_HTTP_SCHEMA, + RateLimitSettings.FIELD_NAME, + new HashMap<>(Map.of(RateLimitSettings.REQUESTS_PER_MINUTE_FIELD, TEST_RATE_LIMIT)) + ) + ) + ); + + assertThat( + serviceSettings, + is( + new AlibabaCloudSearchRerankServiceSettings( + new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + TEST_HTTP_SCHEMA, + new RateLimitSettings(TEST_RATE_LIMIT) + ) + ) + ) + ); + } + + public void testUpdateServiceSettings_EmptyMap_Success() { + var serviceSettings = new AlibabaCloudSearchRerankServiceSettings( + new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + INITIAL_TEST_HTTP_SCHEMA, + new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) + ) + ).updateServiceSettings(new HashMap<>()); + + assertThat( + serviceSettings, + is( + new AlibabaCloudSearchRerankServiceSettings( + new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + INITIAL_TEST_HTTP_SCHEMA, + new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) + ) + ) + ) + ); + } + + public void testFromMap_Success() { + var serviceSettings = AlibabaCloudSearchRerankServiceSettings.fromMap( + new HashMap<>( + Map.of( + AlibabaCloudSearchServiceSettings.HOST, + TEST_HOST, + AlibabaCloudSearchServiceSettings.SERVICE_ID, + TEST_SERVICE_ID, + AlibabaCloudSearchServiceSettings.WORKSPACE_NAME, + TEST_WORKSPACE_NAME, + AlibabaCloudSearchServiceSettings.HTTP_SCHEMA_NAME, + TEST_HTTP_SCHEMA, + RateLimitSettings.FIELD_NAME, + new HashMap<>(Map.of(RateLimitSettings.REQUESTS_PER_MINUTE_FIELD, TEST_RATE_LIMIT)) + ) + ), + null + ); + + assertThat( + serviceSettings, + is( + new AlibabaCloudSearchRerankServiceSettings( + new AlibabaCloudSearchServiceSettings( + TEST_SERVICE_ID, + TEST_HOST, + TEST_WORKSPACE_NAME, + TEST_HTTP_SCHEMA, + new RateLimitSettings(TEST_RATE_LIMIT) + ) + ) + ) + ); + } + + @Override + protected AlibabaCloudSearchRerankServiceSettings mutateInstanceForVersion( + AlibabaCloudSearchRerankServiceSettings instance, + TransportVersion version + ) { + return instance; + } + + @Override + protected Writeable.Reader instanceReader() { + return AlibabaCloudSearchRerankServiceSettings::new; + } + + @Override + protected AlibabaCloudSearchRerankServiceSettings createTestInstance() { + return createRandom(); + } + + @Override + protected AlibabaCloudSearchRerankServiceSettings mutateInstance(AlibabaCloudSearchRerankServiceSettings instance) throws IOException { + return new AlibabaCloudSearchRerankServiceSettings( + randomValueOtherThan(instance.getCommonSettings(), AlibabaCloudSearchServiceSettingsTests::createRandom) + ); + } +} diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/sparse/AlibabaCloudSearchSparseServiceSettingsTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/sparse/AlibabaCloudSearchSparseServiceSettingsTests.java index 8dc635a52f06f..ebd0e3a2a5d1a 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/sparse/AlibabaCloudSearchSparseServiceSettingsTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/sparse/AlibabaCloudSearchSparseServiceSettingsTests.java @@ -7,11 +7,12 @@ package org.elasticsearch.xpack.inference.services.alibabacloudsearch.sparse; +import org.elasticsearch.TransportVersion; import org.elasticsearch.common.io.stream.Writeable; -import org.elasticsearch.test.AbstractWireSerializingTestCase; +import org.elasticsearch.xpack.core.ml.AbstractBWCWireSerializationTestCase; import org.elasticsearch.xpack.inference.services.alibabacloudsearch.AlibabaCloudSearchServiceSettings; import org.elasticsearch.xpack.inference.services.alibabacloudsearch.AlibabaCloudSearchServiceSettingsTests; -import org.hamcrest.MatcherAssert; +import org.elasticsearch.xpack.inference.services.settings.RateLimitSettings; import java.io.IOException; import java.util.HashMap; @@ -19,38 +20,124 @@ import static org.hamcrest.Matchers.is; -public class AlibabaCloudSearchSparseServiceSettingsTests extends AbstractWireSerializingTestCase { +public class AlibabaCloudSearchSparseServiceSettingsTests extends AbstractBWCWireSerializationTestCase< + AlibabaCloudSearchSparseServiceSettings> { + + private static final String TEST_SERVICE_ID = "test-service-id"; + private static final String INITIAL_TEST_SERVICE_ID = "initial-test-service-id"; + private static final String TEST_HOST = "test-host"; + private static final String INITIAL_TEST_HOST = "initial-test-host"; + private static final String TEST_WORKSPACE_NAME = "test-workspace-name"; + private static final String INITIAL_TEST_WORKSPACE_NAME = "initial-test-workspace-name"; + private static final String TEST_HTTP_SCHEMA = "https"; + private static final String INITIAL_TEST_HTTP_SCHEMA = "http"; + private static final int TEST_RATE_LIMIT = 20; + private static final int INITIAL_TEST_RATE_LIMIT = 30; + public static AlibabaCloudSearchSparseServiceSettings createRandom() { var commonSettings = AlibabaCloudSearchServiceSettingsTests.createRandom(); return new AlibabaCloudSearchSparseServiceSettings(commonSettings); } - public void testFromMap() { - var model = "model"; - var host = "host"; - var workspaceName = "default"; - var httpSchema = "https"; + public void testUpdateServiceSettings_AllFields_Success() { + var serviceSettings = new AlibabaCloudSearchSparseServiceSettings( + new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + INITIAL_TEST_HTTP_SCHEMA, + new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) + ) + ).updateServiceSettings( + new HashMap<>( + Map.of( + AlibabaCloudSearchServiceSettings.HOST, + TEST_HOST, + AlibabaCloudSearchServiceSettings.SERVICE_ID, + TEST_SERVICE_ID, + AlibabaCloudSearchServiceSettings.WORKSPACE_NAME, + TEST_WORKSPACE_NAME, + AlibabaCloudSearchServiceSettings.HTTP_SCHEMA_NAME, + TEST_HTTP_SCHEMA, + RateLimitSettings.FIELD_NAME, + new HashMap<>(Map.of(RateLimitSettings.REQUESTS_PER_MINUTE_FIELD, TEST_RATE_LIMIT)) + ) + ) + ); + + assertThat( + serviceSettings, + is( + new AlibabaCloudSearchSparseServiceSettings( + new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + TEST_HTTP_SCHEMA, + new RateLimitSettings(TEST_RATE_LIMIT) + ) + ) + ) + ); + } + + public void testUpdateServiceSettings_EmptyMap_Success() { + var serviceSettings = new AlibabaCloudSearchSparseServiceSettings( + new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + INITIAL_TEST_HTTP_SCHEMA, + new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) + ) + ).updateServiceSettings(new HashMap<>()); + + assertThat( + serviceSettings, + is( + new AlibabaCloudSearchSparseServiceSettings( + new AlibabaCloudSearchServiceSettings( + INITIAL_TEST_SERVICE_ID, + INITIAL_TEST_HOST, + INITIAL_TEST_WORKSPACE_NAME, + INITIAL_TEST_HTTP_SCHEMA, + new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) + ) + ) + ) + ); + } + + public void testFromMap_Success() { var serviceSettings = AlibabaCloudSearchSparseServiceSettings.fromMap( new HashMap<>( Map.of( AlibabaCloudSearchServiceSettings.HOST, - host, + TEST_HOST, AlibabaCloudSearchServiceSettings.SERVICE_ID, - model, + TEST_SERVICE_ID, AlibabaCloudSearchServiceSettings.WORKSPACE_NAME, - workspaceName, + TEST_WORKSPACE_NAME, AlibabaCloudSearchServiceSettings.HTTP_SCHEMA_NAME, - httpSchema + TEST_HTTP_SCHEMA, + RateLimitSettings.FIELD_NAME, + new HashMap<>(Map.of(RateLimitSettings.REQUESTS_PER_MINUTE_FIELD, TEST_RATE_LIMIT)) ) ), null ); - MatcherAssert.assertThat( + assertThat( serviceSettings, is( new AlibabaCloudSearchSparseServiceSettings( - new AlibabaCloudSearchServiceSettings(model, host, workspaceName, httpSchema, null) + new AlibabaCloudSearchServiceSettings( + TEST_SERVICE_ID, + TEST_HOST, + TEST_WORKSPACE_NAME, + TEST_HTTP_SCHEMA, + new RateLimitSettings(TEST_RATE_LIMIT) + ) ) ) ); @@ -68,10 +155,20 @@ protected AlibabaCloudSearchSparseServiceSettings createTestInstance() { @Override protected AlibabaCloudSearchSparseServiceSettings mutateInstance(AlibabaCloudSearchSparseServiceSettings instance) throws IOException { - return null; + return new AlibabaCloudSearchSparseServiceSettings( + randomValueOtherThan(instance.getCommonSettings(), AlibabaCloudSearchServiceSettingsTests::createRandom) + ); } public static Map getServiceSettingsMap(String serviceId, String host, String workspaceName) { return AlibabaCloudSearchServiceSettingsTests.getServiceSettingsMap(serviceId, host, workspaceName); } + + @Override + protected AlibabaCloudSearchSparseServiceSettings mutateInstanceForVersion( + AlibabaCloudSearchSparseServiceSettings instance, + TransportVersion version + ) { + return instance; + } } From 811808c742cabd2c0b29858ef41a78766e854abc Mon Sep 17 00:00:00 2001 From: Jan Kazlouski Date: Fri, 20 Feb 2026 00:35:46 +0200 Subject: [PATCH 2/4] Fix unit tests and add changelog --- docs/changelog/142738.yaml | 6 ++++++ .../AlibabaCloudSearchServiceSettingsTests.java | 1 - 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 docs/changelog/142738.yaml diff --git a/docs/changelog/142738.yaml b/docs/changelog/142738.yaml new file mode 100644 index 0000000000000..225fe96644765 --- /dev/null +++ b/docs/changelog/142738.yaml @@ -0,0 +1,6 @@ +pr: 142738 +summary: Added service settings update logic for Alibaba Cloud Search provider in the Inference Plugin +area: Inference +type: enhancement +issues: + - 122356 diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettingsTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettingsTests.java index bc4ec9b371bfe..26d01028dced2 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettingsTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettingsTests.java @@ -19,7 +19,6 @@ import org.elasticsearch.xpack.inference.services.settings.RateLimitSettingsTests; import java.io.IOException; -import java.net.URISyntaxException; import java.util.HashMap; import java.util.Map; import java.util.Objects; From 1bf97b544efaae92c7e4b023c0d066db2ef791be Mon Sep 17 00:00:00 2001 From: Jan Kazlouski Date: Fri, 20 Feb 2026 13:07:20 +0200 Subject: [PATCH 3/4] Fix validation exception handling --- .../AlibabaCloudSearchServiceSettings.java | 19 +++++++++---------- ...aCloudSearchCompletionServiceSettings.java | 17 +++++++++++++++-- ...aCloudSearchEmbeddingsServiceSettings.java | 5 +++-- ...ibabaCloudSearchRerankServiceSettings.java | 17 +++++++++++++++-- ...ibabaCloudSearchSparseServiceSettings.java | 17 +++++++++++++++-- ...libabaCloudSearchServiceSettingsTests.java | 11 +++++++---- 6 files changed, 64 insertions(+), 22 deletions(-) diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettings.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettings.java index fc493fbe3e198..a4637dcf74ef7 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettings.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettings.java @@ -42,8 +42,11 @@ public class AlibabaCloudSearchServiceSettings extends FilteredXContentObject private static final RateLimitSettings DEFAULT_RATE_LIMIT_SETTINGS = new RateLimitSettings(1_000); - public static AlibabaCloudSearchServiceSettings fromMap(Map map, ConfigurationParseContext context) { - var validationException = new ValidationException(); + public static AlibabaCloudSearchServiceSettings fromMap( + Map map, + ConfigurationParseContext context, + ValidationException validationException + ) { var serviceId = extractRequiredString(map, SERVICE_ID, ModelConfigurations.SERVICE_SETTINGS, validationException); var host = extractRequiredString(map, HOST, ModelConfigurations.SERVICE_SETTINGS, validationException); @@ -60,8 +63,6 @@ public static AlibabaCloudSearchServiceSettings fromMap(Map map, context ); - validationException.throwIfValidationErrorsExist(); - return new AlibabaCloudSearchServiceSettings(serviceId, host, workspaceName, httpSchema, rateLimitSettings); } @@ -104,10 +105,10 @@ public String modelId() { return serviceId; } - @Override - public AlibabaCloudSearchServiceSettings updateServiceSettings(Map serviceSettings) { - var validationException = new ValidationException(); - + public AlibabaCloudSearchServiceSettings updateServiceSettings( + Map serviceSettings, + ValidationException validationException + ) { var extractedHttpSchema = extractOptionalString( serviceSettings, HTTP_SCHEMA_NAME, @@ -125,8 +126,6 @@ public AlibabaCloudSearchServiceSettings updateServiceSettings(Map map, ConfigurationParseContext context) { - return new AlibabaCloudSearchCompletionServiceSettings(AlibabaCloudSearchServiceSettings.fromMap(map, context)); + var validationException = new ValidationException(); + + var commonServiceSettings = AlibabaCloudSearchServiceSettings.fromMap(map, context, validationException); + + validationException.throwIfValidationErrorsExist(); + + return new AlibabaCloudSearchCompletionServiceSettings(commonServiceSettings); } private final AlibabaCloudSearchServiceSettings commonSettings; @@ -48,7 +55,13 @@ public String modelId() { @Override public AlibabaCloudSearchCompletionServiceSettings updateServiceSettings(Map serviceSettings) { - return new AlibabaCloudSearchCompletionServiceSettings(commonSettings.updateServiceSettings(serviceSettings)); + var validationException = new ValidationException(); + + var updatedCommonServiceSettings = commonSettings.updateServiceSettings(serviceSettings, validationException); + + validationException.throwIfValidationErrorsExist(); + + return new AlibabaCloudSearchCompletionServiceSettings(updatedCommonServiceSettings); } @Override diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/embeddings/AlibabaCloudSearchEmbeddingsServiceSettings.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/embeddings/AlibabaCloudSearchEmbeddingsServiceSettings.java index 806c7c3b972b6..372ba1035d7e1 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/embeddings/AlibabaCloudSearchEmbeddingsServiceSettings.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/embeddings/AlibabaCloudSearchEmbeddingsServiceSettings.java @@ -36,7 +36,8 @@ public class AlibabaCloudSearchEmbeddingsServiceSettings implements ServiceSetti public static AlibabaCloudSearchEmbeddingsServiceSettings fromMap(Map map, ConfigurationParseContext context) { var validationException = new ValidationException(); - var commonServiceSettings = AlibabaCloudSearchServiceSettings.fromMap(map, context); + + var commonServiceSettings = AlibabaCloudSearchServiceSettings.fromMap(map, context, validationException); var similarity = extractSimilarity(map, ModelConfigurations.SERVICE_SETTINGS, validationException); var dimensions = extractOptionalPositiveInteger(map, DIMENSIONS, ModelConfigurations.SERVICE_SETTINGS, validationException); @@ -111,7 +112,7 @@ public String modelId() { @Override public AlibabaCloudSearchEmbeddingsServiceSettings updateServiceSettings(Map serviceSettings) { var validationException = new ValidationException(); - var commonServiceSettings = commonSettings.updateServiceSettings(serviceSettings); + var commonServiceSettings = commonSettings.updateServiceSettings(serviceSettings, validationException); var extractedMaxInputTokens = extractOptionalPositiveInteger( serviceSettings, diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/rerank/AlibabaCloudSearchRerankServiceSettings.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/rerank/AlibabaCloudSearchRerankServiceSettings.java index 474a4f977d7ac..6ef2c7a677f22 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/rerank/AlibabaCloudSearchRerankServiceSettings.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/rerank/AlibabaCloudSearchRerankServiceSettings.java @@ -8,6 +8,7 @@ package org.elasticsearch.xpack.inference.services.alibabacloudsearch.rerank; import org.elasticsearch.TransportVersion; +import org.elasticsearch.common.ValidationException; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.inference.ServiceSettings; @@ -24,7 +25,13 @@ public class AlibabaCloudSearchRerankServiceSettings implements ServiceSettings public static final String NAME = "alibabacloud_search_rerank_service_settings"; public static AlibabaCloudSearchRerankServiceSettings fromMap(Map map, ConfigurationParseContext context) { - return new AlibabaCloudSearchRerankServiceSettings(AlibabaCloudSearchServiceSettings.fromMap(map, context)); + var validationException = new ValidationException(); + + var commonServiceSettings = AlibabaCloudSearchServiceSettings.fromMap(map, context, validationException); + + validationException.throwIfValidationErrorsExist(); + + return new AlibabaCloudSearchRerankServiceSettings(commonServiceSettings); } private final AlibabaCloudSearchServiceSettings commonSettings; @@ -48,7 +55,13 @@ public String modelId() { @Override public AlibabaCloudSearchRerankServiceSettings updateServiceSettings(Map serviceSettings) { - return new AlibabaCloudSearchRerankServiceSettings(commonSettings.updateServiceSettings(serviceSettings)); + var validationException = new ValidationException(); + + var updatedCommonServiceSettings = commonSettings.updateServiceSettings(serviceSettings, validationException); + + validationException.throwIfValidationErrorsExist(); + + return new AlibabaCloudSearchRerankServiceSettings(updatedCommonServiceSettings); } @Override diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/sparse/AlibabaCloudSearchSparseServiceSettings.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/sparse/AlibabaCloudSearchSparseServiceSettings.java index bb134fdabee72..9b47c41352986 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/sparse/AlibabaCloudSearchSparseServiceSettings.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/sparse/AlibabaCloudSearchSparseServiceSettings.java @@ -8,6 +8,7 @@ package org.elasticsearch.xpack.inference.services.alibabacloudsearch.sparse; import org.elasticsearch.TransportVersion; +import org.elasticsearch.common.ValidationException; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.inference.ServiceSettings; @@ -24,7 +25,13 @@ public class AlibabaCloudSearchSparseServiceSettings implements ServiceSettings public static final String NAME = "alibabacloud_search_sparse_embeddings_service_settings"; public static AlibabaCloudSearchSparseServiceSettings fromMap(Map map, ConfigurationParseContext context) { - return new AlibabaCloudSearchSparseServiceSettings(AlibabaCloudSearchServiceSettings.fromMap(map, context)); + var validationException = new ValidationException(); + + var commonServiceSettings = AlibabaCloudSearchServiceSettings.fromMap(map, context, validationException); + + validationException.throwIfValidationErrorsExist(); + + return new AlibabaCloudSearchSparseServiceSettings(commonServiceSettings); } private final AlibabaCloudSearchServiceSettings commonSettings; @@ -48,7 +55,13 @@ public String modelId() { @Override public AlibabaCloudSearchSparseServiceSettings updateServiceSettings(Map serviceSettings) { - return new AlibabaCloudSearchSparseServiceSettings(commonSettings.updateServiceSettings(serviceSettings)); + var validationException = new ValidationException(); + + var updatedCommonServiceSettings = commonSettings.updateServiceSettings(serviceSettings, validationException); + + validationException.throwIfValidationErrorsExist(); + + return new AlibabaCloudSearchSparseServiceSettings(updatedCommonServiceSettings); } @Override diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettingsTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettingsTests.java index 26d01028dced2..a4648c73e48ae 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettingsTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettingsTests.java @@ -70,7 +70,8 @@ public void testUpdateServiceSettings_AllFields_Success() { RateLimitSettings.FIELD_NAME, new HashMap<>(Map.of(RateLimitSettings.REQUESTS_PER_MINUTE_FIELD, TEST_RATE_LIMIT)) ) - ) + ), + new ValidationException() ); assertThat( @@ -94,7 +95,7 @@ public void testUpdateServiceSettings_EmptyMap_Success() { INITIAL_TEST_WORKSPACE_NAME, INITIAL_TEST_HTTP_SCHEMA, new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) - ).updateServiceSettings(new HashMap<>()); + ).updateServiceSettings(new HashMap<>(), new ValidationException()); assertThat( serviceSettings, @@ -124,7 +125,8 @@ public void testFromMap_Success() { TEST_HTTP_SCHEMA ) ), - null + null, + new ValidationException() ); assertThat( @@ -149,7 +151,8 @@ public void testFromMap_WithRateLimit() { new HashMap<>(Map.of(RateLimitSettings.REQUESTS_PER_MINUTE_FIELD, TEST_RATE_LIMIT)) ) ), - null + null, + new ValidationException() ); assertThat( From eb5f90a72cf148489e10cd20fcbacff43a48fc5d Mon Sep 17 00:00:00 2001 From: Jan Kazlouski Date: Mon, 23 Feb 2026 10:43:01 +0200 Subject: [PATCH 4/4] Refactor updateServiceSettings tests to improve clarity and consistency --- .../services/ai21/Ai21ServiceTests.java | 4 +- ...i21ChatCompletionServiceSettingsTests.java | 71 +++++++------------ ...libabaCloudSearchServiceSettingsTests.java | 29 +++----- ...dSearchCompletionServiceSettingsTests.java | 31 +++----- ...dSearchEmbeddingsServiceSettingsTests.java | 34 +++------ ...CloudSearchRerankServiceSettingsTests.java | 31 +++----- ...CloudSearchSparseServiceSettingsTests.java | 31 +++----- 7 files changed, 78 insertions(+), 153 deletions(-) diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/ai21/Ai21ServiceTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/ai21/Ai21ServiceTests.java index 04f3c02330a48..e5d8d32dafcc6 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/ai21/Ai21ServiceTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/ai21/Ai21ServiceTests.java @@ -241,7 +241,7 @@ public void testParseRequestConfig_CreatesChatCompletionsModel() throws IOExcept service.parseRequestConfig( "id", TaskType.CHAT_COMPLETION, - getRequestConfigMap(getServiceSettingsMap(model), getSecretSettingsMap(secret)), + getRequestConfigMap(getServiceSettingsMap(model, null), getSecretSettingsMap(secret)), modelVerificationListener ); } @@ -272,7 +272,7 @@ public void testParseRequestConfig_ThrowsException_WithoutModelId() throws IOExc service.parseRequestConfig( "id", TaskType.CHAT_COMPLETION, - getRequestConfigMap(getServiceSettingsMap(null), getSecretSettingsMap(secret)), + getRequestConfigMap(getServiceSettingsMap(null, null), getSecretSettingsMap(secret)), modelVerificationListener ); } diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/ai21/completion/Ai21ChatCompletionServiceSettingsTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/ai21/completion/Ai21ChatCompletionServiceSettingsTests.java index 45f33ffca9168..f5e69e60d91a9 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/ai21/completion/Ai21ChatCompletionServiceSettingsTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/ai21/completion/Ai21ChatCompletionServiceSettingsTests.java @@ -12,6 +12,7 @@ import org.elasticsearch.common.ValidationException; import org.elasticsearch.common.io.stream.Writeable; import org.elasticsearch.common.xcontent.XContentHelper; +import org.elasticsearch.core.Nullable; import org.elasticsearch.xcontent.XContentBuilder; import org.elasticsearch.xcontent.XContentFactory; import org.elasticsearch.xcontent.XContentType; @@ -36,44 +37,31 @@ public class Ai21ChatCompletionServiceSettingsTests extends AbstractBWCWireSeria private static final int INITIAL_TEST_RATE_LIMIT = 30; public void testUpdateServiceSettings_AllFields_OnlyMutableFieldsAreUpdated() { - var serviceSettings = new Ai21ChatCompletionServiceSettings(INITIAL_TEST_MODEL_ID, new RateLimitSettings(INITIAL_TEST_RATE_LIMIT)) - .updateServiceSettings( - new HashMap<>( - Map.of( - ServiceFields.MODEL_ID, - TEST_MODEL_ID, - RateLimitSettings.FIELD_NAME, - new HashMap<>(Map.of(RateLimitSettings.REQUESTS_PER_MINUTE_FIELD, TEST_RATE_LIMIT)) - ) - ) - ); + var originalServiceSettings = new Ai21ChatCompletionServiceSettings( + INITIAL_TEST_MODEL_ID, + new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) + ); + var updatedServiceSettings = originalServiceSettings.updateServiceSettings(getServiceSettingsMap(TEST_MODEL_ID, TEST_RATE_LIMIT)); assertThat( - serviceSettings, + updatedServiceSettings, is(new Ai21ChatCompletionServiceSettings(INITIAL_TEST_MODEL_ID, new RateLimitSettings(TEST_RATE_LIMIT))) ); } - public void testUpdateServiceSettings_EmptyMap_Success() { - var serviceSettings = new Ai21ChatCompletionServiceSettings(INITIAL_TEST_MODEL_ID, new RateLimitSettings(INITIAL_TEST_RATE_LIMIT)) - .updateServiceSettings(new HashMap<>()); - - assertThat( - serviceSettings, - is(new Ai21ChatCompletionServiceSettings(INITIAL_TEST_MODEL_ID, new RateLimitSettings(INITIAL_TEST_RATE_LIMIT))) + public void testUpdateServiceSettings_EmptyMap_DoesNotChangeSettings() { + var originalServiceSettings = new Ai21ChatCompletionServiceSettings( + INITIAL_TEST_MODEL_ID, + new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) ); + var updatedServiceSettings = originalServiceSettings.updateServiceSettings(new HashMap<>()); + + assertThat(updatedServiceSettings, is(originalServiceSettings)); } public void testFromMap_AllFields_Success() { var serviceSettings = Ai21ChatCompletionServiceSettings.fromMap( - new HashMap<>( - Map.of( - ServiceFields.MODEL_ID, - TEST_MODEL_ID, - RateLimitSettings.FIELD_NAME, - new HashMap<>(Map.of(RateLimitSettings.REQUESTS_PER_MINUTE_FIELD, TEST_RATE_LIMIT)) - ) - ), + getServiceSettingsMap(TEST_MODEL_ID, TEST_RATE_LIMIT), ConfigurationParseContext.PERSISTENT ); @@ -84,12 +72,7 @@ public void testFromMap_MissingModelId_ThrowsException() { var thrownException = expectThrows( ValidationException.class, () -> Ai21ChatCompletionServiceSettings.fromMap( - new HashMap<>( - Map.of( - RateLimitSettings.FIELD_NAME, - new HashMap<>(Map.of(RateLimitSettings.REQUESTS_PER_MINUTE_FIELD, TEST_RATE_LIMIT)) - ) - ), + getServiceSettingsMap(null, TEST_RATE_LIMIT), ConfigurationParseContext.PERSISTENT ) ); @@ -102,23 +85,16 @@ public void testFromMap_MissingModelId_ThrowsException() { public void testFromMap_MissingRateLimit_Success() { var serviceSettings = Ai21ChatCompletionServiceSettings.fromMap( - new HashMap<>(Map.of(ServiceFields.MODEL_ID, TEST_MODEL_ID)), + getServiceSettingsMap(TEST_MODEL_ID, null), ConfigurationParseContext.PERSISTENT ); - assertThat(serviceSettings, is(new Ai21ChatCompletionServiceSettings(TEST_MODEL_ID, null))); + assertThat(serviceSettings, is(new Ai21ChatCompletionServiceSettings(TEST_MODEL_ID, new RateLimitSettings(200)))); } public void testToXContent_WritesAllValues() throws IOException { var serviceSettings = Ai21ChatCompletionServiceSettings.fromMap( - new HashMap<>( - Map.of( - ServiceFields.MODEL_ID, - TEST_MODEL_ID, - RateLimitSettings.FIELD_NAME, - new HashMap<>(Map.of(RateLimitSettings.REQUESTS_PER_MINUTE_FIELD, TEST_RATE_LIMIT)) - ) - ), + getServiceSettingsMap(TEST_MODEL_ID, TEST_RATE_LIMIT), ConfigurationParseContext.PERSISTENT ); @@ -196,10 +172,15 @@ private static Ai21ChatCompletionServiceSettings createRandom() { return new Ai21ChatCompletionServiceSettings(modelId, RateLimitSettingsTests.createRandom()); } - public static Map getServiceSettingsMap(String model) { + public static Map getServiceSettingsMap(@Nullable String modelId, @Nullable Integer rateLimit) { var map = new HashMap(); - map.put(ServiceFields.MODEL_ID, model); + if (modelId != null) { + map.put(ServiceFields.MODEL_ID, modelId); + } + if (rateLimit != null) { + map.put(RateLimitSettings.FIELD_NAME, new HashMap<>(Map.of(RateLimitSettings.REQUESTS_PER_MINUTE_FIELD, rateLimit))); + } return map; } diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettingsTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettingsTests.java index a4648c73e48ae..4da789177a5fa 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettingsTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/AlibabaCloudSearchServiceSettingsTests.java @@ -49,14 +49,15 @@ public static AlibabaCloudSearchServiceSettings createRandom() { return new AlibabaCloudSearchServiceSettings(model, host, workspaceName, httpSchema, RateLimitSettingsTests.createRandom()); } - public void testUpdateServiceSettings_AllFields_Success() { - var serviceSettings = new AlibabaCloudSearchServiceSettings( + public void testUpdateServiceSettings_AllFields_OnlyMutableFieldsAreUpdated() { + var originalServiceSettings = new AlibabaCloudSearchServiceSettings( INITIAL_TEST_SERVICE_ID, INITIAL_TEST_HOST, INITIAL_TEST_WORKSPACE_NAME, INITIAL_TEST_HTTP_SCHEMA, new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) - ).updateServiceSettings( + ); + var updatedServiceSettings = originalServiceSettings.updateServiceSettings( new HashMap<>( Map.of( AlibabaCloudSearchServiceSettings.SERVICE_ID, @@ -75,7 +76,7 @@ public void testUpdateServiceSettings_AllFields_Success() { ); assertThat( - serviceSettings, + updatedServiceSettings, is( new AlibabaCloudSearchServiceSettings( INITIAL_TEST_SERVICE_ID, @@ -88,27 +89,17 @@ public void testUpdateServiceSettings_AllFields_Success() { ); } - public void testUpdateServiceSettings_EmptyMap_Success() { - var serviceSettings = new AlibabaCloudSearchServiceSettings( + public void testUpdateServiceSettings_EmptyMap_DoesNotChangeSettings() { + var originalServiceSettings = new AlibabaCloudSearchServiceSettings( INITIAL_TEST_SERVICE_ID, INITIAL_TEST_HOST, INITIAL_TEST_WORKSPACE_NAME, INITIAL_TEST_HTTP_SCHEMA, new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) - ).updateServiceSettings(new HashMap<>(), new ValidationException()); - - assertThat( - serviceSettings, - is( - new AlibabaCloudSearchServiceSettings( - INITIAL_TEST_SERVICE_ID, - INITIAL_TEST_HOST, - INITIAL_TEST_WORKSPACE_NAME, - INITIAL_TEST_HTTP_SCHEMA, - new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) - ) - ) ); + var updatedServiceSettings = originalServiceSettings.updateServiceSettings(new HashMap<>(), new ValidationException()); + + assertThat(updatedServiceSettings, is(originalServiceSettings)); } public void testFromMap_Success() { diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/completion/AlibabaCloudSearchCompletionServiceSettingsTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/completion/AlibabaCloudSearchCompletionServiceSettingsTests.java index 8ffdded569ca6..c9fca5e7e45c4 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/completion/AlibabaCloudSearchCompletionServiceSettingsTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/completion/AlibabaCloudSearchCompletionServiceSettingsTests.java @@ -39,8 +39,8 @@ public static AlibabaCloudSearchCompletionServiceSettings createRandom() { return new AlibabaCloudSearchCompletionServiceSettings(commonSettings); } - public void testUpdateServiceSettings_AllFields_Success() { - var serviceSettings = new AlibabaCloudSearchCompletionServiceSettings( + public void testUpdateServiceSettings_AllFields_OnlyMutableFieldsAreUpdated() { + var originalServiceSettings = new AlibabaCloudSearchCompletionServiceSettings( new AlibabaCloudSearchServiceSettings( INITIAL_TEST_SERVICE_ID, INITIAL_TEST_HOST, @@ -48,7 +48,8 @@ public void testUpdateServiceSettings_AllFields_Success() { INITIAL_TEST_HTTP_SCHEMA, new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) ) - ).updateServiceSettings( + ); + var updatedServiceSettings = originalServiceSettings.updateServiceSettings( new HashMap<>( Map.of( AlibabaCloudSearchServiceSettings.HOST, @@ -66,7 +67,7 @@ public void testUpdateServiceSettings_AllFields_Success() { ); assertThat( - serviceSettings, + updatedServiceSettings, is( new AlibabaCloudSearchCompletionServiceSettings( new AlibabaCloudSearchServiceSettings( @@ -81,8 +82,8 @@ public void testUpdateServiceSettings_AllFields_Success() { ); } - public void testUpdateServiceSettings_EmptyMap_Success() { - var serviceSettings = new AlibabaCloudSearchCompletionServiceSettings( + public void testUpdateServiceSettings_EmptyMap_DoesNotChangeSettings() { + var originalServiceSettings = new AlibabaCloudSearchCompletionServiceSettings( new AlibabaCloudSearchServiceSettings( INITIAL_TEST_SERVICE_ID, INITIAL_TEST_HOST, @@ -90,22 +91,10 @@ public void testUpdateServiceSettings_EmptyMap_Success() { INITIAL_TEST_HTTP_SCHEMA, new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) ) - ).updateServiceSettings(new HashMap<>()); - - assertThat( - serviceSettings, - is( - new AlibabaCloudSearchCompletionServiceSettings( - new AlibabaCloudSearchServiceSettings( - INITIAL_TEST_SERVICE_ID, - INITIAL_TEST_HOST, - INITIAL_TEST_WORKSPACE_NAME, - INITIAL_TEST_HTTP_SCHEMA, - new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) - ) - ) - ) ); + var updatedServiceSettings = originalServiceSettings.updateServiceSettings(new HashMap<>()); + + assertThat(updatedServiceSettings, is(originalServiceSettings)); } public void testFromMap_Success() { diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/embeddings/AlibabaCloudSearchEmbeddingsServiceSettingsTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/embeddings/AlibabaCloudSearchEmbeddingsServiceSettingsTests.java index 8c0fe65618cfc..c855693838ae2 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/embeddings/AlibabaCloudSearchEmbeddingsServiceSettingsTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/embeddings/AlibabaCloudSearchEmbeddingsServiceSettingsTests.java @@ -53,8 +53,8 @@ public static AlibabaCloudSearchEmbeddingsServiceSettings createRandom() { ); } - public void testUpdateServiceSettings_AllFields_Success() { - var serviceSettings = new AlibabaCloudSearchEmbeddingsServiceSettings( + public void testUpdateServiceSettings_AllFields_OnlyMutableFieldsAreUpdated() { + var originalServiceSettings = new AlibabaCloudSearchEmbeddingsServiceSettings( new AlibabaCloudSearchServiceSettings( INITIAL_TEST_SERVICE_ID, INITIAL_TEST_HOST, @@ -65,7 +65,8 @@ public void testUpdateServiceSettings_AllFields_Success() { INITIAL_TEST_SIMILARITY_MEASURE, INITIAL_TEST_DIMENSIONS, INITIAL_TEST_MAX_INPUT_TOKENS - ).updateServiceSettings( + ); + var updatedServiceSettings = originalServiceSettings.updateServiceSettings( new HashMap<>( Map.of( ServiceFields.SIMILARITY, @@ -89,7 +90,7 @@ public void testUpdateServiceSettings_AllFields_Success() { ); assertThat( - serviceSettings, + updatedServiceSettings, is( new AlibabaCloudSearchEmbeddingsServiceSettings( new AlibabaCloudSearchServiceSettings( @@ -107,8 +108,8 @@ public void testUpdateServiceSettings_AllFields_Success() { ); } - public void testUpdateServiceSettings_EmptyMap_Success() { - var serviceSettings = new AlibabaCloudSearchEmbeddingsServiceSettings( + public void testUpdateServiceSettings_EmptyMap_DoesNotChangeSettings() { + var originalServiceSettings = new AlibabaCloudSearchEmbeddingsServiceSettings( new AlibabaCloudSearchServiceSettings( INITIAL_TEST_SERVICE_ID, INITIAL_TEST_HOST, @@ -119,25 +120,10 @@ public void testUpdateServiceSettings_EmptyMap_Success() { INITIAL_TEST_SIMILARITY_MEASURE, INITIAL_TEST_DIMENSIONS, INITIAL_TEST_MAX_INPUT_TOKENS - ).updateServiceSettings(new HashMap<>()); - - assertThat( - serviceSettings, - is( - new AlibabaCloudSearchEmbeddingsServiceSettings( - new AlibabaCloudSearchServiceSettings( - INITIAL_TEST_SERVICE_ID, - INITIAL_TEST_HOST, - INITIAL_TEST_WORKSPACE_NAME, - INITIAL_TEST_HTTP_SCHEMA, - new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) - ), - INITIAL_TEST_SIMILARITY_MEASURE, - INITIAL_TEST_DIMENSIONS, - INITIAL_TEST_MAX_INPUT_TOKENS - ) - ) ); + var updatedServiceSettings = originalServiceSettings.updateServiceSettings(new HashMap<>()); + + assertThat(updatedServiceSettings, is(originalServiceSettings)); } public void testFromMap_Success() { diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/rerank/AlibabaCloudSearchRerankServiceSettingsTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/rerank/AlibabaCloudSearchRerankServiceSettingsTests.java index ebd847b5f9657..6a8ca97216587 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/rerank/AlibabaCloudSearchRerankServiceSettingsTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/rerank/AlibabaCloudSearchRerankServiceSettingsTests.java @@ -39,8 +39,8 @@ public static AlibabaCloudSearchRerankServiceSettings createRandom() { return new AlibabaCloudSearchRerankServiceSettings(commonSettings); } - public void testUpdateServiceSettings_AllFields_Success() { - var serviceSettings = new AlibabaCloudSearchRerankServiceSettings( + public void testUpdateServiceSettings_AllFields_OnlyMutableFieldsAreUpdated() { + var originalServiceSettings = new AlibabaCloudSearchRerankServiceSettings( new AlibabaCloudSearchServiceSettings( INITIAL_TEST_SERVICE_ID, INITIAL_TEST_HOST, @@ -48,7 +48,8 @@ public void testUpdateServiceSettings_AllFields_Success() { INITIAL_TEST_HTTP_SCHEMA, new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) ) - ).updateServiceSettings( + ); + var updatedServiceSettings = originalServiceSettings.updateServiceSettings( new HashMap<>( Map.of( AlibabaCloudSearchServiceSettings.HOST, @@ -66,7 +67,7 @@ public void testUpdateServiceSettings_AllFields_Success() { ); assertThat( - serviceSettings, + updatedServiceSettings, is( new AlibabaCloudSearchRerankServiceSettings( new AlibabaCloudSearchServiceSettings( @@ -81,8 +82,8 @@ public void testUpdateServiceSettings_AllFields_Success() { ); } - public void testUpdateServiceSettings_EmptyMap_Success() { - var serviceSettings = new AlibabaCloudSearchRerankServiceSettings( + public void testUpdateServiceSettings_EmptyMap_DoesNotChangeSettings() { + var originalServiceSettings = new AlibabaCloudSearchRerankServiceSettings( new AlibabaCloudSearchServiceSettings( INITIAL_TEST_SERVICE_ID, INITIAL_TEST_HOST, @@ -90,22 +91,10 @@ public void testUpdateServiceSettings_EmptyMap_Success() { INITIAL_TEST_HTTP_SCHEMA, new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) ) - ).updateServiceSettings(new HashMap<>()); - - assertThat( - serviceSettings, - is( - new AlibabaCloudSearchRerankServiceSettings( - new AlibabaCloudSearchServiceSettings( - INITIAL_TEST_SERVICE_ID, - INITIAL_TEST_HOST, - INITIAL_TEST_WORKSPACE_NAME, - INITIAL_TEST_HTTP_SCHEMA, - new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) - ) - ) - ) ); + var updatedServiceSettings = originalServiceSettings.updateServiceSettings(new HashMap<>()); + + assertThat(updatedServiceSettings, is(originalServiceSettings)); } public void testFromMap_Success() { diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/sparse/AlibabaCloudSearchSparseServiceSettingsTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/sparse/AlibabaCloudSearchSparseServiceSettingsTests.java index ebd0e3a2a5d1a..c260bb9785acb 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/sparse/AlibabaCloudSearchSparseServiceSettingsTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/alibabacloudsearch/sparse/AlibabaCloudSearchSparseServiceSettingsTests.java @@ -39,8 +39,8 @@ public static AlibabaCloudSearchSparseServiceSettings createRandom() { return new AlibabaCloudSearchSparseServiceSettings(commonSettings); } - public void testUpdateServiceSettings_AllFields_Success() { - var serviceSettings = new AlibabaCloudSearchSparseServiceSettings( + public void testUpdateServiceSettings_AllFields_OnlyMutableFieldsAreUpdated() { + var originalServiceSettings = new AlibabaCloudSearchSparseServiceSettings( new AlibabaCloudSearchServiceSettings( INITIAL_TEST_SERVICE_ID, INITIAL_TEST_HOST, @@ -48,7 +48,8 @@ public void testUpdateServiceSettings_AllFields_Success() { INITIAL_TEST_HTTP_SCHEMA, new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) ) - ).updateServiceSettings( + ); + var updatedServiceSettings = originalServiceSettings.updateServiceSettings( new HashMap<>( Map.of( AlibabaCloudSearchServiceSettings.HOST, @@ -66,7 +67,7 @@ public void testUpdateServiceSettings_AllFields_Success() { ); assertThat( - serviceSettings, + updatedServiceSettings, is( new AlibabaCloudSearchSparseServiceSettings( new AlibabaCloudSearchServiceSettings( @@ -81,8 +82,8 @@ public void testUpdateServiceSettings_AllFields_Success() { ); } - public void testUpdateServiceSettings_EmptyMap_Success() { - var serviceSettings = new AlibabaCloudSearchSparseServiceSettings( + public void testUpdateServiceSettings_EmptyMap_DoesNotChangeSettings() { + var originalServiceSettings = new AlibabaCloudSearchSparseServiceSettings( new AlibabaCloudSearchServiceSettings( INITIAL_TEST_SERVICE_ID, INITIAL_TEST_HOST, @@ -90,22 +91,10 @@ public void testUpdateServiceSettings_EmptyMap_Success() { INITIAL_TEST_HTTP_SCHEMA, new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) ) - ).updateServiceSettings(new HashMap<>()); - - assertThat( - serviceSettings, - is( - new AlibabaCloudSearchSparseServiceSettings( - new AlibabaCloudSearchServiceSettings( - INITIAL_TEST_SERVICE_ID, - INITIAL_TEST_HOST, - INITIAL_TEST_WORKSPACE_NAME, - INITIAL_TEST_HTTP_SCHEMA, - new RateLimitSettings(INITIAL_TEST_RATE_LIMIT) - ) - ) - ) ); + var updatedServiceSettings = originalServiceSettings.updateServiceSettings(new HashMap<>()); + + assertThat(updatedServiceSettings, is(originalServiceSettings)); } public void testFromMap_Success() {