You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metron.apache.org by rm...@apache.org on 2018/05/21 13:24:01 UTC

metron git commit: METRON-1565 Metaalerts fix denormalization after moving to active status (merrimanr) closes apache/metron#1017

Repository: metron
Updated Branches:
  refs/heads/master 71a015fab -> 4116b9907


METRON-1565 Metaalerts fix denormalization after moving to active status (merrimanr) closes apache/metron#1017


Project: http://git-wip-us.apache.org/repos/asf/metron/repo
Commit: http://git-wip-us.apache.org/repos/asf/metron/commit/4116b990
Tree: http://git-wip-us.apache.org/repos/asf/metron/tree/4116b990
Diff: http://git-wip-us.apache.org/repos/asf/metron/diff/4116b990

Branch: refs/heads/master
Commit: 4116b99070849ffefd3b9b00ed7f4df2078594e7
Parents: 71a015f
Author: merrimanr <me...@gmail.com>
Authored: Mon May 21 08:23:36 2018 -0500
Committer: merrimanr <me...@apache.org>
Committed: Mon May 21 08:23:36 2018 -0500

----------------------------------------------------------------------
 .../dao/ElasticsearchMetaAlertDao.java          |  7 ++-
 .../ElasticsearchMetaAlertIntegrationTest.java  | 53 +++++++++++++++++++-
 2 files changed, 57 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metron/blob/4116b990/metron-platform/metron-elasticsearch/src/main/java/org/apache/metron/elasticsearch/dao/ElasticsearchMetaAlertDao.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-elasticsearch/src/main/java/org/apache/metron/elasticsearch/dao/ElasticsearchMetaAlertDao.java b/metron-platform/metron-elasticsearch/src/main/java/org/apache/metron/elasticsearch/dao/ElasticsearchMetaAlertDao.java
index 2311a2b..2c42b08 100644
--- a/metron-platform/metron-elasticsearch/src/main/java/org/apache/metron/elasticsearch/dao/ElasticsearchMetaAlertDao.java
+++ b/metron-platform/metron-elasticsearch/src/main/java/org/apache/metron/elasticsearch/dao/ElasticsearchMetaAlertDao.java
@@ -349,7 +349,6 @@ public class ElasticsearchMetaAlertDao implements MetaAlertDao {
     boolean metaAlertUpdated = !status.getStatusString().equals(currentStatus);
     if (metaAlertUpdated) {
       metaAlert.getDocument().put(MetaAlertDao.STATUS_FIELD, status.getStatusString());
-      updates.put(metaAlert, Optional.of(index));
       List<GetRequest> getRequests = new ArrayList<>();
       List<Map<String, Object>> currentAlerts = (List<Map<String, Object>>) metaAlert.getDocument()
           .get(MetaAlertDao.ALERT_FIELD);
@@ -357,6 +356,7 @@ public class ElasticsearchMetaAlertDao implements MetaAlertDao {
         getRequests.add(new GetRequest((String) currentAlert.get(GUID), (String) currentAlert.get(SOURCE_TYPE)));
       });
       Iterable<Document> alerts = indexDao.getAllLatest(getRequests);
+      List<Map<String, Object>> updatedAlerts = new ArrayList<>();
       for (Document alert : alerts) {
         boolean metaAlertAdded = false;
         boolean metaAlertRemoved = false;
@@ -371,7 +371,12 @@ public class ElasticsearchMetaAlertDao implements MetaAlertDao {
         if (metaAlertAdded || metaAlertRemoved) {
           updates.put(alert, Optional.empty());
         }
+        updatedAlerts.add(alert.getDocument());
+      }
+      if (MetaAlertStatus.ACTIVE.equals(status)) {
+        metaAlert.getDocument().put(MetaAlertDao.ALERT_FIELD, updatedAlerts);
       }
+      updates.put(metaAlert, Optional.of(index));
     }
     if (metaAlertUpdated) {
       indexDaoUpdate(updates);

http://git-wip-us.apache.org/repos/asf/metron/blob/4116b990/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/ElasticsearchMetaAlertIntegrationTest.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/ElasticsearchMetaAlertIntegrationTest.java b/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/ElasticsearchMetaAlertIntegrationTest.java
index 9e74fb6..6c78883 100644
--- a/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/ElasticsearchMetaAlertIntegrationTest.java
+++ b/metron-platform/metron-elasticsearch/src/test/java/org/apache/metron/elasticsearch/integration/ElasticsearchMetaAlertIntegrationTest.java
@@ -608,7 +608,7 @@ public class ElasticsearchMetaAlertIntegrationTest {
     }
 
     {
-      // Verify status changed to active and child alerts are updated
+      // Verify status changed to active and metaalerts fields on child alerts are updated
       Assert.assertTrue(metaDao.updateMetaAlertStatus("meta_alert", MetaAlertStatus.ACTIVE));
 
       Map<String, Object> expectedMetaAlert = new HashMap<>(metaAlert);
@@ -649,6 +649,37 @@ public class ElasticsearchMetaAlertIntegrationTest {
         }
       }
     }
+
+    {
+      // Verify status changed to active and meta alert child alerts are refreshed
+      Assert.assertTrue(metaDao.updateMetaAlertStatus("meta_alert", MetaAlertStatus.INACTIVE));
+
+      Map<String, Object> expectedMetaAlert = new HashMap<>(metaAlert);
+      expectedMetaAlert.put(STATUS_FIELD, MetaAlertStatus.INACTIVE.getStatusString());
+
+      findUpdatedDoc(expectedMetaAlert, "meta_alert", METAALERT_TYPE);
+
+      {
+        // Update a child alert by adding a field
+        Document alert0 = esDao.getLatest("message_0", SENSOR_NAME);
+        alert0.getDocument().put("field", "value");
+        esDao.update(alert0, Optional.empty());
+
+        findUpdatedDoc(alert0.getDocument(), "message_0", SENSOR_NAME);
+
+        // Change the status to active
+        Assert.assertTrue(metaDao.updateMetaAlertStatus("meta_alert", MetaAlertStatus.ACTIVE));
+
+        // Expect the first child alert to also contain the update
+        expectedMetaAlert.put(STATUS_FIELD, MetaAlertStatus.ACTIVE.getStatusString());
+        List<Map<String, Object>> expectedAlerts = (List<Map<String, Object>>) expectedMetaAlert.get(ALERT_FIELD);
+        expectedAlerts.get(0).put("field", "value");
+
+        // Verify the metaalert child alerts were refreshed and the new field is present
+        findUpdatedDoc(expectedMetaAlert, "meta_alert", METAALERT_TYPE);
+      }
+
+    }
   }
 
   @Test
@@ -1043,13 +1074,31 @@ public class ElasticsearchMetaAlertIntegrationTest {
       throws InterruptedException, IOException, OriginalNotFoundException {
     for (int t = 0; t < MAX_RETRIES; ++t, Thread.sleep(SLEEP_MS)) {
       Document doc = metaDao.getLatest(guid, sensorType);
-      if (doc != null && message0.equals(doc.getDocument())) {
+      if (doc != null && compareDocs(message0, doc.getDocument())) {
         return;
       }
     }
     throw new OriginalNotFoundException("Count not find " + guid + " after " + MAX_RETRIES + " tries");
   }
 
+  private boolean compareDocs(Map<String, Object> expected, Map<String, Object> actual) {
+    if (expected.size() != actual.size()) {
+      return false;
+    }
+    for(String key: expected.keySet()) {
+      if (ALERT_FIELD.equals(key)) {
+        List<Map<String, Object>> expectedAlerts = (List<Map<String, Object>>) expected.get(MetaAlertDao.ALERT_FIELD);
+        ArrayList<Map<String, Object>> actualAlerts = (ArrayList<Map<String, Object>>) actual.get(MetaAlertDao.ALERT_FIELD);
+        if (!expectedAlerts.containsAll(actualAlerts) || !actualAlerts.containsAll(expectedAlerts)) {
+          return false;
+        }
+      } else if (!expected.get(key).equals(actual.get(key))){
+        return false;
+      }
+    }
+    return true;
+  }
+
   protected boolean findCreatedDoc(String guid, String sensorType)
       throws InterruptedException, IOException, OriginalNotFoundException {
     for (int t = 0; t < MAX_RETRIES; ++t, Thread.sleep(SLEEP_MS)) {