Skip to content

Commit a629efe

Browse files
authored
Simplify ml license checking with XpackLicenseState internals (#52684)
This change removes TrainedModelConfig#isAvailableWithLicense method with calls to XPackLicenseState#isAllowedByLicense. Please note there are subtle changes to the code logic. But they are the right changes: * Instead of Platinum license, Enterprise license nows guarantees availability. * No explicit check when the license requirement is basic. Since basic license is always available, this check is unnecessary. * Trial license is always allowed.
1 parent 729fe26 commit a629efe

File tree

3 files changed

+2
-85
lines changed

3 files changed

+2
-85
lines changed

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/TrainedModelConfig.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import org.elasticsearch.common.xcontent.XContentBuilder;
2222
import org.elasticsearch.common.xcontent.XContentParser;
2323
import org.elasticsearch.license.License;
24-
import org.elasticsearch.license.XPackLicenseState;
2524
import org.elasticsearch.xpack.core.common.time.TimeUtils;
2625
import org.elasticsearch.xpack.core.ml.inference.persistence.InferenceIndexConstants;
2726
import org.elasticsearch.xpack.core.ml.job.messages.Messages;
@@ -236,21 +235,6 @@ public License.OperationMode getLicenseLevel() {
236235
return licenseLevel;
237236
}
238237

239-
public boolean isAvailableWithLicense(XPackLicenseState licenseState) {
240-
// Basic is always true
241-
if (licenseLevel.equals(License.OperationMode.BASIC)) {
242-
return true;
243-
}
244-
245-
// The model license does not matter, Platinum license gets the same functions as the highest license
246-
if (licenseState.isAllowedByLicense(License.OperationMode.PLATINUM)) {
247-
return true;
248-
}
249-
250-
// catch the rest, if the license is active and is at least the required model license
251-
return licenseState.isAllowedByLicense(licenseLevel, true, false);
252-
}
253-
254238
@Override
255239
public void writeTo(StreamOutput out) throws IOException {
256240
out.writeString(modelId);

x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/TrainedModelConfigTests.java

Lines changed: 0 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import org.elasticsearch.common.xcontent.XContentParser;
2121
import org.elasticsearch.common.xcontent.XContentType;
2222
import org.elasticsearch.license.License;
23-
import org.elasticsearch.license.XPackLicenseState;
2423
import org.elasticsearch.search.SearchModule;
2524
import org.elasticsearch.test.AbstractSerializingTestCase;
2625
import org.elasticsearch.xpack.core.ml.job.messages.Messages;
@@ -44,10 +43,6 @@
4443
import static org.hamcrest.Matchers.containsString;
4544
import static org.hamcrest.Matchers.equalTo;
4645
import static org.hamcrest.Matchers.not;
47-
import static org.mockito.Matchers.any;
48-
import static org.mockito.Matchers.anyBoolean;
49-
import static org.mockito.Mockito.mock;
50-
import static org.mockito.Mockito.when;
5146

5247
public class TrainedModelConfigTests extends AbstractSerializingTestCase<TrainedModelConfig> {
5348

@@ -306,66 +301,4 @@ public void testSerializationWithCompressedLazyDefinition() throws IOException {
306301
.assertToXContentEquivalence(true)
307302
.test();
308303
}
309-
310-
public void testIsAvailableWithLicense() {
311-
TrainedModelConfig.Builder builder = createTestInstance(randomAlphaOfLength(10));
312-
XPackLicenseState licenseState = mock(XPackLicenseState.class);
313-
314-
// Reject everything
315-
when(licenseState.isAllowedByLicense(any(License.OperationMode.class), anyBoolean(), anyBoolean())).thenAnswer(
316-
invocationOnMock -> {
317-
final Object[] arguments = invocationOnMock.getArguments();
318-
assertTrue((boolean) arguments[1]); // ensure the call is made to require active license
319-
return false;
320-
}
321-
);
322-
assertFalse(builder.setLicenseLevel(License.OperationMode.ENTERPRISE.description()).build().isAvailableWithLicense(licenseState));
323-
assertFalse(builder.setLicenseLevel(License.OperationMode.PLATINUM.description()).build().isAvailableWithLicense(licenseState));
324-
assertFalse(builder.setLicenseLevel(License.OperationMode.GOLD.description()).build().isAvailableWithLicense(licenseState));
325-
// Basic license always works not matter what
326-
assertTrue(builder.setLicenseLevel(License.OperationMode.BASIC.description()).build().isAvailableWithLicense(licenseState));
327-
}
328-
329-
public void testActivePlatinumLicenseAlwaysWorks() {
330-
TrainedModelConfig.Builder builder = createTestInstance(randomAlphaOfLength(10));
331-
XPackLicenseState licenseState = mock(XPackLicenseState.class);
332-
333-
when(licenseState.isAllowedByLicense(License.OperationMode.PLATINUM)).thenReturn(true);
334-
335-
// Active Platinum license functions the same as Enterprise license (highest) and should always work
336-
when(licenseState.isAllowedByLicense(any(License.OperationMode.class), anyBoolean(), anyBoolean())).thenAnswer(
337-
invocationOnMock -> {
338-
final Object[] arguments = invocationOnMock.getArguments();
339-
assertEquals(License.OperationMode.PLATINUM, arguments[0]);
340-
assertTrue((boolean) arguments[1]); // ensure the call is made to require active license
341-
assertTrue((boolean) arguments[2]);
342-
return true;
343-
}
344-
);
345-
assertTrue(builder.setLicenseLevel(License.OperationMode.ENTERPRISE.description()).build().isAvailableWithLicense(licenseState));
346-
assertTrue(builder.setLicenseLevel(License.OperationMode.PLATINUM.description()).build().isAvailableWithLicense(licenseState));
347-
assertTrue(builder.setLicenseLevel(License.OperationMode.BASIC.description()).build().isAvailableWithLicense(licenseState));
348-
assertTrue(builder.setLicenseLevel(License.OperationMode.GOLD.description()).build().isAvailableWithLicense(licenseState));
349-
}
350-
351-
public void testActiveGoldLicenseWillWorkWhenRequiredLevelIsGold() {
352-
TrainedModelConfig.Builder builder = createTestInstance(randomAlphaOfLength(10));
353-
XPackLicenseState licenseState = mock(XPackLicenseState.class);
354-
355-
// Active Gold license should work when required level is gold
356-
when(licenseState.isAllowedByLicense(any(License.OperationMode.class), anyBoolean(), anyBoolean())).thenAnswer(
357-
invocationOnMock -> {
358-
final Object[] arguments = invocationOnMock.getArguments();
359-
assertTrue((boolean) arguments[1]); // ensure the call is made to require active license
360-
if (License.OperationMode.PLATINUM == arguments[0] && Boolean.TRUE.equals(arguments[2])) {
361-
return false;
362-
} else
363-
return License.OperationMode.GOLD == arguments[0] && Boolean.FALSE.equals(arguments[2]);
364-
}
365-
);
366-
assertFalse(builder.setLicenseLevel(License.OperationMode.ENTERPRISE.description()).build().isAvailableWithLicense(licenseState));
367-
assertFalse(builder.setLicenseLevel(License.OperationMode.PLATINUM.description()).build().isAvailableWithLicense(licenseState));
368-
assertTrue(builder.setLicenseLevel(License.OperationMode.BASIC.description()).build().isAvailableWithLicense(licenseState));
369-
assertTrue(builder.setLicenseLevel(License.OperationMode.GOLD.description()).build().isAvailableWithLicense(licenseState));
370-
}
371304
}

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportInternalInferModelAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ protected void doExecute(Task task, Request request, ActionListener<Response> li
7979
} else {
8080
trainedModelProvider.getTrainedModel(request.getModelId(), false, ActionListener.wrap(
8181
trainedModelConfig -> {
82-
responseBuilder.setLicensed(trainedModelConfig.isAvailableWithLicense(licenseState));
83-
if (trainedModelConfig.isAvailableWithLicense(licenseState) || request.isPreviouslyLicensed()) {
82+
responseBuilder.setLicensed(licenseState.isAllowedByLicense(trainedModelConfig.getLicenseLevel()));
83+
if (licenseState.isAllowedByLicense(trainedModelConfig.getLicenseLevel()) || request.isPreviouslyLicensed()) {
8484
this.modelLoadingService.getModel(request.getModelId(), getModelListener);
8585
} else {
8686
listener.onFailure(LicenseUtils.newComplianceException(XPackField.MACHINE_LEARNING));

0 commit comments

Comments
 (0)