Skip to content

Commit

Permalink
[karmi#209] Added support for creating index aliases with configurati…
Browse files Browse the repository at this point in the history
…on, cleaned up

* You can do `@index.add_alias 'index-aliased', :routing => '1'` now
* Fixed incorrect curl-formatted logs from alias operations
* More consistent naming
* Fixed expectations for Ruby 1.8
* Added integration test

Fixes karmi#209.
  • Loading branch information
karmi committed Apr 27, 2012
1 parent c3ea8de commit c45a060
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 17 deletions.
20 changes: 12 additions & 8 deletions lib/tire/index.rb
Expand Up @@ -36,33 +36,37 @@ def create(options={})
logged('CREATE', curl)
end

def add_alias(alias_name)
operation = {'actions' => [{'add' => {'index' => @name, 'alias' => alias_name}}]}
@response = Configuration.client.post "#{Configuration.url}/_aliases", MultiJson.encode(operation)
def add_alias(alias_name, configuration={})
payload = {'actions' => [ {'add' => {'index' => @name, 'alias' => alias_name}.merge(configuration) } ]}
@response = Configuration.client.post "#{Configuration.url}/_aliases", MultiJson.encode(payload)
@response.success?

ensure
curl = %Q|curl -X POST "#{Configuration.url}/_aliases -d '#{MultiJson.encode(operation)}'"|
curl = %Q|curl -X POST "#{Configuration.url}/_aliases" -d '#{MultiJson.encode(payload)}'|
logged('POST', curl)
end

def remove_alias(alias_name)
operation = {'actions' => [{'remove' => {'index' => @name, 'alias' => alias_name}}]}
@response = Configuration.client.post "#{Configuration.url}/_aliases", MultiJson.encode(operation)
payload = {'actions' => [{'remove' => {'index' => @name, 'alias' => alias_name}}]}
@response = Configuration.client.post "#{Configuration.url}/_aliases", MultiJson.encode(payload)
@response.success?

ensure
curl = %Q|curl -X POST "#{Configuration.url}/_aliases -d '#{MultiJson.encode(operation)}'"|
curl = %Q|curl -X POST "#{Configuration.url}/_aliases" -d '#{MultiJson.encode(payload)}'|
logged('POST', curl)
end

def aliases(alias_name = nil)
@response = Configuration.client.get "#{Configuration.url}/#{@name}/_aliases"
if alias_name
MultiJson.decode(@response.body)[@name]['aliases'].try(:[], alias_name)
MultiJson.decode(@response.body)[@name]['aliases'][alias_name]
else
MultiJson.decode(@response.body)[@name]['aliases'].keys
end

ensure
curl = %Q|curl "#{Configuration.url}/#{@name}/_aliases?pretty"|
logged('GET', curl)
end

def mapping
Expand Down
68 changes: 68 additions & 0 deletions test/integration/index_aliases_test.rb
@@ -0,0 +1,68 @@
require 'test_helper'

module Tire

class IndexAliasesIntegrationTest < Test::Unit::TestCase
include Test::Integration

context "With a filtered alias" do
setup do

@index = Tire.index 'index-original' do
delete
create
end

end

teardown { Tire.index('index-original').delete }

should "create the alias" do
@index.add_alias 'index-aliased'
assert_equal 1, @index.aliases.size
end

should "find only portion of documents in the filtered alias" do
Tire.index 'index-original' do
add_alias 'index-aliased', :filter => { :term => { :user => 'anne' } }
store :title => 'Document 1', :user => 'anne'
store :title => 'Document 2', :user => 'mary'

refresh
end

assert_equal 2, Tire.search('index-original') { query { all } }.results.size
assert_equal 1, Tire.search('index-aliased') { query { all } }.results.size
end

should "remove the alias" do
@index.add_alias 'index-aliased'
assert_equal 1, @index.aliases.size

@index.remove_alias 'index-aliased'
assert_equal 0, @index.aliases.size

assert_raise Tire::Search::SearchRequestFailed do
Tire.search('index-aliased') { query { all } }.results
end
end

should "retrieve a list of aliases for an index" do
@index.add_alias 'index-aliased'

assert_equal ['index-aliased'], @index.aliases
end

should "retrieve the properties of an alias" do
@index.add_alias 'index-aliased', :routing => '1'

assert_equal(
{ 'index_routing' => '1',
'search_routing' => '1' },
@index.aliases('index-aliased') )
end
end

end

end
29 changes: 20 additions & 9 deletions test/unit/index_test.rb
Expand Up @@ -54,32 +54,43 @@ class IndexTest < Test::Unit::TestCase

should "add an index alias" do
Configuration.client.expects(:post).with do |url, payload|
assert_equal({'actions' => [{'add' => {'index' => 'dummy', 'alias' => 'foo'}}]}.to_json, payload)
url =~ /_aliases/ &&
MultiJson.decode(payload)['actions'][0]['add'] == {'index' => 'dummy', 'alias' => 'foo'}
end.returns(mock_response('{"ok":true}'))

@index.add_alias('foo')
@index.add_alias 'foo'
end

should "add an index alias with configuration" do
Configuration.client.expects(:post).with do |url, payload|
url =~ /_aliases/ &&
MultiJson.decode(payload)['actions'][0]['add'] == {'index' => 'dummy', 'alias' => 'foo', 'routing' => 1 }
end.returns(mock_response('{"ok":true}'))

@index.add_alias 'foo', :routing => 1
end

should "delete an index alias" do
Configuration.client.expects(:post).with do |url, payload|
assert_equal({'actions' => [{'remove' => {'index' => 'dummy', 'alias' => 'foo'}}]}.to_json, payload)
url =~ /_aliases/ &&
MultiJson.decode(payload)['actions'][0]['remove'] == {'index' => 'dummy', 'alias' => 'foo'}
end.returns(mock_response('{"ok":true}'))

@index.remove_alias('foo')
@index.remove_alias 'foo'
end

should "list aliases on an index" do
should "list aliases for an index" do
json = {'dummy' => {'aliases' => {'foo' => {}}}}.to_json
Configuration.client.expects(:get).returns(mock_response(json))

assert_equal(['foo'], @index.aliases)
assert_equal ['foo'], @index.aliases
end

should "get the properties of an alias" do
json = {'dummy' => {'aliases' => {'foo' => {'some_config' => 'bar'}}}}.to_json
should "return properties of an alias" do
json = {'dummy' => { 'aliases' => {'foo' => { 'filter' => { 'term' => { 'user' => 'john' } }}} }}.to_json
Configuration.client.expects(:get).returns(mock_response(json))

assert_equal({'some_config' => 'bar'}, @index.aliases('foo'))
assert_equal( { 'filter' => { 'term' => {'user' => 'john'} } }, @index.aliases('foo') )
end

should "refresh the index" do
Expand Down

0 comments on commit c45a060

Please sign in to comment.