use C4::Context;
use Koha::Database;
+use Koha::Exceptions::Config;
use Koha::SearchFields;
use Koha::SearchMarcMaps;
use JSON;
use Modern::Perl;
use Readonly;
+use Search::Elasticsearch;
+use Try::Tiny;
use YAML::Syck;
use Data::Dumper; # TODO remove
return "Unable to perform your search. Please try again.\n";
}
+=head2 _read_configuration
+
+ my $conf = _read_configuration();
+
+Reads the I<configuration file> and returns a hash structure with the
+configuration information. It raises an exception if mandatory entries
+are missing.
+
+The hashref structure has the following form:
+
+ {
+ 'nodes' => ['127.0.0.1:9200', 'anotherserver:9200'],
+ 'index_name' => 'koha_instance',
+ }
+
+This is configured by the following in the C<config> block in koha-conf.xml:
+
+ <elasticsearch>
+ <server>127.0.0.1:9200</server>
+ <server>anotherserver:9200</server>
+ <index_name>koha_instance</index_name>
+ </elasticsearch>
+
+=cut
+
+sub _read_configuration {
+
+ my $configuration;
+
+ my $conf = C4::Context->config('elasticsearch');
+ Koha::Exceptions::Config::MissingEntry->throw(
+ "Missing 'elasticsearch' block in config file")
+ unless defined $conf;
+
+ if ( $conf && $conf->{server} ) {
+ my $nodes = $conf->{server};
+ if ( ref($nodes) eq 'ARRAY' ) {
+ $configuration->{nodes} = $nodes;
+ }
+ else {
+ $configuration->{nodes} = [$nodes];
+ }
+ }
+ else {
+ Koha::Exceptions::Config::MissingEntry->throw(
+ "Missing 'server' entry in config file for elasticsearch");
+ }
+
+ if ( defined $conf->{index_name} ) {
+ $configuration->{index_name} = $conf->{index_name};
+ }
+ else {
+ Koha::Exceptions::Config::MissingEntry->throw(
+ "Missing 'index_name' entry in config file for elasticsearch");
+ }
+
+ return $configuration;
+}
+
1;
__END__
--- /dev/null
+#!/usr/bin/perl
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
+
+use Modern::Perl;
+
+use Test::More tests => 1;
+use Test::Exception;
+
+use t::lib::Mocks;
+
+use Koha::SearchEngine::Elasticsearch;
+
+subtest '_read_configuration() tests' => sub {
+
+ plan tests => 10;
+
+ my $configuration;
+ t::lib::Mocks::mock_config( 'elasticsearch', undef );
+
+ # 'elasticsearch' missing in configuration
+ throws_ok {
+ $configuration = Koha::SearchEngine::Elasticsearch::_read_configuration;
+ }
+ 'Koha::Exceptions::Config::MissingEntry',
+ 'Configuration problem, exception thrown';
+ is(
+ $@->message,
+ "Missing 'elasticsearch' block in config file",
+ 'Exception message is correct'
+ );
+
+ # 'elasticsearch' present but no 'server' entry
+ t::lib::Mocks::mock_config( 'elasticsearch', {} );
+ throws_ok {
+ $configuration = Koha::SearchEngine::Elasticsearch::_read_configuration;
+ }
+ 'Koha::Exceptions::Config::MissingEntry',
+ 'Configuration problem, exception thrown';
+ is(
+ $@->message,
+ "Missing 'server' entry in config file for elasticsearch",
+ 'Exception message is correct'
+ );
+
+ # 'elasticsearch' and 'server' entries present, but no 'index_name'
+ t::lib::Mocks::mock_config( 'elasticsearch', { server => 'a_server' } );
+ throws_ok {
+ $configuration = Koha::SearchEngine::Elasticsearch::_read_configuration;
+ }
+ 'Koha::Exceptions::Config::MissingEntry',
+ 'Configuration problem, exception thrown';
+ is(
+ $@->message,
+ "Missing 'index_name' entry in config file for elasticsearch",
+ 'Exception message is correct'
+ );
+
+ # Correct configuration, only one server
+ t::lib::Mocks::mock_config( 'elasticsearch', { server => 'a_server', index_name => 'index' } );
+
+ $configuration = Koha::SearchEngine::Elasticsearch::_read_configuration;
+ is( $configuration->{index_name}, 'index', 'Index configuration parsed correctly' );
+ is_deeply( $configuration->{nodes}, ['a_server'], 'Server configuration parsed correctly' );
+
+ # Correct configuration, two servers
+ my @servers = ('a_server', 'another_server');
+ t::lib::Mocks::mock_config( 'elasticsearch', { server => \@servers, index_name => 'index' } );
+
+ $configuration = Koha::SearchEngine::Elasticsearch::_read_configuration;
+ is( $configuration->{index_name}, 'index', 'Index configuration parsed correctly' );
+ is_deeply( $configuration->{nodes}, \@servers , 'Server configuration parsed correctly' );
+};