|
@@ -0,0 +1,148 @@
|
|
|
+/*
|
|
|
+ * Licensed to Elasticsearch under one or more contributor
|
|
|
+ * license agreements. See the NOTICE file distributed with
|
|
|
+ * this work for additional information regarding copyright
|
|
|
+ * ownership. Elasticsearch licenses this file to you under
|
|
|
+ * the Apache License, Version 2.0 (the "License"); you may
|
|
|
+ * not use this file except in compliance with the License.
|
|
|
+ * You may obtain a copy of the License at
|
|
|
+ *
|
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
|
+ *
|
|
|
+ * Unless required by applicable law or agreed to in writing,
|
|
|
+ * software distributed under the License is distributed on an
|
|
|
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
|
+ * KIND, either express or implied. See the License for the
|
|
|
+ * specific language governing permissions and limitations
|
|
|
+ * under the License.
|
|
|
+ */
|
|
|
+
|
|
|
+package org.elasticsearch.cluster.routing.allocation.decider;
|
|
|
+
|
|
|
+import org.elasticsearch.cluster.ClusterState;
|
|
|
+import org.elasticsearch.cluster.metadata.IndexMetaData;
|
|
|
+import org.elasticsearch.cluster.metadata.MetaData;
|
|
|
+import org.elasticsearch.cluster.node.DiscoveryNodes;
|
|
|
+import org.elasticsearch.cluster.routing.RoutingTable;
|
|
|
+import org.elasticsearch.cluster.routing.allocation.AllocationService;
|
|
|
+import org.elasticsearch.common.logging.ESLogger;
|
|
|
+import org.elasticsearch.common.logging.Loggers;
|
|
|
+import org.elasticsearch.common.settings.ImmutableSettings;
|
|
|
+import org.elasticsearch.test.ElasticsearchAllocationTestCase;
|
|
|
+import org.junit.Test;
|
|
|
+
|
|
|
+import static org.elasticsearch.cluster.routing.ShardRoutingState.INITIALIZING;
|
|
|
+import static org.elasticsearch.cluster.routing.ShardRoutingState.STARTED;
|
|
|
+import static org.elasticsearch.cluster.routing.allocation.decider.EnableAllocationDecider.*;
|
|
|
+import static org.elasticsearch.common.settings.ImmutableSettings.settingsBuilder;
|
|
|
+import static org.hamcrest.Matchers.equalTo;
|
|
|
+
|
|
|
+/**
|
|
|
+ */
|
|
|
+public class EnableAllocationTests extends ElasticsearchAllocationTestCase {
|
|
|
+
|
|
|
+ private final ESLogger logger = Loggers.getLogger(EnableAllocationTests.class);
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testClusterEnableNone() {
|
|
|
+ AllocationService strategy = createAllocationService(settingsBuilder()
|
|
|
+ .put(CLUSTER_ROUTING_ALLOCATION_ENABLE, Allocation.NONE.name())
|
|
|
+ .build());
|
|
|
+
|
|
|
+ logger.info("Building initial routing table");
|
|
|
+
|
|
|
+ MetaData metaData = MetaData.builder()
|
|
|
+ .put(IndexMetaData.builder("test").numberOfShards(1).numberOfReplicas(1))
|
|
|
+ .build();
|
|
|
+
|
|
|
+ RoutingTable routingTable = RoutingTable.builder()
|
|
|
+ .addAsNew(metaData.index("test"))
|
|
|
+ .build();
|
|
|
+
|
|
|
+ ClusterState clusterState = ClusterState.builder().metaData(metaData).routingTable(routingTable).build();
|
|
|
+
|
|
|
+ logger.info("--> adding two nodes and do rerouting");
|
|
|
+ clusterState = ClusterState.builder(clusterState).nodes(DiscoveryNodes.builder()
|
|
|
+ .put(newNode("node1"))
|
|
|
+ .put(newNode("node2"))
|
|
|
+ ).build();
|
|
|
+ routingTable = strategy.reroute(clusterState).routingTable();
|
|
|
+ clusterState = ClusterState.builder(clusterState).routingTable(routingTable).build();
|
|
|
+ assertThat(clusterState.routingNodes().shardsWithState(INITIALIZING).size(), equalTo(0));
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testClusterEnableOnlyPrimaries() {
|
|
|
+ AllocationService strategy = createAllocationService(settingsBuilder()
|
|
|
+ .put(CLUSTER_ROUTING_ALLOCATION_ENABLE, Allocation.PRIMARIES.name())
|
|
|
+ .build());
|
|
|
+
|
|
|
+ logger.info("Building initial routing table");
|
|
|
+
|
|
|
+ MetaData metaData = MetaData.builder()
|
|
|
+ .put(IndexMetaData.builder("test").numberOfShards(1).numberOfReplicas(1))
|
|
|
+ .build();
|
|
|
+
|
|
|
+ RoutingTable routingTable = RoutingTable.builder()
|
|
|
+ .addAsNew(metaData.index("test"))
|
|
|
+ .build();
|
|
|
+
|
|
|
+ ClusterState clusterState = ClusterState.builder().metaData(metaData).routingTable(routingTable).build();
|
|
|
+
|
|
|
+ logger.info("--> adding two nodes do rerouting");
|
|
|
+ clusterState = ClusterState.builder(clusterState).nodes(DiscoveryNodes.builder()
|
|
|
+ .put(newNode("node1"))
|
|
|
+ .put(newNode("node2"))
|
|
|
+ ).build();
|
|
|
+ routingTable = strategy.reroute(clusterState).routingTable();
|
|
|
+ clusterState = ClusterState.builder(clusterState).routingTable(routingTable).build();
|
|
|
+ assertThat(clusterState.routingNodes().shardsWithState(INITIALIZING).size(), equalTo(1));
|
|
|
+
|
|
|
+ logger.info("--> start the shards (primaries)");
|
|
|
+ routingTable = strategy.applyStartedShards(clusterState, clusterState.routingNodes().shardsWithState(INITIALIZING)).routingTable();
|
|
|
+ clusterState = ClusterState.builder(clusterState).routingTable(routingTable).build();
|
|
|
+
|
|
|
+ assertThat(clusterState.routingNodes().shardsWithState(INITIALIZING).size(), equalTo(0));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testIndexEnableNone() {
|
|
|
+ AllocationService strategy = createAllocationService(settingsBuilder()
|
|
|
+ .build());
|
|
|
+
|
|
|
+ MetaData metaData = MetaData.builder()
|
|
|
+ .put(IndexMetaData.builder("disabled").settings(ImmutableSettings.builder()
|
|
|
+ .put(INDEX_ROUTING_ALLOCATION_ENABLE, Allocation.NONE.name()))
|
|
|
+ .numberOfShards(1).numberOfReplicas(1))
|
|
|
+ .put(IndexMetaData.builder("enabled").numberOfShards(1).numberOfReplicas(1))
|
|
|
+ .build();
|
|
|
+
|
|
|
+ RoutingTable routingTable = RoutingTable.builder()
|
|
|
+ .addAsNew(metaData.index("disabled"))
|
|
|
+ .addAsNew(metaData.index("enabled"))
|
|
|
+ .build();
|
|
|
+
|
|
|
+ ClusterState clusterState = ClusterState.builder().metaData(metaData).routingTable(routingTable).build();
|
|
|
+
|
|
|
+ logger.info("--> adding two nodes and do rerouting");
|
|
|
+ clusterState = ClusterState.builder(clusterState).nodes(DiscoveryNodes.builder()
|
|
|
+ .put(newNode("node1"))
|
|
|
+ .put(newNode("node2"))
|
|
|
+ ).build();
|
|
|
+ routingTable = strategy.reroute(clusterState).routingTable();
|
|
|
+ clusterState = ClusterState.builder(clusterState).routingTable(routingTable).build();
|
|
|
+ assertThat(clusterState.routingNodes().shardsWithState(INITIALIZING).size(), equalTo(1));
|
|
|
+ logger.info("--> start the shards (primaries)");
|
|
|
+ routingTable = strategy.applyStartedShards(clusterState, clusterState.routingNodes().shardsWithState(INITIALIZING)).routingTable();
|
|
|
+ clusterState = ClusterState.builder(clusterState).routingTable(routingTable).build();
|
|
|
+ logger.info("--> start the shards (replicas)");
|
|
|
+ routingTable = strategy.applyStartedShards(clusterState, clusterState.routingNodes().shardsWithState(INITIALIZING)).routingTable();
|
|
|
+ clusterState = ClusterState.builder(clusterState).routingTable(routingTable).build();
|
|
|
+
|
|
|
+ logger.info("--> verify only enabled index has been routed");
|
|
|
+ assertThat(clusterState.readOnlyRoutingNodes().shardsWithState("enabled", STARTED).size(), equalTo(2));
|
|
|
+ assertThat(clusterState.readOnlyRoutingNodes().shardsWithState("disabled", STARTED).size(), equalTo(0));
|
|
|
+ }
|
|
|
+
|
|
|
+}
|