|
@@ -7,10 +7,14 @@
|
|
|
package org.elasticsearch.xpack.dataframe.transforms;
|
|
|
|
|
|
import org.elasticsearch.Version;
|
|
|
+import org.elasticsearch.client.Client;
|
|
|
import org.elasticsearch.cluster.ClusterName;
|
|
|
import org.elasticsearch.cluster.ClusterState;
|
|
|
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
|
|
import org.elasticsearch.cluster.metadata.MetaData;
|
|
|
+import org.elasticsearch.cluster.node.DiscoveryNode;
|
|
|
+import org.elasticsearch.cluster.node.DiscoveryNodeRole;
|
|
|
+import org.elasticsearch.cluster.node.DiscoveryNodes;
|
|
|
import org.elasticsearch.cluster.routing.IndexRoutingTable;
|
|
|
import org.elasticsearch.cluster.routing.IndexShardRoutingTable;
|
|
|
import org.elasticsearch.cluster.routing.RecoverySource;
|
|
@@ -20,14 +24,93 @@ import org.elasticsearch.cluster.routing.UnassignedInfo;
|
|
|
import org.elasticsearch.common.settings.Settings;
|
|
|
import org.elasticsearch.index.Index;
|
|
|
import org.elasticsearch.index.shard.ShardId;
|
|
|
+import org.elasticsearch.persistent.PersistentTasksCustomMetaData;
|
|
|
import org.elasticsearch.test.ESTestCase;
|
|
|
+import org.elasticsearch.threadpool.ThreadPool;
|
|
|
+import org.elasticsearch.xpack.core.dataframe.transforms.DataFrameTransform;
|
|
|
+import org.elasticsearch.xpack.core.scheduler.SchedulerEngine;
|
|
|
+import org.elasticsearch.xpack.dataframe.checkpoint.DataFrameTransformsCheckpointService;
|
|
|
+import org.elasticsearch.xpack.dataframe.notifications.DataFrameAuditor;
|
|
|
import org.elasticsearch.xpack.dataframe.persistence.DataFrameInternalIndex;
|
|
|
+import org.elasticsearch.xpack.dataframe.persistence.DataFrameTransformsConfigManager;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.Collections;
|
|
|
import java.util.List;
|
|
|
+import java.util.Set;
|
|
|
+
|
|
|
+import static org.hamcrest.Matchers.equalTo;
|
|
|
+import static org.mockito.Mockito.mock;
|
|
|
|
|
|
public class DataFrameTransformPersistentTasksExecutorTests extends ESTestCase {
|
|
|
|
|
|
+ public void testNodeVersionAssignment() {
|
|
|
+ MetaData.Builder metaData = MetaData.builder();
|
|
|
+ RoutingTable.Builder routingTable = RoutingTable.builder();
|
|
|
+ addIndices(metaData, routingTable);
|
|
|
+ PersistentTasksCustomMetaData.Builder pTasksBuilder = PersistentTasksCustomMetaData.builder()
|
|
|
+ .addTask("data-frame-task-1",
|
|
|
+ DataFrameTransform.NAME,
|
|
|
+ new DataFrameTransform("data-frame-task-1", Version.CURRENT),
|
|
|
+ new PersistentTasksCustomMetaData.Assignment("current-data-node-with-1-tasks", ""))
|
|
|
+ .addTask("data-frame-task-2",
|
|
|
+ DataFrameTransform.NAME,
|
|
|
+ new DataFrameTransform("data-frame-task-2", Version.CURRENT),
|
|
|
+ new PersistentTasksCustomMetaData.Assignment("current-data-node-with-2-tasks", ""))
|
|
|
+ .addTask("data-frame-task-3",
|
|
|
+ DataFrameTransform.NAME,
|
|
|
+ new DataFrameTransform("data-frame-task-3", Version.CURRENT),
|
|
|
+ new PersistentTasksCustomMetaData.Assignment("current-data-node-with-2-tasks", ""));
|
|
|
+
|
|
|
+ PersistentTasksCustomMetaData pTasks = pTasksBuilder.build();
|
|
|
+
|
|
|
+ metaData.putCustom(PersistentTasksCustomMetaData.TYPE, pTasks);
|
|
|
+
|
|
|
+ DiscoveryNodes.Builder nodes = DiscoveryNodes.builder()
|
|
|
+ .add(new DiscoveryNode("past-data-node-1",
|
|
|
+ buildNewFakeTransportAddress(),
|
|
|
+ Collections.emptyMap(),
|
|
|
+ Set.of(DiscoveryNodeRole.DATA_ROLE, DiscoveryNodeRole.MASTER_ROLE),
|
|
|
+ Version.V_7_2_0))
|
|
|
+ .add(new DiscoveryNode("current-data-node-with-2-tasks",
|
|
|
+ buildNewFakeTransportAddress(),
|
|
|
+ Collections.emptyMap(),
|
|
|
+ Set.of(DiscoveryNodeRole.DATA_ROLE, DiscoveryNodeRole.MASTER_ROLE),
|
|
|
+ Version.CURRENT))
|
|
|
+ .add(new DiscoveryNode("non-data-node-1",
|
|
|
+ buildNewFakeTransportAddress(),
|
|
|
+ Collections.emptyMap(),
|
|
|
+ Set.of(DiscoveryNodeRole.MASTER_ROLE),
|
|
|
+ Version.CURRENT))
|
|
|
+ .add(new DiscoveryNode("current-data-node-with-1-tasks",
|
|
|
+ buildNewFakeTransportAddress(),
|
|
|
+ Collections.emptyMap(),
|
|
|
+ Set.of(DiscoveryNodeRole.DATA_ROLE, DiscoveryNodeRole.MASTER_ROLE),
|
|
|
+ Version.CURRENT));
|
|
|
+
|
|
|
+ ClusterState.Builder csBuilder = ClusterState.builder(new ClusterName("_name"))
|
|
|
+ .nodes(nodes);
|
|
|
+ csBuilder.routingTable(routingTable.build());
|
|
|
+ csBuilder.metaData(metaData);
|
|
|
+
|
|
|
+ ClusterState cs = csBuilder.build();
|
|
|
+ Client client = mock(Client.class);
|
|
|
+ DataFrameTransformsConfigManager transformsConfigManager = new DataFrameTransformsConfigManager(client, xContentRegistry());
|
|
|
+ DataFrameTransformsCheckpointService dataFrameTransformsCheckpointService = new DataFrameTransformsCheckpointService(client,
|
|
|
+ transformsConfigManager);
|
|
|
+
|
|
|
+ DataFrameTransformPersistentTasksExecutor executor = new DataFrameTransformPersistentTasksExecutor(client,
|
|
|
+ transformsConfigManager,
|
|
|
+ dataFrameTransformsCheckpointService, mock(SchedulerEngine.class),
|
|
|
+ new DataFrameAuditor(client, ""),
|
|
|
+ mock(ThreadPool.class));
|
|
|
+
|
|
|
+ assertThat(executor.getAssignment(new DataFrameTransform("new-task-id", Version.CURRENT), cs).getExecutorNode(),
|
|
|
+ equalTo("current-data-node-with-1-tasks"));
|
|
|
+ assertThat(executor.getAssignment(new DataFrameTransform("new-old-task-id", Version.V_7_2_0), cs).getExecutorNode(),
|
|
|
+ equalTo("past-data-node-1"));
|
|
|
+ }
|
|
|
+
|
|
|
public void testVerifyIndicesPrimaryShardsAreActive() {
|
|
|
MetaData.Builder metaData = MetaData.builder();
|
|
|
RoutingTable.Builder routingTable = RoutingTable.builder();
|