The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use Test::More;
use Test::Exception;
use strict;
use warnings;
our ( $es, $instances );
my ( $r, $shards, %nodes, $node1, $node2, $node3 );

ok $r = $es->cluster_reroute->{state}, 'Reroute, no commands';

ok %nodes = %{ $r->{nodes} }, ' - has nodes';
ok keys %nodes == $instances, ' - nodes has all instances';
ok $shards = $r->{routing_table}{indices}{es_test_1}{shards}{0},
    ' - routing table';

ok $node1 = $shards->[0]{node}, ' - node 1';
delete $nodes{$node1};
ok $node2 = $shards->[1]{node}, ' - node 2';
delete $nodes{$node2};
ok $node3 = ( keys %nodes )[0], ' - node 3';

throws_ok {
    $es->cluster_reroute(
        commands => {
            move => {
                index     => 'es_test_1',
                shard     => 0,
                from_node => $node1,
                to_node   => $node2
            }
        }
    );
}
qr/not allowed/, ' - bad move';

ok $shards= $es->cluster_reroute(
    dry_run  => 1,
    commands => {
        move => {
            index     => 'es_test_1',
            shard     => 0,
            from_node => $node1,
            to_node   => $node3
        }
    }
    )->{state}{routing_table}{indices}{es_test_1}{shards}{0},
    ' - dry run';

is $shards->[0]{state}, 'RELOCATING', ' - dry run node relocating';
is $shards->[0]{relocating_node}, $node3, ' - dry run new node';

ok $shards
    = $es->cluster_reroute()
    ->{state}{routing_table}{indices}{es_test_1}{shards}{0},
    ' - post dry run';

is $shards->[0]{state}, 'STARTED', ' - node started';
is $shards->[0]{node}, $node1, ' - node not moved';

ok $shards= $es->cluster_reroute(
    commands => {
        move => {
            index     => 'es_test_1',
            shard     => 0,
            from_node => $node1,
            to_node   => $node3
        }
    }
    )->{state}{routing_table}{indices}{es_test_1}{shards}{0},
    ' - real reroute';

is $shards->[0]{state}, 'RELOCATING', ' - real run node relocating';
is $shards->[0]{relocating_node}, $node3, ' - real run new node';

wait_for_es(3);

ok $shards
    = $es->cluster_reroute()
    ->{state}{routing_table}{indices}{es_test_1}{shards}{0},
    ' - post real run';

TODO: {
    local $TODO = "Shards don't move predictably";
    is $shards->[0]{state}, 'STARTED', ' - node started';
    is $shards->[0]{node}, $node3, ' - node moved';

}

1;