forked from elastic/elasticsearch
-
Notifications
You must be signed in to change notification settings - Fork 0
/
groovy_update_spec.rb
150 lines (136 loc) · 6.87 KB
/
groovy_update_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
require_relative "../../../spec/es_spec_helper"
if ESHelper.es_version_satisfies?('>= 2', '< 6')
describe "Update actions using groovy scripts", :integration => true, :update_tests => 'groovy' do
require "logstash/outputs/elasticsearch"
def get_es_output( options={} )
settings = {
"manage_template" => true,
"index" => "logstash-update",
"template_overwrite" => true,
"hosts" => get_host_port(),
"action" => "update",
"script_lang" => "groovy"
}
LogStash::Outputs::ElasticSearch.new(settings.merge!(options))
end
before :each do
@es = get_client
# Delete all templates first.
# Clean ES of data before we start.
@es.indices.delete_template(:name => "*")
# This can fail if there are no indexes, ignore failure.
@es.indices.delete(:index => "*") rescue nil
@es.index(
:index => 'logstash-update',
:type => doc_type,
:id => "123",
:body => { :message => 'Test', :counter => 1 }
)
@es.indices.refresh
end
context "scripted updates" do
it "should increment a counter with event/doc 'count' variable" do
subject = get_es_output({ 'document_id' => "123", 'script' => 'scripted_update', 'script_type' => 'file' })
subject.register
subject.multi_receive([LogStash::Event.new("count" => 2)])
r = @es.get(:index => 'logstash-update', :type => doc_type, :id => "123", :refresh => true)
expect(r["_source"]["counter"]).to eq(3)
end
it "should increment a counter with event/doc '[data][count]' nested variable" do
subject = get_es_output({ 'document_id' => "123", 'script' => 'scripted_update_nested', 'script_type' => 'file' })
subject.register
subject.multi_receive([LogStash::Event.new("data" => { "count" => 3 })])
r = @es.get(:index => 'logstash-update', :type => doc_type, :id => "123", :refresh => true)
expect(r["_source"]["counter"]).to eq(4)
end
it "should increment a counter with event/doc 'count' variable with inline script" do
subject = get_es_output({
'document_id' => "123",
'script' => 'ctx._source.counter += event["counter"]',
'script_lang' => 'groovy',
'script_type' => 'inline'
})
subject.register
subject.multi_receive([LogStash::Event.new("counter" => 3 )])
r = @es.get(:index => 'logstash-update', :type => doc_type, :id => "123", :refresh => true)
expect(r["_source"]["counter"]).to eq(4)
end
it "should increment a counter with event/doc 'count' variable with event/doc as upsert and inline script" do
subject = get_es_output({
'document_id' => "123",
'doc_as_upsert' => true,
'script' => 'if( ctx._source.containsKey("counter") ){ ctx._source.counter += event["counter"]; } else { ctx._source.counter = event["counter"]; }',
'script_lang' => 'groovy',
'script_type' => 'inline'
})
subject.register
subject.multi_receive([LogStash::Event.new("counter" => 3 )])
r = @es.get(:index => 'logstash-update', :type => doc_type, :id => "123", :refresh => true)
expect(r["_source"]["counter"]).to eq(4)
end
it "should, with new doc, set a counter with event/doc 'count' variable with event/doc as upsert and inline script" do
subject = get_es_output({
'document_id' => "456",
'doc_as_upsert' => true,
'script' => 'if( ctx._source.containsKey("counter") ){ ctx._source.counter += event["count"]; } else { ctx._source.counter = event["count"]; }',
'script_lang' => 'groovy',
'script_type' => 'inline'
})
subject.register
subject.multi_receive([LogStash::Event.new("counter" => 3 )])
r = @es.get(:index => 'logstash-update', :type => doc_type, :id => "456", :refresh => true)
expect(r["_source"]["counter"]).to eq(3)
end
it "should increment a counter with event/doc 'count' variable with indexed script" do
@es.put_script lang: 'groovy', id: 'indexed_update', body: { script: 'ctx._source.counter += event["count"]' }
subject = get_es_output({
'document_id' => "123",
'script' => 'indexed_update',
'script_lang' => 'groovy',
'script_type' => 'indexed'
})
subject.register
subject.multi_receive([LogStash::Event.new("count" => 4 )])
r = @es.get(:index => 'logstash-update', :type => doc_type, :id => "123", :refresh => true)
expect(r["_source"]["counter"]).to eq(5)
end
end
context "when update with upsert" do
it "should create new documents with provided upsert" do
subject = get_es_output({ 'document_id' => "456", 'upsert' => '{"message": "upsert message"}' })
subject.register
subject.multi_receive([LogStash::Event.new("message" => "sample message here")])
r = @es.get(:index => 'logstash-update', :type => doc_type, :id => "456", :refresh => true)
expect(r["_source"]["message"]).to eq('upsert message')
end
it "should create new documents with event/doc as upsert" do
subject = get_es_output({ 'document_id' => "456", 'doc_as_upsert' => true })
subject.register
subject.multi_receive([LogStash::Event.new("message" => "sample message here")])
r = @es.get(:index => 'logstash-update', :type => doc_type, :id => "456", :refresh => true)
expect(r["_source"]["message"]).to eq('sample message here')
end
it "should fail on documents with event/doc as upsert at external version" do
subject = get_es_output({ 'document_id' => "456", 'doc_as_upsert' => true, 'version' => 999, "version_type" => "external" })
expect { subject.register }.to raise_error(LogStash::ConfigurationError)
end
end
context "updates with scripted upsert" do
it "should create new documents with upsert content" do
subject = get_es_output({ 'document_id' => "456", 'script' => 'scripted_update', 'upsert' => '{"message": "upsert message"}', 'script_type' => 'file' })
subject.register
subject.multi_receive([LogStash::Event.new("message" => "sample message here")])
r = @es.get(:index => 'logstash-update', :type => doc_type, :id => "456", :refresh => true)
expect(r["_source"]["message"]).to eq('upsert message')
end
it "should create new documents with event/doc as script params" do
subject = get_es_output({ 'document_id' => "456", 'script' => 'scripted_upsert', 'scripted_upsert' => true, 'script_type' => 'file' })
subject.register
subject.multi_receive([LogStash::Event.new("counter" => 1)])
@es.indices.refresh
r = @es.get(:index => 'logstash-update', :type => doc_type, :id => "456", :refresh => true)
expect(r["_source"]["counter"]).to eq(1)
end
end
end
end