Skip to content

Commit da94bd0

Browse files
Allow deleting user endpoints for eis
1 parent cb81e65 commit da94bd0

File tree

3 files changed

+53
-1
lines changed

3 files changed

+53
-1
lines changed

x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/inference/action/PutInferenceModelActionTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,16 @@ public void testValidate() {
7676
validationException = invalidRequest3.validate();
7777
assertNotNull(validationException);
7878
}
79+
80+
public void testValidate_ReturnsException_WhenIdStartsWithADot() {
81+
var invalidRequest = new PutInferenceModelAction.Request(
82+
TASK_TYPE,
83+
".elser-2-elastic",
84+
BYTES,
85+
X_CONTENT_TYPE,
86+
InferenceAction.Request.DEFAULT_TIMEOUT
87+
);
88+
var validationException = invalidRequest.validate();
89+
assertNotNull(validationException);
90+
}
7991
}

x-pack/plugin/inference/src/internalClusterTest/java/org/elasticsearch/xpack/inference/integration/ModelRegistryIT.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import org.elasticsearch.xpack.inference.LocalStateInferencePlugin;
5656
import org.elasticsearch.xpack.inference.model.TestModel;
5757
import org.elasticsearch.xpack.inference.registry.ModelRegistry;
58+
import org.elasticsearch.xpack.inference.services.elastic.ElasticInferenceService;
5859
import org.elasticsearch.xpack.inference.services.elasticsearch.ElasticsearchInternalModel;
5960
import org.elasticsearch.xpack.inference.services.elasticsearch.ElasticsearchInternalService;
6061
import org.elasticsearch.xpack.inference.services.elasticsearch.ElserInternalServiceSettingsTests;
@@ -949,6 +950,41 @@ public void testStoreModel_DoesNotDeleteIndexDocs_WhenModelAlreadyExists() {
949950
assertIndicesContainExpectedDocsCount(model, 2);
950951
}
951952

953+
public void testContainsPreconfiguredInferenceEndpointId() {
954+
var preconfiguredModelId = ".elser-2-elastic";
955+
var preconfiguredModel = new TestModel(
956+
preconfiguredModelId,
957+
TaskType.SPARSE_EMBEDDING,
958+
ElasticInferenceService.NAME,
959+
new TestModel.TestServiceSettings(null, null, null, null),
960+
new TestModel.TestTaskSettings(randomInt(3)),
961+
new TestModel.TestSecretSettings("secret")
962+
);
963+
964+
var userModelId = "user-model-1";
965+
var userModel = new TestModel(
966+
userModelId,
967+
TaskType.SPARSE_EMBEDDING,
968+
ElasticInferenceService.NAME,
969+
new TestModel.TestServiceSettings(null, null, null, null),
970+
new TestModel.TestTaskSettings(randomInt(3)),
971+
new TestModel.TestSecretSettings("secret")
972+
);
973+
974+
var listener = new PlainActionFuture<List<ModelStoreResponse>>();
975+
modelRegistry.storeModels(List.of(preconfiguredModel, userModel), listener, TimeValue.THIRTY_SECONDS);
976+
977+
var response = listener.actionGet(TimeValue.THIRTY_SECONDS);
978+
assertThat(response.size(), is(2));
979+
assertFalse(response.get(0).failed());
980+
assertFalse(response.get(1).failed());
981+
982+
assertTrue(modelRegistry.containsPreconfiguredInferenceEndpointId(preconfiguredModelId));
983+
assertFalse(modelRegistry.containsPreconfiguredInferenceEndpointId(userModelId));
984+
985+
assertThat(modelRegistry.getInferenceIds(), is(Set.of(preconfiguredModelId, userModelId)));
986+
}
987+
952988
private void storeCorruptedModelThenStoreModel(boolean storeSecrets) {
953989
var model = new TestModel(
954990
"corrupted-model-id",

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/registry/ModelRegistry.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@ public static UnparsedModel unparsedModelFromMap(ModelConfigMap modelConfigMap)
144144
private static final String TASK_TYPE_FIELD = "task_type";
145145
private static final String MODEL_ID_FIELD = "model_id";
146146
private static final Logger logger = LogManager.getLogger(ModelRegistry.class);
147+
// Currently all EIS preconfigured endpoints are prefixed with a dot. We should remove this restriction by leveraging
148+
// the information from the authorization response instead.
149+
private static final String EIS_PRECONFIGURED_ENDPOINT_ID_PREFIX = ".";
147150

148151
private final OriginSettingClient client;
149152
private final Map<String, InferenceService.DefaultConfigId> defaultConfigIds;
@@ -185,7 +188,8 @@ public boolean containsPreconfiguredInferenceEndpointId(String inferenceEntityId
185188
var project = lastMetadata.get().getProject(ProjectId.DEFAULT);
186189
var state = ModelRegistryMetadata.fromState(project);
187190
var eisPreconfiguredEndpoints = state.getServiceInferenceIds(ElasticInferenceService.NAME);
188-
return eisPreconfiguredEndpoints.contains(inferenceEntityId);
191+
return eisPreconfiguredEndpoints.contains(inferenceEntityId)
192+
&& inferenceEntityId.startsWith(EIS_PRECONFIGURED_ENDPOINT_ID_PREFIX);
189193
}
190194

191195
return false;

0 commit comments

Comments
 (0)