Commit Graph

1789 Commits

Author SHA1 Message Date
Martijn van Groningen f4d0dc4955 http client: Don't append '?' to the url if there are no query string options defined.
Closes elastic/elasticsearch#271

Original commit: elastic/x-pack-elasticsearch@63487fad87
2015-04-29 15:07:48 +02:00
Martijn van Groningen 5bc491d359 execution service: Don't try to send empty bulk requests
Closes elastic/elasticsearch#264

Original commit: elastic/x-pack-elasticsearch@f636bfd956
2015-04-29 15:06:16 +02:00
Martijn van Groningen e438c51555 execution service: Ignore watch records that where deleted while awaiting for execution.
Closes elastic/elasticsearch#268

Original commit: elastic/x-pack-elasticsearch@dbb7160a67
2015-04-29 15:02:49 +02:00
jaymode a6df3d003e add reroute permissions for the system user
The system user needs to be able to execute a reroute action to support the
DiskThresholdDecider. The DiskThresholdDecider executes an empty reroute
request when a high disk watermark has been exceeded.

Relates to elastic/elasticsearch#816

Original commit: elastic/x-pack-elasticsearch@890b44d79e
2015-04-29 08:39:31 -04:00
Brian Murphy 42d49d54ef Merge pull request elastic/elasticsearch#265 from GaelTadh/api_namespace_changes
Change watcher REST API call namespace to be watcher.

Original commit: elastic/x-pack-elasticsearch@7a80eb522b
2015-04-28 23:41:03 -04:00
Martijn van Groningen 66c492192c test: fix test bug
Original commit: elastic/x-pack-elasticsearch@d747eadf2f
2015-04-29 01:28:38 +02:00
Brian Murphy 94bea8f83a Change the watch specific actions to reflect that they operate on watches.
This change changes the watch specific actions put/get/delete/execute/ack to be watcher.<action>_watch.

Original commit: elastic/x-pack-elasticsearch@86a91cb141
2015-04-28 19:08:28 -04:00
Martijn van Groningen bbdfaadfaa test: add webhook integration tests
Original commit: elastic/x-pack-elasticsearch@246888fe5e
2015-04-29 01:06:08 +02:00
Brian Murphy 4482d8d2ba Change watcher REST API call namespace to be watcher.
This change changes the API spec such that all of the watcher APIs are in the `watcher` namespace.

Original commit: elastic/x-pack-elasticsearch@f409ab4569
2015-04-28 18:50:07 -04:00
Martijn van Groningen 2f18dd8269 test: add a test that verifies that we only execute watch records that have the await_exection state during the Watcher start phase
Original commit: elastic/x-pack-elasticsearch@62ffe1c984
2015-04-28 19:08:09 +02:00
Martijn van Groningen 4ef30822ea test: improved tests that verify the loading of watches and watch records at Watcher startup time
Original commit: elastic/x-pack-elasticsearch@2ee28bdf7e
2015-04-28 17:34:51 +02:00
Brian Murphy 29d25d4440 [TEST] Enable test compilation against elasticsearch version 1.5.2
ElasticsearchIntegrationTest now has a method called httpClient with a different return type than the watcher AbstractWatcherTests httpclient.
This change renamed the `AbstractWatcherTests.httpClient` to `AbstractWatcherTests.watcherHttpClient`.

Original commit: elastic/x-pack-elasticsearch@d35f076cf2
2015-04-28 11:24:28 -04:00
uboness 280732a120 Better handling of sensitive data in registered watches and watcher settings
A watch may contain sensitive data that typically you don't want to expose in plain text. Exposing means:
 - storing it as plain text in the `.watches` and `.watch_history` indices
 - storing it in memory in plain text (can be access via mem dump)
 - returning it to the user via API in plain text

Examples of such sensitive data:
 - The `password` for the email service (can be configured on the watch itself)
 - The `password` for http input when using basic auth
 - The `passowrd` for webhook action when using basic auth

A new `SecretService` (you heard it right... secret service) was added to handel the secrets across the board. When a watch is first added to watcher, this service converts all the sensitive data to secrets. From that moment on, all sensitive data associated with the watch (whether in stored in the index or in memory) is hidden behind the secret. This service is also used to "reveal" the original sensitive data on-demand when needed (for example, when the email is sent, it is sent with the original text).

There are two implementations for the `SecretService`. The default one is "plain text" where the created secrets don't really hide anything. The second implementation is based on Shield. If Shield is installed and enabled, the `ShieldSecretService` is used which uses shield's crypto service to potentially encrypt the sensitive data (only potentially because Shield's system key must be defined for encryption to take effect, without the system key, the crypto service will not encrypt and instead return the sensitive data in plain text)

Note, even when Shield is installed, the encryption of sensitive data will only be applied if the `watcher.shield.encrypt_sensitive_data` setting is set to `true`. By default it is set to `false`.

The `get watch` and `execute watch` APIs were updated to filter out sensitive data (using special "hide secrets" parameter).

When shield is integrated, we use shield's settings filter to filter out sensitive settings from the REST nodes info API (when shield is not installed or enabled, we don't do this filtering).

For this change several other refactoring needed to take place
 - The http auth codebase was refactored to be more modular. Just like with other modular constructs in watcher, we separated `HttpAuth` from `ApplicableHttpAuth` where the former is the configuration construct and tha latter is the applicable ("executable") construct.
 - Changed `WatchStore#put` to accept a watch (instead of the watch source). That's more natural way of looking at a store. Also, a `Watch` can now create and return itself as `ByteReference`. In addition, we now don't directly store the watch source as it was sent by the user, instead, we first parse it to a watch (important step to both validate the source and convert all sensitive data to secrets) and then serialize the watch back to `ByteReference`. This way we're sure that only the secrets are stored and not the original sensitive data.
 - All `ToXContent` implementation were updated to properly propagate the `Params`

Docs were added to the Shield Integration chapter

Original commit: elastic/x-pack-elasticsearch@4490fb0ab8
2015-04-28 16:04:02 +02:00
Martijn van Groningen 735369b5f4 test: use put watch api to insert watches
test: verify that the exection queue size is 0 when Watcher isn't running

Original commit: elastic/x-pack-elasticsearch@ea16d066e5
2015-04-28 15:26:20 +02:00
Martijn van Groningen 87e3a6a41d test: after each test, ensure that watcher only runs on one node (elected master)
Original commit: elastic/x-pack-elasticsearch@c5d0d4e1d3
2015-04-28 13:41:24 +02:00
Martijn van Groningen 59218733ea test: fix forbidden api failure
Original commit: elastic/x-pack-elasticsearch@ec8c6e1d51
2015-04-28 12:37:41 +02:00
Martijn van Groningen fcb81ab76a test: added more tests for the transform feature.
Original commit: elastic/x-pack-elasticsearch@dd46dc1c42
2015-04-28 12:22:06 +02:00
Brian Murphy 877e59c80f [TEST] Add support for HEAD and DELETE to `WebhookActionTests`
Add HEAD and DELETE to the list of http methods we test in the webhook action tests.

Original commit: elastic/x-pack-elasticsearch@7a6b29bac6
2015-04-27 18:14:17 -04:00
Brian Murphy 01c80e63b0 [TEST] Add automated tests that were missing.
SearchInput using inline, indexed and on disk templates.
ScriptedCondition where the script accesses the ctx.
ScriptedCondition where the script throws an exception.
ScriptedCondition where the script doesn't return a boolean.
Webhook tests using templated body, path and parameters.
Some REST test fixes.

Original commit: elastic/x-pack-elasticsearch@d02b6d1d7b
2015-04-27 17:56:55 -04:00
jaymode c83836df71 [Test] fix bug in creating a byte array for tampered encryption test
The testChangingAByte method was requesting a random length byte array ranging
from 0-1000. The issue is that a byte array with length of 0 cannot be changed and
therefore this test is not valid in this case. It now requests a range of 1-1000.

Original commit: elastic/x-pack-elasticsearch@88edf535f4
2015-04-27 09:27:01 -04:00
jaymode c0858842ad [Test] update randomization file for elasticsearch 1.5.2 release
Original commit: elastic/x-pack-elasticsearch@cc48198ce4
2015-04-27 08:39:42 -04:00
Martijn van Groningen 7f6c3814b7 test: unset 'shieldEnabled' and 'scheduleEngine' after test class is completed.
Original commit: elastic/x-pack-elasticsearch@3e9332df94
2015-04-25 17:42:48 +02:00
Martijn van Groningen 5d494a7b2d test: ensure that 'shieldEnabled' field is only set once.
The HttpInputIntegrationTest sometimes unsetted the 'shieldEnabled' field for subsequent test methods, this caused http 401 errors, because the nodes were started with Shield enabled.

Original commit: elastic/x-pack-elasticsearch@b39ca9647d
2015-04-25 15:37:41 +02:00
Martijn van Groningen 4530232060 increased logging
Original commit: elastic/x-pack-elasticsearch@704c8d6132
2015-04-24 23:07:38 +02:00
Martijn van Groningen b0a16e36fd test: quicker interval
Original commit: elastic/x-pack-elasticsearch@795827db7f
2015-04-24 14:54:13 +02:00
Brian Murphy 9a044735dd [TEST] Minimize chance of thread pre-emption when testing fair locks.
Original commit: elastic/x-pack-elasticsearch@4d52f70e7f
2015-04-24 08:47:44 -04:00
Martijn van Groningen 93fee667ab test: added no master node test for a cluster with dedicated master nodes and dedicated data nodes.
Automates: https://github.com/elastic/elasticsearch-watcher-qa/issues/83

Original commit: elastic/x-pack-elasticsearch@73fac17961
2015-04-24 14:26:30 +02:00
Martijn van Groningen e1c163dba4 test: added test for http input querying api other than _search
Original commit: elastic/x-pack-elasticsearch@ebb1d802c9
2015-04-24 12:45:35 +02:00
Martijn van Groningen 3e882fce7d test: run randomily with shield again
Original commit: elastic/x-pack-elasticsearch@d55e61af71
2015-04-24 12:14:03 +02:00
Brian Murphy f39da21905 If we fail to bind to port 2500 when starting an EmailServer try the next port up.
This change employs the same kind of logic that `HttpClientTest` uses to find an open port for it's server. This should prevent the rare build failures we have seen.

Original commit: elastic/x-pack-elasticsearch@f3b68adad5
2015-04-23 21:10:04 -04:00
Brian Murphy d319fdef1b Add timeout when stopping WatchLockService
If there were many watches concurrently executing that take some time to execute it can a long time to shutdown a node. This change introduces a Timeout when stopping the WatchLockService.
Make watcher lock service timeout configurable. The configuration setting is `watcher.stop.timeout` the default is 30s.

Fixes elastic/elasticsearch#216

Original commit: elastic/x-pack-elasticsearch@06bf029a54
2015-04-23 17:45:11 -04:00
Brian Murphy a68d9018f2 Disable minimizeJar in pom.xml
The javax package finds some needed classfiles by reflection. Minimizing the shaded jar meant that these were not available.

Fixes elastic/elasticsearch#254

Original commit: elastic/x-pack-elasticsearch@7cdc3bc55b
2015-04-23 17:37:39 -04:00
Martijn van Groningen 80a766d18e test: removed unused field
Original commit: elastic/x-pack-elasticsearch@039328fccd
2015-04-23 22:11:20 +02:00
Martijn van Groningen 946df191e9 removed unused field
Original commit: elastic/x-pack-elasticsearch@1c4e94b5b2
2015-04-23 22:00:46 +02:00
Martijn van Groningen 4e8ed283e7 Renamed `WatchService` to `WatcherService` and moved it to the `org.elasticsearch.watcher` package.
Original commit: elastic/x-pack-elasticsearch@5f602ed832
2015-04-23 21:49:29 +02:00
Martijn van Groningen ec8c9046b3 Refactored life cycle starting.
* The validation happens separately from the actual starting and loading. Also the validation happens on the cluster update thread, so that we don't miss any cluster state update.
* The starting/loading part happens on a forked thread, but if it fails then it always retry after a small timeout.
* Simplified the starting code, so that we don't need the callback interface.

Closes elastic/elasticsearch#212

Original commit: elastic/x-pack-elasticsearch@b5cd48e5bb
2015-04-23 21:49:28 +02:00
Brian Murphy 41e42f0945 The DateTimes watcher uses for scheduled and trigger times should always be UTC
Before this change DateTimes were being constructed without providing a time zone,
this was causing some non-utc time leakage. In particular watch record ids were being created with non utc dates and
watch records were going to the wrong .watch_history index.
Add Clock.now(DateTimeZone) to allow callers to get UTC now.
Also construct the DateTimes with UTC timezones when we construct from millis.
Add all constuctors of DateTime that do not specify a time zone to the forbidden APIs.
This change makes constructing a `DateTime` object without providing a `DateTimeZone` forbidden.
This is much safer and makes time zone errors much more unlikely to occur.
Statically import DateTimeZone.UTC everywhere it was being used
Now all calls that use DateTimeZone.UTC just refrence UTC.

Fixes elastic/elasticsearch#150

Original commit: elastic/x-pack-elasticsearch@7f23ce605e
2015-04-23 15:17:23 -04:00
Brian Murphy 29c76b9c8a [LOG] Catch all and log all `WatcherException`s with watch id when parsing watches at start.
This will help debugging broken watches.

Fixes elastic/elasticsearch#251

Original commit: elastic/x-pack-elasticsearch@87e3e9a0dc
2015-04-23 15:13:19 -04:00
Martijn van Groningen 096e00caed index templates: use correct property to extract version from index template from cluster state
Original commit: elastic/x-pack-elasticsearch@ab86054c7f
2015-04-23 20:58:21 +02:00
uboness 345f610bdf Cleanup and Refactored Templates
Mainly how templates read/write themselves from/to xcontent. Instead of using `text`, use `template`

Original commit: elastic/x-pack-elasticsearch@0d6f317539
2015-04-23 15:15:46 +02:00
uboness ae1d4021c0 Cleanup and Refactoring
- Changed watch `name` to watch `id
- `TriggerEngine.Job#name` -> `TriggerEngine.Job#id`
- Removed `Trigger.SourceBuilder` in favor of `Trigger.Builder`
- Fixed compile warnings in `EmailTemplate`

Original commit: elastic/x-pack-elasticsearch@b7fb23712c
2015-04-23 13:06:53 +02:00
uboness 70209698fb Changed version to 1.0.0-Beta1-SNAPSHOT
Original commit: elastic/x-pack-elasticsearch@6bd62904cc
2015-04-23 10:35:33 +02:00
uboness 690af790b2 Cleanup and Refactoring of the transforms
* Split the transform into two constructs: `Transform` and `ExecutableTransform`. The former holds all the transform configuration, the latter can execute the transform based on that configuration (an executable transform holds a transform)
 - This makes the code clearer to understand and maintain.
 - This also enabled to pull some common implementation code into the `ExecutableTransform` and by that reduce the implementation details of each executable to the minimum required.

* Also, extracted the `Transform.Parser` to its own top level class, and renamed it to - `TransformFactory`. The main thing that the factory does is: 1) delegate to the parsing to the `Transform` class, 2) construct & wire up the `ExecutableTransform`.

* With the introduction of `Transform`, we no longer need the `SourceBuilder` for transforms. Instead, we have `Transform.Builder` that help you build a transform. This is much more intuitive from the client perspective.

Original commit: elastic/x-pack-elasticsearch@f6ee0d0c75
2015-04-23 10:23:08 +02:00
Martijn van Groningen 34c9d6af62 Removed the watcher executor thread pool as it is redundant now with the async indexing.
Original commit: elastic/x-pack-elasticsearch@6afaf0308b
2015-04-23 08:34:23 +02:00
Martijn van Groningen 7851ad6993 Removed quartz, timer and hashwheel schedule engines. Renames simple engine to ticket engine.
Original commit: elastic/x-pack-elasticsearch@f59be963ef
2015-04-22 23:36:53 +02:00
Martijn van Groningen a68db406e2 * Doubled the watcher executor thread pool size.
* Tune the index templates for higher index throughput.
* Trigger events should be processed and indexed in an async manner.
* Moved the job name into the TriggerEvent
* Added support for fire multiple events at the same time. If multiple events are fired at the same time then use async bulk to persist the watch record.
* Cut simple ticker and timer ticker over to fire multiple events at the same time
* Don't fire more than 1000 events at the time. (this also may result in large bulk requests)

Original commit: elastic/x-pack-elasticsearch@c7f6bd3812
2015-04-22 23:35:20 +02:00
Martijn van Groningen c8a0c27934 * Log EsRejectedExecutionException better than it is now. (letting it bubble up the the thread that is actually firing triggers, which then prints uncaught exception...)
* if we have EsRejectedExecutionException log on debug level.

Original commit: elastic/x-pack-elasticsearch@e8eb8fcf36
2015-04-22 23:30:11 +02:00
Martijn van Groningen a1b3d41822 * Added overall benchmark that tests all the scheduler engines
* Changed the isolated ScheduleEngineBenchmark to tests all engines and collect statistics during a test run.
* Updated the isolated schedule benchmark to just test the trigger part of the scheduler and capture some basic matrics.

Original commit: elastic/x-pack-elasticsearch@88bbf3688d
2015-04-22 23:30:10 +02:00
uboness 3f26a1b2e0 Adds initial schedule engine implementation
- `TimerScheduleTriggerEngine` - a single threaded Java `Timer`based scheduler. "Ticks" every second and checks all the registered schedules.

- `SimpleTickerScheduleTriggerEngine` - a single threaded scheduler. "Ticks" every second and checks all the registered schedules

- `SchedulerScheduleTriggerEngine` - a single threaded engine based on Java's schedule executor service. Here, every job is added as a scheduled task to the executor and each job is managing its own execution times.

- `HashWheelScheduleTriggerEngine` - a single threaded engine based on Netty's `HashWheelTimer`. Like with the `scheduler` above, every job is added as a scheduled task to the executor and each job is managing its own execution times.

Also:

- Added an undocumented feature to configure the schedule engine in the settings using `watcher.trigger.schedule.engine` (optional values right now are `quartz`, `simple`, `timer`, `hashwheel` and `scheduler`)
- `Cron` is a fork/copy of quartz `CronExpression`.. a bit cleaned up though.
- `Schedule` now exposes `nextScheduledTimeAfter` to return the next scheduled time after the given one.
- `CronnableSchedule` is now based on `Cron` (this exposed bugs in the schedule tests where we generated invalid cron expression. Now, since `Cronnable` creates the actual cron, validation is in place to make sure only valid expressions are created)
- While at it... refactored how the thread pool settings are set. Removed it from the plugin class, now each module is responsible for the settings of its own TPs. Also, if the thread pools are already configured in node settings we don't configure our default ones. This will enable users to configure the TPs in `elasticsearch.yml`
- Also updated `CronEvalTool` to work with `DateTime` construct (instead of java's `Date`)

Original commit: elastic/x-pack-elasticsearch@40d107c66e
2015-04-22 23:30:10 +02:00
Brian Murphy 3c7b42eb7b Support for Sanitized HTML in emails.
This change adds a shaded dependency on owasp (https://code.google.com/p/owasp-java-html-sanitizer/) to add support for HTML Sanitization.
Only images that reference an attachment are supported. This Sanitization may be customized for each email profile.
Other dangerous behavior is suppressed.

See elastic/elasticsearch#163
Fixes elastic/elasticsearch#163

Original commit: elastic/x-pack-elasticsearch@bc237d1beb
2015-04-22 16:57:03 -04:00