From 906e2e0749cb93ffe00f50416d5f369356e79272 Mon Sep 17 00:00:00 2001 From: Tim Nagel Date: Sat, 1 Nov 2014 19:33:05 +1100 Subject: [PATCH] Ability to set connectionStrategy for elastica clients --- CHANGELOG-3.0.md | 1 + DependencyInjection/Configuration.php | 11 +++++ .../doc/cookbook/multiple-connections.md | 5 ++ Tests/Functional/ClientTest.php | 48 +++++++++++++++++++ Tests/Functional/app/Basic/config.yml | 5 ++ 5 files changed, 70 insertions(+) create mode 100644 Tests/Functional/ClientTest.php diff --git a/CHANGELOG-3.0.md b/CHANGELOG-3.0.md index d7a826f..599d1f9 100644 --- a/CHANGELOG-3.0.md +++ b/CHANGELOG-3.0.md @@ -15,6 +15,7 @@ To generate a changelog summary since the last version, run * 3.0.8 (Unreleased) * Fixed handling of empty indexes #760 + * Added support for `connectionStrategy` Elastica configuration #732 * 3.0.7 (2015-01-21) diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index fa2c048..7ebce1b 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -84,6 +84,16 @@ class Configuration implements ConfigurationInterface return $v; }) ->end() + // Elastica names its properties with camel case, support both + ->beforeNormalization() + ->ifTrue(function ($v) { return isset($v['connection_strategy']); }) + ->then(function ($v) { + $v['connectionStrategy'] = $v['connection_strategy']; + unset($v['connection_strategy']); + + return $v; + }) + ->end() // If there is no connections array key defined, assume a single connection. ->beforeNormalization() ->ifTrue(function ($v) { return is_array($v) && !array_key_exists('connections', $v); }) @@ -124,6 +134,7 @@ class Configuration implements ConfigurationInterface ->end() ->scalarNode('timeout')->end() ->scalarNode('headers')->end() + ->scalarNode('connectionStrategy')->defaultValue('Simple')->end() ->end() ->end() ->end() diff --git a/Resources/doc/cookbook/multiple-connections.md b/Resources/doc/cookbook/multiple-connections.md index 7b5226c..9544359 100644 --- a/Resources/doc/cookbook/multiple-connections.md +++ b/Resources/doc/cookbook/multiple-connections.md @@ -11,6 +11,11 @@ fos_elastica: connections: - url: http://es1.example.net:9200 - url: http://es2.example.net:9200 + connection_strategy: RoundRobin ``` +Elastica allows for definition of different connection strategies and by default +supports `RoundRobin` and `Simple`. You can see definitions for these strategies +in the `Elastica\Connection\Strategy` namespace. + For more information on Elastica clustering see http://elastica.io/getting-started/installation.html#section-connect-cluster diff --git a/Tests/Functional/ClientTest.php b/Tests/Functional/ClientTest.php new file mode 100644 index 0000000..8a6357a --- /dev/null +++ b/Tests/Functional/ClientTest.php @@ -0,0 +1,48 @@ + + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace FOS\ElasticaBundle\Tests\Functional; + +use Symfony\Bundle\FrameworkBundle\Client; + +/** + * @group functional + */ +class ClientTest extends WebTestCase +{ + public function testContainerSource() + { + $client = $this->createClient(array('test_case' => 'Basic')); + + $es = $client->getContainer()->get('fos_elastica.client.default'); + $this->assertInstanceOf('Elastica\\Connection\\Strategy\\RoundRobin', $es->getConnectionStrategy()); + + $es = $client->getContainer()->get('fos_elastica.client.second_server'); + $this->assertInstanceOf('Elastica\\Connection\\Strategy\\RoundRobin', $es->getConnectionStrategy()); + + $es = $client->getContainer()->get('fos_elastica.client.third'); + $this->assertInstanceOf('Elastica\\Connection\\Strategy\\Simple', $es->getConnectionStrategy()); + } + + protected function setUp() + { + parent::setUp(); + + $this->deleteTmpDir('Basic'); + } + + protected function tearDown() + { + parent::tearDown(); + + $this->deleteTmpDir('Basic'); + } +} diff --git a/Tests/Functional/app/Basic/config.yml b/Tests/Functional/app/Basic/config.yml index 3d0e120..41a869e 100644 --- a/Tests/Functional/app/Basic/config.yml +++ b/Tests/Functional/app/Basic/config.yml @@ -15,7 +15,12 @@ fos_elastica: - url: http://localhost:9200 - host: localhost port: 9200 + connectionStrategy: RoundRobin second_server: + connections: + - url: http://localhost:9200 + connection_strategy: RoundRobin + third: url: http://localhost:9200 indexes: index: