|  | @@ -53,7 +53,6 @@ import org.junit.Before;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import java.io.IOException;
 | 
	
		
			
				|  |  |  import java.io.UncheckedIOException;
 | 
	
		
			
				|  |  | -import java.util.UUID;
 | 
	
		
			
				|  |  |  import java.util.concurrent.atomic.AtomicBoolean;
 | 
	
		
			
				|  |  |  import java.util.concurrent.atomic.AtomicReference;
 | 
	
		
			
				|  |  |  import java.util.function.BiConsumer;
 | 
	
	
		
			
				|  | @@ -110,8 +109,7 @@ public class SecurityIndexManagerTests extends ESTestCase {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          final ClusterState.Builder clusterStateBuilder = createClusterState(RestrictedIndicesNames.INTERNAL_SECURITY_MAIN_INDEX_7,
 | 
	
		
			
				|  |  |                  RestrictedIndicesNames.SECURITY_MAIN_ALIAS);
 | 
	
		
			
				|  |  | -        markShardsAvailable(clusterStateBuilder);
 | 
	
		
			
				|  |  | -        manager.clusterChanged(event(clusterStateBuilder));
 | 
	
		
			
				|  |  | +        manager.clusterChanged(event(markShardsAvailable(clusterStateBuilder)));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          assertThat(manager.indexExists(), Matchers.equalTo(true));
 | 
	
		
			
				|  |  |          assertThat(manager.isAvailable(), Matchers.equalTo(true));
 | 
	
	
		
			
				|  | @@ -121,9 +119,10 @@ public class SecurityIndexManagerTests extends ESTestCase {
 | 
	
		
			
				|  |  |      public void testIndexWithoutPrimaryShards() {
 | 
	
		
			
				|  |  |          assertInitialState();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        final ClusterState.Builder clusterStateBuilder = createClusterState(RestrictedIndicesNames.INTERNAL_SECURITY_MAIN_INDEX_7,
 | 
	
		
			
				|  |  | -                RestrictedIndicesNames.SECURITY_MAIN_ALIAS);
 | 
	
		
			
				|  |  | -        Index index = new Index(RestrictedIndicesNames.INTERNAL_SECURITY_MAIN_INDEX_7, UUID.randomUUID().toString());
 | 
	
		
			
				|  |  | +        final ClusterState cs = createClusterState(RestrictedIndicesNames.INTERNAL_SECURITY_MAIN_INDEX_7,
 | 
	
		
			
				|  |  | +                RestrictedIndicesNames.SECURITY_MAIN_ALIAS).build();
 | 
	
		
			
				|  |  | +        final ClusterState.Builder clusterStateBuilder = ClusterState.builder(cs);
 | 
	
		
			
				|  |  | +        Index index = cs.metadata().index(RestrictedIndicesNames.INTERNAL_SECURITY_MAIN_INDEX_7).getIndex();
 | 
	
		
			
				|  |  |          ShardRouting shardRouting = ShardRouting.newUnassigned(new ShardId(index, 0), true,
 | 
	
		
			
				|  |  |              RecoverySource.ExistingStoreRecoverySource.INSTANCE, new UnassignedInfo(UnassignedInfo.Reason.INDEX_CREATED, ""));
 | 
	
		
			
				|  |  |          String nodeId = ESTestCase.randomAlphaOfLength(8);
 | 
	
	
		
			
				|  | @@ -134,13 +133,13 @@ public class SecurityIndexManagerTests extends ESTestCase {
 | 
	
		
			
				|  |  |          clusterStateBuilder.routingTable(RoutingTable.builder()
 | 
	
		
			
				|  |  |                  .add(IndexRoutingTable.builder(index).addIndexShard(table).build())
 | 
	
		
			
				|  |  |                  .build());
 | 
	
		
			
				|  |  | -        manager.clusterChanged(event(clusterStateBuilder));
 | 
	
		
			
				|  |  | +        manager.clusterChanged(event(clusterStateBuilder.build()));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          assertIndexUpToDateButNotAvailable();
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private ClusterChangedEvent event(ClusterState.Builder clusterStateBuilder) {
 | 
	
		
			
				|  |  | -        return new ClusterChangedEvent("test-event", clusterStateBuilder.build(), EMPTY_CLUSTER_STATE);
 | 
	
		
			
				|  |  | +    private ClusterChangedEvent event(ClusterState clusterState) {
 | 
	
		
			
				|  |  | +        return new ClusterChangedEvent("test-event", clusterState, EMPTY_CLUSTER_STATE);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public void testIndexHealthChangeListeners() {
 | 
	
	
		
			
				|  | @@ -157,9 +156,8 @@ public class SecurityIndexManagerTests extends ESTestCase {
 | 
	
		
			
				|  |  |          // index doesn't exist and now exists
 | 
	
		
			
				|  |  |          final ClusterState.Builder clusterStateBuilder = createClusterState(RestrictedIndicesNames.INTERNAL_SECURITY_MAIN_INDEX_7,
 | 
	
		
			
				|  |  |                  RestrictedIndicesNames.SECURITY_MAIN_ALIAS);
 | 
	
		
			
				|  |  | -        markShardsAvailable(clusterStateBuilder);
 | 
	
		
			
				|  |  | -        final ClusterState clusterState = clusterStateBuilder.build();
 | 
	
		
			
				|  |  | -        manager.clusterChanged(event(ClusterState.builder(clusterState)));
 | 
	
		
			
				|  |  | +        final ClusterState clusterState = markShardsAvailable(clusterStateBuilder);
 | 
	
		
			
				|  |  | +        manager.clusterChanged(event(clusterState));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          assertTrue(listenerCalled.get());
 | 
	
		
			
				|  |  |          assertNull(previousState.get().indexHealth);
 | 
	
	
		
			
				|  | @@ -222,7 +220,7 @@ public class SecurityIndexManagerTests extends ESTestCase {
 | 
	
		
			
				|  |  |          prepareRunnableCalled.set(false);
 | 
	
		
			
				|  |  |          // state not recovered
 | 
	
		
			
				|  |  |          final ClusterBlocks.Builder blocks = ClusterBlocks.builder().addGlobalBlock(GatewayService.STATE_NOT_RECOVERED_BLOCK);
 | 
	
		
			
				|  |  | -        manager.clusterChanged(event(new ClusterState.Builder(CLUSTER_NAME).blocks(blocks)));
 | 
	
		
			
				|  |  | +        manager.clusterChanged(event(new ClusterState.Builder(CLUSTER_NAME).blocks(blocks).build()));
 | 
	
		
			
				|  |  |          manager.prepareIndexIfNeededThenExecute(prepareException::set, () -> prepareRunnableCalled.set(true));
 | 
	
		
			
				|  |  |          assertThat(prepareException.get(), is(notNullValue()));
 | 
	
		
			
				|  |  |          assertThat(prepareException.get(), instanceOf(ElasticsearchStatusException.class));
 | 
	
	
		
			
				|  | @@ -234,8 +232,7 @@ public class SecurityIndexManagerTests extends ESTestCase {
 | 
	
		
			
				|  |  |          // state recovered with index
 | 
	
		
			
				|  |  |          ClusterState.Builder clusterStateBuilder = createClusterState(RestrictedIndicesNames.INTERNAL_SECURITY_MAIN_INDEX_7,
 | 
	
		
			
				|  |  |                  RestrictedIndicesNames.SECURITY_MAIN_ALIAS, SecurityIndexManager.INTERNAL_MAIN_INDEX_FORMAT);
 | 
	
		
			
				|  |  | -        markShardsAvailable(clusterStateBuilder);
 | 
	
		
			
				|  |  | -        manager.clusterChanged(event(clusterStateBuilder));
 | 
	
		
			
				|  |  | +        manager.clusterChanged(event(markShardsAvailable(clusterStateBuilder)));
 | 
	
		
			
				|  |  |          manager.prepareIndexIfNeededThenExecute(prepareException::set, () -> prepareRunnableCalled.set(true));
 | 
	
		
			
				|  |  |          assertThat(prepareException.get(), is(nullValue()));
 | 
	
		
			
				|  |  |          assertThat(prepareRunnableCalled.get(), is(true));
 | 
	
	
		
			
				|  | @@ -262,8 +259,7 @@ public class SecurityIndexManagerTests extends ESTestCase {
 | 
	
		
			
				|  |  |              IndexMetadata.State.OPEN,
 | 
	
		
			
				|  |  |              getMappings(previousVersion)
 | 
	
		
			
				|  |  |          );
 | 
	
		
			
				|  |  | -        markShardsAvailable(clusterStateBuilder);
 | 
	
		
			
				|  |  | -        manager.clusterChanged(event(clusterStateBuilder));
 | 
	
		
			
				|  |  | +        manager.clusterChanged(event(markShardsAvailable(clusterStateBuilder)));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          manager.prepareIndexIfNeededThenExecute(prepareException::set, () -> prepareRunnableCalled.set(true));
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -296,8 +292,7 @@ public class SecurityIndexManagerTests extends ESTestCase {
 | 
	
		
			
				|  |  |              IndexMetadata.State.OPEN,
 | 
	
		
			
				|  |  |              getMappings(previousVersion)
 | 
	
		
			
				|  |  |          );
 | 
	
		
			
				|  |  | -        markShardsAvailable(clusterStateBuilder);
 | 
	
		
			
				|  |  | -        manager.clusterChanged(event(clusterStateBuilder));
 | 
	
		
			
				|  |  | +        manager.clusterChanged(event(markShardsAvailable(clusterStateBuilder)));
 | 
	
		
			
				|  |  |          manager.prepareIndexIfNeededThenExecute(prepareException::set, () -> prepareRunnableCalled.set(true));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          assertThat(prepareRunnableCalled.get(), is(false));
 | 
	
	
		
			
				|  | @@ -313,21 +308,20 @@ public class SecurityIndexManagerTests extends ESTestCase {
 | 
	
		
			
				|  |  |          manager.addStateListener((prev, current) -> listenerCalled.set(true));
 | 
	
		
			
				|  |  |          final ClusterBlocks.Builder blocks = ClusterBlocks.builder().addGlobalBlock(GatewayService.STATE_NOT_RECOVERED_BLOCK);
 | 
	
		
			
				|  |  |          // state not recovered
 | 
	
		
			
				|  |  | -        manager.clusterChanged(event(new ClusterState.Builder(CLUSTER_NAME).blocks(blocks)));
 | 
	
		
			
				|  |  | +        manager.clusterChanged(event(new ClusterState.Builder(CLUSTER_NAME).blocks(blocks).build()));
 | 
	
		
			
				|  |  |          assertThat(manager.isStateRecovered(), is(false));
 | 
	
		
			
				|  |  |          assertThat(listenerCalled.get(), is(false));
 | 
	
		
			
				|  |  |          // state recovered with index
 | 
	
		
			
				|  |  |          ClusterState.Builder clusterStateBuilder = createClusterState(RestrictedIndicesNames.INTERNAL_SECURITY_MAIN_INDEX_7,
 | 
	
		
			
				|  |  |                  RestrictedIndicesNames.SECURITY_MAIN_ALIAS, SecurityIndexManager.INTERNAL_MAIN_INDEX_FORMAT);
 | 
	
		
			
				|  |  | -        markShardsAvailable(clusterStateBuilder);
 | 
	
		
			
				|  |  | -        manager.clusterChanged(event(clusterStateBuilder));
 | 
	
		
			
				|  |  | +        manager.clusterChanged(event(markShardsAvailable(clusterStateBuilder)));
 | 
	
		
			
				|  |  |          assertThat(manager.isStateRecovered(), is(true));
 | 
	
		
			
				|  |  |          assertThat(listenerCalled.get(), is(true));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public void testIndexOutOfDateListeners() {
 | 
	
		
			
				|  |  |          final AtomicBoolean listenerCalled = new AtomicBoolean(false);
 | 
	
		
			
				|  |  | -        manager.clusterChanged(event(new ClusterState.Builder(CLUSTER_NAME)));
 | 
	
		
			
				|  |  | +        manager.clusterChanged(event(new ClusterState.Builder(CLUSTER_NAME).build()));
 | 
	
		
			
				|  |  |          AtomicBoolean upToDateChanged = new AtomicBoolean();
 | 
	
		
			
				|  |  |          manager.addStateListener((prev, current) -> {
 | 
	
		
			
				|  |  |              listenerCalled.set(true);
 | 
	
	
		
			
				|  | @@ -335,22 +329,21 @@ public class SecurityIndexManagerTests extends ESTestCase {
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |          assertTrue(manager.isIndexUpToDate());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        manager.clusterChanged(event(new ClusterState.Builder(CLUSTER_NAME)));
 | 
	
		
			
				|  |  | +        manager.clusterChanged(event(new ClusterState.Builder(CLUSTER_NAME).build()));
 | 
	
		
			
				|  |  |          assertFalse(listenerCalled.get());
 | 
	
		
			
				|  |  |          assertTrue(manager.isIndexUpToDate());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // index doesn't exist and now exists with wrong format
 | 
	
		
			
				|  |  |          ClusterState.Builder clusterStateBuilder = createClusterState(RestrictedIndicesNames.INTERNAL_SECURITY_MAIN_INDEX_7,
 | 
	
		
			
				|  |  |                  RestrictedIndicesNames.SECURITY_MAIN_ALIAS, SecurityIndexManager.INTERNAL_MAIN_INDEX_FORMAT - 1);
 | 
	
		
			
				|  |  | -        markShardsAvailable(clusterStateBuilder);
 | 
	
		
			
				|  |  | -        manager.clusterChanged(event(clusterStateBuilder));
 | 
	
		
			
				|  |  | +        manager.clusterChanged(event(markShardsAvailable(clusterStateBuilder)));
 | 
	
		
			
				|  |  |          assertTrue(listenerCalled.get());
 | 
	
		
			
				|  |  |          assertTrue(upToDateChanged.get());
 | 
	
		
			
				|  |  |          assertFalse(manager.isIndexUpToDate());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          listenerCalled.set(false);
 | 
	
		
			
				|  |  |          assertFalse(listenerCalled.get());
 | 
	
		
			
				|  |  | -        manager.clusterChanged(event(new ClusterState.Builder(CLUSTER_NAME)));
 | 
	
		
			
				|  |  | +        manager.clusterChanged(event(new ClusterState.Builder(CLUSTER_NAME).build()));
 | 
	
		
			
				|  |  |          assertTrue(listenerCalled.get());
 | 
	
		
			
				|  |  |          assertTrue(upToDateChanged.get());
 | 
	
		
			
				|  |  |          assertTrue(manager.isIndexUpToDate());
 | 
	
	
		
			
				|  | @@ -359,8 +352,7 @@ public class SecurityIndexManagerTests extends ESTestCase {
 | 
	
		
			
				|  |  |          // index doesn't exist and now exists with correct format
 | 
	
		
			
				|  |  |          clusterStateBuilder = createClusterState(RestrictedIndicesNames.INTERNAL_SECURITY_MAIN_INDEX_7,
 | 
	
		
			
				|  |  |                  RestrictedIndicesNames.SECURITY_MAIN_ALIAS, SecurityIndexManager.INTERNAL_MAIN_INDEX_FORMAT);
 | 
	
		
			
				|  |  | -        markShardsAvailable(clusterStateBuilder);
 | 
	
		
			
				|  |  | -        manager.clusterChanged(event(clusterStateBuilder));
 | 
	
		
			
				|  |  | +        manager.clusterChanged(event(markShardsAvailable(clusterStateBuilder)));
 | 
	
		
			
				|  |  |          assertTrue(listenerCalled.get());
 | 
	
		
			
				|  |  |          assertFalse(upToDateChanged.get());
 | 
	
		
			
				|  |  |          assertTrue(manager.isIndexUpToDate());
 | 
	
	
		
			
				|  | @@ -370,23 +362,21 @@ public class SecurityIndexManagerTests extends ESTestCase {
 | 
	
		
			
				|  |  |          // Index initially exists
 | 
	
		
			
				|  |  |          final ClusterState.Builder indexAvailable = createClusterState(RestrictedIndicesNames.INTERNAL_SECURITY_MAIN_INDEX_7,
 | 
	
		
			
				|  |  |              RestrictedIndicesNames.SECURITY_MAIN_ALIAS, IndexMetadata.State.OPEN);
 | 
	
		
			
				|  |  | -        markShardsAvailable(indexAvailable);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        manager.clusterChanged(event(indexAvailable));
 | 
	
		
			
				|  |  | +        manager.clusterChanged(event(markShardsAvailable(indexAvailable)));
 | 
	
		
			
				|  |  |          assertThat(manager.indexExists(), is(true));
 | 
	
		
			
				|  |  |          assertThat(manager.isAvailable(), is(true));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // Now close it
 | 
	
		
			
				|  |  | -        final ClusterState.Builder indexClosed = createClusterState(RestrictedIndicesNames.INTERNAL_SECURITY_MAIN_INDEX_7,
 | 
	
		
			
				|  |  | +        ClusterState.Builder indexClosed = createClusterState(RestrictedIndicesNames.INTERNAL_SECURITY_MAIN_INDEX_7,
 | 
	
		
			
				|  |  |              RestrictedIndicesNames.SECURITY_MAIN_ALIAS, IndexMetadata.State.CLOSE);
 | 
	
		
			
				|  |  |          if (randomBoolean()) {
 | 
	
		
			
				|  |  |              // In old/mixed cluster versions closed indices have no routing table
 | 
	
		
			
				|  |  |              indexClosed.routingTable(RoutingTable.EMPTY_ROUTING_TABLE);
 | 
	
		
			
				|  |  |          } else {
 | 
	
		
			
				|  |  | -            markShardsAvailable(indexClosed);
 | 
	
		
			
				|  |  | +            indexClosed = ClusterState.builder(markShardsAvailable(indexClosed));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        manager.clusterChanged(event(indexClosed));
 | 
	
		
			
				|  |  | +        manager.clusterChanged(event(indexClosed.build()));
 | 
	
		
			
				|  |  |          assertThat(manager.indexExists(), is(true));
 | 
	
		
			
				|  |  |          assertThat(manager.isAvailable(), is(false));
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -427,8 +417,11 @@ public class SecurityIndexManagerTests extends ESTestCase {
 | 
	
		
			
				|  |  |          return ClusterState.builder(state()).metadata(metadataBuilder.build());
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private void markShardsAvailable(ClusterState.Builder clusterStateBuilder) {
 | 
	
		
			
				|  |  | -        clusterStateBuilder.routingTable(SecurityTestUtils.buildIndexRoutingTable(RestrictedIndicesNames.INTERNAL_SECURITY_MAIN_INDEX_7));
 | 
	
		
			
				|  |  | +    private ClusterState markShardsAvailable(ClusterState.Builder clusterStateBuilder) {
 | 
	
		
			
				|  |  | +        final ClusterState cs = clusterStateBuilder.build();
 | 
	
		
			
				|  |  | +        return ClusterState.builder(cs).routingTable(
 | 
	
		
			
				|  |  | +                SecurityTestUtils.buildIndexRoutingTable(
 | 
	
		
			
				|  |  | +                        cs.metadata().index(RestrictedIndicesNames.INTERNAL_SECURITY_MAIN_INDEX_7).getIndex())).build();
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private static ClusterState state() {
 |