|
@@ -6,19 +6,18 @@
|
|
|
package org.elasticsearch.xpack.ml.integration;
|
|
|
|
|
|
import org.elasticsearch.ElasticsearchStatusException;
|
|
|
-import org.elasticsearch.action.support.master.AcknowledgedResponse;
|
|
|
import org.elasticsearch.cluster.ClusterState;
|
|
|
import org.elasticsearch.persistent.PersistentTasksCustomMetadata;
|
|
|
import org.elasticsearch.rest.RestStatus;
|
|
|
-import org.elasticsearch.xpack.core.ml.MlMetadata;
|
|
|
import org.elasticsearch.xpack.core.ml.MlTasks;
|
|
|
import org.elasticsearch.xpack.core.ml.action.GetDatafeedsStatsAction;
|
|
|
import org.elasticsearch.xpack.core.ml.action.GetJobsStatsAction;
|
|
|
-import org.elasticsearch.xpack.core.ml.action.SetUpgradeModeAction;
|
|
|
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedConfig;
|
|
|
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedState;
|
|
|
+import org.elasticsearch.xpack.core.ml.datafeed.DatafeedUpdate;
|
|
|
import org.elasticsearch.xpack.core.ml.job.config.Job;
|
|
|
import org.elasticsearch.xpack.core.ml.job.config.JobState;
|
|
|
+import org.elasticsearch.xpack.core.ml.job.config.MlFilter;
|
|
|
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.DataCounts;
|
|
|
import org.junit.After;
|
|
|
|
|
@@ -31,8 +30,10 @@ import static org.elasticsearch.xpack.ml.support.BaseMlIntegTestCase.createSched
|
|
|
import static org.elasticsearch.xpack.ml.support.BaseMlIntegTestCase.getDataCounts;
|
|
|
import static org.elasticsearch.xpack.ml.support.BaseMlIntegTestCase.getDatafeedStats;
|
|
|
import static org.elasticsearch.xpack.ml.support.BaseMlIntegTestCase.indexDocs;
|
|
|
+import static org.hamcrest.Matchers.containsString;
|
|
|
import static org.hamcrest.Matchers.empty;
|
|
|
import static org.hamcrest.Matchers.equalTo;
|
|
|
+import static org.hamcrest.Matchers.hasSize;
|
|
|
import static org.hamcrest.Matchers.is;
|
|
|
import static org.hamcrest.Matchers.not;
|
|
|
import static org.hamcrest.Matchers.nullValue;
|
|
@@ -49,35 +50,31 @@ public class SetUpgradeModeIT extends MlNativeAutodetectIntegTestCase {
|
|
|
String datafeedId = jobId + "-datafeed";
|
|
|
startRealtime(jobId);
|
|
|
|
|
|
+ assertThat(upgradeMode(), is(false));
|
|
|
+
|
|
|
// Assert appropriate task state and assignment numbers
|
|
|
assertThat(client().admin()
|
|
|
.cluster()
|
|
|
.prepareListTasks()
|
|
|
.setActions(MlTasks.JOB_TASK_NAME + "[c]", MlTasks.DATAFEED_TASK_NAME + "[c]")
|
|
|
.get()
|
|
|
- .getTasks()
|
|
|
- .size(), equalTo(2));
|
|
|
+ .getTasks(), hasSize(2));
|
|
|
|
|
|
ClusterState masterClusterState = client().admin().cluster().prepareState().all().get().getState();
|
|
|
|
|
|
PersistentTasksCustomMetadata persistentTasks = masterClusterState.getMetadata().custom(PersistentTasksCustomMetadata.TYPE);
|
|
|
- assertThat(persistentTasks.findTasks(MlTasks.DATAFEED_TASK_NAME, task -> true).size(), equalTo(1));
|
|
|
- assertThat(persistentTasks.findTasks(MlTasks.JOB_TASK_NAME, task -> true).size(), equalTo(1));
|
|
|
- assertThat(MlMetadata.getMlMetadata(masterClusterState).isUpgradeMode(), equalTo(false));
|
|
|
+ assertThat(persistentTasks.findTasks(MlTasks.DATAFEED_TASK_NAME, task -> true), hasSize(1));
|
|
|
+ assertThat(persistentTasks.findTasks(MlTasks.JOB_TASK_NAME, task -> true), hasSize(1));
|
|
|
|
|
|
// Set the upgrade mode setting
|
|
|
- AcknowledgedResponse response = client().execute(SetUpgradeModeAction.INSTANCE, new SetUpgradeModeAction.Request(true))
|
|
|
- .actionGet();
|
|
|
-
|
|
|
- assertThat(response.isAcknowledged(), equalTo(true));
|
|
|
+ setUpgradeModeTo(true);
|
|
|
|
|
|
masterClusterState = client().admin().cluster().prepareState().all().get().getState();
|
|
|
|
|
|
// Assert state for tasks still exists and that the upgrade setting is set
|
|
|
persistentTasks = masterClusterState.getMetadata().custom(PersistentTasksCustomMetadata.TYPE);
|
|
|
- assertThat(persistentTasks.findTasks(MlTasks.DATAFEED_TASK_NAME, task -> true).size(), equalTo(1));
|
|
|
- assertThat(persistentTasks.findTasks(MlTasks.JOB_TASK_NAME, task -> true).size(), equalTo(1));
|
|
|
- assertThat(MlMetadata.getMlMetadata(masterClusterState).isUpgradeMode(), equalTo(true));
|
|
|
+ assertThat(persistentTasks.findTasks(MlTasks.DATAFEED_TASK_NAME, task -> true), hasSize(1));
|
|
|
+ assertThat(persistentTasks.findTasks(MlTasks.JOB_TASK_NAME, task -> true), hasSize(1));
|
|
|
|
|
|
assertThat(client().admin()
|
|
|
.cluster()
|
|
@@ -87,50 +84,81 @@ public class SetUpgradeModeIT extends MlNativeAutodetectIntegTestCase {
|
|
|
.getTasks(), is(empty()));
|
|
|
|
|
|
GetJobsStatsAction.Response.JobStats jobStats = getJobStats(jobId).get(0);
|
|
|
- assertThat(jobStats.getState(), equalTo(JobState.OPENED));
|
|
|
- assertThat(jobStats.getAssignmentExplanation(), equalTo(AWAITING_UPGRADE.getExplanation()));
|
|
|
+ assertThat(jobStats.getState(), is(equalTo(JobState.OPENED)));
|
|
|
+ assertThat(jobStats.getAssignmentExplanation(), is(equalTo(AWAITING_UPGRADE.getExplanation())));
|
|
|
assertThat(jobStats.getNode(), is(nullValue()));
|
|
|
|
|
|
GetDatafeedsStatsAction.Response.DatafeedStats datafeedStats = getDatafeedStats(datafeedId);
|
|
|
- assertThat(datafeedStats.getDatafeedState(), equalTo(DatafeedState.STARTED));
|
|
|
- assertThat(datafeedStats.getAssignmentExplanation(), equalTo(AWAITING_UPGRADE.getExplanation()));
|
|
|
+ assertThat(datafeedStats.getDatafeedState(), is(equalTo(DatafeedState.STARTED)));
|
|
|
+ assertThat(datafeedStats.getAssignmentExplanation(), is(equalTo(AWAITING_UPGRADE.getExplanation())));
|
|
|
assertThat(datafeedStats.getNode(), is(nullValue()));
|
|
|
|
|
|
- Job.Builder job = createScheduledJob("job-should-not-open");
|
|
|
- registerJob(job);
|
|
|
- putJob(job);
|
|
|
- ElasticsearchStatusException statusException = expectThrows(ElasticsearchStatusException.class, () -> openJob(job.getId()));
|
|
|
- assertThat(statusException.status(), equalTo(RestStatus.TOO_MANY_REQUESTS));
|
|
|
- assertThat(statusException.getMessage(), equalTo("Cannot open jobs when upgrade mode is enabled"));
|
|
|
-
|
|
|
- //Disable the setting
|
|
|
- response = client().execute(SetUpgradeModeAction.INSTANCE, new SetUpgradeModeAction.Request(false))
|
|
|
- .actionGet();
|
|
|
-
|
|
|
- assertThat(response.isAcknowledged(), equalTo(true));
|
|
|
+ // Disable the setting
|
|
|
+ setUpgradeModeTo(false);
|
|
|
|
|
|
masterClusterState = client().admin().cluster().prepareState().all().get().getState();
|
|
|
|
|
|
persistentTasks = masterClusterState.getMetadata().custom(PersistentTasksCustomMetadata.TYPE);
|
|
|
- assertThat(persistentTasks.findTasks(MlTasks.DATAFEED_TASK_NAME, task -> true).size(), equalTo(1));
|
|
|
- assertThat(persistentTasks.findTasks(MlTasks.JOB_TASK_NAME, task -> true).size(), equalTo(1));
|
|
|
- assertThat(MlMetadata.getMlMetadata(masterClusterState).isUpgradeMode(), equalTo(false));
|
|
|
+ assertThat(persistentTasks.findTasks(MlTasks.DATAFEED_TASK_NAME, task -> true), hasSize(1));
|
|
|
+ assertThat(persistentTasks.findTasks(MlTasks.JOB_TASK_NAME, task -> true), hasSize(1));
|
|
|
|
|
|
assertBusy(() -> assertThat(client().admin()
|
|
|
.cluster()
|
|
|
.prepareListTasks()
|
|
|
.setActions(MlTasks.JOB_TASK_NAME + "[c]", MlTasks.DATAFEED_TASK_NAME + "[c]")
|
|
|
.get()
|
|
|
- .getTasks()
|
|
|
- .size(), equalTo(2)));
|
|
|
+ .getTasks(), hasSize(2)));
|
|
|
|
|
|
jobStats = getJobStats(jobId).get(0);
|
|
|
- assertThat(jobStats.getState(), equalTo(JobState.OPENED));
|
|
|
- assertThat(jobStats.getAssignmentExplanation(), not(equalTo(AWAITING_UPGRADE.getExplanation())));
|
|
|
+ assertThat(jobStats.getState(), is(equalTo(JobState.OPENED)));
|
|
|
+ assertThat(jobStats.getAssignmentExplanation(), is(not(equalTo(AWAITING_UPGRADE.getExplanation()))));
|
|
|
|
|
|
datafeedStats = getDatafeedStats(datafeedId);
|
|
|
- assertThat(datafeedStats.getDatafeedState(), equalTo(DatafeedState.STARTED));
|
|
|
- assertThat(datafeedStats.getAssignmentExplanation(), not(equalTo(AWAITING_UPGRADE.getExplanation())));
|
|
|
+ assertThat(datafeedStats.getDatafeedState(), is(equalTo(DatafeedState.STARTED)));
|
|
|
+ assertThat(datafeedStats.getAssignmentExplanation(), is(not(equalTo(AWAITING_UPGRADE.getExplanation()))));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testJobOpenActionInUpgradeMode() {
|
|
|
+ String jobId = "job-should-not-open";
|
|
|
+ Job.Builder job = createScheduledJob(jobId);
|
|
|
+ registerJob(job);
|
|
|
+ putJob(job);
|
|
|
+
|
|
|
+ setUpgradeModeTo(true);
|
|
|
+
|
|
|
+ ElasticsearchStatusException e = expectThrows(ElasticsearchStatusException.class, () -> openJob(jobId));
|
|
|
+ assertThat(e.getMessage(), is(equalTo("Cannot perform cluster:admin/xpack/ml/job/open action while upgrade mode is enabled")));
|
|
|
+ assertThat(e.status(), is(equalTo(RestStatus.TOO_MANY_REQUESTS)));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testAnomalyDetectionActionsInUpgradeMode() {
|
|
|
+ setUpgradeModeTo(true);
|
|
|
+
|
|
|
+ String jobId = "job_id";
|
|
|
+ expectThrowsUpgradeModeException(() -> putJob(createScheduledJob(jobId)));
|
|
|
+ expectThrowsUpgradeModeException(() -> updateJob(jobId, null));
|
|
|
+ expectThrowsUpgradeModeException(() -> deleteJob(jobId));
|
|
|
+ expectThrowsUpgradeModeException(() -> openJob(jobId));
|
|
|
+ expectThrowsUpgradeModeException(() -> flushJob(jobId, false));
|
|
|
+ expectThrowsUpgradeModeException(() -> closeJob(jobId));
|
|
|
+ expectThrowsUpgradeModeException(() -> persistJob(jobId));
|
|
|
+ expectThrowsUpgradeModeException(() -> forecast(jobId, null, null));
|
|
|
+
|
|
|
+ String snapshotId = "snapshot_id";
|
|
|
+ expectThrowsUpgradeModeException(() -> revertModelSnapshot(jobId, snapshotId));
|
|
|
+
|
|
|
+ String datafeedId = "datafeed_id";
|
|
|
+ expectThrowsUpgradeModeException(() -> putDatafeed(createDatafeed(datafeedId, jobId, Collections.singletonList("index"))));
|
|
|
+ expectThrowsUpgradeModeException(() -> updateDatafeed(new DatafeedUpdate.Builder(datafeedId).build()));
|
|
|
+ expectThrowsUpgradeModeException(() -> deleteDatafeed(datafeedId));
|
|
|
+ expectThrowsUpgradeModeException(() -> startDatafeed(datafeedId, 0, null));
|
|
|
+ expectThrowsUpgradeModeException(() -> stopDatafeed(datafeedId));
|
|
|
+
|
|
|
+ String filterId = "filter_id";
|
|
|
+ expectThrowsUpgradeModeException(() -> putMlFilter(MlFilter.builder(filterId).build()));
|
|
|
+
|
|
|
+ String calendarId = "calendar_id";
|
|
|
+ expectThrowsUpgradeModeException(() -> putCalendar(calendarId, Collections.singletonList(jobId), ""));
|
|
|
}
|
|
|
|
|
|
private void startRealtime(String jobId) throws Exception {
|
|
@@ -154,8 +182,8 @@ public class SetUpgradeModeIT extends MlNativeAutodetectIntegTestCase {
|
|
|
startDatafeed(datafeedConfig.getId(), 0L, null);
|
|
|
assertBusy(() -> {
|
|
|
DataCounts dataCounts = getDataCounts(job.getId());
|
|
|
- assertThat(dataCounts.getProcessedRecordCount(), equalTo(numDocs1));
|
|
|
- assertThat(dataCounts.getOutOfOrderTimeStampCount(), equalTo(0L));
|
|
|
+ assertThat(dataCounts.getProcessedRecordCount(), is(equalTo(numDocs1)));
|
|
|
+ assertThat(dataCounts.getOutOfOrderTimeStampCount(), is(equalTo(0L)));
|
|
|
});
|
|
|
|
|
|
long numDocs2 = randomIntBetween(2, 64);
|
|
@@ -163,9 +191,14 @@ public class SetUpgradeModeIT extends MlNativeAutodetectIntegTestCase {
|
|
|
indexDocs(logger, "data", numDocs2, now + 5000, now + 6000);
|
|
|
assertBusy(() -> {
|
|
|
DataCounts dataCounts = getDataCounts(job.getId());
|
|
|
- assertThat(dataCounts.getProcessedRecordCount(), equalTo(numDocs1 + numDocs2));
|
|
|
- assertThat(dataCounts.getOutOfOrderTimeStampCount(), equalTo(0L));
|
|
|
+ assertThat(dataCounts.getProcessedRecordCount(), is(equalTo(numDocs1 + numDocs2)));
|
|
|
+ assertThat(dataCounts.getOutOfOrderTimeStampCount(), is(equalTo(0L)));
|
|
|
}, 30, TimeUnit.SECONDS);
|
|
|
}
|
|
|
|
|
|
+ private static void expectThrowsUpgradeModeException(ThrowingRunnable actionInvocation) {
|
|
|
+ ElasticsearchStatusException e = expectThrows(ElasticsearchStatusException.class, actionInvocation);
|
|
|
+ assertThat(e.getMessage(), containsString("upgrade mode is enabled"));
|
|
|
+ assertThat(e.status(), is(equalTo(RestStatus.TOO_MANY_REQUESTS)));
|
|
|
+ }
|
|
|
}
|