App-ElasticSearch-Utilities
view release on metacpan or search on metacpan
lib/App/ElasticSearch/Utilities/VersionHacks.pm view on Meta::CPAN
# ABSTRACT: Fix version issues to support all the things
package App::ElasticSearch::Utilities::VersionHacks;
use v5.16;
use warnings;
use version;
our $VERSION = '9.0'; # VERSION
use Const::Fast;
use CLI::Helpers qw(:all);
use Sub::Exporter -setup => {
exports => [ qw(
_fix_version_request
)],
};
const my $MIN_VERSION => 1.0;
const my %SIMPLE => (
'_cluster/nodes' => {
default => '_nodes',
},
'_optimize' => {
default => '_forcemerge',
},
'_status' => {
default => '_stats',
}
);
my %CALLBACKS = (
'_cluster/state' => {
default => \&_cluster_state_1_0,
},
'_search' => {
default => \&_search_params,
},
'_cat/shards' => {
default => \&_cat_shards,
},
);
sub _fix_version_request {
my ($version,$url,$options,$data) = @_;
return ($url,$options,$data) unless length $version;
if (version->parse($version) < $MIN_VERSION) {
output({stderr=>1,color=>'red',sticky=>1},
"!!! Detected ElasticSearch Version '$version', which is < $MIN_VERSION, please upgrade your cluster !!!");
exit 1;
}
if(exists $SIMPLE{$url}) {
my $versions = join(", ", sort keys %{ $SIMPLE{$url} });
debug("Method changed in API, evaluating rewrite ($versions) against $version");
if(exists $SIMPLE{$url}->{$version}) {
debug({indent=>1,color=>'yellow'}, "+ Rewriting $url to $SIMPLE{$url}->{$version}");
$url = $SIMPLE{$url}->{$version};
}
elsif(exists $SIMPLE{$url}->{default}) {
debug({indent=>1,color=>'yellow'}, "+ Rewriting $url to $SIMPLE{$url}->{default} by default rule");
$url = $SIMPLE{$url}->{default};
}
}
else {
my $cb;
foreach my $check (keys %CALLBACKS) {
next unless $url =~ /^\Q$check\E/i;
$cb = $check;
last;
}
if( defined $cb ) {
my $versions = join(", ", sort keys %{ $CALLBACKS{$cb} });
debug("Method changed in API, evaluating callback for $cb ($versions) against $version");
if(exists $CALLBACKS{$url}->{$version}) {
debug({indent=>1,color=>'yellow'}, "+ Callback dispatched for $url");
($url,$options,$data) = $CALLBACKS{$url}->{$version}->($url,$options,$data,$version);
}
elsif(exists $CALLBACKS{$url}->{default}) {
debug({indent=>1,color=>'yellow'}, "+ Callback dispatched for $url by default rule");
($url,$options,$data) = $CALLBACKS{$url}->{default}->($url,$options,$data,$version);
}
}
}
return ($url,$options,$data);
}
my %_cluster_state = map { $_ => 1 } qw(
nodes
routing_table
metadata
indices
blocks
version
master_node
);
sub _cluster_state_1_0 {
my ($url,$options,$data,$version) = @_;
my @parts = split /\//, $url;
# Translate old to new
if( @parts < 3 ) {
verbose({color=>'yellow'}, "DEPRECATION: Attempting to use legacy API for _cluster/state on ES $version");
verbose({level=>2,indent=>1}, "See: http://www.elasticsearch.org/guide/en/reference/$version/cluster-state.html#cluster-state");
my @requested = ();
( run in 1.036 second using v1.01-cache-2.11-cpan-5c0b1e786e0 )