You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2014/07/22 16:53:17 UTC

git commit: AMBARI-6561. Alerts: DAO Date Restrictions & JPA Sequence Generation (Jonathan Hurley via ncole)

Repository: ambari
Updated Branches:
  refs/heads/trunk fe7f25b54 -> b90771744


AMBARI-6561. Alerts: DAO Date Restrictions & JPA Sequence Generation (Jonathan Hurley via ncole)


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

Branch: refs/heads/trunk
Commit: b90771744a5c2ba0b2aa47ca0e3edab59b174820
Parents: fe7f25b
Author: Nate Cole <nc...@hortonworks.com>
Authored: Tue Jul 22 10:52:56 2014 -0400
Committer: Nate Cole <nc...@hortonworks.com>
Committed: Tue Jul 22 10:52:56 2014 -0400

----------------------------------------------------------------------
 .../apache/ambari/server/orm/dao/AlertsDAO.java |  90 ++++++++++++++
 .../orm/entities/AlertDefinitionEntity.java     |   4 +-
 .../server/orm/entities/AlertGroupEntity.java   |   4 +-
 .../server/orm/entities/AlertHistoryEntity.java |  20 ++-
 .../server/orm/entities/AlertNoticeEntity.java  |   4 +-
 .../server/orm/entities/AlertTargetEntity.java  |   4 +-
 .../server/upgrade/UpgradeCatalog170.java       |  31 ++++-
 .../resources/Ambari-DDL-Postgres-CREATE.sql    |  12 +-
 .../Ambari-DDL-Postgres-EMBEDDED-CREATE.sql     |  14 ++-
 .../ambari/server/orm/dao/AlertsDAOTest.java    | 124 ++++++++++++++++---
 .../server/upgrade/UpgradeCatalog170Test.java   |   3 +
 11 files changed, 279 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/b9077174/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertsDAO.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertsDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertsDAO.java
index f9f1f45..a1257a2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertsDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertsDAO.java
@@ -17,6 +17,8 @@
  */
 package org.apache.ambari.server.orm.dao;
 
+import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 
 import javax.persistence.EntityManager;
@@ -25,6 +27,7 @@ import javax.persistence.TypedQuery;
 import org.apache.ambari.server.orm.RequiresSession;
 import org.apache.ambari.server.orm.entities.AlertCurrentEntity;
 import org.apache.ambari.server.orm.entities.AlertHistoryEntity;
+import org.apache.ambari.server.state.AlertState;
 
 import com.google.inject.Inject;
 import com.google.inject.Provider;
@@ -78,6 +81,8 @@ public class AlertsDAO {
   /**
    * Gets all alerts stored in the database for the given cluster.
    * 
+   * @param clusterId
+   *          the ID of the cluster.
    * @return all alerts in the specified cluster or an empty list if none exist
    *         (never {@code null}).
    */
@@ -92,6 +97,91 @@ public class AlertsDAO {
   }
 
   /**
+   * Gets all alerts stored in the database for the given cluster that have one
+   * of the specified alert states.
+   * 
+   * @param clusterId
+   *          the ID of the cluster.
+   * @param alertStates
+   *          the states to match for the retrieved alerts (not {@code null}).
+   * @return the alerts matching the specified states and cluster, or an empty
+   *         list if none.
+   */
+  public List<AlertHistoryEntity> findAll(long clusterId,
+      List<AlertState> alertStates) {
+    if (null == alertStates || alertStates.size() == 0) {
+      return Collections.emptyList();
+    }
+
+    TypedQuery<AlertHistoryEntity> query = entityManagerProvider.get().createNamedQuery(
+        "AlertHistoryEntity.findAllInClusterWithState",
+        AlertHistoryEntity.class);
+
+    query.setParameter("clusterId", clusterId);
+    query.setParameter("alertStates", alertStates);
+
+    return daoUtils.selectList(query);
+  }
+
+  /**
+   * Gets all alerts stored in the database for the given cluster and that fall
+   * withing the specified date range. Dates are expected to be in milliseconds
+   * since the epoch, normalized to UTC time.
+   * 
+   * @param clusterId
+   *          the ID of the cluster.
+   * @param startDate
+   *          the date that the earliest entry must occur after, normalized to
+   *          UTC, or {@code null} for all entries that occur before the given
+   *          end date.
+   * @param endDate
+   *          the date that the latest entry must occur before, normalized to
+   *          UTC, or {@code null} for all entries that occur after the given
+   *          start date.
+   * @return the alerts matching the specified date range.
+   */
+  public List<AlertHistoryEntity> findAll(long clusterId, Date startDate,
+      Date endDate) {
+    if (null == startDate && null == endDate)
+      return Collections.emptyList();
+
+    TypedQuery<AlertHistoryEntity> query = null;
+
+    if (null != startDate && null != endDate) {
+      if (startDate.after(endDate)) {
+        return Collections.emptyList();
+      }
+
+      query = entityManagerProvider.get().createNamedQuery(
+          "AlertHistoryEntity.findAllInClusterBetweenDates",
+          AlertHistoryEntity.class);
+
+      query.setParameter("clusterId", clusterId);
+      query.setParameter("startDate", startDate.getTime());
+      query.setParameter("endDate", endDate.getTime());
+    } else if (null != startDate) {
+      query = entityManagerProvider.get().createNamedQuery(
+          "AlertHistoryEntity.findAllInClusterAfterDate",
+          AlertHistoryEntity.class);
+
+      query.setParameter("clusterId", clusterId);
+      query.setParameter("afterDate", startDate.getTime());
+    } else if (null != endDate) {
+      query = entityManagerProvider.get().createNamedQuery(
+          "AlertHistoryEntity.findAllInClusterBeforeDate",
+          AlertHistoryEntity.class);
+
+      query.setParameter("clusterId", clusterId);
+      query.setParameter("beforeDate", endDate.getTime());
+    }
+
+    if (null == query)
+      return Collections.emptyList();
+
+    return daoUtils.selectList(query);
+  }
+
+  /**
    * Gets the current alerts.
    * 
    * @return the current alerts or an empty list if none exist (never

http://git-wip-us.apache.org/repos/asf/ambari/blob/b9077174/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertDefinitionEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertDefinitionEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertDefinitionEntity.java
index da36c0c..9c2d5a2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertDefinitionEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertDefinitionEntity.java
@@ -28,6 +28,7 @@ import javax.persistence.ManyToMany;
 import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
+import javax.persistence.TableGenerator;
 import javax.persistence.UniqueConstraint;
 
 /**
@@ -38,6 +39,7 @@ import javax.persistence.UniqueConstraint;
 @Entity
 @Table(name = "alert_definition", uniqueConstraints = @UniqueConstraint(columnNames = {
     "cluster_id", "definition_name" }))
+@TableGenerator(name = "alert_definition_id_generator", table = "ambari_sequences", pkColumnName = "sequence_name", valueColumnName = "value", pkColumnValue = "alert_definition_id_seq", initialValue = 0, allocationSize = 1)
 @NamedQueries({
     @NamedQuery(name = "AlertDefinitionEntity.findAll", query = "SELECT alertDefinition FROM AlertDefinitionEntity alertDefinition"),
     @NamedQuery(name = "AlertDefinitionEntity.findAllInCluster", query = "SELECT alertDefinition FROM AlertDefinitionEntity alertDefinition WHERE alertDefinition.clusterId = :clusterId"),
@@ -45,7 +47,7 @@ import javax.persistence.UniqueConstraint;
 public class AlertDefinitionEntity {
 
   @Id
-  @GeneratedValue(strategy = GenerationType.TABLE)
+  @GeneratedValue(strategy = GenerationType.TABLE, generator = "alert_definition_id_generator")
   @Column(name = "definition_id", nullable = false, updatable = false)
   private Long definitionId;
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b9077174/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertGroupEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertGroupEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertGroupEntity.java
index a88d1ac..6e67214 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertGroupEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertGroupEntity.java
@@ -30,6 +30,7 @@ import javax.persistence.ManyToMany;
 import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
+import javax.persistence.TableGenerator;
 import javax.persistence.UniqueConstraint;
 
 /**
@@ -40,6 +41,7 @@ import javax.persistence.UniqueConstraint;
 @Entity
 @Table(name = "alert_group", uniqueConstraints = @UniqueConstraint(columnNames = {
     "cluster_id", "group_name" }))
+@TableGenerator(name = "alert_group_id_generator", table = "ambari_sequences", pkColumnName = "sequence_name", valueColumnName = "value", pkColumnValue = "alert_group_id_seq", initialValue = 0, allocationSize = 1)
 @NamedQueries({
     @NamedQuery(name = "AlertGroupEntity.findAll", query = "SELECT alertGroup FROM AlertGroupEntity alertGroup"),
     @NamedQuery(name = "AlertGroupEntity.findAllInCluster", query = "SELECT alertGroup FROM AlertGroupEntity alertGroup WHERE alertGroup.clusterId = :clusterId"),
@@ -48,7 +50,7 @@ import javax.persistence.UniqueConstraint;
 public class AlertGroupEntity {
 
   @Id
-  @GeneratedValue(strategy = GenerationType.TABLE)
+  @GeneratedValue(strategy = GenerationType.TABLE, generator = "alert_group_id_generator")
   @Column(name = "group_id", nullable = false, updatable = false)
   private Long groupId;
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b9077174/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertHistoryEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertHistoryEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertHistoryEntity.java
index 6533340..4b0d39c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertHistoryEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertHistoryEntity.java
@@ -30,6 +30,7 @@ import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
+import javax.persistence.TableGenerator;
 
 import org.apache.ambari.server.state.AlertState;
 
@@ -42,13 +43,18 @@ import org.apache.ambari.server.state.AlertState;
  */
 @Entity
 @Table(name = "alert_history")
+@TableGenerator(name = "alert_history_id_generator", table = "ambari_sequences", pkColumnName = "sequence_name", valueColumnName = "value", pkColumnValue = "alert_history_id_seq", initialValue = 0, allocationSize = 1)
 @NamedQueries({
     @NamedQuery(name = "AlertHistoryEntity.findAll", query = "SELECT alertHistory FROM AlertHistoryEntity alertHistory"),
-    @NamedQuery(name = "AlertHistoryEntity.findAllInCluster", query = "SELECT alertHistory FROM AlertHistoryEntity alertHistory WHERE alertHistory.clusterId = :clusterId") })
+    @NamedQuery(name = "AlertHistoryEntity.findAllInCluster", query = "SELECT alertHistory FROM AlertHistoryEntity alertHistory WHERE alertHistory.clusterId = :clusterId"),
+    @NamedQuery(name = "AlertHistoryEntity.findAllInClusterWithState", query = "SELECT alertHistory FROM AlertHistoryEntity alertHistory WHERE alertHistory.clusterId = :clusterId AND alertHistory.alertState IN :alertStates"),
+    @NamedQuery(name = "AlertHistoryEntity.findAllInClusterBetweenDates", query = "SELECT alertHistory FROM AlertHistoryEntity alertHistory WHERE alertHistory.clusterId = :clusterId AND alertHistory.alertTimestamp BETWEEN :startDate AND :endDate"),
+    @NamedQuery(name = "AlertHistoryEntity.findAllInClusterBeforeDate", query = "SELECT alertHistory FROM AlertHistoryEntity alertHistory WHERE alertHistory.clusterId = :clusterId AND alertHistory.alertTimestamp <= :beforeDate"),
+    @NamedQuery(name = "AlertHistoryEntity.findAllInClusterAfterDate", query = "SELECT alertHistory FROM AlertHistoryEntity alertHistory WHERE alertHistory.clusterId = :clusterId AND alertHistory.alertTimestamp >= :afterDate") })
 public class AlertHistoryEntity {
 
   @Id
-  @GeneratedValue(strategy = GenerationType.TABLE)
+  @GeneratedValue(strategy = GenerationType.TABLE, generator = "alert_history_id_generator")
   @Column(name = "alert_id", nullable = false, updatable = false)
   private Long alertId;
 
@@ -87,10 +93,10 @@ public class AlertHistoryEntity {
   private AlertCurrentEntity alertCurrent;
 
   /**
-   * Bi-directional many-to-one association to {@link AlertDefinitionEntity}
+   * Unidirectional many-to-one association to {@link AlertDefinitionEntity}
    */
   @ManyToOne
-  @JoinColumn(name = "alert_definition_id", nullable = false)
+  @JoinColumn(name = "definition_id", nullable = false)
   private AlertDefinitionEntity alertDefinition;
 
   /**
@@ -197,7 +203,8 @@ public class AlertHistoryEntity {
   }
 
   /**
-   * Gets the time that the alert instace was received.
+   * Gets the time that the alert instace was received. This will be the value,
+   * in milliseconds, since the UNIX/Java epoch, represented in UTC time.
    * 
    * @return the time of the alert instance (never {@code null}).
    */
@@ -206,7 +213,8 @@ public class AlertHistoryEntity {
   }
 
   /**
-   * Sets the time that the alert instace was received.
+   * Sets the time that the alert instace was received. This should be the
+   * value, in milliseconds, since the UNIX/Java epoch, represented in UTC time.
    * 
    * @param alertTimestamp
    *          the time of the alert instance (not {@code null}).

http://git-wip-us.apache.org/repos/asf/ambari/blob/b9077174/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertNoticeEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertNoticeEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertNoticeEntity.java
index ce64ae2..9fe1c88 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertNoticeEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertNoticeEntity.java
@@ -28,6 +28,7 @@ import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
+import javax.persistence.TableGenerator;
 
 import org.apache.ambari.server.state.NotificationState;
 
@@ -40,11 +41,12 @@ import org.apache.ambari.server.state.NotificationState;
  */
 @Entity
 @Table(name = "alert_notice")
+@TableGenerator(name = "alert_notice_id_generator", table = "ambari_sequences", pkColumnName = "sequence_name", valueColumnName = "value", pkColumnValue = "alert_notice_id_seq", initialValue = 0, allocationSize = 1)
 @NamedQuery(name = "AlertNoticeEntity.findAll", query = "SELECT alertNotice FROM AlertNoticeEntity alertNotice")
 public class AlertNoticeEntity {
 
   @Id
-  @GeneratedValue(strategy = GenerationType.TABLE)
+  @GeneratedValue(strategy = GenerationType.TABLE, generator = "alert_notice_id_generator")
   @Column(name = "notification_id", nullable = false, updatable = false)
   private Long notificationId;
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b9077174/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertTargetEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertTargetEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertTargetEntity.java
index 227931e..3cd444e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertTargetEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/AlertTargetEntity.java
@@ -30,6 +30,7 @@ import javax.persistence.ManyToMany;
 import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
+import javax.persistence.TableGenerator;
 
 /**
  * The {@link AlertTargetEntity} class represents audience that will receive
@@ -37,13 +38,14 @@ import javax.persistence.Table;
  */
 @Entity
 @Table(name = "alert_target")
+@TableGenerator(name = "alert_target_id_generator", table = "ambari_sequences", pkColumnName = "sequence_name", valueColumnName = "value", pkColumnValue = "alert_target_id_seq", initialValue = 0, allocationSize = 1)
 @NamedQueries({
     @NamedQuery(name = "AlertTargetEntity.findAll", query = "SELECT alertTarget FROM AlertTargetEntity alertTarget"),
     @NamedQuery(name = "AlertTargetEntity.findByName", query = "SELECT alertTarget FROM AlertTargetEntity alertTarget WHERE alertTarget.targetName = :targetName"), })
 public class AlertTargetEntity {
 
   @Id
-  @GeneratedValue(strategy = GenerationType.TABLE)
+  @GeneratedValue(strategy = GenerationType.TABLE, generator = "alert_target_id_generator")
   @Column(name = "target_id", nullable = false, updatable = false)
   private Long targetId;
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b9077174/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
index 684d46c..24645ba 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.orm.DBAccessor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -64,6 +65,7 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog {
 
   @Override
   protected void executeDDLUpdates() throws AmbariException, SQLException {
+    // !!! TODO: alerting DDL upgrade
 
     List<DBAccessor.DBColumnInfo> columns;
 
@@ -162,7 +164,32 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog {
 
   @Override
   protected void executeDMLUpdates() throws AmbariException, SQLException {
-    // TODO : create admin principals for existing users and groups.
-    // TODO : create admin resources for existing clusters and view instances
+    // !!! TODO: create admin principals for existing users and groups.
+    // !!! TODO: create admin resources for existing clusters and view instances
+    // !!! TODO: alerting DML updates (sequences)
+
+    String dbType = getDbType();
+
+    // add new sequences for view entity
+    String valueColumnName = "\"value\"";
+    if (Configuration.ORACLE_DB_NAME.equals(dbType)
+        || Configuration.MYSQL_DB_NAME.equals(dbType)) {
+      valueColumnName = "value";
+    }
+
+    dbAccessor.executeQuery("INSERT INTO ambari_sequences(sequence_name, "
+        + valueColumnName + ") " + "VALUES('alert_definition_id_seq', 0)", true);
+
+    dbAccessor.executeQuery("INSERT INTO ambari_sequences(sequence_name, "
+        + valueColumnName + ") " + "VALUES('alert_group_id_seq', 0)", true);
+
+    dbAccessor.executeQuery("INSERT INTO ambari_sequences(sequence_name, "
+        + valueColumnName + ") " + "VALUES('alert_target_id_seq', 0)", true);
+
+    dbAccessor.executeQuery("INSERT INTO ambari_sequences(sequence_name, "
+        + valueColumnName + ") " + "VALUES('alert_history_id_seq', 0)", true);
+
+    dbAccessor.executeQuery("INSERT INTO ambari_sequences(sequence_name, "
+        + valueColumnName + ") " + "VALUES('alert_notice_id_seq', 0)", true);
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/b9077174/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
index 8875de7..d44c8e3 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
@@ -287,7 +287,17 @@ BEGIN;
   union all
   select 'permission_id_seq', 5
   union all
-  select 'privilege_id_seq', 1;
+  select 'privilege_id_seq', 1
+  union all
+  select 'alert_definition_id_seq', 0
+  union all
+  select 'alert_group_id_seq', 0
+  union all
+  select 'alert_target_id_seq', 0
+  union all
+  select 'alert_history_id_seq', 0
+  union all
+  select 'alert_notice_id_seq', 0;
 
   INSERT INTO adminresourcetype (resource_type_id, resource_type_name)
   SELECT 1, 'AMBARI'

http://git-wip-us.apache.org/repos/asf/ambari/blob/b9077174/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
index dafda33..723058b 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
@@ -360,8 +360,18 @@ INSERT INTO ambari.ambari_sequences (sequence_name, "value")
   union all
   select 'permission_id_seq', 5
   union all
-  select 'privilege_id_seq', 1;
-
+  select 'privilege_id_seq', 1
+  union all
+  select 'alert_definition_id_seq', 0
+  union all
+  select 'alert_group_id_seq', 0
+  union all
+  select 'alert_target_id_seq', 0
+  union all
+  select 'alert_history_id_seq', 0
+  union all
+  select 'alert_notice_id_seq', 0;
+  
 
 INSERT INTO ambari.adminresourcetype (resource_type_id, resource_type_name)
   SELECT 1, 'AMBARI'

http://git-wip-us.apache.org/repos/asf/ambari/blob/b9077174/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/AlertsDAOTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/AlertsDAOTest.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/AlertsDAOTest.java
index f2adcaa..2bc2b7f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/AlertsDAOTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/AlertsDAOTest.java
@@ -18,8 +18,15 @@
 
 package org.apache.ambari.server.orm.dao;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
+import java.util.TimeZone;
 import java.util.UUID;
 
 import org.apache.ambari.server.orm.GuiceJpaInitializer;
@@ -31,7 +38,6 @@ import org.apache.ambari.server.orm.entities.AlertHistoryEntity;
 import org.apache.ambari.server.state.AlertState;
 import org.apache.ambari.server.state.MaintenanceState;
 import org.junit.AfterClass;
-import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -47,6 +53,8 @@ public class AlertsDAOTest {
 
   static Long clusterId;
   static Injector injector;
+  static Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+
   AlertsDAO dao;
 
   @BeforeClass
@@ -73,12 +81,15 @@ public class AlertsDAOTest {
     }
 
     List<AlertDefinitionEntity> definitions = alertDefinitionDAO.findAll();
-    Assert.assertNotNull(definitions);
-    Assert.assertEquals(5, definitions.size());
+    assertNotNull(definitions);
+    assertEquals(5, definitions.size());
+
+    // create 10 historical alerts for each definition, 8 OK and 2 CRIT
+    calendar.clear();
+    calendar.set(2014, Calendar.JANUARY, 1);
 
-    // create 5 historical alerts for each definition
     for (AlertDefinitionEntity definition : definitions) {
-      for (int i = 0; i < 5; i++) {
+      for (int i = 0; i < 10; i++) {
         AlertHistoryEntity history = new AlertHistoryEntity();
         history.setServiceName(definition.getServiceName());
         history.setClusterId(clusterId);
@@ -86,8 +97,18 @@ public class AlertsDAOTest {
         history.setAlertLabel(definition.getDefinitionName() + " " + i);
         history.setAlertState(AlertState.OK);
         history.setAlertText(definition.getDefinitionName() + " " + i);
-        history.setAlertTimestamp(new Date().getTime());
+        history.setAlertTimestamp(calendar.getTimeInMillis());
+
+        // increase the days for each
+        calendar.add(Calendar.DATE, 1);
+
         alertDAO.create(history);
+
+        if (i == 0 || i == 1) {
+          history.setAlertId(null);
+          history.setAlertState(AlertState.CRITICAL);
+          alertDAO.create(history);
+        }
       }
     }
 
@@ -101,7 +122,7 @@ public class AlertsDAOTest {
         }
       }
 
-      Assert.assertNotNull(history);
+      assertNotNull(history);
 
       AlertCurrentEntity current = new AlertCurrentEntity();
       current.setAlertId(history.getAlertId());
@@ -137,8 +158,8 @@ public class AlertsDAOTest {
   @Test
   public void testFindAll() {
     List<AlertHistoryEntity> alerts = dao.findAll(clusterId);
-    Assert.assertNotNull(alerts);
-    Assert.assertEquals(25, alerts.size());
+    assertNotNull(alerts);
+    assertEquals(60, alerts.size());
   }
 
   /**
@@ -147,8 +168,8 @@ public class AlertsDAOTest {
   @Test
   public void testFindAllCurrent() {
     List<AlertCurrentEntity> currentAlerts = dao.findCurrent();
-    Assert.assertNotNull(currentAlerts);
-    Assert.assertEquals(5, currentAlerts.size());
+    assertNotNull(currentAlerts);
+    assertEquals(5, currentAlerts.size());
   }
 
   /**
@@ -160,17 +181,88 @@ public class AlertsDAOTest {
     AlertCurrentEntity current = currentAlerts.get(0);
     AlertHistoryEntity history = current.getAlertHistory();
     
-    Assert.assertNotNull(history);    
+    assertNotNull(history);
     
     currentAlerts = dao.findCurrentByService(clusterId,
         history.getServiceName());
 
-    Assert.assertNotNull(currentAlerts);
-    Assert.assertEquals(1, currentAlerts.size());
+    assertNotNull(currentAlerts);
+    assertEquals(1, currentAlerts.size());
 
     currentAlerts = dao.findCurrentByService(clusterId, "foo");
 
-    Assert.assertNotNull(currentAlerts);
-    Assert.assertEquals(0, currentAlerts.size());
+    assertNotNull(currentAlerts);
+    assertEquals(0, currentAlerts.size());
+  }
+
+  /**
+   * 
+   */
+  @Test
+  public void testFindByState() {
+    List<AlertState> allStates = new ArrayList<AlertState>();
+    allStates.add(AlertState.OK);
+    allStates.add(AlertState.WARNING);
+    allStates.add(AlertState.CRITICAL);
+        
+    List<AlertHistoryEntity> history = dao.findAll(clusterId, allStates);
+    assertNotNull(history);
+    assertEquals(60, history.size());
+
+    history = dao.findAll(clusterId, Collections.singletonList(AlertState.OK));
+    assertNotNull(history);
+    assertEquals(50, history.size());
+
+    history = dao.findAll(clusterId,
+        Collections.singletonList(AlertState.CRITICAL));
+    assertNotNull(history);
+    assertEquals(10, history.size());
+    
+    history = dao.findAll(clusterId,
+        Collections.singletonList(AlertState.WARNING));
+    assertNotNull(history);
+    assertEquals(0, history.size());        
+  }
+
+  /**
+   * 
+   */
+  @Test
+  public void testFindByDate() {
+    calendar.clear();
+    calendar.set(2014, Calendar.JANUARY, 1);
+    
+    // on or after 1/1/2014
+    List<AlertHistoryEntity> history = dao.findAll(clusterId,
+        calendar.getTime(), null);
+
+    assertNotNull(history);
+    assertEquals(60, history.size());
+
+    // on or before 1/1/2014
+    history = dao.findAll(clusterId, null, calendar.getTime());
+    assertNotNull(history);
+    assertEquals(2, history.size());
+
+    // between 1/5 and 1/10
+    calendar.set(2014, Calendar.JANUARY, 5);
+    Date startDate = calendar.getTime();
+
+    calendar.set(2014, Calendar.JANUARY, 10);
+    Date endDate = calendar.getTime();
+
+    history = dao.findAll(clusterId, startDate, endDate);
+    assertNotNull(history);
+    assertEquals(6, history.size());
+
+    // after 3/1
+    calendar.set(2014, Calendar.MARCH, 5);
+    history = dao.findAll(clusterId, calendar.getTime(), null);
+    assertNotNull(history);
+    assertEquals(0, history.size());
+
+    history = dao.findAll(clusterId, endDate, startDate);
+    assertNotNull(history);
+    assertEquals(0, history.size());
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/b9077174/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog170Test.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog170Test.java b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog170Test.java
index dfda132..ad5fb76 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog170Test.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog170Test.java
@@ -85,10 +85,13 @@ public class UpgradeCatalog170Test {
     assertClusterConfigColumns(clusterConfigAttributesColumnCapture);
     assertViewColumns(maskColumnCapture);
     assertViewParameterColumns(maskedColumnCapture);
+
+    // !!! TODO: alerting DDL upgrade
   }
 
   @Test
   public void testExecuteDMLUpdates() throws Exception {
+    // !!! TODO: alerting DML updates (sequences)
   }