|  | @@ -35,7 +35,6 @@ import org.mockito.Mockito;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import java.io.IOException;
 | 
	
		
			
				|  |  |  import java.util.ArrayList;
 | 
	
		
			
				|  |  | -import java.util.HashMap;
 | 
	
		
			
				|  |  |  import java.util.HashSet;
 | 
	
		
			
				|  |  |  import java.util.List;
 | 
	
		
			
				|  |  |  import java.util.Map;
 | 
	
	
		
			
				|  | @@ -112,12 +111,8 @@ public class SetSingleNodeAllocateStepTests extends AbstractStepTestCase<SetSing
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public void testPerformActionAttrsAllNodesValid() throws Exception {
 | 
	
		
			
				|  |  | -        int numAttrs = randomIntBetween(1, 10);
 | 
	
		
			
				|  |  |          final int numNodes = randomIntBetween(1, 20);
 | 
	
		
			
				|  |  | -        String[][] validAttrs = new String[numAttrs][2];
 | 
	
		
			
				|  |  | -        for (int i = 0; i < numAttrs; i++) {
 | 
	
		
			
				|  |  | -            validAttrs[i] = new String[] { randomAlphaOfLengthBetween(1, 20), randomAlphaOfLengthBetween(1, 20) };
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        String[][] validAttrs = generateRandomValidAttributes(randomIntBetween(1, 10));
 | 
	
		
			
				|  |  |          Settings.Builder indexSettings = settings(Version.CURRENT);
 | 
	
		
			
				|  |  |          for (String[] attr : validAttrs) {
 | 
	
		
			
				|  |  |              indexSettings.put(IndexMetadata.INDEX_ROUTING_INCLUDE_GROUP_SETTING.getKey() + attr[0], attr[1]);
 | 
	
	
		
			
				|  | @@ -258,22 +253,11 @@ public class SetSingleNodeAllocateStepTests extends AbstractStepTestCase<SetSing
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public void testPerformActionAttrsRequestFails() {
 | 
	
		
			
				|  |  |          final int numNodes = randomIntBetween(1, 20);
 | 
	
		
			
				|  |  | -        int numAttrs = randomIntBetween(1, 10);
 | 
	
		
			
				|  |  | -        Map<String, String> validAttributes = new HashMap<>();
 | 
	
		
			
				|  |  | -        for (int i = 0; i < numAttrs; i++) {
 | 
	
		
			
				|  |  | -            validAttributes.put(
 | 
	
		
			
				|  |  | -                randomValueOtherThanMany(
 | 
	
		
			
				|  |  | -                    attr -> validAttributes.containsKey(attr) || DiscoveryNodeRole.roleNames().contains(attr),
 | 
	
		
			
				|  |  | -                    () -> randomAlphaOfLengthBetween(1, 20)
 | 
	
		
			
				|  |  | -                ),
 | 
	
		
			
				|  |  | -                randomAlphaOfLengthBetween(1, 20)
 | 
	
		
			
				|  |  | -            );
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        String[][] validAttrs = generateRandomValidAttributes(randomIntBetween(1, 10));
 | 
	
		
			
				|  |  |          Settings.Builder indexSettings = settings(Version.CURRENT);
 | 
	
		
			
				|  |  | -        validAttributes.forEach((k, v) -> {
 | 
	
		
			
				|  |  | -            indexSettings.put(IndexMetadata.INDEX_ROUTING_INCLUDE_GROUP_SETTING.getKey() + k, v);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | +        for (String[] attr : validAttrs) {
 | 
	
		
			
				|  |  | +            indexSettings.put(IndexMetadata.INDEX_ROUTING_INCLUDE_GROUP_SETTING.getKey() + attr[0], attr[1]);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          IndexMetadata indexMetadata = IndexMetadata.builder(randomAlphaOfLength(10))
 | 
	
		
			
				|  |  |              .settings(indexSettings)
 | 
	
		
			
				|  |  |              .numberOfShards(randomIntBetween(1, 5))
 | 
	
	
		
			
				|  | @@ -287,11 +271,11 @@ public class SetSingleNodeAllocateStepTests extends AbstractStepTestCase<SetSing
 | 
	
		
			
				|  |  |              String nodeId = "node_id_" + i;
 | 
	
		
			
				|  |  |              String nodeName = "node_" + i;
 | 
	
		
			
				|  |  |              int nodePort = 9300 + i;
 | 
	
		
			
				|  |  | -            Map.Entry<String, String> nodeAttr = randomFrom(validAttributes.entrySet());
 | 
	
		
			
				|  |  | +            String[] nodeAttr = randomFrom(validAttrs);
 | 
	
		
			
				|  |  |              Settings nodeSettings = Settings.builder()
 | 
	
		
			
				|  |  |                  .put(validNodeSettings)
 | 
	
		
			
				|  |  |                  .put(Node.NODE_NAME_SETTING.getKey(), nodeName)
 | 
	
		
			
				|  |  | -                .put(Node.NODE_ATTRIBUTES.getKey() + nodeAttr.getKey(), nodeAttr.getValue())
 | 
	
		
			
				|  |  | +                .put(Node.NODE_ATTRIBUTES.getKey() + nodeAttr[0], nodeAttr[1])
 | 
	
		
			
				|  |  |                  .build();
 | 
	
		
			
				|  |  |              nodes.add(DiscoveryNode.createLocal(nodeSettings, new TransportAddress(TransportAddress.META_ADDRESS, nodePort), nodeId));
 | 
	
		
			
				|  |  |              validNodeIds.add(nodeId);
 | 
	
	
		
			
				|  | @@ -338,12 +322,8 @@ public class SetSingleNodeAllocateStepTests extends AbstractStepTestCase<SetSing
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public void testPerformActionAttrsNoShard() {
 | 
	
		
			
				|  |  | -        int numAttrs = randomIntBetween(1, 10);
 | 
	
		
			
				|  |  |          final int numNodes = randomIntBetween(1, 20);
 | 
	
		
			
				|  |  | -        String[][] validAttrs = new String[numAttrs][2];
 | 
	
		
			
				|  |  | -        for (int i = 0; i < numAttrs; i++) {
 | 
	
		
			
				|  |  | -            validAttrs[i] = new String[] { "na_" + randomAlphaOfLengthBetween(1, 20), randomAlphaOfLengthBetween(1, 20) };
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        String[][] validAttrs = generateRandomValidAttributes(randomIntBetween(1, 10), "na_");
 | 
	
		
			
				|  |  |          Settings.Builder indexSettings = settings(Version.CURRENT);
 | 
	
		
			
				|  |  |          for (String[] attr : validAttrs) {
 | 
	
		
			
				|  |  |              indexSettings.put(IndexMetadata.INDEX_ROUTING_INCLUDE_GROUP_SETTING.getKey() + attr[0], attr[1]);
 | 
	
	
		
			
				|  | @@ -593,6 +573,21 @@ public class SetSingleNodeAllocateStepTests extends AbstractStepTestCase<SetSing
 | 
	
		
			
				|  |  |          assertNodeSelected(indexMetadata, indexMetadata.getIndex(), oldNodeIds, discoveryNodes, indexRoutingTable.build());
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    private String[][] generateRandomValidAttributes(int numAttrs) {
 | 
	
		
			
				|  |  | +        return generateRandomValidAttributes(numAttrs, "");
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private String[][] generateRandomValidAttributes(int numAttrs, String prefix) {
 | 
	
		
			
				|  |  | +        Set<String> reservedNames = new HashSet<>(DiscoveryNodeRole.roleNames());
 | 
	
		
			
				|  |  | +        String[][] validAttrs = new String[numAttrs][2];
 | 
	
		
			
				|  |  | +        for (int i = 0; i < numAttrs; i++) {
 | 
	
		
			
				|  |  | +            validAttrs[i] = new String[] {
 | 
	
		
			
				|  |  | +                prefix + randomValueOtherThanMany(attr -> reservedNames.contains(prefix + attr), () -> randomAlphaOfLengthBetween(1, 20)),
 | 
	
		
			
				|  |  | +                randomAlphaOfLengthBetween(1, 20) };
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return validAttrs;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      private void assertNodeSelected(IndexMetadata indexMetadata, Index index, Set<String> validNodeIds, DiscoveryNodes.Builder nodes)
 | 
	
		
			
				|  |  |          throws Exception {
 | 
	
		
			
				|  |  |          DiscoveryNodes discoveryNodes = nodes.build();
 |