Watcher: Fix resetting of ack status on unmet condition (elastic/x-pack-elasticsearch#1141)
When a condition is unmet, the ack status of the actions needs to be resetted again, so that new alerts can be triggered. Due to a bugfix this functionality was removed from ES 5.0.0-alpha5 onwards. relates elastic/x-pack-elasticsearch#1123 Original commit: elastic/x-pack-elasticsearch@83db2cecf9
This commit is contained in:
parent
13d3b353c6
commit
50dff91a3a
|
@ -117,6 +117,10 @@ public class WatchStatus implements ToXContentObject, Streamable {
|
||||||
lastChecked = timestamp;
|
lastChecked = timestamp;
|
||||||
if (metCondition) {
|
if (metCondition) {
|
||||||
lastMetCondition = timestamp;
|
lastMetCondition = timestamp;
|
||||||
|
} else {
|
||||||
|
for (ActionStatus status : actions.values()) {
|
||||||
|
status.resetAckStatus(timestamp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* 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.watcher.watch;
|
||||||
|
|
||||||
|
import org.elasticsearch.test.ESTestCase;
|
||||||
|
import org.elasticsearch.xpack.watcher.actions.ActionStatus;
|
||||||
|
import org.elasticsearch.xpack.watcher.actions.ActionStatus.AckStatus.State;
|
||||||
|
import org.elasticsearch.xpack.watcher.actions.logging.LoggingAction;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import static org.hamcrest.Matchers.is;
|
||||||
|
import static org.joda.time.DateTime.now;
|
||||||
|
|
||||||
|
public class WatchStatusTests extends ESTestCase {
|
||||||
|
|
||||||
|
public void testAckStatusIsResetOnUnmetCondition() {
|
||||||
|
HashMap<String, ActionStatus> myMap = new HashMap<>();
|
||||||
|
ActionStatus actionStatus = new ActionStatus(now());
|
||||||
|
myMap.put("foo", actionStatus);
|
||||||
|
|
||||||
|
actionStatus.update(now(), new LoggingAction.Result.Success("foo"));
|
||||||
|
actionStatus.onAck(now());
|
||||||
|
assertThat(actionStatus.ackStatus().state(), is(State.ACKED));
|
||||||
|
|
||||||
|
WatchStatus status = new WatchStatus(now(), myMap);
|
||||||
|
status.onCheck(false, now());
|
||||||
|
|
||||||
|
assertThat(status.actionStatus("foo").ackStatus().state(), is(State.AWAITS_SUCCESSFUL_EXECUTION));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,105 @@
|
||||||
|
---
|
||||||
|
setup:
|
||||||
|
- do:
|
||||||
|
cluster.health:
|
||||||
|
wait_for_status: yellow
|
||||||
|
|
||||||
|
---
|
||||||
|
teardown:
|
||||||
|
- do:
|
||||||
|
xpack.watcher.delete_watch:
|
||||||
|
id: "my_watch"
|
||||||
|
ignore: 404
|
||||||
|
|
||||||
|
# See https://github.com/elastic/x-pack-elasticsearch/issues/1123
|
||||||
|
---
|
||||||
|
"Ensure that ack status is reset after unsuccesful execution":
|
||||||
|
|
||||||
|
- do:
|
||||||
|
xpack.watcher.put_watch:
|
||||||
|
id: "my_watch"
|
||||||
|
body: >
|
||||||
|
{
|
||||||
|
"trigger": {
|
||||||
|
"schedule": {
|
||||||
|
"interval": "1m"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"input": {
|
||||||
|
"simple" : { "match" : "true" }
|
||||||
|
},
|
||||||
|
"condition": {
|
||||||
|
"compare": {
|
||||||
|
"ctx.payload.match": {
|
||||||
|
"eq": "true"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"actions": {
|
||||||
|
"indexme" : {
|
||||||
|
"index" : {
|
||||||
|
"index" : "my-index",
|
||||||
|
"doc_type" : "my-type",
|
||||||
|
"doc_id": "my-id"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- do:
|
||||||
|
xpack.watcher.execute_watch:
|
||||||
|
id: "my_watch"
|
||||||
|
body: >
|
||||||
|
{
|
||||||
|
"record_execution" : true
|
||||||
|
}
|
||||||
|
- match: { watch_record._status.actions.indexme.ack.state: "ackable" }
|
||||||
|
|
||||||
|
- do:
|
||||||
|
xpack.watcher.ack_watch:
|
||||||
|
watch_id: "my_watch"
|
||||||
|
- match: { "_status.actions.indexme.ack.state" : "acked" }
|
||||||
|
|
||||||
|
- do:
|
||||||
|
xpack.watcher.get_watch:
|
||||||
|
id: "my_watch"
|
||||||
|
- match: { "_status.actions.indexme.ack.state" : "acked" }
|
||||||
|
|
||||||
|
# having a false result will reset the ack state
|
||||||
|
- do:
|
||||||
|
xpack.watcher.execute_watch:
|
||||||
|
id: "my_watch"
|
||||||
|
body: >
|
||||||
|
{
|
||||||
|
"record_execution" : true,
|
||||||
|
"alternative_input" : {
|
||||||
|
"match" : "false"
|
||||||
|
},
|
||||||
|
"action_modes" : {
|
||||||
|
"indexme" : "force_execute"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- match: { watch_record._status.actions.indexme.ack.state: "awaits_successful_execution" }
|
||||||
|
|
||||||
|
- do:
|
||||||
|
xpack.watcher.get_watch:
|
||||||
|
id: "my_watch"
|
||||||
|
- match: { "_status.actions.indexme.ack.state" : "awaits_successful_execution" }
|
||||||
|
|
||||||
|
- do:
|
||||||
|
xpack.watcher.execute_watch:
|
||||||
|
id: "my_watch"
|
||||||
|
body: >
|
||||||
|
{
|
||||||
|
"record_execution" : true,
|
||||||
|
"action_modes" : {
|
||||||
|
"indexme" : "force_execute"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- match: { watch_record._status.actions.indexme.ack.state: "ackable" }
|
||||||
|
|
||||||
|
- do:
|
||||||
|
xpack.watcher.get_watch:
|
||||||
|
id: "my_watch"
|
||||||
|
- match: { "_status.actions.indexme.ack.state" : "ackable" }
|
||||||
|
|
Loading…
Reference in New Issue