Skip to content

Commit 7f7e515

Browse files
committed
EIS is basic licence
# Conflicts: # x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/action/BaseTransportInferenceAction.java # x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/action/filter/ShardBulkInferenceActionFilter.java
1 parent c5b0360 commit 7f7e515

File tree

8 files changed

+159
-49
lines changed

8 files changed

+159
-49
lines changed

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/XPackField.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ public final class XPackField {
3232
public static final String UPGRADE = "upgrade";
3333
// inside of YAML settings we still use xpack do not having handle issues with dashes
3434
public static final String SETTINGS_NAME = "xpack";
35+
/** Name constant for the EIS feature. */
36+
public static final String ELASTIC_INFERENCE_SERVICE = "Elastic Inference Service";
3537
/** Name constant for the eql feature. */
3638
public static final String EQL = "eql";
3739
/** Name constant for the esql feature. */
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0; you may not use this file except in compliance with the Elastic License
5+
* 2.0.
6+
*/
7+
8+
package org.elasticsearch.xpack.inference;
9+
10+
import org.elasticsearch.ElasticsearchSecurityException;
11+
import org.elasticsearch.license.LicenseUtils;
12+
import org.elasticsearch.license.XPackLicenseState;
13+
import org.elasticsearch.xpack.core.XPackField;
14+
import org.elasticsearch.xpack.inference.services.elastic.ElasticInferenceService;
15+
16+
import static org.elasticsearch.xpack.inference.InferencePlugin.EIS_INFERENCE_FEATURE;
17+
import static org.elasticsearch.xpack.inference.InferencePlugin.INFERENCE_API_FEATURE;
18+
19+
public class InferenceLicenceCheck {
20+
21+
private InferenceLicenceCheck() {}
22+
23+
public static boolean isServiceLicenced(String serviceName, XPackLicenseState licenseState) {
24+
if (ElasticInferenceService.NAME.equals(serviceName)) {
25+
return EIS_INFERENCE_FEATURE.check(licenseState);
26+
} else {
27+
return INFERENCE_API_FEATURE.check(licenseState);
28+
}
29+
}
30+
31+
public static ElasticsearchSecurityException complianceException(String serviceName) {
32+
if (ElasticInferenceService.NAME.equals(serviceName)) {
33+
return LicenseUtils.newComplianceException(XPackField.ELASTIC_INFERENCE_SERVICE);
34+
} else {
35+
return LicenseUtils.newComplianceException(XPackField.INFERENCE);
36+
}
37+
}
38+
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,12 @@ public class InferencePlugin extends Plugin
203203
License.OperationMode.ENTERPRISE
204204
);
205205

206+
public static final LicensedFeature.Momentary EIS_INFERENCE_FEATURE = LicensedFeature.momentary(
207+
"inference",
208+
"eis",
209+
License.OperationMode.BASIC
210+
);
211+
206212
public static final String X_ELASTIC_PRODUCT_USE_CASE_HTTP_HEADER = "X-elastic-product-use-case";
207213

208214
public static final String NAME = "inference";

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/action/BaseTransportInferenceAction.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,14 @@
2525
import org.elasticsearch.inference.Model;
2626
import org.elasticsearch.inference.TaskType;
2727
import org.elasticsearch.inference.telemetry.InferenceStats;
28-
import org.elasticsearch.license.LicenseUtils;
2928
import org.elasticsearch.license.XPackLicenseState;
3029
import org.elasticsearch.rest.RestStatus;
3130
import org.elasticsearch.tasks.Task;
3231
import org.elasticsearch.threadpool.ThreadPool;
3332
import org.elasticsearch.transport.TransportService;
34-
import org.elasticsearch.xpack.core.XPackField;
3533
import org.elasticsearch.xpack.core.inference.action.BaseInferenceActionRequest;
3634
import org.elasticsearch.xpack.core.inference.action.InferenceAction;
35+
import org.elasticsearch.xpack.inference.InferenceLicenceCheck;
3736
import org.elasticsearch.xpack.inference.InferencePlugin;
3837
import org.elasticsearch.xpack.inference.action.task.StreamingTaskManager;
3938
import org.elasticsearch.xpack.inference.registry.InferenceEndpointRegistry;
@@ -51,7 +50,6 @@
5150
import static org.elasticsearch.core.Strings.format;
5251
import static org.elasticsearch.inference.telemetry.InferenceStats.responseAttributes;
5352
import static org.elasticsearch.inference.telemetry.InferenceStats.serviceAndResponseAttributes;
54-
import static org.elasticsearch.xpack.inference.InferencePlugin.INFERENCE_API_FEATURE;
5553

5654
/**
5755
* Base class for transport actions that handle inference requests.
@@ -112,16 +110,17 @@ protected abstract void doInference(
112110

113111
@Override
114112
protected void doExecute(Task task, Request request, ActionListener<InferenceAction.Response> listener) {
115-
if (INFERENCE_API_FEATURE.check(licenseState) == false) {
116-
listener.onFailure(LicenseUtils.newComplianceException(XPackField.INFERENCE));
117-
return;
118-
}
119113

120114
var timer = InferenceTimer.start();
121115

122116
var getModelListener = ActionListener.wrap((Model model) -> {
123117
var serviceName = model.getConfigurations().getService();
124118

119+
if (InferenceLicenceCheck.isServiceLicenced(serviceName, licenseState) == false) {
120+
listener.onFailure(InferenceLicenceCheck.complianceException(serviceName));
121+
return;
122+
}
123+
125124
try {
126125
validateRequest(request, model);
127126
} catch (Exception e) {

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/action/TransportPutInferenceModelAction.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,18 @@
2929
import org.elasticsearch.inference.ModelConfigurations;
3030
import org.elasticsearch.inference.TaskType;
3131
import org.elasticsearch.injection.guice.Inject;
32-
import org.elasticsearch.license.LicenseUtils;
3332
import org.elasticsearch.license.XPackLicenseState;
3433
import org.elasticsearch.rest.RestStatus;
3534
import org.elasticsearch.tasks.Task;
3635
import org.elasticsearch.threadpool.ThreadPool;
3736
import org.elasticsearch.transport.TransportService;
3837
import org.elasticsearch.xcontent.XContentParser;
3938
import org.elasticsearch.xcontent.XContentParserConfiguration;
40-
import org.elasticsearch.xpack.core.XPackField;
4139
import org.elasticsearch.xpack.core.inference.action.PutInferenceModelAction;
4240
import org.elasticsearch.xpack.core.ml.inference.assignment.TrainedModelAssignmentUtils;
4341
import org.elasticsearch.xpack.core.ml.job.messages.Messages;
4442
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
43+
import org.elasticsearch.xpack.inference.InferenceLicenceCheck;
4544
import org.elasticsearch.xpack.inference.InferencePlugin;
4645
import org.elasticsearch.xpack.inference.registry.ModelRegistry;
4746
import org.elasticsearch.xpack.inference.services.ServiceUtils;
@@ -53,7 +52,6 @@
5352
import java.util.Map;
5453

5554
import static org.elasticsearch.core.Strings.format;
56-
import static org.elasticsearch.xpack.inference.InferencePlugin.INFERENCE_API_FEATURE;
5755
import static org.elasticsearch.xpack.inference.services.elasticsearch.ElasticsearchInternalService.OLD_ELSER_SERVICE_NAME;
5856

5957
public class TransportPutInferenceModelAction extends TransportMasterNodeAction<
@@ -106,11 +104,6 @@ protected void masterOperation(
106104
ClusterState state,
107105
ActionListener<PutInferenceModelAction.Response> listener
108106
) throws Exception {
109-
if (INFERENCE_API_FEATURE.check(licenseState) == false) {
110-
listener.onFailure(LicenseUtils.newComplianceException(XPackField.INFERENCE));
111-
return;
112-
}
113-
114107
if (modelRegistry.containsDefaultConfigId(request.getInferenceEntityId())) {
115108
listener.onFailure(
116109
new ElasticsearchStatusException(
@@ -136,6 +129,11 @@ protected void masterOperation(
136129
return;
137130
}
138131

132+
if (InferenceLicenceCheck.isServiceLicenced(serviceName, licenseState) == false) {
133+
listener.onFailure(InferenceLicenceCheck.complianceException(serviceName));
134+
return;
135+
}
136+
139137
if (List.of(OLD_ELSER_SERVICE_NAME, ElasticsearchInternalService.NAME).contains(serviceName)) {
140138
// required for BWC of elser service in elasticsearch service TODO remove when elser service deprecated
141139
requestAsMap.put(ModelConfigurations.SERVICE, serviceName);

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/action/TransportUpdateInferenceModelAction.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import org.elasticsearch.xpack.core.ml.inference.assignment.TrainedModelAssignmentUtils;
5151
import org.elasticsearch.xpack.core.ml.job.messages.Messages;
5252
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
53+
import org.elasticsearch.xpack.inference.InferenceLicenceCheck;
5354
import org.elasticsearch.xpack.inference.registry.ModelRegistry;
5455
import org.elasticsearch.xpack.inference.services.elasticsearch.ElasticsearchInternalModel;
5556
import org.elasticsearch.xpack.inference.services.elasticsearch.ElasticsearchInternalService;
@@ -137,10 +138,16 @@ protected void masterOperation(
137138
unparsedModel.service()
138139
)
139140
);
140-
} else {
141-
service.set(optionalService.get());
142-
listener.onResponse(unparsedModel);
141+
return;
142+
}
143+
144+
if (InferenceLicenceCheck.isServiceLicenced(optionalService.get().name(), licenseState) == false) {
145+
listener.onFailure(InferenceLicenceCheck.complianceException(optionalService.get().name()));
146+
return;
143147
}
148+
149+
service.set(optionalService.get());
150+
listener.onResponse(unparsedModel);
144151
})
145152
.<Boolean>andThen((listener, existingUnparsedModel) -> {
146153

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/action/filter/ShardBulkInferenceActionFilter.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
import org.elasticsearch.inference.Model;
4949
import org.elasticsearch.inference.UnparsedModel;
5050
import org.elasticsearch.inference.telemetry.InferenceStats;
51-
import org.elasticsearch.license.LicenseUtils;
5251
import org.elasticsearch.license.XPackLicenseState;
5352
import org.elasticsearch.rest.RestStatus;
5453
import org.elasticsearch.tasks.Task;
@@ -57,10 +56,10 @@
5756
import org.elasticsearch.xcontent.XContentParser;
5857
import org.elasticsearch.xcontent.XContentParserConfiguration;
5958
import org.elasticsearch.xcontent.XContentType;
60-
import org.elasticsearch.xpack.core.XPackField;
6159
import org.elasticsearch.xpack.core.inference.chunking.ChunkingSettingsBuilder;
6260
import org.elasticsearch.xpack.core.inference.results.ChunkedInferenceError;
6361
import org.elasticsearch.xpack.inference.InferenceException;
62+
import org.elasticsearch.xpack.inference.InferenceLicenceCheck;
6463
import org.elasticsearch.xpack.inference.mapper.SemanticTextField;
6564
import org.elasticsearch.xpack.inference.mapper.SemanticTextFieldMapper;
6665
import org.elasticsearch.xpack.inference.mapper.SemanticTextUtils;
@@ -78,7 +77,6 @@
7877
import java.util.stream.Collectors;
7978

8079
import static org.elasticsearch.inference.telemetry.InferenceStats.serviceAndResponseAttributes;
81-
import static org.elasticsearch.xpack.inference.InferencePlugin.INFERENCE_API_FEATURE;
8280
import static org.elasticsearch.xpack.inference.mapper.SemanticTextField.toSemanticTextFieldChunks;
8381
import static org.elasticsearch.xpack.inference.mapper.SemanticTextField.toSemanticTextFieldChunksLegacy;
8482

@@ -383,6 +381,19 @@ public void onFailure(Exception exc) {
383381
modelRegistry.getModelWithSecrets(inferenceId, modelLoadingListener);
384382
return;
385383
}
384+
385+
if (InferenceLicenceCheck.isServiceLicenced(inferenceProvider.service.name(), licenseState) == false) {
386+
try (onFinish) {
387+
for (FieldInferenceRequest request : requests) {
388+
addInferenceResponseFailure(
389+
request.bulkItemIndex,
390+
InferenceLicenceCheck.complianceException(inferenceProvider.service.name())
391+
);
392+
}
393+
return;
394+
}
395+
}
396+
386397
final List<ChunkInferenceInput> inputs = requests.stream()
387398
.map(r -> new ChunkInferenceInput(r.input, r.chunkingSettings))
388399
.collect(Collectors.toList());
@@ -571,11 +582,6 @@ private long addFieldInferenceRequests(BulkItemRequest item, int itemIndex, Map<
571582
break;
572583
}
573584

574-
if (INFERENCE_API_FEATURE.check(licenseState) == false) {
575-
addInferenceResponseFailure(itemIndex, LicenseUtils.newComplianceException(XPackField.INFERENCE));
576-
break;
577-
}
578-
579585
List<FieldInferenceRequest> requests = requestsMap.computeIfAbsent(inferenceId, k -> new ArrayList<>());
580586
int offsetAdjustment = 0;
581587
for (String v : values) {

0 commit comments

Comments
 (0)