Merge branch 'master' into cli-parsing

Original commit: elastic/x-pack-elasticsearch@bfe0cdc477
This commit is contained in:
Ryan Ernst 2016-03-08 14:17:44 -08:00
commit 64419c0856
55 changed files with 378 additions and 221 deletions

View File

@ -34,7 +34,7 @@ import org.elasticsearch.watcher.input.search.SearchInput;
import org.elasticsearch.watcher.input.search.SearchInputFactory; import org.elasticsearch.watcher.input.search.SearchInputFactory;
import org.elasticsearch.watcher.input.simple.ExecutableSimpleInput; import org.elasticsearch.watcher.input.simple.ExecutableSimpleInput;
import org.elasticsearch.watcher.input.simple.SimpleInput; import org.elasticsearch.watcher.input.simple.SimpleInput;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import org.elasticsearch.watcher.support.text.TextTemplate; import org.elasticsearch.watcher.support.text.TextTemplate;
import org.elasticsearch.watcher.trigger.schedule.IntervalSchedule; import org.elasticsearch.watcher.trigger.schedule.IntervalSchedule;
import org.elasticsearch.watcher.trigger.schedule.ScheduleTrigger; import org.elasticsearch.watcher.trigger.schedule.ScheduleTrigger;
@ -132,7 +132,7 @@ public class SearchInputIT extends ESIntegTestCase {
.source(searchSourceBuilder); .source(searchSourceBuilder);
ExecutableSearchInput searchInput = new ExecutableSearchInput(new SearchInput(request, null, null, null), logger, ExecutableSearchInput searchInput = new ExecutableSearchInput(new SearchInput(request, null, null, null), logger,
ClientProxy.of(client()), null); WatcherClientProxy.of(client()), null);
WatchExecutionContext ctx = new TriggeredExecutionContext( WatchExecutionContext ctx = new TriggeredExecutionContext(
new Watch("test-watch", new Watch("test-watch",
new ScheduleTrigger(new IntervalSchedule(new IntervalSchedule.Interval(1, IntervalSchedule.Interval.Unit.MINUTES))), new ScheduleTrigger(new IntervalSchedule(new IntervalSchedule.Interval(1, IntervalSchedule.Interval.Unit.MINUTES))),
@ -244,7 +244,7 @@ public class SearchInputIT extends ESIntegTestCase {
.source(searchSourceBuilder); .source(searchSourceBuilder);
ExecutableSearchInput searchInput = new ExecutableSearchInput(new SearchInput(request, null, null, null), logger, ExecutableSearchInput searchInput = new ExecutableSearchInput(new SearchInput(request, null, null, null), logger,
ClientProxy.of(client()), null); WatcherClientProxy.of(client()), null);
WatchExecutionContext ctx = new TriggeredExecutionContext( WatchExecutionContext ctx = new TriggeredExecutionContext(
new Watch("test-watch", new Watch("test-watch",
new ScheduleTrigger(new IntervalSchedule(new IntervalSchedule.Interval(1, IntervalSchedule.Interval.Unit.MINUTES))), new ScheduleTrigger(new IntervalSchedule(new IntervalSchedule.Interval(1, IntervalSchedule.Interval.Unit.MINUTES))),
@ -281,7 +281,7 @@ public class SearchInputIT extends ESIntegTestCase {
parser.nextToken(); parser.nextToken();
IndicesQueriesRegistry indicesQueryRegistry = internalCluster().getInstance(IndicesQueriesRegistry.class); IndicesQueriesRegistry indicesQueryRegistry = internalCluster().getInstance(IndicesQueriesRegistry.class);
SearchInputFactory factory = new SearchInputFactory(Settings.EMPTY, ClientProxy.of(client()), indicesQueryRegistry, null); SearchInputFactory factory = new SearchInputFactory(Settings.EMPTY, WatcherClientProxy.of(client()), indicesQueryRegistry, null);
SearchInput searchInput = factory.parseInput("_id", parser); SearchInput searchInput = factory.parseInput("_id", parser);
assertEquals(SearchInput.TYPE, searchInput.type()); assertEquals(SearchInput.TYPE, searchInput.type());
@ -311,7 +311,7 @@ public class SearchInputIT extends ESIntegTestCase {
SearchInput si = siBuilder.build(); SearchInput si = siBuilder.build();
ExecutableSearchInput searchInput = new ExecutableSearchInput(si, logger, ClientProxy.of(client()), null); ExecutableSearchInput searchInput = new ExecutableSearchInput(si, logger, WatcherClientProxy.of(client()), null);
return searchInput.execute(ctx, new Payload.Simple()); return searchInput.execute(ctx, new Payload.Simple());
} }

View File

@ -37,7 +37,7 @@ import org.elasticsearch.watcher.execution.TriggeredExecutionContext;
import org.elasticsearch.watcher.execution.WatchExecutionContext; import org.elasticsearch.watcher.execution.WatchExecutionContext;
import org.elasticsearch.watcher.input.simple.ExecutableSimpleInput; import org.elasticsearch.watcher.input.simple.ExecutableSimpleInput;
import org.elasticsearch.watcher.input.simple.SimpleInput; import org.elasticsearch.watcher.input.simple.SimpleInput;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import org.elasticsearch.watcher.support.text.TextTemplate; import org.elasticsearch.watcher.support.text.TextTemplate;
import org.elasticsearch.watcher.transform.Transform; import org.elasticsearch.watcher.transform.Transform;
import org.elasticsearch.watcher.transform.TransformBuilders; import org.elasticsearch.watcher.transform.TransformBuilders;
@ -154,7 +154,7 @@ public class SearchTransformIT extends ESIntegTestCase {
SearchRequest request = Requests.searchRequest("idx").source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery())); SearchRequest request = Requests.searchRequest("idx").source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
SearchTransform searchTransform = TransformBuilders.searchTransform(request).build(); SearchTransform searchTransform = TransformBuilders.searchTransform(request).build();
ExecutableSearchTransform transform = new ExecutableSearchTransform(searchTransform, logger, ClientProxy.of(client()), null); ExecutableSearchTransform transform = new ExecutableSearchTransform(searchTransform, logger, WatcherClientProxy.of(client()), null);
WatchExecutionContext ctx = mockExecutionContext("_name", EMPTY_PAYLOAD); WatchExecutionContext ctx = mockExecutionContext("_name", EMPTY_PAYLOAD);
@ -188,7 +188,7 @@ public class SearchTransformIT extends ESIntegTestCase {
new SearchSourceBuilder().query(QueryBuilders.wrapperQuery(jsonBuilder().startObject() new SearchSourceBuilder().query(QueryBuilders.wrapperQuery(jsonBuilder().startObject()
.startObject("_unknown_query_").endObject().endObject().bytes()))); .startObject("_unknown_query_").endObject().endObject().bytes())));
SearchTransform searchTransform = TransformBuilders.searchTransform(request).build(); SearchTransform searchTransform = TransformBuilders.searchTransform(request).build();
ExecutableSearchTransform transform = new ExecutableSearchTransform(searchTransform, logger, ClientProxy.of(client()), null); ExecutableSearchTransform transform = new ExecutableSearchTransform(searchTransform, logger, WatcherClientProxy.of(client()), null);
WatchExecutionContext ctx = mockExecutionContext("_name", EMPTY_PAYLOAD); WatchExecutionContext ctx = mockExecutionContext("_name", EMPTY_PAYLOAD);
@ -252,7 +252,7 @@ public class SearchTransformIT extends ESIntegTestCase {
.must(termQuery("value", "{{ctx.payload.value}}")))); .must(termQuery("value", "{{ctx.payload.value}}"))));
SearchTransform searchTransform = TransformBuilders.searchTransform(request).build(); SearchTransform searchTransform = TransformBuilders.searchTransform(request).build();
ExecutableSearchTransform transform = new ExecutableSearchTransform(searchTransform, logger, ClientProxy.of(client()), null); ExecutableSearchTransform transform = new ExecutableSearchTransform(searchTransform, logger, WatcherClientProxy.of(client()), null);
ScheduleTriggerEvent event = new ScheduleTriggerEvent("_name", parseDate("2015-01-04T00:00:00", UTC), ScheduleTriggerEvent event = new ScheduleTriggerEvent("_name", parseDate("2015-01-04T00:00:00", UTC),
parseDate("2015-01-01T00:00:00", UTC)); parseDate("2015-01-01T00:00:00", UTC));
@ -318,7 +318,7 @@ public class SearchTransformIT extends ESIntegTestCase {
parser.nextToken(); parser.nextToken();
IndicesQueriesRegistry indicesQueryRegistry = internalCluster().getInstance(IndicesQueriesRegistry.class); IndicesQueriesRegistry indicesQueryRegistry = internalCluster().getInstance(IndicesQueriesRegistry.class);
SearchTransformFactory transformFactory = new SearchTransformFactory(Settings.EMPTY, ClientProxy.of(client()), SearchTransformFactory transformFactory = new SearchTransformFactory(Settings.EMPTY, WatcherClientProxy.of(client()),
indicesQueryRegistry, indicesQueryRegistry,
null); null);
ExecutableSearchTransform executable = transformFactory.parseExecutable("_id", parser); ExecutableSearchTransform executable = transformFactory.parseExecutable("_id", parser);
@ -482,7 +482,7 @@ public class SearchTransformIT extends ESIntegTestCase {
SearchTransform searchTransform = TransformBuilders.searchTransform(request).build(); SearchTransform searchTransform = TransformBuilders.searchTransform(request).build();
ExecutableSearchTransform executableSearchTransform = new ExecutableSearchTransform(searchTransform, logger, ExecutableSearchTransform executableSearchTransform = new ExecutableSearchTransform(searchTransform, logger,
ClientProxy.of(client()), null); WatcherClientProxy.of(client()), null);
return executableSearchTransform.execute(ctx, Payload.Simple.EMPTY); return executableSearchTransform.execute(ctx, Payload.Simple.EMPTY);
} }

View File

@ -28,7 +28,8 @@ integTest {
'indices.shard_stores/10_basic/no indices test', 'indices.shard_stores/10_basic/no indices test',
'cat.nodeattrs/10_basic/Test cat nodes attrs output', 'cat.nodeattrs/10_basic/Test cat nodes attrs output',
'bulk/40_fields/Fields', 'bulk/40_fields/Fields',
'indices.get_alias/10_basic/Get alias against closed indices'].join(',') 'indices.get_alias/10_basic/Get alias against closed indices',
'ingest/10_crud/Check availability of default processors'].join(',')
cluster { cluster {
plugin 'x-pack', project(':x-plugins:elasticsearch:x-pack') plugin 'x-pack', project(':x-plugins:elasticsearch:x-pack')

View File

@ -292,7 +292,8 @@ public class HttpExporterTests extends MarvelIntegTestCase {
logger.info("--> starting node"); logger.info("--> starting node");
// returning an unsupported cluster version // returning an unsupported cluster version
enqueueGetClusterVersionResponse(randomFrom(Version.V_0_18_0, Version.V_1_0_0, Version.V_1_4_0)); enqueueGetClusterVersionResponse(randomFrom(Version.fromString("0.18.0"), Version.fromString("1.0.0"),
Version.fromString("1.4.0")));
String agentNode = internalCluster().startNode(builder); String agentNode = internalCluster().startNode(builder);
@ -431,8 +432,8 @@ public class HttpExporterTests extends MarvelIntegTestCase {
Version resolved = exporter.loadRemoteClusterVersion(host); Version resolved = exporter.loadRemoteClusterVersion(host);
assertTrue(resolved.equals(Version.CURRENT)); assertTrue(resolved.equals(Version.CURRENT));
final Version expected = randomFrom(Version.CURRENT, Version.V_0_18_0, Version.V_1_1_0, Version.V_1_2_4, final Version expected = randomFrom(Version.CURRENT, Version.V_2_0_0_beta1, Version.V_2_0_0_beta2, Version.V_2_0_0_rc1,
Version.V_1_4_5, Version.V_1_6_0); Version.V_2_0_0, Version.V_2_1_0, Version.V_2_2_0, Version.V_2_3_0);
enqueueGetClusterVersionResponse(expected); enqueueGetClusterVersionResponse(expected);
resolved = exporter.loadRemoteClusterVersion(host); resolved = exporter.loadRemoteClusterVersion(host);
assertTrue(resolved.equals(expected)); assertTrue(resolved.equals(expected));

View File

@ -31,6 +31,7 @@ import org.elasticsearch.index.fielddata.FieldDataStats;
import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.index.shard.ShardId;
import org.elasticsearch.index.shard.ShardPath; import org.elasticsearch.index.shard.ShardPath;
import org.elasticsearch.indices.NodeIndicesStats; import org.elasticsearch.indices.NodeIndicesStats;
import org.elasticsearch.ingest.core.IngestInfo;
import org.elasticsearch.marvel.agent.collector.cluster.ClusterStatsMonitoringDoc; import org.elasticsearch.marvel.agent.collector.cluster.ClusterStatsMonitoringDoc;
import org.elasticsearch.marvel.agent.exporter.MarvelTemplateUtils; import org.elasticsearch.marvel.agent.exporter.MarvelTemplateUtils;
import org.elasticsearch.marvel.agent.resolver.MonitoringIndexNameResolverTestCase; import org.elasticsearch.marvel.agent.resolver.MonitoringIndexNameResolverTestCase;
@ -112,7 +113,7 @@ public class ClusterStatsResolverTests extends MonitoringIndexNameResolverTestCa
Settings.EMPTY, DummyOsInfo.INSTANCE, new ProcessInfo(randomInt(), randomBoolean()), JvmInfo.jvmInfo(), Settings.EMPTY, DummyOsInfo.INSTANCE, new ProcessInfo(randomInt(), randomBoolean()), JvmInfo.jvmInfo(),
new ThreadPoolInfo(Collections.singletonList(new ThreadPool.Info("test_threadpool", ThreadPool.ThreadPoolType.FIXED, 5))), new ThreadPoolInfo(Collections.singletonList(new ThreadPool.Info("test_threadpool", ThreadPool.ThreadPoolType.FIXED, 5))),
new TransportInfo(transportAddress, Collections.emptyMap()), new HttpInfo(transportAddress, randomLong()), new TransportInfo(transportAddress, Collections.emptyMap()), new HttpInfo(transportAddress, randomLong()),
new PluginsAndModules()); new PluginsAndModules(), new IngestInfo());
} }

View File

@ -16,8 +16,9 @@ import static org.hamcrest.Matchers.equalTo;
public class VersionUtilsTests extends ESTestCase { public class VersionUtilsTests extends ESTestCase {
public void testParseVersion() { public void testParseVersion() {
List<Version> versions = randomSubsetOf(9, Version.V_0_18_0, Version.V_0_19_0, Version.V_1_0_1, Version.V_1_2_3, Version.V_1_3_2, List<Version> versions = randomSubsetOf(9, Version.V_2_0_0_beta1, Version.V_2_0_0_beta2, Version.V_2_0_0_rc1, Version.V_2_0_0,
Version.V_1_4_5, Version.V_1_6_2, Version.V_1_7_2, Version.V_2_0_0); Version.V_2_0_1, Version.V_2_0_2, Version.V_2_1_0, Version.V_2_1_1, Version.V_2_1_2, Version.V_2_2_0, Version.V_2_3_0,
Version.V_5_0_0);
for (Version version : versions) { for (Version version : versions) {
String output = createOutput(VersionUtils.VERSION_NUMBER_FIELD, version.toString()); String output = createOutput(VersionUtils.VERSION_NUMBER_FIELD, version.toString());
assertThat(VersionUtils.parseVersion(output.getBytes(StandardCharsets.UTF_8)), equalTo(version)); assertThat(VersionUtils.parseVersion(output.getBytes(StandardCharsets.UTF_8)), equalTo(version));

View File

@ -125,6 +125,14 @@ export HOSTNAME=`hostname -s`
# include shield jars in classpath # include shield jars in classpath
ES_CLASSPATH="$ES_CLASSPATH:$ES_HOME/plugins/xpack/*" ES_CLASSPATH="$ES_CLASSPATH:$ES_HOME/plugins/xpack/*"
# don't let JAVA_TOOL_OPTIONS slip in (e.g. crazy agents in ubuntu)
# works around https://bugs.launchpad.net/ubuntu/+source/jayatana/+bug/1441487
if [ "x$JAVA_TOOL_OPTIONS" != "x" ]; then
echo "Warning: Ignoring JAVA_TOOL_OPTIONS=$JAVA_TOOL_OPTIONS"
echo "Please pass JVM parameters via ES_JAVA_OPTS instead"
unset JAVA_TOOL_OPTIONS
fi
cd "$ES_HOME" > /dev/null cd "$ES_HOME" > /dev/null
"$JAVA" $ES_JAVA_OPTS -cp "$ES_CLASSPATH" -Des.path.home="$ES_HOME" $properties org.elasticsearch.shield.authc.esusers.tool.ESUsersTool "$@" "$JAVA" $ES_JAVA_OPTS -cp "$ES_CLASSPATH" -Des.path.home="$ES_HOME" $properties org.elasticsearch.shield.authc.esusers.tool.ESUsersTool "$@"
status=$? status=$?

View File

@ -125,8 +125,16 @@ export HOSTNAME=`hostname -s`
# include shield jars in classpath # include shield jars in classpath
ES_CLASSPATH="$ES_CLASSPATH:$ES_HOME/plugins/xpack/*" ES_CLASSPATH="$ES_CLASSPATH:$ES_HOME/plugins/xpack/*"
# don't let JAVA_TOOL_OPTIONS slip in (e.g. crazy agents in ubuntu)
# works around https://bugs.launchpad.net/ubuntu/+source/jayatana/+bug/1441487
if [ "x$JAVA_TOOL_OPTIONS" != "x" ]; then
echo "Warning: Ignoring JAVA_TOOL_OPTIONS=$JAVA_TOOL_OPTIONS"
echo "Please pass JVM parameters via ES_JAVA_OPTS instead"
unset JAVA_TOOL_OPTIONS
fi
cd "$ES_HOME" > /dev/null cd "$ES_HOME" > /dev/null
$JAVA $ES_JAVA_OPTS -cp "$ES_CLASSPATH" -Des.path.home="$ES_HOME" $properties org.elasticsearch.shield.crypto.tool.SystemKeyTool "$@" "$JAVA" $ES_JAVA_OPTS -cp "$ES_CLASSPATH" -Des.path.home="$ES_HOME" $properties org.elasticsearch.shield.crypto.tool.SystemKeyTool "$@"
status=$? status=$?
cd - > /dev/null cd - > /dev/null
exit $status exit $status

View File

@ -325,6 +325,7 @@ public class Shield {
return; return;
} }
final Map<String, String> settingsMap = settings.getAsMap();
for (Map.Entry<String, Settings> tribeSettings : tribesSettings.entrySet()) { for (Map.Entry<String, Settings> tribeSettings : tribesSettings.entrySet()) {
String tribePrefix = "tribe." + tribeSettings.getKey() + "."; String tribePrefix = "tribe." + tribeSettings.getKey() + ".";
@ -352,6 +353,14 @@ public class Shield {
//shield must be enabled on every tribe if it's enabled on the tribe node //shield must be enabled on every tribe if it's enabled on the tribe node
settingsBuilder.put(tribeEnabledSetting, true); settingsBuilder.put(tribeEnabledSetting, true);
} }
// we passed all the checks now we need to copy in all of the shield settings
for (Map.Entry<String, String> entry : settingsMap.entrySet()) {
String key = entry.getKey();
if (key.startsWith("shield.")) {
settingsBuilder.put(tribePrefix + key, entry.getValue());
}
}
} }
} }

View File

@ -5,13 +5,16 @@
*/ */
package org.elasticsearch.shield; package org.elasticsearch.shield;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.xpack.XPackPlugin; import org.elasticsearch.xpack.XPackPlugin;
import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.Matchers.arrayContaining; import static org.hamcrest.Matchers.arrayContaining;
public class ShieldPluginSettingsTests extends ESTestCase { public class ShieldPluginSettingsTests extends ESTestCase {
@ -106,4 +109,27 @@ public class ShieldPluginSettingsTests extends ESTestCase {
assertThat(e.getMessage(), containsString(TRIBE_T1_SHIELD_ENABLED)); assertThat(e.getMessage(), containsString(TRIBE_T1_SHIELD_ENABLED));
} }
} }
public void testShieldSettingsCopiedForTribeNodes() {
Settings settings = Settings.builder()
.put("tribe.t1.cluster.name", "non_existing")
.put("tribe.t2.cluster.name", "non_existing")
.put("shield.foo", "bar")
.put("shield.bar", "foo")
.putArray("shield.something.else.here", new String[] { "foo", "bar" })
.build();
Shield shield = new Shield(settings);
Settings additionalSettings = shield.additionalSettings();
assertThat(additionalSettings.get("shield.foo"), nullValue());
assertThat(additionalSettings.get("shield.bar"), nullValue());
assertThat(additionalSettings.getAsArray("shield.something.else.here"), is(Strings.EMPTY_ARRAY));
assertThat(additionalSettings.get("tribe.t1.shield.foo"), is("bar"));
assertThat(additionalSettings.get("tribe.t1.shield.bar"), is("foo"));
assertThat(additionalSettings.getAsArray("tribe.t1.shield.something.else.here"), arrayContaining("foo", "bar"));
assertThat(additionalSettings.get("tribe.t2.shield.foo"), is("bar"));
assertThat(additionalSettings.get("tribe.t2.shield.bar"), is("foo"));
assertThat(additionalSettings.getAsArray("tribe.t2.shield.something.else.here"), arrayContaining("foo", "bar"));
}
} }

View File

@ -207,7 +207,7 @@ public class DocumentSubsetReaderTests extends ESTestCase {
iw.addDocument(doc); iw.addDocument(doc);
// open reader // open reader
DirectoryReader ir = DocumentSubsetReader.wrap(DirectoryReader.open(iw, true), bitsetFilterCache, new MatchAllDocsQuery()); DirectoryReader ir = DocumentSubsetReader.wrap(DirectoryReader.open(iw), bitsetFilterCache, new MatchAllDocsQuery());
assertEquals(2, ir.numDocs()); assertEquals(2, ir.numDocs());
assertEquals(1, ir.leaves().size()); assertEquals(1, ir.leaves().size());

View File

@ -64,7 +64,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
// open reader // open reader
Set<String> fields = Collections.singleton("fieldA"); Set<String> fields = Collections.singleton("fieldA");
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
LeafReader segmentReader = ir.leaves().get(0).reader(); LeafReader segmentReader = ir.leaves().get(0).reader();
@ -96,7 +96,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
// open reader // open reader
Set<String> fields = Collections.singleton("fieldA"); Set<String> fields = Collections.singleton("fieldA");
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
Document d2 = ir.document(0); Document d2 = ir.document(0);
@ -123,7 +123,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
// open reader // open reader
Set<String> fields = Collections.singleton("fieldA"); Set<String> fields = Collections.singleton("fieldA");
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
Document d2 = ir.document(0); Document d2 = ir.document(0);
@ -150,7 +150,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
// open reader // open reader
Set<String> fields = Collections.singleton("fieldA"); Set<String> fields = Collections.singleton("fieldA");
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
Document d2 = ir.document(0); Document d2 = ir.document(0);
@ -177,7 +177,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
// open reader // open reader
Set<String> fields = Collections.singleton("fieldA"); Set<String> fields = Collections.singleton("fieldA");
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
Document d2 = ir.document(0); Document d2 = ir.document(0);
@ -204,7 +204,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
// open reader // open reader
Set<String> fields = Collections.singleton("fieldA"); Set<String> fields = Collections.singleton("fieldA");
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
Document d2 = ir.document(0); Document d2 = ir.document(0);
@ -231,7 +231,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
// open reader // open reader
Set<String> fields = Collections.singleton("fieldA"); Set<String> fields = Collections.singleton("fieldA");
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
Document d2 = ir.document(0); Document d2 = ir.document(0);
@ -260,7 +260,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
// open reader // open reader
Set<String> fields = Collections.singleton("fieldA"); Set<String> fields = Collections.singleton("fieldA");
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
Fields vectors = ir.getTermVectors(0); Fields vectors = ir.getTermVectors(0);
@ -290,7 +290,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
// open reader // open reader
Set<String> fields = Collections.singleton("fieldA"); Set<String> fields = Collections.singleton("fieldA");
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
LeafReader segmentReader = ir.leaves().get(0).reader(); LeafReader segmentReader = ir.leaves().get(0).reader();
@ -317,7 +317,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
// open reader // open reader
Set<String> fields = Collections.singleton("fieldA"); Set<String> fields = Collections.singleton("fieldA");
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
LeafReader segmentReader = ir.leaves().get(0).reader(); LeafReader segmentReader = ir.leaves().get(0).reader();
@ -349,7 +349,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
// open reader // open reader
Set<String> fields = Collections.singleton("fieldA"); Set<String> fields = Collections.singleton("fieldA");
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
LeafReader segmentReader = ir.leaves().get(0).reader(); LeafReader segmentReader = ir.leaves().get(0).reader();
@ -381,7 +381,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
// open reader // open reader
Set<String> fields = Collections.singleton("fieldA"); Set<String> fields = Collections.singleton("fieldA");
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
LeafReader segmentReader = ir.leaves().get(0).reader(); LeafReader segmentReader = ir.leaves().get(0).reader();
@ -413,7 +413,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
// open reader // open reader
Set<String> fields = Collections.singleton("fieldA"); Set<String> fields = Collections.singleton("fieldA");
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
LeafReader segmentReader = ir.leaves().get(0).reader(); LeafReader segmentReader = ir.leaves().get(0).reader();
@ -449,7 +449,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
// open reader // open reader
Set<String> fields = Collections.singleton("fieldA"); Set<String> fields = Collections.singleton("fieldA");
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
LeafReader segmentReader = ir.leaves().get(0).reader(); LeafReader segmentReader = ir.leaves().get(0).reader();
@ -484,7 +484,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
// open reader // open reader
Set<String> fields = Collections.singleton("fieldA"); Set<String> fields = Collections.singleton("fieldA");
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
LeafReader segmentReader = ir.leaves().get(0).reader(); LeafReader segmentReader = ir.leaves().get(0).reader();
@ -517,7 +517,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
Set<String> fields = new HashSet<>(); Set<String> fields = new HashSet<>();
fields.add("fieldA"); fields.add("fieldA");
fields.add(SourceFieldMapper.NAME); fields.add(SourceFieldMapper.NAME);
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
Document d2 = ir.document(0); Document d2 = ir.document(0);
@ -548,7 +548,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
Set<String> fields = new HashSet<>(); Set<String> fields = new HashSet<>();
fields.add("fieldA"); fields.add("fieldA");
fields.add(FieldNamesFieldMapper.NAME); fields.add(FieldNamesFieldMapper.NAME);
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
LeafReader segmentReader = ir.leaves().get(0).reader(); LeafReader segmentReader = ir.leaves().get(0).reader();
@ -597,7 +597,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
fields.add("fieldA"); fields.add("fieldA");
fields.add("fieldC"); fields.add("fieldC");
fields.add(FieldNamesFieldMapper.NAME); fields.add(FieldNamesFieldMapper.NAME);
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only two fields // see only two fields
LeafReader segmentReader = ir.leaves().get(0).reader(); LeafReader segmentReader = ir.leaves().get(0).reader();
@ -645,7 +645,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
fields.add("fieldA"); fields.add("fieldA");
fields.add("fieldC"); fields.add("fieldC");
fields.add(FieldNamesFieldMapper.NAME); fields.add(FieldNamesFieldMapper.NAME);
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
LeafReader segmentReader = ir.leaves().get(0).reader(); LeafReader segmentReader = ir.leaves().get(0).reader();
@ -681,7 +681,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
Set<String> fields = new HashSet<>(); Set<String> fields = new HashSet<>();
fields.add("fieldA"); fields.add("fieldA");
fields.add(FieldNamesFieldMapper.NAME); fields.add(FieldNamesFieldMapper.NAME);
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see only one field // see only one field
LeafReader segmentReader = ir.leaves().get(0).reader(); LeafReader segmentReader = ir.leaves().get(0).reader();
@ -710,7 +710,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
// open reader // open reader
Set<String> fields = Collections.singleton("id"); Set<String> fields = Collections.singleton("id");
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
assertEquals(2, ir.numDocs()); assertEquals(2, ir.numDocs());
assertEquals(1, ir.leaves().size()); assertEquals(1, ir.leaves().size());
@ -745,7 +745,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
// open reader // open reader
Set<String> fields = Collections.singleton("fieldB"); Set<String> fields = Collections.singleton("fieldB");
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// sees no fields // sees no fields
assertNull(ir.getTermVectors(0)); assertNull(ir.getTermVectors(0));
@ -765,7 +765,7 @@ public class FieldSubsetReaderTests extends ESTestCase {
// open reader // open reader
Set<String> fields = Collections.singleton("fieldA"); Set<String> fields = Collections.singleton("fieldA");
DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw, true), fields); DirectoryReader ir = FieldSubsetReader.wrap(DirectoryReader.open(iw), fields);
// see no fields // see no fields
LeafReader segmentReader = ir.leaves().get(0).reader(); LeafReader segmentReader = ir.leaves().get(0).reader();

View File

@ -22,6 +22,8 @@ import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.script.ScriptModule; import org.elasticsearch.script.ScriptModule;
import org.elasticsearch.shield.Shield; import org.elasticsearch.shield.Shield;
import org.elasticsearch.watcher.Watcher; import org.elasticsearch.watcher.Watcher;
import org.elasticsearch.xpack.common.init.LazyInitializationModule;
import org.elasticsearch.xpack.common.init.LazyInitializationService;
import java.nio.file.Path; import java.nio.file.Path;
import java.security.AccessController; import java.security.AccessController;
@ -89,6 +91,7 @@ public class XPackPlugin extends Plugin {
@Override @Override
public Collection<Module> nodeModules() { public Collection<Module> nodeModules() {
ArrayList<Module> modules = new ArrayList<>(); ArrayList<Module> modules = new ArrayList<>();
modules.add(new LazyInitializationModule());
modules.addAll(licensing.nodeModules()); modules.addAll(licensing.nodeModules());
modules.addAll(shield.nodeModules()); modules.addAll(shield.nodeModules());
modules.addAll(watcher.nodeModules()); modules.addAll(watcher.nodeModules());
@ -99,6 +102,10 @@ public class XPackPlugin extends Plugin {
@Override @Override
public Collection<Class<? extends LifecycleComponent>> nodeServices() { public Collection<Class<? extends LifecycleComponent>> nodeServices() {
ArrayList<Class<? extends LifecycleComponent>> services = new ArrayList<>(); ArrayList<Class<? extends LifecycleComponent>> services = new ArrayList<>();
// the initialization service must be first in the list
// as other services may depend on one of the initialized
// constructs
services.add(LazyInitializationService.class);
services.addAll(licensing.nodeServices()); services.addAll(licensing.nodeServices());
services.addAll(shield.nodeServices()); services.addAll(shield.nodeServices());
services.addAll(watcher.nodeServices()); services.addAll(watcher.nodeServices());
@ -145,6 +152,10 @@ public class XPackPlugin extends Plugin {
shield.onIndexModule(module); shield.onIndexModule(module);
} }
public void onModule(LazyInitializationModule module) {
watcher.onModule(module);
}
public static boolean transportClientMode(Settings settings) { public static boolean transportClientMode(Settings settings) {
return !"node".equals(settings.get(Client.CLIENT_TYPE_SETTING_S.getKey())); return !"node".equals(settings.get(Client.CLIENT_TYPE_SETTING_S.getKey()));
} }

View File

@ -0,0 +1,17 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
package org.elasticsearch.xpack.common.init;
import org.elasticsearch.common.inject.Injector;
public interface LazyInitializable {
/**
* This method is called once all objects have been constructed and
* the @{link LazyInitializationService} has been started.
*/
void init(Injector injector);
}

View File

@ -0,0 +1,39 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
package org.elasticsearch.xpack.common.init;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.multibindings.Multibinder;
import java.util.HashSet;
import java.util.Set;
/**
* A module to lazy initialize objects and avoid circular dependency injection issues.
*
* Objects that use the {@link org.elasticsearch.client.ElasticsearchClient} and that are also injected in transport actions provoke
* a circular dependency injection issues with Guice. Using proxies with lazy initialization is a way to solve this issue.
*
* The proxies are initialized by {@link LazyInitializationService}.
*/
public class LazyInitializationModule extends AbstractModule {
private final Set<Class<? extends LazyInitializable>> initializables = new HashSet<>();
@Override
protected void configure() {
Multibinder<LazyInitializable> mbinder = Multibinder.newSetBinder(binder(), LazyInitializable.class);
for (Class<? extends LazyInitializable> initializable : initializables) {
bind(initializable).asEagerSingleton();
mbinder.addBinding().to(initializable);
}
bind(LazyInitializationService.class).asEagerSingleton();
}
public void registerLazyInitializable(Class<? extends LazyInitializable> lazyTypeClass) {
initializables.add(lazyTypeClass);
}
}

View File

@ -3,7 +3,7 @@
* or more contributor license agreements. Licensed under the Elastic License; * or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License. * you may not use this file except in compliance with the Elastic License.
*/ */
package org.elasticsearch.watcher.support.init; package org.elasticsearch.xpack.common.init;
import org.elasticsearch.ElasticsearchException; import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.common.component.AbstractLifecycleComponent; import org.elasticsearch.common.component.AbstractLifecycleComponent;
@ -14,15 +14,15 @@ import org.elasticsearch.common.settings.Settings;
import java.util.Set; import java.util.Set;
/** /**
* A service to lazy initialize {@link InitializingService.Initializable} constructs. * A service to lazy initialize {@link LazyInitializable} constructs.
*/ */
public class InitializingService extends AbstractLifecycleComponent { public class LazyInitializationService extends AbstractLifecycleComponent {
private final Injector injector; private final Injector injector;
private final Set<Initializable> initializables; private final Set<LazyInitializable> initializables;
@Inject @Inject
public InitializingService(Settings settings, Injector injector, Set<Initializable> initializables) { public LazyInitializationService(Settings settings, Injector injector, Set<LazyInitializable> initializables) {
super(settings); super(settings);
this.injector = injector; this.injector = injector;
this.initializables = initializables; this.initializables = initializables;
@ -30,7 +30,8 @@ public class InitializingService extends AbstractLifecycleComponent {
@Override @Override
protected void doStart() throws ElasticsearchException { protected void doStart() throws ElasticsearchException {
for (Initializable initializable : initializables) { for (LazyInitializable initializable : initializables) {
logger.trace("lazy initialization of [{}]", initializable);
initializable.init(injector); initializable.init(injector);
} }
} }
@ -42,9 +43,4 @@ public class InitializingService extends AbstractLifecycleComponent {
@Override @Override
protected void doClose() throws ElasticsearchException { protected void doClose() throws ElasticsearchException {
} }
public interface Initializable {
void init(Injector injector);
}
} }

View File

@ -0,0 +1,42 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
package org.elasticsearch.xpack.common.init.proxy;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.client.AdminClient;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.inject.Injector;
import org.elasticsearch.shield.InternalClient;
import org.elasticsearch.transport.TransportMessage;
import org.elasticsearch.xpack.common.init.LazyInitializable;
/**
* A lazily initialized proxy to an elasticsearch {@link Client}. Inject this proxy whenever a client
* needs to injected to be avoid circular dependencies issues.
*/
public class ClientProxy implements LazyInitializable {
protected InternalClient client;
@Override
public void init(Injector injector) {
this.client = injector.getInstance(InternalClient.class);
}
public AdminClient admin() {
return client.admin();
}
public void bulk(BulkRequest request, ActionListener<BulkResponse> listener) {
client.bulk(preProcess(request), listener);
}
protected <M extends TransportMessage> M preProcess(M message) {
return message;
}
}

View File

@ -116,8 +116,16 @@ export HOSTNAME=`hostname -s`
# include watcher jars in classpath # include watcher jars in classpath
ES_CLASSPATH="$ES_CLASSPATH:$ES_HOME/plugins/xpack/*" ES_CLASSPATH="$ES_CLASSPATH:$ES_HOME/plugins/xpack/*"
# don't let JAVA_TOOL_OPTIONS slip in (e.g. crazy agents in ubuntu)
# works around https://bugs.launchpad.net/ubuntu/+source/jayatana/+bug/1441487
if [ "x$JAVA_TOOL_OPTIONS" != "x" ]; then
echo "Warning: Ignoring JAVA_TOOL_OPTIONS=$JAVA_TOOL_OPTIONS"
echo "Please pass JVM parameters via ES_JAVA_OPTS instead"
unset JAVA_TOOL_OPTIONS
fi
cd "$ES_HOME" > /dev/null cd "$ES_HOME" > /dev/null
$JAVA $ES_JAVA_OPTS -cp "$ES_CLASSPATH" org.elasticsearch.watcher.trigger.schedule.tool.CronEvalTool "$@" $properties "$JAVA" $ES_JAVA_OPTS -cp "$ES_CLASSPATH" -Des.path.home="$ES_HOME" org.elasticsearch.watcher.trigger.schedule.tool.CronEvalTool "$@" $properties
status=$? status=$?
cd - > /dev/null cd - > /dev/null
exit $status exit $status

View File

@ -38,6 +38,7 @@ import org.elasticsearch.watcher.execution.ExecutionModule;
import org.elasticsearch.watcher.history.HistoryModule; import org.elasticsearch.watcher.history.HistoryModule;
import org.elasticsearch.watcher.history.HistoryStore; import org.elasticsearch.watcher.history.HistoryStore;
import org.elasticsearch.watcher.input.InputModule; import org.elasticsearch.watcher.input.InputModule;
import org.elasticsearch.watcher.input.chain.ChainInputFactory;
import org.elasticsearch.watcher.license.LicenseModule; import org.elasticsearch.watcher.license.LicenseModule;
import org.elasticsearch.watcher.license.WatcherLicensee; import org.elasticsearch.watcher.license.WatcherLicensee;
import org.elasticsearch.watcher.rest.action.RestAckWatchAction; import org.elasticsearch.watcher.rest.action.RestAckWatchAction;
@ -54,14 +55,14 @@ import org.elasticsearch.watcher.support.WatcherIndexTemplateRegistry.TemplateCo
import org.elasticsearch.watcher.support.clock.ClockModule; import org.elasticsearch.watcher.support.clock.ClockModule;
import org.elasticsearch.watcher.support.http.HttpClient; import org.elasticsearch.watcher.support.http.HttpClient;
import org.elasticsearch.watcher.support.http.HttpClientModule; import org.elasticsearch.watcher.support.http.HttpClientModule;
import org.elasticsearch.watcher.support.init.InitializingModule;
import org.elasticsearch.watcher.support.init.InitializingService;
import org.elasticsearch.watcher.support.init.proxy.ScriptServiceProxy; import org.elasticsearch.watcher.support.init.proxy.ScriptServiceProxy;
import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import org.elasticsearch.watcher.support.secret.SecretModule; import org.elasticsearch.watcher.support.secret.SecretModule;
import org.elasticsearch.watcher.support.secret.SecretService; import org.elasticsearch.watcher.support.secret.SecretService;
import org.elasticsearch.watcher.support.text.TextTemplateModule; import org.elasticsearch.watcher.support.text.TextTemplateModule;
import org.elasticsearch.watcher.support.validation.WatcherSettingsValidation; import org.elasticsearch.watcher.support.validation.WatcherSettingsValidation;
import org.elasticsearch.watcher.transform.TransformModule; import org.elasticsearch.watcher.transform.TransformModule;
import org.elasticsearch.watcher.transform.chain.ChainTransformFactory;
import org.elasticsearch.watcher.transport.actions.ack.AckWatchAction; import org.elasticsearch.watcher.transport.actions.ack.AckWatchAction;
import org.elasticsearch.watcher.transport.actions.ack.TransportAckWatchAction; import org.elasticsearch.watcher.transport.actions.ack.TransportAckWatchAction;
import org.elasticsearch.watcher.transport.actions.activate.ActivateWatchAction; import org.elasticsearch.watcher.transport.actions.activate.ActivateWatchAction;
@ -82,6 +83,7 @@ import org.elasticsearch.watcher.trigger.TriggerModule;
import org.elasticsearch.watcher.trigger.schedule.ScheduleModule; import org.elasticsearch.watcher.trigger.schedule.ScheduleModule;
import org.elasticsearch.watcher.watch.WatchModule; import org.elasticsearch.watcher.watch.WatchModule;
import org.elasticsearch.xpack.XPackPlugin; import org.elasticsearch.xpack.XPackPlugin;
import org.elasticsearch.xpack.common.init.LazyInitializationModule;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.joda.time.DateTimeZone; import org.joda.time.DateTimeZone;
@ -133,7 +135,6 @@ public class Watcher {
} }
return Arrays.<Module>asList( return Arrays.<Module>asList(
new WatcherModule(settings), new WatcherModule(settings),
new InitializingModule(),
new LicenseModule(), new LicenseModule(),
new WatchModule(), new WatchModule(),
new TextTemplateModule(), new TextTemplateModule(),
@ -156,10 +157,6 @@ public class Watcher {
return Collections.emptyList(); return Collections.emptyList();
} }
return Arrays.<Class<? extends LifecycleComponent>>asList( return Arrays.<Class<? extends LifecycleComponent>>asList(
// the initialization service must be first in the list
// as other services may depend on one of the initialized
// constructs
InitializingService.class,
WatcherLicensee.class, WatcherLicensee.class,
EmailService.class, EmailService.class,
HipChatService.class, HipChatService.class,
@ -254,6 +251,15 @@ public class Watcher {
} }
} }
public void onModule(LazyInitializationModule module) {
if (enabled) {
module.registerLazyInitializable(WatcherClientProxy.class);
module.registerLazyInitializable(ScriptServiceProxy.class);
module.registerLazyInitializable(ChainTransformFactory.class);
module.registerLazyInitializable(ChainInputFactory.class);
}
}
public static boolean enabled(Settings settings) { public static boolean enabled(Settings settings) {
return XPackPlugin.featureEnabled(settings, NAME, true); return XPackPlugin.featureEnabled(settings, NAME, true);
} }

View File

@ -34,7 +34,7 @@ public enum DataAttachment implements ToXContent {
@Override @Override
public Attachment create(String id, Map<String, Object> data) { public Attachment create(String id, Map<String, Object> data) {
return new Attachment.XContent.Yaml(id, "data.yml", new Payload.Simple(data)); return new Attachment.XContent.Yaml(id, id, new Payload.Simple(data));
} }
@Override @Override
@ -51,7 +51,7 @@ public enum DataAttachment implements ToXContent {
@Override @Override
public Attachment create(String id, Map<String, Object> data) { public Attachment create(String id, Map<String, Object> data) {
return new Attachment.XContent.Json(id, "data.json", new Payload.Simple(data)); return new Attachment.XContent.Json(id, id, new Payload.Simple(data));
} }
@Override @Override

View File

@ -32,7 +32,6 @@ public class DataAttachment implements EmailAttachmentParser.EmailAttachment {
} else { } else {
builder.field("format", "json"); builder.field("format", "json");
} }
return builder.endObject().endObject(); return builder.endObject().endObject();
} }

View File

@ -25,6 +25,11 @@ public interface EmailAttachmentParser<T extends EmailAttachmentParser.EmailAtta
* @return A type to identify the email attachment, same as the parser identifier * @return A type to identify the email attachment, same as the parser identifier
*/ */
String type(); String type();
/**
* @return The id of this attachment
*/
String id();
} }
/** /**

View File

@ -10,8 +10,8 @@ import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentBuilder;
import java.io.IOException; import java.io.IOException;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import java.util.Objects; import java.util.Objects;
public class EmailAttachments implements ToXContent { public class EmailAttachments implements ToXContent {
@ -23,13 +23,13 @@ public class EmailAttachments implements ToXContent {
ParseField ATTACHMENTS = new ParseField("attachments"); ParseField ATTACHMENTS = new ParseField("attachments");
} }
private final List<EmailAttachmentParser.EmailAttachment> attachments; private final Collection<EmailAttachmentParser.EmailAttachment> attachments;
public EmailAttachments(List<EmailAttachmentParser.EmailAttachment> attachments) { public EmailAttachments(Collection<EmailAttachmentParser.EmailAttachment> attachments) {
this.attachments = attachments; this.attachments = attachments;
} }
public List<EmailAttachmentParser.EmailAttachment> getAttachments() { public Collection<EmailAttachmentParser.EmailAttachment> getAttachments() {
return attachments; return attachments;
} }

View File

@ -12,7 +12,7 @@ import org.elasticsearch.common.xcontent.XContentParser;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
public class EmailAttachmentsParser { public class EmailAttachmentsParser {
@ -25,7 +25,7 @@ public class EmailAttachmentsParser {
} }
public EmailAttachments parse(XContentParser parser) throws IOException { public EmailAttachments parse(XContentParser parser) throws IOException {
List<EmailAttachmentParser.EmailAttachment> attachments = new ArrayList<>(); Map<String, EmailAttachmentParser.EmailAttachment> attachments = new LinkedHashMap<>();
String currentFieldName = null; String currentFieldName = null;
XContentParser.Token token; XContentParser.Token token;
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
@ -41,17 +41,21 @@ public class EmailAttachmentsParser {
EmailAttachmentParser emailAttachmentParser = parsers.get(currentAttachmentType); EmailAttachmentParser emailAttachmentParser = parsers.get(currentAttachmentType);
if (emailAttachmentParser == null) { if (emailAttachmentParser == null) {
throw new ElasticsearchParseException("Cannot parse attachment of type " + currentAttachmentType); throw new ElasticsearchParseException("Cannot parse attachment of type [{}]", currentAttachmentType);
} }
EmailAttachmentParser.EmailAttachment emailAttachment = emailAttachmentParser.parse(currentFieldName, parser); EmailAttachmentParser.EmailAttachment emailAttachment = emailAttachmentParser.parse(currentFieldName, parser);
attachments.add(emailAttachment); if (attachments.containsKey(emailAttachment.id())) {
throw new ElasticsearchParseException("Attachment with id [{}] has already been created, must be renamed",
emailAttachment.id());
}
attachments.put(emailAttachment.id(), emailAttachment);
// one further to skip the end_object from the attachment // one further to skip the end_object from the attachment
parser.nextToken(); parser.nextToken();
} }
} }
} }
return new EmailAttachments(attachments); return new EmailAttachments(new ArrayList<>(attachments.values()));
} }
public Map<String, EmailAttachmentParser> getParsers() { public Map<String, EmailAttachmentParser> getParsers() {

View File

@ -94,7 +94,7 @@ public class HttpEmailAttachementParser implements EmailAttachmentParser<HttpReq
if (response.hasContent()) { if (response.hasContent()) {
String contentType = attachment.getContentType(); String contentType = attachment.getContentType();
String attachmentContentType = Strings.hasLength(contentType) ? contentType : response.contentType(); String attachmentContentType = Strings.hasLength(contentType) ? contentType : response.contentType();
return new Attachment.Bytes(attachment.getId(), response.body().toBytes(), attachmentContentType); return new Attachment.Bytes(attachment.id(), response.body().toBytes(), attachmentContentType);
} else { } else {
logger.error("Empty response body: [host[{}], port[{}], method[{}], path[{}]: response status [{}]", httpRequest.host(), logger.error("Empty response body: [host[{}], port[{}], method[{}], path[{}]: response status [{}]", httpRequest.host(),
httpRequest.port(), httpRequest.method(), httpRequest.path(), response.status()); httpRequest.port(), httpRequest.method(), httpRequest.path(), response.status());
@ -109,6 +109,6 @@ public class HttpEmailAttachementParser implements EmailAttachmentParser<HttpReq
} }
throw new ElasticsearchException("Unable to get attachment of type [{}] with id [{}] in watch [{}] aborting watch execution", throw new ElasticsearchException("Unable to get attachment of type [{}] with id [{}] in watch [{}] aborting watch execution",
type(), attachment.getId(), context.watch().id()); type(), attachment.id(), context.watch().id());
} }
} }

View File

@ -17,7 +17,7 @@ public class HttpRequestAttachment implements EmailAttachmentParser.EmailAttachm
private final HttpRequestTemplate requestTemplate; private final HttpRequestTemplate requestTemplate;
private final String contentType; private final String contentType;
private String id; private final String id;
public HttpRequestAttachment(String id, HttpRequestTemplate requestTemplate, @Nullable String contentType) { public HttpRequestAttachment(String id, HttpRequestTemplate requestTemplate, @Nullable String contentType) {
this.id = id; this.id = id;
@ -33,7 +33,8 @@ public class HttpRequestAttachment implements EmailAttachmentParser.EmailAttachm
return contentType; return contentType;
} }
public String getId() { @Override
public String id() {
return id; return id;
} }

View File

@ -21,7 +21,7 @@ import org.elasticsearch.watcher.actions.ExecutableAction;
import org.elasticsearch.watcher.execution.WatchExecutionContext; import org.elasticsearch.watcher.execution.WatchExecutionContext;
import org.elasticsearch.watcher.support.ArrayObjectIterator; import org.elasticsearch.watcher.support.ArrayObjectIterator;
import org.elasticsearch.watcher.support.WatcherDateTimeUtils; import org.elasticsearch.watcher.support.WatcherDateTimeUtils;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import org.elasticsearch.watcher.support.xcontent.XContentSource; import org.elasticsearch.watcher.support.xcontent.XContentSource;
import org.elasticsearch.watcher.watch.Payload; import org.elasticsearch.watcher.watch.Payload;
@ -34,10 +34,10 @@ import static org.elasticsearch.watcher.support.Exceptions.illegalState;
public class ExecutableIndexAction extends ExecutableAction<IndexAction> { public class ExecutableIndexAction extends ExecutableAction<IndexAction> {
private final ClientProxy client; private final WatcherClientProxy client;
private final TimeValue timeout; private final TimeValue timeout;
public ExecutableIndexAction(IndexAction action, ESLogger logger, ClientProxy client, @Nullable TimeValue defaultTimeout) { public ExecutableIndexAction(IndexAction action, ESLogger logger, WatcherClientProxy client, @Nullable TimeValue defaultTimeout) {
super(action, logger); super(action, logger);
this.client = client; this.client = client;
this.timeout = action.timeout != null ? action.timeout : defaultTimeout; this.timeout = action.timeout != null ? action.timeout : defaultTimeout;

View File

@ -12,7 +12,7 @@ import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.watcher.actions.ActionFactory; import org.elasticsearch.watcher.actions.ActionFactory;
import org.elasticsearch.watcher.actions.email.ExecutableEmailAction; import org.elasticsearch.watcher.actions.email.ExecutableEmailAction;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import java.io.IOException; import java.io.IOException;
@ -21,11 +21,11 @@ import java.io.IOException;
*/ */
public class IndexActionFactory extends ActionFactory<IndexAction, ExecutableIndexAction> { public class IndexActionFactory extends ActionFactory<IndexAction, ExecutableIndexAction> {
private final ClientProxy client; private final WatcherClientProxy client;
private final TimeValue defaultTimeout; private final TimeValue defaultTimeout;
@Inject @Inject
public IndexActionFactory(Settings settings, ClientProxy client) { public IndexActionFactory(Settings settings, WatcherClientProxy client) {
super(Loggers.getLogger(ExecutableEmailAction.class, settings)); super(Loggers.getLogger(ExecutableEmailAction.class, settings));
this.client = client; this.client = client;
this.defaultTimeout = settings.getAsTime("watcher.actions.index.default_timeout", null); this.defaultTimeout = settings.getAsTime("watcher.actions.index.default_timeout", null);

View File

@ -26,7 +26,7 @@ import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@ -47,7 +47,7 @@ public class TriggeredWatchStore extends AbstractComponent {
public static final String DOC_TYPE = "triggered_watch"; public static final String DOC_TYPE = "triggered_watch";
private final int scrollSize; private final int scrollSize;
private final ClientProxy client; private final WatcherClientProxy client;
private final TimeValue scrollTimeout; private final TimeValue scrollTimeout;
private final TriggeredWatch.Parser triggeredWatchParser; private final TriggeredWatch.Parser triggeredWatchParser;
@ -57,7 +57,7 @@ public class TriggeredWatchStore extends AbstractComponent {
private final AtomicBoolean started = new AtomicBoolean(false); private final AtomicBoolean started = new AtomicBoolean(false);
@Inject @Inject
public TriggeredWatchStore(Settings settings, ClientProxy client, TriggeredWatch.Parser triggeredWatchParser) { public TriggeredWatchStore(Settings settings, WatcherClientProxy client, TriggeredWatch.Parser triggeredWatchParser) {
super(settings); super(settings);
this.scrollSize = settings.getAsInt("watcher.execution.scroll.size", 100); this.scrollSize = settings.getAsInt("watcher.execution.scroll.size", 100);
this.client = client; this.client = client;

View File

@ -14,7 +14,7 @@ import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.engine.VersionConflictEngineException; import org.elasticsearch.index.engine.VersionConflictEngineException;
import org.elasticsearch.watcher.WatcherModule; import org.elasticsearch.watcher.WatcherModule;
import org.elasticsearch.watcher.execution.ExecutionState; import org.elasticsearch.watcher.execution.ExecutionState;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.DateTimeFormatter;
@ -36,7 +36,7 @@ public class HistoryStore extends AbstractComponent {
static final DateTimeFormatter indexTimeFormat = DateTimeFormat.forPattern("YYYY.MM.dd"); static final DateTimeFormatter indexTimeFormat = DateTimeFormat.forPattern("YYYY.MM.dd");
private final ClientProxy client; private final WatcherClientProxy client;
private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private final Lock putUpdateLock = readWriteLock.readLock(); private final Lock putUpdateLock = readWriteLock.readLock();
@ -44,7 +44,7 @@ public class HistoryStore extends AbstractComponent {
private final AtomicBoolean started = new AtomicBoolean(false); private final AtomicBoolean started = new AtomicBoolean(false);
@Inject @Inject
public HistoryStore(Settings settings, ClientProxy client) { public HistoryStore(Settings settings, WatcherClientProxy client) {
super(settings); super(settings);
this.client = client; this.client = client;
} }

View File

@ -48,7 +48,7 @@ public class InputModule extends AbstractModule {
bind(NoneInputFactory.class).asEagerSingleton(); bind(NoneInputFactory.class).asEagerSingleton();
parsersBinder.addBinding(NoneInput.TYPE).to(NoneInputFactory.class); parsersBinder.addBinding(NoneInput.TYPE).to(NoneInputFactory.class);
// no bind() needed, done in InitializingModule // no bind() needed, done using the LazyInitializationModule
parsersBinder.addBinding(ChainInput.TYPE).to(ChainInputFactory.class); parsersBinder.addBinding(ChainInput.TYPE).to(ChainInputFactory.class);
for (Map.Entry<String, Class<? extends InputFactory>> entry : parsers.entrySet()) { for (Map.Entry<String, Class<? extends InputFactory>> entry : parsers.entrySet()) {

View File

@ -15,14 +15,14 @@ import org.elasticsearch.watcher.input.ExecutableInput;
import org.elasticsearch.watcher.input.Input; import org.elasticsearch.watcher.input.Input;
import org.elasticsearch.watcher.input.InputFactory; import org.elasticsearch.watcher.input.InputFactory;
import org.elasticsearch.watcher.input.InputRegistry; import org.elasticsearch.watcher.input.InputRegistry;
import org.elasticsearch.watcher.support.init.InitializingService; import org.elasticsearch.xpack.common.init.LazyInitializable;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class ChainInputFactory extends InputFactory<ChainInput, ChainInput.Result, ExecutableChainInput> public class ChainInputFactory extends InputFactory<ChainInput, ChainInput.Result, ExecutableChainInput>
implements InitializingService.Initializable { implements LazyInitializable {
private InputRegistry inputRegistry; private InputRegistry inputRegistry;

View File

@ -20,7 +20,7 @@ import org.elasticsearch.watcher.execution.WatchExecutionContext;
import org.elasticsearch.watcher.input.ExecutableInput; import org.elasticsearch.watcher.input.ExecutableInput;
import org.elasticsearch.watcher.support.WatcherUtils; import org.elasticsearch.watcher.support.WatcherUtils;
import org.elasticsearch.watcher.support.XContentFilterKeysUtils; import org.elasticsearch.watcher.support.XContentFilterKeysUtils;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import org.elasticsearch.watcher.watch.Payload; import org.elasticsearch.watcher.watch.Payload;
import java.util.Map; import java.util.Map;
@ -34,10 +34,10 @@ public class ExecutableSearchInput extends ExecutableInput<SearchInput, SearchIn
public static final SearchType DEFAULT_SEARCH_TYPE = SearchType.QUERY_THEN_FETCH; public static final SearchType DEFAULT_SEARCH_TYPE = SearchType.QUERY_THEN_FETCH;
private final ClientProxy client; private final WatcherClientProxy client;
private final @Nullable TimeValue timeout; private final @Nullable TimeValue timeout;
public ExecutableSearchInput(SearchInput input, ESLogger logger, ClientProxy client, @Nullable TimeValue defaultTimeout) { public ExecutableSearchInput(SearchInput input, ESLogger logger, WatcherClientProxy client, @Nullable TimeValue defaultTimeout) {
super(input, logger); super(input, logger);
this.client = client; this.client = client;
this.timeout = input.getTimeout() != null ? input.getTimeout() : defaultTimeout; this.timeout = input.getTimeout() != null ? input.getTimeout() : defaultTimeout;

View File

@ -15,7 +15,7 @@ import org.elasticsearch.indices.query.IndicesQueriesRegistry;
import org.elasticsearch.search.aggregations.AggregatorParsers; import org.elasticsearch.search.aggregations.AggregatorParsers;
import org.elasticsearch.watcher.input.InputFactory; import org.elasticsearch.watcher.input.InputFactory;
import org.elasticsearch.watcher.input.simple.ExecutableSimpleInput; import org.elasticsearch.watcher.input.simple.ExecutableSimpleInput;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import java.io.IOException; import java.io.IOException;
@ -24,13 +24,14 @@ import java.io.IOException;
*/ */
public class SearchInputFactory extends InputFactory<SearchInput, SearchInput.Result, ExecutableSearchInput> { public class SearchInputFactory extends InputFactory<SearchInput, SearchInput.Result, ExecutableSearchInput> {
private final ClientProxy client; private final WatcherClientProxy client;
private final TimeValue defaultTimeout; private final TimeValue defaultTimeout;
private IndicesQueriesRegistry queryRegistry; private IndicesQueriesRegistry queryRegistry;
private AggregatorParsers aggParsers; private AggregatorParsers aggParsers;
@Inject @Inject
public SearchInputFactory(Settings settings, ClientProxy client, IndicesQueriesRegistry queryRegistry, AggregatorParsers aggParsers) { public SearchInputFactory(Settings settings, WatcherClientProxy client, IndicesQueriesRegistry queryRegistry,
AggregatorParsers aggParsers) {
super(Loggers.getLogger(ExecutableSimpleInput.class, settings)); super(Loggers.getLogger(ExecutableSimpleInput.class, settings));
this.client = client; this.client = client;
this.queryRegistry = queryRegistry; this.queryRegistry = queryRegistry;

View File

@ -20,7 +20,7 @@ import org.elasticsearch.common.settings.Setting;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.gateway.GatewayService; import org.elasticsearch.gateway.GatewayService;
import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import org.elasticsearch.watcher.watch.WatchStore; import org.elasticsearch.watcher.watch.WatchStore;
import java.io.InputStream; import java.io.InputStream;
@ -38,7 +38,7 @@ import static java.util.Collections.unmodifiableSet;
public class WatcherIndexTemplateRegistry extends AbstractComponent implements ClusterStateListener { public class WatcherIndexTemplateRegistry extends AbstractComponent implements ClusterStateListener {
private static final String FORBIDDEN_INDEX_SETTING = "index.mapper.dynamic"; private static final String FORBIDDEN_INDEX_SETTING = "index.mapper.dynamic";
private final ClientProxy client; private final WatcherClientProxy client;
private final ThreadPool threadPool; private final ThreadPool threadPool;
private final ClusterService clusterService; private final ClusterService clusterService;
private final Set<TemplateConfig> indexTemplates; private final Set<TemplateConfig> indexTemplates;
@ -47,7 +47,7 @@ public class WatcherIndexTemplateRegistry extends AbstractComponent implements C
@Inject @Inject
public WatcherIndexTemplateRegistry(Settings settings, ClusterSettings clusterSettings, ClusterService clusterService, public WatcherIndexTemplateRegistry(Settings settings, ClusterSettings clusterSettings, ClusterService clusterService,
ThreadPool threadPool, ClientProxy client, Set<TemplateConfig> configs) { ThreadPool threadPool, WatcherClientProxy client, Set<TemplateConfig> configs) {
super(settings); super(settings);
this.client = client; this.client = client;
this.threadPool = threadPool; this.threadPool = threadPool;

View File

@ -1,35 +0,0 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
package org.elasticsearch.watcher.support.init;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.multibindings.Multibinder;
import org.elasticsearch.watcher.input.chain.ChainInputFactory;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy;
import org.elasticsearch.watcher.support.init.proxy.ScriptServiceProxy;
import org.elasticsearch.watcher.transform.chain.ChainTransformFactory;
/**
*
*/
public class InitializingModule extends AbstractModule {
@Override
protected void configure() {
bind(ClientProxy.class).asEagerSingleton();
bind(ScriptServiceProxy.class).asEagerSingleton();
bind(ChainInputFactory.class).asEagerSingleton();
Multibinder<InitializingService.Initializable> mbinder = Multibinder.newSetBinder(binder(),
InitializingService.Initializable.class);
mbinder.addBinding().to(ClientProxy.class);
mbinder.addBinding().to(ScriptServiceProxy.class);
mbinder.addBinding().to(ChainTransformFactory.class);
mbinder.addBinding().to(ChainInputFactory.class);
bind(InitializingService.class).asEagerSingleton();
}
}

View File

@ -13,7 +13,7 @@ import org.elasticsearch.script.ScriptService;
import org.elasticsearch.shield.SecurityContext; import org.elasticsearch.shield.SecurityContext;
import org.elasticsearch.shield.XPackUser; import org.elasticsearch.shield.XPackUser;
import org.elasticsearch.watcher.support.Script; import org.elasticsearch.watcher.support.Script;
import org.elasticsearch.watcher.support.init.InitializingService; import org.elasticsearch.xpack.common.init.LazyInitializable;
import java.util.Map; import java.util.Map;
@ -23,7 +23,7 @@ import static java.util.Collections.emptyMap;
*A lazily initialized proxy to the elasticsearch {@link ScriptService}. Inject this proxy whenever the script *A lazily initialized proxy to the elasticsearch {@link ScriptService}. Inject this proxy whenever the script
* service needs to be injected to avoid circular dependencies issues. * service needs to be injected to avoid circular dependencies issues.
*/ */
public class ScriptServiceProxy implements InitializingService.Initializable { public class ScriptServiceProxy implements LazyInitializable {
private ScriptService service; private ScriptService service;
private SecurityContext securityContext; private SecurityContext securityContext;
@ -65,7 +65,7 @@ public class ScriptServiceProxy implements InitializingService.Initializable {
service.executable(script, WatcherScriptContext.CTX, emptyMap())); service.executable(script, WatcherScriptContext.CTX, emptyMap()));
} }
public static final ScriptContext.Plugin INSTANCE = new ScriptContext.Plugin("elasticsearch-watcher", "watch"); public static final ScriptContext.Plugin INSTANCE = new ScriptContext.Plugin("xpack", "watch");
private static class WatcherScriptContext implements ScriptContext { private static class WatcherScriptContext implements ScriptContext {

View File

@ -23,29 +23,25 @@ import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchScrollRequest; import org.elasticsearch.action.search.SearchScrollRequest;
import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse; import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.AdminClient;
import org.elasticsearch.client.Client; import org.elasticsearch.client.Client;
import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.inject.Injector;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.shield.InternalClient; import org.elasticsearch.shield.InternalClient;
import org.elasticsearch.transport.TransportMessage; import org.elasticsearch.xpack.common.init.proxy.ClientProxy;
import org.elasticsearch.watcher.support.init.InitializingService;
/** /**
* A lazily initialized proxy to an elasticsearch {@link Client}. Inject this proxy whenever a client * A lazily initialized proxy to an elasticsearch {@link Client}. Inject this proxy whenever a client
* needs to injected to be avoid circular dependencies issues. * needs to injected to be avoid circular dependencies issues.
*/ */
public class ClientProxy implements InitializingService.Initializable { public class WatcherClientProxy extends ClientProxy {
private final TimeValue defaultSearchTimeout; private final TimeValue defaultSearchTimeout;
private final TimeValue defaultIndexTimeout; private final TimeValue defaultIndexTimeout;
private final TimeValue defaultBulkTimeout; private final TimeValue defaultBulkTimeout;
private InternalClient client;
@Inject @Inject
public ClientProxy(Settings settings) { public WatcherClientProxy(Settings settings) {
defaultSearchTimeout = settings.getAsTime("watcher.internal.ops.search.default_timeout", TimeValue.timeValueSeconds(30)); defaultSearchTimeout = settings.getAsTime("watcher.internal.ops.search.default_timeout", TimeValue.timeValueSeconds(30));
defaultIndexTimeout = settings.getAsTime("watcher.internal.ops.index.default_timeout", TimeValue.timeValueSeconds(60)); defaultIndexTimeout = settings.getAsTime("watcher.internal.ops.index.default_timeout", TimeValue.timeValueSeconds(60));
defaultBulkTimeout = settings.getAsTime("watcher.internal.ops.bulk.default_timeout", TimeValue.timeValueSeconds(120)); defaultBulkTimeout = settings.getAsTime("watcher.internal.ops.bulk.default_timeout", TimeValue.timeValueSeconds(120));
@ -54,21 +50,12 @@ public class ClientProxy implements InitializingService.Initializable {
/** /**
* Creates a proxy to the given internal client (can be used for testing) * Creates a proxy to the given internal client (can be used for testing)
*/ */
public static ClientProxy of(Client client) { public static WatcherClientProxy of(Client client) {
ClientProxy proxy = new ClientProxy(Settings.EMPTY); WatcherClientProxy proxy = new WatcherClientProxy(Settings.EMPTY);
proxy.client = client instanceof InternalClient ? (InternalClient) client : new InternalClient.Insecure(client); proxy.client = client instanceof InternalClient ? (InternalClient) client : new InternalClient.Insecure(client);
return proxy; return proxy;
} }
@Override
public void init(Injector injector) {
this.client = injector.getInstance(InternalClient.class);
}
public AdminClient admin() {
return client.admin();
}
public IndexResponse index(IndexRequest request, TimeValue timeout) { public IndexResponse index(IndexRequest request, TimeValue timeout) {
if (timeout == null) { if (timeout == null) {
timeout = defaultIndexTimeout; timeout = defaultIndexTimeout;
@ -125,8 +112,4 @@ public class ClientProxy implements InitializingService.Initializable {
preProcess(request); preProcess(request);
return client.admin().indices().putTemplate(request).actionGet(defaultIndexTimeout); return client.admin().indices().putTemplate(request).actionGet(defaultIndexTimeout);
} }
<M extends TransportMessage> M preProcess(M message) {
return message;
}
} }

View File

@ -38,7 +38,7 @@ public class TransformModule extends AbstractModule {
bind(ScriptTransformFactory.class).asEagerSingleton(); bind(ScriptTransformFactory.class).asEagerSingleton();
mbinder.addBinding(ScriptTransform.TYPE).to(ScriptTransformFactory.class); mbinder.addBinding(ScriptTransform.TYPE).to(ScriptTransformFactory.class);
bind(ChainTransformFactory.class).asEagerSingleton(); // no bind() needed, done using the LazyInitializationModule
mbinder.addBinding(ChainTransform.TYPE).to(ChainTransformFactory.class); mbinder.addBinding(ChainTransform.TYPE).to(ChainTransformFactory.class);
for (Map.Entry<String, Class<? extends TransformFactory>> entry : factories.entrySet()) { for (Map.Entry<String, Class<? extends TransformFactory>> entry : factories.entrySet()) {

View File

@ -9,11 +9,11 @@ import org.elasticsearch.common.inject.Injector;
import org.elasticsearch.common.logging.Loggers; import org.elasticsearch.common.logging.Loggers;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.watcher.support.init.InitializingService;
import org.elasticsearch.watcher.transform.ExecutableTransform; import org.elasticsearch.watcher.transform.ExecutableTransform;
import org.elasticsearch.watcher.transform.Transform; import org.elasticsearch.watcher.transform.Transform;
import org.elasticsearch.watcher.transform.TransformFactory; import org.elasticsearch.watcher.transform.TransformFactory;
import org.elasticsearch.watcher.transform.TransformRegistry; import org.elasticsearch.watcher.transform.TransformRegistry;
import org.elasticsearch.xpack.common.init.LazyInitializable;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@ -22,7 +22,7 @@ import java.util.ArrayList;
* *
*/ */
public class ChainTransformFactory extends TransformFactory<ChainTransform, ChainTransform.Result, ExecutableChainTransform> implements public class ChainTransformFactory extends TransformFactory<ChainTransform, ChainTransform.Result, ExecutableChainTransform> implements
InitializingService.Initializable { LazyInitializable {
private TransformRegistry registry; private TransformRegistry registry;

View File

@ -13,7 +13,7 @@ import org.elasticsearch.common.logging.ESLogger;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.watcher.execution.WatchExecutionContext; import org.elasticsearch.watcher.execution.WatchExecutionContext;
import org.elasticsearch.watcher.support.WatcherUtils; import org.elasticsearch.watcher.support.WatcherUtils;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import org.elasticsearch.watcher.transform.ExecutableTransform; import org.elasticsearch.watcher.transform.ExecutableTransform;
import org.elasticsearch.watcher.watch.Payload; import org.elasticsearch.watcher.watch.Payload;
@ -24,10 +24,11 @@ public class ExecutableSearchTransform extends ExecutableTransform<SearchTransfo
public static final SearchType DEFAULT_SEARCH_TYPE = SearchType.QUERY_THEN_FETCH; public static final SearchType DEFAULT_SEARCH_TYPE = SearchType.QUERY_THEN_FETCH;
protected final ClientProxy client; protected final WatcherClientProxy client;
protected final @Nullable TimeValue timeout; protected final @Nullable TimeValue timeout;
public ExecutableSearchTransform(SearchTransform transform, ESLogger logger, ClientProxy client, @Nullable TimeValue defaultTimeout) { public ExecutableSearchTransform(SearchTransform transform, ESLogger logger, WatcherClientProxy client,
@Nullable TimeValue defaultTimeout) {
super(transform, logger); super(transform, logger);
this.client = client; this.client = client;
this.timeout = transform.getTimeout() != null ? transform.getTimeout() : defaultTimeout; this.timeout = transform.getTimeout() != null ? transform.getTimeout() : defaultTimeout;

View File

@ -13,7 +13,7 @@ import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.index.query.QueryParseContext;
import org.elasticsearch.indices.query.IndicesQueriesRegistry; import org.elasticsearch.indices.query.IndicesQueriesRegistry;
import org.elasticsearch.search.aggregations.AggregatorParsers; import org.elasticsearch.search.aggregations.AggregatorParsers;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import org.elasticsearch.watcher.transform.TransformFactory; import org.elasticsearch.watcher.transform.TransformFactory;
import java.io.IOException; import java.io.IOException;
@ -23,14 +23,14 @@ import java.io.IOException;
*/ */
public class SearchTransformFactory extends TransformFactory<SearchTransform, SearchTransform.Result, ExecutableSearchTransform> { public class SearchTransformFactory extends TransformFactory<SearchTransform, SearchTransform.Result, ExecutableSearchTransform> {
protected final ClientProxy client; protected final WatcherClientProxy client;
private final TimeValue defaultTimeout; private final TimeValue defaultTimeout;
private IndicesQueriesRegistry queryRegistry; private IndicesQueriesRegistry queryRegistry;
private AggregatorParsers aggParsers; private AggregatorParsers aggParsers;
@Inject @Inject
public SearchTransformFactory(Settings settings, ClientProxy client, IndicesQueriesRegistry queryRegistry, public SearchTransformFactory(Settings settings, WatcherClientProxy client, IndicesQueriesRegistry queryRegistry,
AggregatorParsers aggParsers) { AggregatorParsers aggParsers) {
super(Loggers.getLogger(ExecutableSearchTransform.class, settings)); super(Loggers.getLogger(ExecutableSearchTransform.class, settings));
this.client = client; this.client = client;
this.queryRegistry = queryRegistry; this.queryRegistry = queryRegistry;

View File

@ -31,7 +31,7 @@ import org.elasticsearch.common.xcontent.json.JsonXContent;
import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import java.io.IOException; import java.io.IOException;
import java.util.Collection; import java.util.Collection;
@ -49,7 +49,7 @@ public class WatchStore extends AbstractComponent {
public static final String INDEX = ".watches"; public static final String INDEX = ".watches";
public static final String DOC_TYPE = "watch"; public static final String DOC_TYPE = "watch";
private final ClientProxy client; private final WatcherClientProxy client;
private final Watch.Parser watchParser; private final Watch.Parser watchParser;
private final ConcurrentMap<String, Watch> watches; private final ConcurrentMap<String, Watch> watches;
@ -59,7 +59,7 @@ public class WatchStore extends AbstractComponent {
private final TimeValue scrollTimeout; private final TimeValue scrollTimeout;
@Inject @Inject
public WatchStore(Settings settings, ClientProxy client, Watch.Parser watchParser) { public WatchStore(Settings settings, WatcherClientProxy client, Watch.Parser watchParser) {
super(settings); super(settings);
this.client = client; this.client = client;
this.watchParser = watchParser; this.watchParser = watchParser;

View File

@ -17,10 +17,8 @@ import java.util.Map;
import static java.util.Collections.singletonMap; import static java.util.Collections.singletonMap;
import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.is;
/**
*
*/
public class DataAttachmentTests extends ESTestCase { public class DataAttachmentTests extends ESTestCase {
public void testCreateJson() throws Exception { public void testCreateJson() throws Exception {
Map<String, Object> data = singletonMap("key", "value"); Map<String, Object> data = singletonMap("key", "value");
Attachment attachment = DataAttachment.JSON.create("data", data); Attachment attachment = DataAttachment.JSON.create("data", data);

View File

@ -481,7 +481,7 @@ public class EmailActionTests extends ESTestCase {
} }
public void testThatDataAttachmentGetsAttachedWithId() throws Exception { public void testThatDataAttachmentGetsAttachedWithId() throws Exception {
String attachmentId = "my_attachment"; String attachmentId = randomAsciiOfLength(10) + ".yml";
XContentBuilder builder = jsonBuilder().startObject() XContentBuilder builder = jsonBuilder().startObject()
.startObject("attachments") .startObject("attachments")
@ -506,9 +506,9 @@ public class EmailActionTests extends ESTestCase {
EmailAction.Result.Success successResult = (EmailAction.Result.Success) result; EmailAction.Result.Success successResult = (EmailAction.Result.Success) result;
Map<String, Attachment> attachments = successResult.email().attachments(); Map<String, Attachment> attachments = successResult.email().attachments();
assertThat(attachments, hasKey("my_attachment")); assertThat(attachments, hasKey(attachmentId));
Attachment dataAttachment = attachments.get("my_attachment"); Attachment dataAttachment = attachments.get(attachmentId);
assertThat(dataAttachment.name(), is("data.yml")); assertThat(dataAttachment.name(), is(attachmentId));
assertThat(dataAttachment.type(), is("yaml")); assertThat(dataAttachment.type(), is("yaml"));
assertThat(dataAttachment.contentType(), is("application/yaml")); assertThat(dataAttachment.contentType(), is("application/yaml"));
} }

View File

@ -11,7 +11,9 @@ import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.common.xcontent.json.JsonXContent;
import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.ESTestCase;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
@ -36,7 +38,8 @@ public class DataAttachmentParserTests extends ESTestCase {
assertThat(emailAttachments.getAttachments(), hasSize(1)); assertThat(emailAttachments.getAttachments(), hasSize(1));
XContentBuilder toXcontentBuilder = jsonBuilder().startObject(); XContentBuilder toXcontentBuilder = jsonBuilder().startObject();
emailAttachments.getAttachments().get(0).toXContent(toXcontentBuilder, ToXContent.EMPTY_PARAMS); List<EmailAttachmentParser.EmailAttachment> attachments = new ArrayList<>(emailAttachments.getAttachments());
attachments.get(0).toXContent(toXcontentBuilder, ToXContent.EMPTY_PARAMS);
toXcontentBuilder.endObject(); toXcontentBuilder.endObject();
assertThat(toXcontentBuilder.string(), is(builder.string())); assertThat(toXcontentBuilder.string(), is(builder.string()));
} }

View File

@ -61,15 +61,15 @@ public class EmailAttachmentParsersTests extends ESTestCase {
EmailAttachments attachments = parser.parse(xContentParser); EmailAttachments attachments = parser.parse(xContentParser);
assertThat(attachments.getAttachments(), hasSize(2)); assertThat(attachments.getAttachments(), hasSize(2));
EmailAttachmentParser.EmailAttachment emailAttachment = attachments.getAttachments().get(0); List<EmailAttachmentParser.EmailAttachment> emailAttachments = new ArrayList<>(attachments.getAttachments());
EmailAttachmentParser.EmailAttachment emailAttachment = emailAttachments.get(0);
assertThat(emailAttachment, instanceOf(TestEmailAttachment.class)); assertThat(emailAttachment, instanceOf(TestEmailAttachment.class));
Attachment attachment = parsers.get("test").toAttachment(ctx, new Payload.Simple(), emailAttachment); Attachment attachment = parsers.get("test").toAttachment(ctx, new Payload.Simple(), emailAttachment);
assertThat(attachment.name(), is("my-id")); assertThat(attachment.name(), is("my-id"));
assertThat(attachment.contentType(), is("personalContentType")); assertThat(attachment.contentType(), is("personalContentType"));
assertThat(parsers.get("test").toAttachment(ctx, new Payload.Simple(), assertThat(parsers.get("test").toAttachment(ctx, new Payload.Simple(), emailAttachments.get(1)).id(), is("my-other-id"));
attachments.getAttachments().get(1)).id(), is("my-other-id"));
} }
public void testThatUnknownParserThrowsException() throws IOException { public void testThatUnknownParserThrowsException() throws IOException {
@ -84,13 +84,13 @@ public class EmailAttachmentParsersTests extends ESTestCase {
parser.parse(xContentParser); parser.parse(xContentParser);
fail("Expected random parser of type [" + type + "] to throw an exception"); fail("Expected random parser of type [" + type + "] to throw an exception");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), containsString("Cannot parse attachment of type " + type)); assertThat(e.getMessage(), containsString("Cannot parse attachment of type [" + type + "]"));
} }
} }
public void testThatToXContentSerializationWorks() throws Exception { public void testThatToXContentSerializationWorks() throws Exception {
List<EmailAttachmentParser.EmailAttachment> attachments = new ArrayList<>(); List<EmailAttachmentParser.EmailAttachment> attachments = new ArrayList<>();
attachments.add(new DataAttachment("my-id", org.elasticsearch.watcher.actions.email.DataAttachment.JSON)); attachments.add(new DataAttachment("my-name.json", org.elasticsearch.watcher.actions.email.DataAttachment.JSON));
HttpRequestTemplate requestTemplate = HttpRequestTemplate.builder("localhost", 80).scheme(Scheme.HTTP).path("/").build(); HttpRequestTemplate requestTemplate = HttpRequestTemplate.builder("localhost", 80).scheme(Scheme.HTTP).path("/").build();
HttpRequestAttachment httpRequestAttachment = new HttpRequestAttachment("other-id", requestTemplate, null); HttpRequestAttachment httpRequestAttachment = new HttpRequestAttachment("other-id", requestTemplate, null);
@ -100,13 +100,36 @@ public class EmailAttachmentParsersTests extends ESTestCase {
XContentBuilder builder = jsonBuilder(); XContentBuilder builder = jsonBuilder();
emailAttachments.toXContent(builder, ToXContent.EMPTY_PARAMS); emailAttachments.toXContent(builder, ToXContent.EMPTY_PARAMS);
logger.info("JSON is: " + builder.string()); logger.info("JSON is: " + builder.string());
assertThat(builder.string(), containsString("my-id")); assertThat(builder.string(), containsString("my-name.json"));
assertThat(builder.string(), containsString("json")); assertThat(builder.string(), containsString("json"));
assertThat(builder.string(), containsString("other-id")); assertThat(builder.string(), containsString("other-id"));
assertThat(builder.string(), containsString("localhost")); assertThat(builder.string(), containsString("localhost"));
assertThat(builder.string(), containsString("/")); assertThat(builder.string(), containsString("/"));
} }
public void testThatTwoAttachmentsWithTheSameIdThrowError() throws Exception {
Map<String, EmailAttachmentParser> parsers = new HashMap<>();
parsers.put("test", new TestEmailAttachmentParser());
EmailAttachmentsParser parser = new EmailAttachmentsParser(parsers);
List<EmailAttachmentParser.EmailAttachment> attachments = new ArrayList<>();
attachments.add(new TestEmailAttachment("my-name.json", "value"));
attachments.add(new TestEmailAttachment("my-name.json", "value"));
EmailAttachments emailAttachments = new EmailAttachments(attachments);
XContentBuilder builder = jsonBuilder();
emailAttachments.toXContent(builder, ToXContent.EMPTY_PARAMS);
logger.info("JSON is: " + builder.string());
XContentParser xContentParser = JsonXContent.jsonXContent.createParser(builder.bytes());
try {
parser.parse(xContentParser);
fail("Expected parser to fail but did not happen");
} catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), is("Attachment with id [my-name.json] has already been created, must be renamed"));
}
}
public class TestEmailAttachmentParser implements EmailAttachmentParser<TestEmailAttachment> { public class TestEmailAttachmentParser implements EmailAttachmentParser<TestEmailAttachment> {
@Override @Override
@ -138,7 +161,7 @@ public class EmailAttachmentParsersTests extends ESTestCase {
@Override @Override
public Attachment toAttachment(WatchExecutionContext ctx, Payload payload, TestEmailAttachment attachment) { public Attachment toAttachment(WatchExecutionContext ctx, Payload payload, TestEmailAttachment attachment) {
return new Attachment.Bytes(attachment.getId(), attachment.getValue().getBytes(Charsets.UTF_8), "personalContentType"); return new Attachment.Bytes(attachment.id(), attachment.getValue().getBytes(Charsets.UTF_8), "personalContentType");
} }
} }
@ -165,7 +188,8 @@ public class EmailAttachmentParsersTests extends ESTestCase {
return value; return value;
} }
public String getId() { @Override
public String id() {
return id; return id;
} }

View File

@ -21,7 +21,9 @@ import org.elasticsearch.watcher.support.secret.SecretService;
import org.elasticsearch.watcher.test.MockTextTemplateEngine; import org.elasticsearch.watcher.test.MockTextTemplateEngine;
import org.junit.Before; import org.junit.Before;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import static java.nio.charset.StandardCharsets.UTF_8; import static java.nio.charset.StandardCharsets.UTF_8;
@ -83,7 +85,8 @@ public class HttpEmailAttachementParserTests extends ESTestCase {
assertThat(emailAttachments.getAttachments(), hasSize(1)); assertThat(emailAttachments.getAttachments(), hasSize(1));
XContentBuilder toXcontentBuilder = jsonBuilder().startObject(); XContentBuilder toXcontentBuilder = jsonBuilder().startObject();
emailAttachments.getAttachments().get(0).toXContent(toXcontentBuilder, ToXContent.EMPTY_PARAMS); List<EmailAttachmentParser.EmailAttachment> attachments = new ArrayList<>(emailAttachments.getAttachments());
attachments.get(0).toXContent(toXcontentBuilder, ToXContent.EMPTY_PARAMS);
toXcontentBuilder.endObject(); toXcontentBuilder.endObject();
assertThat(toXcontentBuilder.string(), is(builder.string())); assertThat(toXcontentBuilder.string(), is(builder.string()));
} }

View File

@ -20,7 +20,7 @@ import org.elasticsearch.watcher.actions.Action;
import org.elasticsearch.watcher.actions.Action.Result.Status; import org.elasticsearch.watcher.actions.Action.Result.Status;
import org.elasticsearch.watcher.execution.WatchExecutionContext; import org.elasticsearch.watcher.execution.WatchExecutionContext;
import org.elasticsearch.watcher.support.WatcherDateTimeUtils; import org.elasticsearch.watcher.support.WatcherDateTimeUtils;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import org.elasticsearch.watcher.support.xcontent.XContentSource; import org.elasticsearch.watcher.support.xcontent.XContentSource;
import org.elasticsearch.watcher.test.WatcherTestUtils; import org.elasticsearch.watcher.test.WatcherTestUtils;
import org.elasticsearch.watcher.watch.Payload; import org.elasticsearch.watcher.watch.Payload;
@ -72,7 +72,7 @@ public class IndexActionTests extends ESIntegTestCase {
} }
IndexAction action = new IndexAction("test-index", "test-type", timestampField, null, null); IndexAction action = new IndexAction("test-index", "test-type", timestampField, null, null);
ExecutableIndexAction executable = new ExecutableIndexAction(action, logger, ClientProxy.of(client()), null); ExecutableIndexAction executable = new ExecutableIndexAction(action, logger, WatcherClientProxy.of(client()), null);
DateTime executionTime = DateTime.now(UTC); DateTime executionTime = DateTime.now(UTC);
Payload payload = randomBoolean() ? new Payload.Simple("foo", "bar") : new Payload.Simple("_doc", singletonMap("foo", "bar")); Payload payload = randomBoolean() ? new Payload.Simple("foo", "bar") : new Payload.Simple("_doc", singletonMap("foo", "bar"));
WatchExecutionContext ctx = WatcherTestUtils.mockExecutionContext("_id", executionTime, payload); WatchExecutionContext ctx = WatcherTestUtils.mockExecutionContext("_id", executionTime, payload);
@ -132,7 +132,7 @@ public class IndexActionTests extends ESIntegTestCase {
); );
IndexAction action = new IndexAction("test-index", "test-type", timestampField, null, null); IndexAction action = new IndexAction("test-index", "test-type", timestampField, null, null);
ExecutableIndexAction executable = new ExecutableIndexAction(action, logger, ClientProxy.of(client()), null); ExecutableIndexAction executable = new ExecutableIndexAction(action, logger, WatcherClientProxy.of(client()), null);
DateTime executionTime = DateTime.now(UTC); DateTime executionTime = DateTime.now(UTC);
WatchExecutionContext ctx = WatcherTestUtils.mockExecutionContext("_id", executionTime, new Payload.Simple("_doc", list)); WatchExecutionContext ctx = WatcherTestUtils.mockExecutionContext("_id", executionTime, new Payload.Simple("_doc", list));
@ -196,7 +196,7 @@ public class IndexActionTests extends ESIntegTestCase {
} }
builder.endObject(); builder.endObject();
IndexActionFactory actionParser = new IndexActionFactory(Settings.EMPTY, ClientProxy.of(client())); IndexActionFactory actionParser = new IndexActionFactory(Settings.EMPTY, WatcherClientProxy.of(client()));
XContentParser parser = JsonXContent.jsonXContent.createParser(builder.bytes()); XContentParser parser = JsonXContent.jsonXContent.createParser(builder.bytes());
parser.nextToken(); parser.nextToken();
@ -224,7 +224,7 @@ public class IndexActionTests extends ESIntegTestCase {
} }
} }
builder.endObject(); builder.endObject();
IndexActionFactory actionParser = new IndexActionFactory(Settings.EMPTY, ClientProxy.of(client())); IndexActionFactory actionParser = new IndexActionFactory(Settings.EMPTY, WatcherClientProxy.of(client()));
XContentParser parser = JsonXContent.jsonXContent.createParser(builder.bytes()); XContentParser parser = JsonXContent.jsonXContent.createParser(builder.bytes());
parser.nextToken(); parser.nextToken();
try { try {

View File

@ -15,7 +15,6 @@ import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.common.xcontent.json.JsonXContent;
import org.elasticsearch.env.Environment; import org.elasticsearch.env.Environment;
import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.watcher.actions.Action; import org.elasticsearch.watcher.actions.Action;
import org.elasticsearch.watcher.actions.Action.Result.Status; import org.elasticsearch.watcher.actions.Action.Result.Status;
import org.elasticsearch.watcher.actions.email.service.Attachment; import org.elasticsearch.watcher.actions.email.service.Attachment;
@ -32,12 +31,10 @@ import org.elasticsearch.watcher.support.http.HttpRequestTemplate;
import org.elasticsearch.watcher.support.http.HttpResponse; import org.elasticsearch.watcher.support.http.HttpResponse;
import org.elasticsearch.watcher.support.http.auth.HttpAuthRegistry; import org.elasticsearch.watcher.support.http.auth.HttpAuthRegistry;
import org.elasticsearch.watcher.support.http.auth.basic.BasicAuthFactory; import org.elasticsearch.watcher.support.http.auth.basic.BasicAuthFactory;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import org.elasticsearch.watcher.support.init.proxy.ScriptServiceProxy;
import org.elasticsearch.watcher.support.secret.SecretService; import org.elasticsearch.watcher.support.secret.SecretService;
import org.elasticsearch.watcher.support.text.TextTemplate; import org.elasticsearch.watcher.support.text.TextTemplate;
import org.elasticsearch.watcher.support.text.TextTemplateEngine; import org.elasticsearch.watcher.support.text.TextTemplateEngine;
import org.elasticsearch.watcher.support.text.DefaultTextTemplateEngine;
import org.elasticsearch.watcher.test.AbstractWatcherIntegrationTestCase; import org.elasticsearch.watcher.test.AbstractWatcherIntegrationTestCase;
import org.elasticsearch.watcher.test.MockTextTemplateEngine; import org.elasticsearch.watcher.test.MockTextTemplateEngine;
import org.elasticsearch.watcher.test.WatcherTestUtils; import org.elasticsearch.watcher.test.WatcherTestUtils;
@ -46,7 +43,6 @@ import org.elasticsearch.watcher.watch.Payload;
import org.elasticsearch.watcher.watch.Watch; import org.elasticsearch.watcher.watch.Watch;
import org.hamcrest.Matchers; import org.hamcrest.Matchers;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import javax.mail.internet.AddressException; import javax.mail.internet.AddressException;
@ -242,7 +238,7 @@ public class WebhookActionTests extends ESTestCase {
ExecutableWebhookAction executable = new ExecutableWebhookAction(action, logger, httpClient, templateEngine); ExecutableWebhookAction executable = new ExecutableWebhookAction(action, logger, httpClient, templateEngine);
String watchId = "test_url_encode" + randomAsciiOfLength(10); String watchId = "test_url_encode" + randomAsciiOfLength(10);
Watch watch = createWatch(watchId, mock(ClientProxy.class), "account1"); Watch watch = createWatch(watchId, mock(WatcherClientProxy.class), "account1");
WatchExecutionContext ctx = new TriggeredExecutionContext(watch, new DateTime(UTC), WatchExecutionContext ctx = new TriggeredExecutionContext(watch, new DateTime(UTC),
new ScheduleTriggerEvent(watchId, new DateTime(UTC), new DateTime(UTC)), timeValueSeconds(5)); new ScheduleTriggerEvent(watchId, new DateTime(UTC), new DateTime(UTC)), timeValueSeconds(5));
executable.execute("_id", ctx, new Payload.Simple()); executable.execute("_id", ctx, new Payload.Simple());
@ -268,14 +264,14 @@ public class WebhookActionTests extends ESTestCase {
ExecutableWebhookAction executable = new ExecutableWebhookAction(action, logger, client, templateEngine); ExecutableWebhookAction executable = new ExecutableWebhookAction(action, logger, client, templateEngine);
Watch watch = createWatch(watchId, mock(ClientProxy.class), "account1"); Watch watch = createWatch(watchId, mock(WatcherClientProxy.class), "account1");
WatchExecutionContext ctx = new TriggeredExecutionContext(watch, new DateTime(UTC), WatchExecutionContext ctx = new TriggeredExecutionContext(watch, new DateTime(UTC),
new ScheduleTriggerEvent(watchId, new DateTime(UTC), new DateTime(UTC)), timeValueSeconds(5)); new ScheduleTriggerEvent(watchId, new DateTime(UTC), new DateTime(UTC)), timeValueSeconds(5));
Action.Result result = executable.execute("_id", ctx, new Payload.Simple()); Action.Result result = executable.execute("_id", ctx, new Payload.Simple());
assertThat(result, Matchers.instanceOf(WebhookAction.Result.Success.class)); assertThat(result, Matchers.instanceOf(WebhookAction.Result.Success.class));
} }
private Watch createWatch(String watchId, ClientProxy client, final String account) throws AddressException, IOException { private Watch createWatch(String watchId, WatcherClientProxy client, final String account) throws AddressException, IOException {
return WatcherTestUtils.createTestWatch(watchId, return WatcherTestUtils.createTestWatch(watchId,
client, client,
ExecuteScenario.Success.client(), ExecuteScenario.Success.client(),

View File

@ -33,7 +33,7 @@ import org.elasticsearch.search.internal.InternalSearchHit;
import org.elasticsearch.search.internal.InternalSearchHits; import org.elasticsearch.search.internal.InternalSearchHits;
import org.elasticsearch.search.internal.InternalSearchResponse; import org.elasticsearch.search.internal.InternalSearchResponse;
import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import org.hamcrest.core.IsNull; import org.hamcrest.core.IsNull;
import org.junit.Before; import org.junit.Before;
@ -53,13 +53,13 @@ import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
public class TriggeredWatchStoreTests extends ESTestCase { public class TriggeredWatchStoreTests extends ESTestCase {
private ClientProxy clientProxy; private WatcherClientProxy clientProxy;
private TriggeredWatch.Parser parser; private TriggeredWatch.Parser parser;
private TriggeredWatchStore triggeredWatchStore; private TriggeredWatchStore triggeredWatchStore;
@Before @Before
public void init() { public void init() {
clientProxy = mock(ClientProxy.class); clientProxy = mock(WatcherClientProxy.class);
parser = mock(TriggeredWatch.Parser.class); parser = mock(TriggeredWatch.Parser.class);
triggeredWatchStore = new TriggeredWatchStore(Settings.EMPTY, clientProxy, parser); triggeredWatchStore = new TriggeredWatchStore(Settings.EMPTY, clientProxy, parser);
triggeredWatchStore.start(); triggeredWatchStore.start();

View File

@ -13,7 +13,7 @@ import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.watcher.WatcherModule; import org.elasticsearch.watcher.WatcherModule;
import org.elasticsearch.watcher.execution.ExecutionState; import org.elasticsearch.watcher.execution.ExecutionState;
import org.elasticsearch.watcher.execution.Wid; import org.elasticsearch.watcher.execution.Wid;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import org.elasticsearch.watcher.trigger.schedule.ScheduleTriggerEvent; import org.elasticsearch.watcher.trigger.schedule.ScheduleTriggerEvent;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.junit.Before; import org.junit.Before;
@ -31,11 +31,11 @@ import static org.mockito.Mockito.when;
*/ */
public class HistoryStoreTests extends ESTestCase { public class HistoryStoreTests extends ESTestCase {
private HistoryStore historyStore; private HistoryStore historyStore;
private ClientProxy clientProxy; private WatcherClientProxy clientProxy;
@Before @Before
public void init() { public void init() {
clientProxy = mock(ClientProxy.class); clientProxy = mock(WatcherClientProxy.class);
historyStore = new HistoryStore(Settings.EMPTY, clientProxy); historyStore = new HistoryStore(Settings.EMPTY, clientProxy);
historyStore.start(); historyStore.start();
} }

View File

@ -50,7 +50,7 @@ import org.elasticsearch.watcher.support.WatcherUtils;
import org.elasticsearch.watcher.support.http.HttpClient; import org.elasticsearch.watcher.support.http.HttpClient;
import org.elasticsearch.watcher.support.http.HttpMethod; import org.elasticsearch.watcher.support.http.HttpMethod;
import org.elasticsearch.watcher.support.http.HttpRequestTemplate; import org.elasticsearch.watcher.support.http.HttpRequestTemplate;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import org.elasticsearch.watcher.support.init.proxy.ScriptServiceProxy; import org.elasticsearch.watcher.support.init.proxy.ScriptServiceProxy;
import org.elasticsearch.watcher.support.secret.Secret; import org.elasticsearch.watcher.support.secret.Secret;
import org.elasticsearch.watcher.support.text.TextTemplate; import org.elasticsearch.watcher.support.text.TextTemplate;
@ -172,11 +172,11 @@ public final class WatcherTestUtils {
public static Watch createTestWatch(String watchName, HttpClient httpClient, EmailService emailService, public static Watch createTestWatch(String watchName, HttpClient httpClient, EmailService emailService,
ESLogger logger) throws AddressException { ESLogger logger) throws AddressException {
return createTestWatch(watchName, ClientProxy.of(ESIntegTestCase.client()), httpClient, emailService, logger); return createTestWatch(watchName, WatcherClientProxy.of(ESIntegTestCase.client()), httpClient, emailService, logger);
} }
public static Watch createTestWatch(String watchName, ClientProxy client, HttpClient httpClient, EmailService emailService, public static Watch createTestWatch(String watchName, WatcherClientProxy client, HttpClient httpClient, EmailService emailService,
ESLogger logger) throws AddressException { ESLogger logger) throws AddressException {
SearchRequest conditionRequest = newInputSearchRequest("my-condition-index").source(searchSource().query(matchAllQuery())); SearchRequest conditionRequest = newInputSearchRequest("my-condition-index").source(searchSource().query(matchAllQuery()));

View File

@ -32,7 +32,7 @@ import org.elasticsearch.search.SearchHitField;
import org.elasticsearch.search.internal.InternalSearchHit; import org.elasticsearch.search.internal.InternalSearchHit;
import org.elasticsearch.search.internal.InternalSearchHits; import org.elasticsearch.search.internal.InternalSearchHits;
import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import org.junit.Before; import org.junit.Before;
import java.util.Collections; import java.util.Collections;
@ -52,12 +52,12 @@ import static org.mockito.Mockito.when;
*/ */
public class WatchStoreTests extends ESTestCase { public class WatchStoreTests extends ESTestCase {
private WatchStore watchStore; private WatchStore watchStore;
private ClientProxy clientProxy; private WatcherClientProxy clientProxy;
private Watch.Parser parser; private Watch.Parser parser;
@Before @Before
public void init() { public void init() {
clientProxy = mock(ClientProxy.class); clientProxy = mock(WatcherClientProxy.class);
parser = mock(Watch.Parser.class); parser = mock(Watch.Parser.class);
watchStore = new WatchStore(Settings.EMPTY, clientProxy, parser); watchStore = new WatchStore(Settings.EMPTY, clientProxy, parser);
} }

View File

@ -76,7 +76,7 @@ import org.elasticsearch.watcher.support.http.HttpMethod;
import org.elasticsearch.watcher.support.http.HttpRequestTemplate; import org.elasticsearch.watcher.support.http.HttpRequestTemplate;
import org.elasticsearch.watcher.support.http.auth.HttpAuthRegistry; import org.elasticsearch.watcher.support.http.auth.HttpAuthRegistry;
import org.elasticsearch.watcher.support.http.auth.basic.BasicAuthFactory; import org.elasticsearch.watcher.support.http.auth.basic.BasicAuthFactory;
import org.elasticsearch.watcher.support.init.proxy.ClientProxy; import org.elasticsearch.watcher.support.init.proxy.WatcherClientProxy;
import org.elasticsearch.watcher.support.init.proxy.ScriptServiceProxy; import org.elasticsearch.watcher.support.init.proxy.ScriptServiceProxy;
import org.elasticsearch.watcher.support.secret.SecretService; import org.elasticsearch.watcher.support.secret.SecretService;
import org.elasticsearch.watcher.support.text.TextTemplate; import org.elasticsearch.watcher.support.text.TextTemplate;
@ -141,7 +141,7 @@ import static org.mockito.Mockito.mock;
public class WatchTests extends ESTestCase { public class WatchTests extends ESTestCase {
private ScriptServiceProxy scriptService; private ScriptServiceProxy scriptService;
private ClientProxy client; private WatcherClientProxy client;
private HttpClient httpClient; private HttpClient httpClient;
private EmailService emailService; private EmailService emailService;
private TextTemplateEngine templateEngine; private TextTemplateEngine templateEngine;
@ -155,7 +155,7 @@ public class WatchTests extends ESTestCase {
@Before @Before
public void init() throws Exception { public void init() throws Exception {
scriptService = mock(ScriptServiceProxy.class); scriptService = mock(ScriptServiceProxy.class);
client = mock(ClientProxy.class); client = mock(WatcherClientProxy.class);
httpClient = mock(HttpClient.class); httpClient = mock(HttpClient.class);
emailService = mock(EmailService.class); emailService = mock(EmailService.class);
templateEngine = mock(TextTemplateEngine.class); templateEngine = mock(TextTemplateEngine.class);