eson-http 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE.md +20 -0
- data/README.md +111 -0
- data/Rakefile +31 -0
- data/bin/elshell +20 -0
- data/eson-http.gemspec +28 -0
- data/lib/eson-http.rb +55 -0
- data/lib/eson/http.rb +16 -0
- data/lib/eson/http/api.rb +13 -0
- data/lib/eson/http/client.rb +24 -0
- data/lib/eson/http/cluster/health.rb +15 -0
- data/lib/eson/http/cluster/nodes.rb +14 -0
- data/lib/eson/http/cluster/shutdown.rb +15 -0
- data/lib/eson/http/cluster/state.rb +16 -0
- data/lib/eson/http/cluster/stats.rb +18 -0
- data/lib/eson/http/core/bulk.rb +33 -0
- data/lib/eson/http/core/count.rb +26 -0
- data/lib/eson/http/core/delete.rb +14 -0
- data/lib/eson/http/core/delete_by_query.rb +22 -0
- data/lib/eson/http/core/get.rb +15 -0
- data/lib/eson/http/core/index.rb +26 -0
- data/lib/eson/http/core/mget.rb +23 -0
- data/lib/eson/http/core/more_like_this.rb +14 -0
- data/lib/eson/http/core/msearch.rb +47 -0
- data/lib/eson/http/core/percolate.rb +16 -0
- data/lib/eson/http/core/search.rb +29 -0
- data/lib/eson/http/core/simple_search.rb +18 -0
- data/lib/eson/http/indices/aliases.rb +14 -0
- data/lib/eson/http/indices/analyze.rb +14 -0
- data/lib/eson/http/indices/clear_cache.rb +18 -0
- data/lib/eson/http/indices/close_index.rb +14 -0
- data/lib/eson/http/indices/create_index.rb +14 -0
- data/lib/eson/http/indices/delete_index.rb +14 -0
- data/lib/eson/http/indices/delete_mapping.rb +17 -0
- data/lib/eson/http/indices/delete_template.rb +14 -0
- data/lib/eson/http/indices/exists.rb +14 -0
- data/lib/eson/http/indices/flush.rb +18 -0
- data/lib/eson/http/indices/get_mapping.rb +20 -0
- data/lib/eson/http/indices/get_settings.rb +18 -0
- data/lib/eson/http/indices/get_template.rb +14 -0
- data/lib/eson/http/indices/open_index.rb +14 -0
- data/lib/eson/http/indices/optimize.rb +18 -0
- data/lib/eson/http/indices/put_mapping.rb +16 -0
- data/lib/eson/http/indices/put_template.rb +14 -0
- data/lib/eson/http/indices/refresh.rb +18 -0
- data/lib/eson/http/indices/segments.rb +18 -0
- data/lib/eson/http/indices/snapshot.rb +18 -0
- data/lib/eson/http/indices/stats.rb +18 -0
- data/lib/eson/http/indices/status.rb +18 -0
- data/lib/eson/http/indices/update_settings.rb +18 -0
- data/lib/eson/http/request.rb +95 -0
- data/lib/eson/modules/response_parser.rb +22 -0
- data/lib/eson/modules/status_handler.rb +24 -0
- data/log4j.properties +18 -0
- data/test/http/client_test.rb +14 -0
- data/test/http/cluster_test.rb +58 -0
- data/test/http/index_test.rb +180 -0
- data/test/http/indices/basics_test.rb +257 -0
- data/test/http/query_test.rb +70 -0
- data/test/modules/query_plugin_test.rb +40 -0
- data/test/seeds/seeds.rb +30 -0
- data/test/test_config.rb +33 -0
- metadata +202 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
module Eson
|
2
|
+
module HTTP
|
3
|
+
module Snapshot
|
4
|
+
include Shared::Snapshot
|
5
|
+
extend API
|
6
|
+
|
7
|
+
request_method :post
|
8
|
+
|
9
|
+
def path
|
10
|
+
unless indices.empty?
|
11
|
+
"/{-list|,|indices}/_gateway/snapshot"
|
12
|
+
else
|
13
|
+
"/_gateway/snapshot"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Eson
|
2
|
+
module HTTP
|
3
|
+
module UpdateSettings
|
4
|
+
include Shared::UpdateSettings
|
5
|
+
extend API
|
6
|
+
|
7
|
+
request_method :put
|
8
|
+
|
9
|
+
def path
|
10
|
+
unless indices.empty?
|
11
|
+
"/{-list|,|indices}/_settings"
|
12
|
+
else
|
13
|
+
"/_settings"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module Eson
|
4
|
+
module HTTP
|
5
|
+
class Request < Eson::Request
|
6
|
+
# This middleware circumvents faradays detection of
|
7
|
+
# :get as special and emits a generic request - which
|
8
|
+
# can have a body...
|
9
|
+
# This is mostly due to ElasticSearchs reliance of
|
10
|
+
# Bodys on get and delete.
|
11
|
+
class GetHackMiddleware < Faraday::Middleware
|
12
|
+
def call(env)
|
13
|
+
env[:method] = "get" if env[:method] == :get
|
14
|
+
|
15
|
+
@app.call env
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_accessor :request_method
|
20
|
+
|
21
|
+
def base_resource
|
22
|
+
conn = Faraday.new(:url => client.node) do |builder|
|
23
|
+
builder.use Faraday::Response::Logger, Eson::HTTP.logger
|
24
|
+
builder.use GetHackMiddleware
|
25
|
+
|
26
|
+
builder.adapter :net_http
|
27
|
+
end
|
28
|
+
|
29
|
+
conn.basic_auth(*client.auth) if client.auth?
|
30
|
+
conn
|
31
|
+
end
|
32
|
+
|
33
|
+
def call
|
34
|
+
resource = base_resource
|
35
|
+
|
36
|
+
response = (
|
37
|
+
case request_method
|
38
|
+
when :get
|
39
|
+
resource.get fill do |req|
|
40
|
+
(req.body = source) if source
|
41
|
+
end
|
42
|
+
when :head
|
43
|
+
resource.head fill
|
44
|
+
when :delete
|
45
|
+
resource.delete(fill) do |req|
|
46
|
+
req.body = source if source
|
47
|
+
end
|
48
|
+
when :post
|
49
|
+
resource.post(fill, source)
|
50
|
+
when :put
|
51
|
+
resource.put(fill, source)
|
52
|
+
end
|
53
|
+
)
|
54
|
+
|
55
|
+
response
|
56
|
+
end
|
57
|
+
|
58
|
+
def fill
|
59
|
+
template = Addressable::Template.new(path)
|
60
|
+
|
61
|
+
template_keys = template.keys.map(&:to_sym)
|
62
|
+
expansions = {}
|
63
|
+
query_values = {}
|
64
|
+
|
65
|
+
url_params.each do |p|
|
66
|
+
val = self.send(p)
|
67
|
+
|
68
|
+
if template_keys.include? p
|
69
|
+
expansions[p] = val if val
|
70
|
+
else
|
71
|
+
query_values[p] = val if val
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
uri = template.expand(expansions)
|
76
|
+
uri.query_values = query_values unless query_values.empty?
|
77
|
+
uri
|
78
|
+
end
|
79
|
+
|
80
|
+
def url_params
|
81
|
+
if self.respond_to? :source_param
|
82
|
+
source_params = Array(source_param)
|
83
|
+
else
|
84
|
+
source_params = []
|
85
|
+
end
|
86
|
+
|
87
|
+
(parameters - source_params)
|
88
|
+
end
|
89
|
+
|
90
|
+
def request_method
|
91
|
+
@request_method || :get
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Eson
|
2
|
+
module ResponseParser
|
3
|
+
class JSONParseError < Eson::Error
|
4
|
+
attr_accessor :source
|
5
|
+
end
|
6
|
+
|
7
|
+
def call(*args)
|
8
|
+
parse(super)
|
9
|
+
end
|
10
|
+
|
11
|
+
def parse(response)
|
12
|
+
begin
|
13
|
+
MultiJson.decode(response.body) if response.body
|
14
|
+
rescue MultiJson::DecodeError => e
|
15
|
+
error = JSONParseError.new(e.message, response)
|
16
|
+
error.source = response.body
|
17
|
+
raise error
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Eson
|
2
|
+
module StatusHandler
|
3
|
+
def call(*args)
|
4
|
+
handle(super)
|
5
|
+
end
|
6
|
+
|
7
|
+
def handle(response)
|
8
|
+
case response.status
|
9
|
+
when 404
|
10
|
+
if /IndexMissingException/.match(response.body)
|
11
|
+
raise Eson::IndexNotFoundError.new(response.body, response)
|
12
|
+
else
|
13
|
+
raise Eson::NotFoundError.new(response, response)
|
14
|
+
end
|
15
|
+
else
|
16
|
+
if response.status >= 400
|
17
|
+
raise Eson::Error.new(response[:error], response)
|
18
|
+
else
|
19
|
+
response
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/log4j.properties
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
log4j.rootLogger=INFO, out
|
2
|
+
log4j.logger.jgroups=WARN
|
3
|
+
|
4
|
+
#log4j.logger.discovery=TRACE
|
5
|
+
#log4j.logger.cluster=TRACE
|
6
|
+
#log4j.logger.indices.cluster=DEBUG
|
7
|
+
#log4j.logger.index=TRACE
|
8
|
+
#log4j.logger.index.engine=DEBUG
|
9
|
+
#log4j.logger.index.shard=TRACE
|
10
|
+
#log4j.logger.index.cache=DEBUG
|
11
|
+
#log4j.logger.http=TRACE
|
12
|
+
#log4j.logger.monitor.jvm=DEBUG
|
13
|
+
#log4j.logger.cluster.action.shard=TRACE
|
14
|
+
#log4j.logger.index.gateway=TRACE
|
15
|
+
|
16
|
+
log4j.appender.out=org.apache.log4j.ConsoleAppender
|
17
|
+
log4j.appender.out.layout=org.apache.log4j.PatternLayout
|
18
|
+
log4j.appender.out.layout.ConversionPattern=[%d{ABSOLUTE}][%-5p][%-25c] %m%n
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require './test/test_config'
|
2
|
+
|
3
|
+
context "HTTP client" do
|
4
|
+
helper(:node) { Node::External.instance }
|
5
|
+
|
6
|
+
helper(:client) do
|
7
|
+
Eson::HTTP::Client.new(:server => "http://#{node.ip}:#{node.port}",
|
8
|
+
:logger => 'test/test.log',
|
9
|
+
:auto_call => false)
|
10
|
+
end
|
11
|
+
|
12
|
+
asserts("too many params") { client.index.params = {:foo => :bar} }.raises(NoMethodError)
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require './test/test_config'
|
2
|
+
|
3
|
+
context 'HTTP client cluster api' do
|
4
|
+
helper(:node) { Node::External.instance }
|
5
|
+
|
6
|
+
helper(:client) do
|
7
|
+
Eson::HTTP::Client.new(:server => "http://#{node.ip}:#{node.port}",
|
8
|
+
:logger => 'test/test.log')
|
9
|
+
end
|
10
|
+
|
11
|
+
context "cluster health" do
|
12
|
+
setup do
|
13
|
+
client.health
|
14
|
+
end
|
15
|
+
|
16
|
+
asserts("returns cluster info") { topic["cluster_name"]}.equals("elasticsearch")
|
17
|
+
end
|
18
|
+
|
19
|
+
context "cluster state" do
|
20
|
+
setup do
|
21
|
+
client.state
|
22
|
+
end
|
23
|
+
|
24
|
+
asserts("returns metadata") { topic["metadata"] }
|
25
|
+
end
|
26
|
+
|
27
|
+
context "cluster state with filtered metadata" do
|
28
|
+
setup do
|
29
|
+
client.state :filter_metadata => true
|
30
|
+
end
|
31
|
+
|
32
|
+
asserts("metadata") { topic["metadata"] }.equals(nil)
|
33
|
+
end
|
34
|
+
|
35
|
+
context "cluster nodes info" do
|
36
|
+
setup do
|
37
|
+
client.nodes
|
38
|
+
end
|
39
|
+
|
40
|
+
asserts("returns nodes info") { topic["nodes"] }
|
41
|
+
end
|
42
|
+
|
43
|
+
context "filtered cluster nodes" do
|
44
|
+
setup do
|
45
|
+
client.nodes :nodes => "non_existant_node"
|
46
|
+
end
|
47
|
+
|
48
|
+
asserts("returns no nodes info") { topic["nodes"] }.empty
|
49
|
+
end
|
50
|
+
|
51
|
+
context "stats" do
|
52
|
+
setup do
|
53
|
+
client.stats
|
54
|
+
end
|
55
|
+
|
56
|
+
asserts("returns nodes info") { topic["nodes"] }
|
57
|
+
end
|
58
|
+
end
|