99
1010import org .elasticsearch .ResourceNotFoundException ;
1111import org .elasticsearch .Version ;
12- import org .elasticsearch .action .ActionListener ;
1312import org .elasticsearch .action .support .ActionFilters ;
13+ import org .elasticsearch .action .support .PlainActionFuture ;
1414import org .elasticsearch .cluster .ClusterInfo ;
1515import org .elasticsearch .cluster .ClusterInfoService ;
1616import org .elasticsearch .cluster .ClusterName ;
4040import org .elasticsearch .index .shard .ShardId ;
4141import org .elasticsearch .rest .RestStatus ;
4242import org .elasticsearch .tasks .Task ;
43+ import org .elasticsearch .tasks .TaskId ;
44+ import org .elasticsearch .test .AbstractChunkedSerializingTestCase ;
4345import org .elasticsearch .threadpool .ThreadPool ;
4446import org .elasticsearch .transport .TransportService ;
45- import org .mockito .ArgumentCaptor ;
4647
4748import java .util .HashMap ;
4849import java .util .List ;
4950import java .util .Map ;
5051import java .util .Optional ;
5152import java .util .Set ;
53+ import java .util .concurrent .TimeUnit ;
5254import java .util .stream .Collectors ;
5355
5456import static org .elasticsearch .cluster .ClusterModule .BALANCED_ALLOCATOR ;
5759import static org .hamcrest .Matchers .equalTo ;
5860import static org .hamcrest .Matchers .notNullValue ;
5961import static org .mockito .Mockito .mock ;
60- import static org .mockito .Mockito .verify ;
6162import static org .mockito .Mockito .when ;
6263
6364public class TransportGetDesiredBalanceActionTests extends ESAllocationTestCase {
@@ -74,13 +75,28 @@ public class TransportGetDesiredBalanceActionTests extends ESAllocationTestCase
7475 clusterInfoService ,
7576 TEST_WRITE_LOAD_FORECASTER
7677 );
77- @ SuppressWarnings ("unchecked" )
78- private final ActionListener <DesiredBalanceResponse > listener = mock (ActionListener .class );
78+
79+ private static DesiredBalanceResponse execute (TransportGetDesiredBalanceAction action , ClusterState clusterState ) throws Exception {
80+ return PlainActionFuture .get (
81+ future -> action .masterOperation (
82+ new Task (1 , "test" , GetDesiredBalanceAction .NAME , "" , TaskId .EMPTY_TASK_ID , Map .of ()),
83+ new DesiredBalanceRequest (),
84+ clusterState ,
85+ future
86+ ),
87+ 10 ,
88+ TimeUnit .SECONDS
89+ );
90+ }
91+
92+ private DesiredBalanceResponse executeAction (ClusterState clusterState ) throws Exception {
93+ return execute (transportGetDesiredBalanceAction , clusterState );
94+ }
7995
8096 public void testReturnsErrorIfAllocatorIsNotDesiredBalanced () throws Exception {
8197 var clusterState = ClusterState .builder (ClusterName .DEFAULT ).metadata (metadataWithConfiguredAllocator (BALANCED_ALLOCATOR )).build ();
8298
83- new TransportGetDesiredBalanceAction (
99+ final var action = new TransportGetDesiredBalanceAction (
84100 mock (TransportService .class ),
85101 mock (ClusterService .class ),
86102 mock (ThreadPool .class ),
@@ -89,12 +105,9 @@ public void testReturnsErrorIfAllocatorIsNotDesiredBalanced() throws Exception {
89105 mock (ShardsAllocator .class ),
90106 mock (ClusterInfoService .class ),
91107 mock (WriteLoadForecaster .class )
92- ).masterOperation (mock (Task .class ), mock (DesiredBalanceRequest .class ), clusterState , listener );
93-
94- ArgumentCaptor <ResourceNotFoundException > exceptionArgumentCaptor = ArgumentCaptor .forClass (ResourceNotFoundException .class );
95- verify (listener ).onFailure (exceptionArgumentCaptor .capture ());
108+ );
96109
97- final var exception = exceptionArgumentCaptor . getValue ( );
110+ final var exception = expectThrows ( ResourceNotFoundException . class , () -> execute ( action , clusterState ) );
98111 assertEquals ("Desired balance allocator is not in use, no desired balance found" , exception .getMessage ());
99112 assertThat (exception .status (), equalTo (RestStatus .NOT_FOUND ));
100113 }
@@ -104,12 +117,10 @@ public void testReturnsErrorIfDesiredBalanceIsNotAvailable() throws Exception {
104117 .metadata (metadataWithConfiguredAllocator (DESIRED_BALANCE_ALLOCATOR ))
105118 .build ();
106119
107- transportGetDesiredBalanceAction .masterOperation (mock (Task .class ), mock (DesiredBalanceRequest .class ), clusterState , listener );
108-
109- ArgumentCaptor <ResourceNotFoundException > exceptionArgumentCaptor = ArgumentCaptor .forClass (ResourceNotFoundException .class );
110- verify (listener ).onFailure (exceptionArgumentCaptor .capture ());
111-
112- assertEquals ("Desired balance is not computed yet" , exceptionArgumentCaptor .getValue ().getMessage ());
120+ assertEquals (
121+ "Desired balance is not computed yet" ,
122+ expectThrows (ResourceNotFoundException .class , () -> executeAction (clusterState )).getMessage ()
123+ );
113124 }
114125
115126 public void testGetDesiredBalance () throws Exception {
@@ -220,15 +231,15 @@ public void testGetDesiredBalance() throws Exception {
220231 .routingTable (routingTable )
221232 .build ();
222233
223- transportGetDesiredBalanceAction .masterOperation (mock (Task .class ), mock (DesiredBalanceRequest .class ), clusterState , listener );
224-
225- ArgumentCaptor <DesiredBalanceResponse > desiredBalanceResponseCaptor = ArgumentCaptor .forClass (DesiredBalanceResponse .class );
226- verify (listener ).onResponse (desiredBalanceResponseCaptor .capture ());
227- DesiredBalanceResponse desiredBalanceResponse = desiredBalanceResponseCaptor .getValue ();
234+ final var desiredBalanceResponse = executeAction (clusterState );
228235 assertThat (desiredBalanceResponse .getStats (), equalTo (desiredBalanceStats ));
229236 assertThat (desiredBalanceResponse .getClusterBalanceStats (), notNullValue ());
230237 assertThat (desiredBalanceResponse .getClusterInfo (), equalTo (clusterInfo ));
231238 assertEquals (indexShards .keySet (), desiredBalanceResponse .getRoutingTable ().keySet ());
239+
240+ assertEquals (desiredBalanceResponse , copyWriteable (desiredBalanceResponse , writableRegistry (), DesiredBalanceResponse ::from ));
241+ AbstractChunkedSerializingTestCase .assertChunkCount (desiredBalanceResponse , r -> 2 + r .getRoutingTable ().size ());
242+
232243 for (var e : desiredBalanceResponse .getRoutingTable ().entrySet ()) {
233244 String index = e .getKey ();
234245 Map <Integer , DesiredBalanceResponse .DesiredShards > shardsMap = e .getValue ();
@@ -267,14 +278,14 @@ public void testGetDesiredBalance() throws Exception {
267278 );
268279 assertEquals (indexMetadata .getTierPreference (), shardView .tierPreference ());
269280 }
270- Optional <ShardAssignment > shardAssignment = Optional .ofNullable (shardAssignments .get (indexShardRoutingTable .shardId ()));
271- if (shardAssignment .isPresent ()) {
272- assertEquals (shardAssignment .get ().nodeIds (), desiredShard .desired ().nodeIds ());
273- assertEquals (shardAssignment .get ().total (), desiredShard .desired ().total ());
274- assertEquals (shardAssignment .get ().unassigned (), desiredShard .desired ().unassigned ());
275- assertEquals (shardAssignment .get ().ignored (), desiredShard .desired ().ignored ());
281+ final var shardAssignment = shardAssignments .get (indexShardRoutingTable .shardId ());
282+ if (shardAssignment == null ) {
283+ assertSame (desiredShard .desired (), DesiredBalanceResponse .ShardAssignmentView .EMPTY );
276284 } else {
277- assertNull (desiredShard .desired ());
285+ assertEquals (shardAssignment .nodeIds (), desiredShard .desired ().nodeIds ());
286+ assertEquals (shardAssignment .total (), desiredShard .desired ().total ());
287+ assertEquals (shardAssignment .unassigned (), desiredShard .desired ().unassigned ());
288+ assertEquals (shardAssignment .ignored (), desiredShard .desired ().ignored ());
278289 }
279290 }
280291 }
0 commit comments