浏览代码

AMBARI-7191. Alerts: rename old alerts endpoint for new alerts and provide summary info (ncole)

Nate Cole 10 年之前
父节点
当前提交
1f1059cff1
共有 20 个文件被更改,包括 450 次插入99 次删除
  1. 2 2
      ambari-server/src/main/java/org/apache/ambari/server/api/resources/AlertResourceDefinition.java
  2. 2 2
      ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertService.java
  3. 1 1
      ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterService.java
  4. 1 1
      ambari-server/src/main/java/org/apache/ambari/server/api/services/HostService.java
  5. 1 1
      ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceService.java
  6. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
  7. 31 10
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
  8. 134 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertSummaryPropertyProvider.java
  9. 14 13
      ambari-server/src/main/java/org/apache/ambari/server/controller/nagios/NagiosPropertyProvider.java
  10. 70 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertSummaryDTO.java
  11. 50 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertsDAO.java
  12. 40 40
      ambari-server/src/test/java/org/apache/ambari/server/controller/nagios/NagiosPropertyProviderTest.java
  13. 74 1
      ambari-server/src/test/java/org/apache/ambari/server/orm/dao/AlertsDAOTest.java
  14. 2 2
      ambari-web/app/controllers/global/update_controller.js
  15. 2 2
      ambari-web/app/controllers/main/alerts_controller.js
  16. 2 2
      ambari-web/app/controllers/main/host.js
  17. 1 1
      ambari-web/app/mappers/hosts_mapper.js
  18. 4 4
      ambari-web/app/mappers/service_mapper.js
  19. 3 3
      ambari-web/app/utils/ajax/ajax.js
  20. 14 14
      ambari-web/test/controllers/main/alerts_controller_test.js

+ 2 - 2
ambari-server/src/main/java/org/apache/ambari/server/api/resources/AlertResourceDefinition.java

@@ -30,12 +30,12 @@ public class AlertResourceDefinition extends BaseResourceDefinition {
   
   @Override
   public String getPluralName() {
-    return "alerts_data";
+    return "alerts";
   }
   
   @Override
   public String getSingularName() {
-    return "alert_data";
+    return "alert";
   }
   
 }

+ 2 - 2
ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertService.java

@@ -52,7 +52,7 @@ public class AlertService extends BaseService {
    */
   @GET
   @Produces("text/plain")
-  public Response getDefinitions(String body,
+  public Response getAlerts(String body,
       @Context HttpHeaders headers,
       @Context UriInfo ui) {
     return handleRequest(headers, body, ui, Request.Type.GET,
@@ -66,7 +66,7 @@ public class AlertService extends BaseService {
   @GET
   @Path("{alertId}")
   @Produces("text/plain")
-  public Response getDefinition(String body,
+  public Response getAlert(String body,
       @Context HttpHeaders headers,
       @Context UriInfo ui,
       @PathParam("alertId") Long id) {

+ 1 - 1
ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterService.java

@@ -366,7 +366,7 @@ public class ClusterService extends BaseService {
    *
    * @return  the alert definition service
    */
-  @Path("{clusterName}/alerts_data")
+  @Path("{clusterName}/alerts")
   public AlertService getAlertService(
       @Context javax.ws.rs.core.Request request, @PathParam("clusterName") String clusterName) {
 

+ 1 - 1
ambari-server/src/main/java/org/apache/ambari/server/api/services/HostService.java

@@ -212,7 +212,7 @@ public class HostService extends BaseService {
    * @param hostName host id
    * @return the alerts service
    */
-  @Path("{hostName}/alerts_data")
+  @Path("{hostName}/alerts")
   public AlertService getAlertHandler(@PathParam("hostName") String hostName) {
     return new AlertService(m_clusterName, null, hostName);
   }  

+ 1 - 1
ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceService.java

@@ -187,7 +187,7 @@ public class ServiceService extends BaseService {
   /**
    * Gets the alerts sub-resource.
    */
-  @Path("{serviceName}/alerts_data")
+  @Path("{serviceName}/alerts")
   public AlertService getAlertHandler(
       @PathParam("serviceName") String serviceName) {
     return new AlertService(m_clusterName, serviceName, null);

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java

@@ -48,6 +48,7 @@ import org.apache.ambari.server.controller.internal.AbstractControllerResourcePr
 import org.apache.ambari.server.controller.internal.AlertDefinitionResourceProvider;
 import org.apache.ambari.server.controller.internal.AlertGroupResourceProvider;
 import org.apache.ambari.server.controller.internal.AlertResourceProvider;
+import org.apache.ambari.server.controller.internal.AlertSummaryPropertyProvider;
 import org.apache.ambari.server.controller.internal.AlertTargetResourceProvider;
 import org.apache.ambari.server.controller.internal.AmbariPrivilegeResourceProvider;
 import org.apache.ambari.server.controller.internal.BlueprintResourceProvider;
@@ -535,6 +536,7 @@ public class AmbariServer {
     AlertResourceProvider.init(injector);
     AlertDefinitionResourceProvider.init(injector);
     AlertGroupResourceProvider.init(injector);
+    AlertSummaryPropertyProvider.init(injector);
     AlertTargetResourceProvider.init(injector);
     PermissionResourceProvider.init(injector.getInstance(PermissionDAO.class));
     ViewPermissionResourceProvider.init(injector.getInstance(PermissionDAO.class));

+ 31 - 10
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java

@@ -18,9 +18,21 @@
 
 package org.apache.ambari.server.controller.internal;
 
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.Role;
 import org.apache.ambari.server.configuration.ComponentSSLConfiguration;
+import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.AmbariServer;
 import org.apache.ambari.server.controller.HostRequest;
 import org.apache.ambari.server.controller.HostResponse;
@@ -29,30 +41,33 @@ import org.apache.ambari.server.controller.ServiceComponentHostResponse;
 import org.apache.ambari.server.controller.ganglia.GangliaComponentPropertyProvider;
 import org.apache.ambari.server.controller.ganglia.GangliaHostComponentPropertyProvider;
 import org.apache.ambari.server.controller.ganglia.GangliaHostPropertyProvider;
-import org.apache.ambari.server.controller.ganglia.GangliaReportPropertyProvider;
 import org.apache.ambari.server.controller.ganglia.GangliaHostProvider;
+import org.apache.ambari.server.controller.ganglia.GangliaReportPropertyProvider;
 import org.apache.ambari.server.controller.jmx.JMXHostProvider;
 import org.apache.ambari.server.controller.jmx.JMXPropertyProvider;
 import org.apache.ambari.server.controller.nagios.NagiosPropertyProvider;
-import org.apache.ambari.server.controller.spi.*;
+import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
+import org.apache.ambari.server.controller.spi.NoSuchResourceException;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.PropertyProvider;
+import org.apache.ambari.server.controller.spi.ProviderModule;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.ResourceProvider;
+import org.apache.ambari.server.controller.spi.SystemException;
+import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PredicateBuilder;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
-import org.apache.ambari.server.controller.AmbariManagementController;
-
-import com.google.inject.Inject;
-
 import org.apache.ambari.server.controller.utilities.StreamProvider;
+import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.DesiredConfig;
 import org.apache.ambari.server.state.HostState;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.State;
-import org.apache.ambari.server.state.Cluster;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.concurrent.ConcurrentHashMap;
+import com.google.inject.Inject;
 
 /**
  * An abstract provider module implementation.
@@ -422,6 +437,8 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
                 configuration),
               "Clusters/cluster_name",
               "Clusters/version"));
+          providers.add(new AlertSummaryPropertyProvider(type,
+              "Clusters/cluster_name", null));
           break;
         case Service:
           providers.add(new NagiosPropertyProvider(type,
@@ -430,6 +447,8 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
                 configuration),
               "ServiceInfo/cluster_name",
               "ServiceInfo/service_name"));
+          providers.add(new AlertSummaryPropertyProvider(type,
+              "ServiceInfo/cluster_name", "ServiceInfo/service_name"));
           break;
         case Host:
           providers.add(createGangliaHostPropertyProvider(
@@ -446,6 +465,8 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
                 configuration),
               "Hosts/cluster_name",
               "Hosts/host_name"));
+          providers.add(new AlertSummaryPropertyProvider(type,
+              "Hosts/cluster_name", "Hosts/host_name"));
           break;
         case Component: {
           // TODO as we fill out stack metric definitions, these can be phased out

+ 134 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertSummaryPropertyProvider.java

@@ -0,0 +1,134 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.controller.internal;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.PropertyProvider;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.SystemException;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.apache.ambari.server.orm.dao.AlertSummaryDTO;
+import org.apache.ambari.server.orm.dao.AlertsDAO;
+import org.apache.ambari.server.state.AlertState;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.inject.Injector;
+
+/**
+ * Property provider that adds alert summary information to endpoints.
+ */
+public class AlertSummaryPropertyProvider extends BaseProvider implements PropertyProvider {
+
+  private final static Logger LOG = LoggerFactory.getLogger(AlertSummaryPropertyProvider.class);
+  
+  private static Clusters s_clusters = null;
+  private static AlertsDAO s_dao = null;
+  
+  private Resource.Type m_resourceType = null;
+  private String m_clusterPropertyId = null;
+  private String m_typeIdPropertyId = null;
+  
+  AlertSummaryPropertyProvider(Resource.Type type,
+      String clusterPropertyId, String typeIdPropertyId) {
+    super(Collections.singleton("alerts_summary"));
+    m_resourceType = type;
+    m_clusterPropertyId = clusterPropertyId;
+    m_typeIdPropertyId = typeIdPropertyId;
+  }
+  
+  public static void init(Injector injector) {
+    s_clusters = injector.getInstance(Clusters.class);
+    s_dao = injector.getInstance(AlertsDAO.class);
+  }
+
+  @Override
+  public Set<Resource> populateResources(Set<Resource> resources,
+      Request request, Predicate predicate) throws SystemException {
+
+    Set<String> propertyIds = getRequestPropertyIds(request, predicate);
+
+    try {
+      for (Resource res : resources) {
+        populateResource(res, propertyIds);
+      }
+    } catch (AmbariException e) {
+      LOG.error("Could not load built-in alerts - Executor exception ({})",
+          e.getMessage());
+    }
+    
+    return resources;
+  }
+  
+  private void populateResource(Resource resource, Set<String> requestedIds) throws AmbariException {
+
+    AlertSummaryDTO summary = null;
+
+    String clusterName = (String) resource.getPropertyValue(m_clusterPropertyId);
+    String typeId = null == m_typeIdPropertyId ? null : (String) resource.getPropertyValue(m_typeIdPropertyId);
+    Cluster cluster = s_clusters.getCluster(clusterName);
+    
+    switch (m_resourceType.getInternalType()) {
+      case Cluster:
+        summary = s_dao.findCurrentCounts(cluster.getClusterId(), null, null);
+        break;
+      case Service:
+        summary = s_dao.findCurrentCounts(cluster.getClusterId(), typeId, null);
+        break;
+      case Host:
+        summary = s_dao.findCurrentCounts(cluster.getClusterId(), null, typeId);
+        break;
+      default:
+        break;
+    }
+    
+    if (null != summary) {
+      Map<AlertState, Integer> map = new HashMap<AlertState, Integer>();
+      map.put(AlertState.OK, Integer.valueOf(summary.getOkCount()));
+      map.put(AlertState.WARNING, Integer.valueOf(summary.getWarningCount()));
+      map.put(AlertState.CRITICAL, Integer.valueOf(summary.getCriticalCount()));
+      map.put(AlertState.UNKNOWN, Integer.valueOf(summary.getUnknownCount()));
+      
+      setResourceProperty(resource, "alerts_summary", map, requestedIds);
+    }
+      
+  }
+
+  @Override
+  public Set<String> checkPropertyIds(Set<String> propertyIds) {
+    Set<String> rejects = new HashSet<String>();
+    
+    for (String id : propertyIds) {
+      if (!id.startsWith("alerts_summary"))
+        rejects.add(id);
+    }
+    
+    return rejects;
+  }
+
+}

+ 14 - 13
ambari-server/src/main/java/org/apache/ambari/server/controller/nagios/NagiosPropertyProvider.java

@@ -17,14 +17,10 @@
  */
 package org.apache.ambari.server.controller.nagios;
 
-import com.google.gson.Gson;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashSet;
@@ -42,8 +38,8 @@ import java.util.concurrent.Future;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
 import java.util.regex.Pattern;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.configuration.ComponentSSLConfiguration;
 import org.apache.ambari.server.configuration.Configuration;
@@ -54,7 +50,6 @@ import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.utilities.StreamProvider;
-import org.apache.ambari.server.state.Alert;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Service;
@@ -63,20 +58,26 @@ import org.apache.commons.io.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.gson.Gson;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+
 /**
  * Used to populate resources that have Nagios alertable properties.
  */
+@Deprecated
 public class NagiosPropertyProvider extends BaseProvider implements PropertyProvider {
   
   private static final Logger LOG = LoggerFactory.getLogger(NagiosPropertyProvider.class);
   private static final Set<String> NAGIOS_PROPERTY_IDS = new HashSet<String>();
   private static final String NAGIOS_TEMPLATE = "http://%s/ambarinagios/nagios/nagios_alerts.php?q1=alerts&alert_type=all";
   
-  private static final String ALERT_DETAIL_PROPERTY_ID = "alerts/detail";
-  private static final String ALERT_SUMMARY_OK_PROPERTY_ID = "alerts/summary/OK";
-  private static final String ALERT_SUMMARY_WARNING_PROPERTY_ID = "alerts/summary/WARNING";
-  private static final String ALERT_SUMMARY_CRITICAL_PROPERTY_ID = "alerts/summary/CRITICAL";
-  private static final String ALERT_SUMMARY_PASSIVE_PROPERTY_ID = "alerts/summary/PASSIVE";
+  private static final String ALERT_DETAIL_PROPERTY_ID = "legacy_alerts/detail";
+  private static final String ALERT_SUMMARY_PROPERTY_ID = "legacy_alerts/summary";
+  private static final String ALERT_SUMMARY_OK_PROPERTY_ID = "legacy_alerts/summary/OK";
+  private static final String ALERT_SUMMARY_WARNING_PROPERTY_ID = "legacy_alerts/summary/WARNING";
+  private static final String ALERT_SUMMARY_CRITICAL_PROPERTY_ID = "legacy_alerts/summary/CRITICAL";
+  private static final String ALERT_SUMMARY_PASSIVE_PROPERTY_ID = "legacy_alerts/summary/PASSIVE";
   private static final String PASSIVE_TOKEN = "AMBARIPASSIVE=";
   
   private static final List<String> DEFAULT_IGNORABLE_FOR_SERVICES = Collections.unmodifiableList(new ArrayList<String>(
@@ -99,8 +100,8 @@ public class NagiosPropertyProvider extends BaseProvider implements PropertyProv
   private static final Set<String> CLUSTER_NAMES = new CopyOnWriteArraySet<String>();
   
   static {
-    NAGIOS_PROPERTY_IDS.add("alerts/summary");
-    NAGIOS_PROPERTY_IDS.add("alerts/detail");
+    NAGIOS_PROPERTY_IDS.add(ALERT_SUMMARY_PROPERTY_ID);
+    NAGIOS_PROPERTY_IDS.add(ALERT_DETAIL_PROPERTY_ID);
     IGNORABLE_FOR_SERVICES = new ArrayList<String>(DEFAULT_IGNORABLE_FOR_SERVICES);
 
     scheduler = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {

+ 70 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertSummaryDTO.java

@@ -0,0 +1,70 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.orm.dao;
+
+import org.apache.ambari.server.state.AlertState;
+
+/**
+ * Used to return alert summary data out of the database.
+ */
+public class AlertSummaryDTO {
+
+  private int okCount;
+  private int warningCount;
+  private int criticalCount;
+  private int unknownCount;
+  
+  /**
+   * Constructor, used by JPA.  JPA invokes this constructor, even if there
+   * are no records in the resultset.  In that case, all arguments are {@code null}.
+   */
+  public AlertSummaryDTO(Number ok, Number warning, Number critical, Number unknown) {
+    okCount = null == ok ? 0 : ok.intValue();
+    warningCount = null == warning ? 0 : warning.intValue();
+    criticalCount = null == critical ? 0 : critical.intValue();
+    unknownCount = null == unknown ? 0 : unknown.intValue();
+  }
+  
+  /**
+   * @return the count of {@link AlertState#OK} states
+   */
+  public int getOkCount() {
+    return okCount;
+  }
+  
+  /**
+   * @return the count of {@link AlertState#WARNING} states
+   */
+  public int getWarningCount() {
+    return warningCount;
+  }  
+  
+  /**
+   * @return the count of {@link AlertState#CRITICAL} states
+   */
+  public int getCriticalCount() {
+    return criticalCount;
+  }
+  
+  /**
+   * @return the count of {@link AlertState#UNKNOWN} states
+   */
+  public int getUnknownCount() {
+    return unknownCount;
+  }  
+}

+ 50 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertsDAO.java

@@ -222,6 +222,55 @@ public class AlertsDAO {
     return daoUtils.selectList(query);
   }
   
+  /**
+   * Retrieves the summary information for a particular scope.  The result is a DTO
+   * since the columns are aggregated and don't fit to an entity.
+   * 
+   * @param clusterId the cluster id
+   * @param serviceName the service name. Use {@code null} to not filter on service.
+   * @param hostName the host name.  Use {@code null} to not filter on host.
+   * @return the summary DTO
+   */
+  @RequiresSession
+  public AlertSummaryDTO findCurrentCounts(long clusterId, String serviceName, String hostName) {
+    StringBuilder sb = new StringBuilder();
+    sb.append("SELECT NEW %s (");
+    sb.append("SUM(CASE WHEN history.alertState = %s.%s THEN 1 ELSE 0 END), ");
+    sb.append("SUM(CASE WHEN history.alertState = %s.%s THEN 1 ELSE 0 END), ");
+    sb.append("SUM(CASE WHEN history.alertState = %s.%s THEN 1 ELSE 0 END), ");
+    sb.append("SUM(CASE WHEN history.alertState = %s.%s THEN 1 ELSE 0 END)) ");
+    sb.append("FROM AlertCurrentEntity alert JOIN alert.alertHistory history WHERE history.clusterId = :clusterId");
+    
+    if (null != serviceName) {
+      sb.append(" AND history.serviceName = :serviceName");
+    }
+    
+    if (null != hostName) {
+      sb.append(" AND history.hostName = :hostName");
+    }
+    
+    String str = String.format(sb.toString(),
+        AlertSummaryDTO.class.getName(),
+        AlertState.class.getName(), AlertState.OK.name(),
+        AlertState.class.getName(), AlertState.WARNING.name(),
+        AlertState.class.getName(), AlertState.CRITICAL.name(),
+        AlertState.class.getName(), AlertState.UNKNOWN.name());
+    
+    TypedQuery<AlertSummaryDTO> query = entityManagerProvider.get().createQuery(
+        str, AlertSummaryDTO.class);
+    
+    query.setParameter("clusterId", Long.valueOf(clusterId));
+    
+    if (null != serviceName) {
+      query.setParameter("serviceName", serviceName);
+    }
+    
+    if (null != hostName) {
+      query.setParameter("hostName", hostName);
+    }
+    
+    return daoUtils.selectSingle(query);
+  }
   
   /**
    * Gets the current alerts for a given service.
@@ -408,4 +457,5 @@ public class AlertsDAO {
   public void remove(AlertCurrentEntity alert) {
     entityManagerProvider.get().remove(merge(alert));
   }
+
 }

+ 40 - 40
ambari-server/src/test/java/org/apache/ambari/server/controller/nagios/NagiosPropertyProviderTest.java

@@ -124,7 +124,7 @@ public class NagiosPropertyProviderTest {
     
     Map<String, Map<String, Object>> values = res.getPropertiesMap();
     
-    Assert.assertFalse("Expected no alerts", values.containsKey("alerts"));
+    Assert.assertFalse("Expected no alerts", values.containsKey("legacy_alerts"));
   }
 
 
@@ -176,9 +176,9 @@ public class NagiosPropertyProviderTest {
 
     Map<String, Map<String, Object>> values = res.getPropertiesMap();
 
-    Assert.assertTrue(values.containsKey("alerts/summary"));
+    Assert.assertTrue(values.containsKey("legacy_alerts/summary"));
 
-    Map<String, Object> summary = values.get("alerts/summary");
+    Map<String, Object> summary = values.get("legacy_alerts/summary");
     Assert.assertEquals(4L, summary.size());
     Assert.assertTrue(summary.containsKey("OK"));
     Assert.assertTrue(summary.containsKey("WARNING"));
@@ -230,7 +230,7 @@ public class NagiosPropertyProviderTest {
     
     Map<String, Map<String, Object>> values = res.getPropertiesMap();
     
-    Assert.assertFalse("Expected no alerts", values.containsKey("alerts"));
+    Assert.assertFalse("Expected no alerts", values.containsKey("legacy_alerts"));
   }
   
   @Test
@@ -260,12 +260,12 @@ public class NagiosPropertyProviderTest {
     
     Map<String, Map<String, Object>> values = res.getPropertiesMap();
     
-    Assert.assertTrue(values.containsKey("alerts"));
-    Assert.assertTrue(values.containsKey("alerts/summary"));
-    Assert.assertTrue(values.get("alerts").containsKey("detail"));
-    Assert.assertTrue(List.class.isInstance(values.get("alerts").get("detail")));
+    Assert.assertTrue(values.containsKey("legacy_alerts"));
+    Assert.assertTrue(values.containsKey("legacy_alerts/summary"));
+    Assert.assertTrue(values.get("legacy_alerts").containsKey("detail"));
+    Assert.assertTrue(List.class.isInstance(values.get("legacy_alerts").get("detail")));
     
-    List<?> list = (List<?>) values.get("alerts").get("detail");
+    List<?> list = (List<?>) values.get("legacy_alerts").get("detail");
     Assert.assertEquals(Integer.valueOf(3), Integer.valueOf(list.size()));
     for (Object o : list) {
       Assert.assertTrue(Map.class.isInstance(o));
@@ -275,7 +275,7 @@ public class NagiosPropertyProviderTest {
       Assert.assertTrue("expected HBASE", serviceName.equals("HBASE"));
     }
     
-    Map<String, Object> summary = values.get("alerts/summary");
+    Map<String, Object> summary = values.get("legacy_alerts/summary");
     Assert.assertTrue(summary.containsKey("OK"));
     Assert.assertTrue(summary.containsKey("WARNING"));
     Assert.assertTrue(summary.containsKey("CRITICAL"));
@@ -311,12 +311,12 @@ public class NagiosPropertyProviderTest {
     
     Map<String, Map<String, Object>> values = res.getPropertiesMap();
     
-    Assert.assertTrue(values.containsKey("alerts"));
-    Assert.assertTrue(values.containsKey("alerts/summary"));
-    Assert.assertTrue(values.get("alerts").containsKey("detail"));
-    Assert.assertTrue(List.class.isInstance(values.get("alerts").get("detail")));
+    Assert.assertTrue(values.containsKey("legacy_alerts"));
+    Assert.assertTrue(values.containsKey("legacy_alerts/summary"));
+    Assert.assertTrue(values.get("legacy_alerts").containsKey("detail"));
+    Assert.assertTrue(List.class.isInstance(values.get("legacy_alerts").get("detail")));
     
-    List<?> list = (List<?>) values.get("alerts").get("detail");
+    List<?> list = (List<?>) values.get("legacy_alerts").get("detail");
     Assert.assertTrue(7 == list.size());
     for (Object o : list) {
       Assert.assertTrue(Map.class.isInstance(o));
@@ -326,7 +326,7 @@ public class NagiosPropertyProviderTest {
       Assert.assertTrue("expected c6403.ambari.apache.org", host.equals("c6403.ambari.apache.org"));
     }
     
-    Map<String, Object> summary = values.get("alerts/summary");
+    Map<String, Object> summary = values.get("legacy_alerts/summary");
     Assert.assertTrue(summary.containsKey("OK"));
     Assert.assertTrue(summary.containsKey("WARNING"));
     Assert.assertTrue(summary.containsKey("CRITICAL"));
@@ -362,12 +362,12 @@ public class NagiosPropertyProviderTest {
     
     Map<String, Map<String, Object>> values = res.getPropertiesMap();
     
-    Assert.assertTrue(values.containsKey("alerts"));
-    Assert.assertTrue(values.containsKey("alerts/summary"));
-    Assert.assertTrue(values.get("alerts").containsKey("detail"));
-    Assert.assertTrue(List.class.isInstance(values.get("alerts").get("detail")));
+    Assert.assertTrue(values.containsKey("legacy_alerts"));
+    Assert.assertTrue(values.containsKey("legacy_alerts/summary"));
+    Assert.assertTrue(values.get("legacy_alerts").containsKey("detail"));
+    Assert.assertTrue(List.class.isInstance(values.get("legacy_alerts").get("detail")));
     
-    List<?> list = (List<?>) values.get("alerts").get("detail");
+    List<?> list = (List<?>) values.get("legacy_alerts").get("detail");
     Assert.assertEquals(Integer.valueOf(16), Integer.valueOf(list.size()));
     for (Object o : list) {
       Assert.assertTrue(Map.class.isInstance(o));
@@ -377,7 +377,7 @@ public class NagiosPropertyProviderTest {
       Assert.assertEquals("c6401.ambari.apache.org", host);
     }
     
-    Map<String, Object> summary = values.get("alerts/summary");
+    Map<String, Object> summary = values.get("legacy_alerts/summary");
     Assert.assertTrue(summary.containsKey("OK"));
     Assert.assertTrue(summary.containsKey("WARNING"));
     Assert.assertTrue(summary.containsKey("CRITICAL"));
@@ -417,12 +417,12 @@ public class NagiosPropertyProviderTest {
     
     Map<String, Map<String, Object>> values = res.getPropertiesMap();
     
-    Assert.assertTrue(values.containsKey("alerts"));
-    Assert.assertTrue(values.containsKey("alerts/summary"));
-    Assert.assertTrue(values.get("alerts").containsKey("detail"));
-    Assert.assertTrue(List.class.isInstance(values.get("alerts").get("detail")));
+    Assert.assertTrue(values.containsKey("legacy_alerts"));
+    Assert.assertTrue(values.containsKey("legacy_alerts/summary"));
+    Assert.assertTrue(values.get("legacy_alerts").containsKey("detail"));
+    Assert.assertTrue(List.class.isInstance(values.get("legacy_alerts").get("detail")));
     
-    List<?> list = (List<?>) values.get("alerts").get("detail");
+    List<?> list = (List<?>) values.get("legacy_alerts").get("detail");
     // removed an additional one
     Assert.assertEquals(Integer.valueOf(2), Integer.valueOf(list.size()));
     for (Object o : list) {
@@ -433,7 +433,7 @@ public class NagiosPropertyProviderTest {
       Assert.assertTrue("expected HBASE", serviceName.equals("HBASE"));
     }
     
-    Map<String, Object> summary = values.get("alerts/summary");
+    Map<String, Object> summary = values.get("legacy_alerts/summary");
     Assert.assertTrue(summary.containsKey("OK"));
     Assert.assertTrue(summary.containsKey("WARNING"));
     Assert.assertTrue(summary.containsKey("CRITICAL"));
@@ -490,12 +490,12 @@ public class NagiosPropertyProviderTest {
     
     Map<String, Map<String, Object>> values = res.getPropertiesMap();
     
-    Assert.assertTrue(values.containsKey("alerts"));
-    Assert.assertTrue(values.containsKey("alerts/summary"));
-    Assert.assertTrue(values.get("alerts").containsKey("detail"));
-    Assert.assertTrue(List.class.isInstance(values.get("alerts").get("detail")));
+    Assert.assertTrue(values.containsKey("legacy_alerts"));
+    Assert.assertTrue(values.containsKey("legacy_alerts/summary"));
+    Assert.assertTrue(values.get("legacy_alerts").containsKey("detail"));
+    Assert.assertTrue(List.class.isInstance(values.get("legacy_alerts").get("detail")));
     
-    List<?> list = (List<?>) values.get("alerts").get("detail");
+    List<?> list = (List<?>) values.get("legacy_alerts").get("detail");
     // removed an additional one
     Assert.assertEquals(Integer.valueOf(4), Integer.valueOf(list.size()));
     for (Object o : list) {
@@ -506,7 +506,7 @@ public class NagiosPropertyProviderTest {
       Assert.assertEquals(serviceName, "GANGLIA");
     }
     
-    Map<String, Object> summary = values.get("alerts/summary");
+    Map<String, Object> summary = values.get("legacy_alerts/summary");
     Assert.assertTrue(summary.containsKey("OK"));
     Assert.assertTrue(summary.containsKey("WARNING"));
     Assert.assertTrue(summary.containsKey("CRITICAL"));
@@ -543,12 +543,12 @@ public class NagiosPropertyProviderTest {
     
     Map<String, Map<String, Object>> values = res.getPropertiesMap();
     
-    Assert.assertTrue(values.containsKey("alerts"));
-    Assert.assertTrue(values.containsKey("alerts/summary"));
-    Assert.assertTrue(values.get("alerts").containsKey("detail"));
-    Assert.assertTrue(List.class.isInstance(values.get("alerts").get("detail")));
+    Assert.assertTrue(values.containsKey("legacy_alerts"));
+    Assert.assertTrue(values.containsKey("legacy_alerts/summary"));
+    Assert.assertTrue(values.get("legacy_alerts").containsKey("detail"));
+    Assert.assertTrue(List.class.isInstance(values.get("legacy_alerts").get("detail")));
     
-    List<?> list = (List<?>) values.get("alerts").get("detail");
+    List<?> list = (List<?>) values.get("legacy_alerts").get("detail");
     Assert.assertEquals(Integer.valueOf(1), Integer.valueOf(list.size()));
     for (Object o : list) {
       Assert.assertTrue(Map.class.isInstance(o));
@@ -558,7 +558,7 @@ public class NagiosPropertyProviderTest {
       Assert.assertEquals("c6404.ambari.apache.org", host);
     }
     
-    Map<String, Object> summary = values.get("alerts/summary");
+    Map<String, Object> summary = values.get("legacy_alerts/summary");
     Assert.assertTrue(summary.containsKey("OK"));
     Assert.assertTrue(summary.containsKey("WARNING"));
     Assert.assertTrue(summary.containsKey("CRITICAL"));

+ 74 - 1
ambari-server/src/test/java/org/apache/ambari/server/orm/dao/AlertsDAOTest.java

@@ -229,7 +229,6 @@ public class AlertsDAOTest {
     current.setAlertHistory(history);
     dao.create(current);
     
-    
     List<AlertCurrentEntity> currentAlerts = dao.findCurrentByHost(clusterId, history.getHostName());
 
     assertNotNull(currentAlerts);
@@ -323,4 +322,78 @@ public class AlertsDAOTest {
     assertNotNull(entity.getAlertHistory());
     assertNotNull(entity.getAlertHistory().getAlertDefinition());
   }
+  
+  /**
+   * 
+   */
+  @Test
+  public void testFindCurrentSummary() throws Exception {
+    AlertSummaryDTO summary = dao.findCurrentCounts(clusterId.longValue(), null, null);
+    assertEquals(5, summary.getOkCount());
+
+    AlertHistoryEntity h1 = dao.findCurrentByCluster(clusterId.longValue()).get(2).getAlertHistory();
+    AlertHistoryEntity h2 = dao.findCurrentByCluster(clusterId.longValue()).get(3).getAlertHistory();
+    AlertHistoryEntity h3 = dao.findCurrentByCluster(clusterId.longValue()).get(4).getAlertHistory();
+    h1.setAlertState(AlertState.WARNING);
+    dao.merge(h1);
+    h2.setAlertState(AlertState.CRITICAL);
+    dao.merge(h2);
+    h3.setAlertState(AlertState.UNKNOWN);
+    dao.merge(h3);
+    
+    int ok = 0;
+    int warn = 0;
+    int crit = 0;
+    int unk = 0;
+    
+    for (AlertCurrentEntity h : dao.findCurrentByCluster(clusterId.longValue())) {
+      switch (h.getAlertHistory().getAlertState()) {
+        case CRITICAL:
+          crit++;
+          break;
+        case OK:
+          ok++;
+          break;
+        case UNKNOWN:
+          unk++;
+          break;
+        default:
+          warn++;
+          break;
+      }
+        
+    }
+      
+    summary = dao.findCurrentCounts(clusterId.longValue(), null, null);
+    // !!! db-to-db compare
+    assertEquals(ok, summary.getOkCount());
+    assertEquals(warn, summary.getWarningCount());
+    assertEquals(crit, summary.getCriticalCount());
+    assertEquals(unk, summary.getCriticalCount());
+    
+    // !!! expected
+    assertEquals(2, summary.getOkCount());
+    assertEquals(1, summary.getWarningCount());
+    assertEquals(1, summary.getCriticalCount());
+    assertEquals(1, summary.getCriticalCount());
+    
+    summary = dao.findCurrentCounts(clusterId.longValue(), "Service 0", null);
+    assertEquals(1, summary.getOkCount());
+    assertEquals(0, summary.getWarningCount());
+    assertEquals(0, summary.getCriticalCount());
+    assertEquals(0, summary.getCriticalCount());
+
+    summary = dao.findCurrentCounts(clusterId.longValue(), null, "h1");
+    assertEquals(2, summary.getOkCount());
+    assertEquals(1, summary.getWarningCount());
+    assertEquals(1, summary.getCriticalCount());
+    assertEquals(1, summary.getCriticalCount());
+    
+    summary = dao.findCurrentCounts(clusterId.longValue(), "foo", null);
+    assertEquals(0, summary.getOkCount());
+    assertEquals(0, summary.getWarningCount());
+    assertEquals(0, summary.getCriticalCount());
+    assertEquals(0, summary.getCriticalCount());
+    
+  }  
 }

+ 2 - 2
ambari-web/app/controllers/global/update_controller.js

@@ -154,7 +154,7 @@ App.UpdateController = Em.Controller.extend({
     var realUrl = '/hosts?<parameters>fields=Hosts/host_name,Hosts/maintenance_state,Hosts/public_host_name,Hosts/cpu_count,Hosts/ph_cpu_count,' +
       'Hosts/host_status,Hosts/last_heartbeat_time,Hosts/ip,host_components/HostRoles/state,host_components/HostRoles/maintenance_state,' +
       'host_components/HostRoles/stale_configs,host_components/HostRoles/service_name,metrics/disk,metrics/load/load_one,Hosts/total_mem,' +
-      'alerts/summary<hostAuxiliaryInfo>&minimal_response=true';
+      'legacy_alerts/summary<hostAuxiliaryInfo>&minimal_response=true';
     var hostAuxiliaryInfo = ',Hosts/os_arch,Hosts/os_type,metrics/cpu/cpu_system,metrics/cpu/cpu_user,metrics/memory/mem_total,metrics/memory/mem_free';
 
     if (App.router.get('currentState.name') == 'index' && App.router.get('currentState.parentState.name') == 'hosts') {
@@ -423,7 +423,7 @@ App.UpdateController = Em.Controller.extend({
   },
   updateServices: function (callback) {
     var testUrl = '/data/services/HDP2/services.json';
-    var componentConfigUrl = this.getUrl(testUrl, '/services?fields=alerts/summary,ServiceInfo/state,ServiceInfo/maintenance_state&minimal_response=true');
+    var componentConfigUrl = this.getUrl(testUrl, '/services?fields=legacy_alerts/summary,ServiceInfo/state,ServiceInfo/maintenance_state&minimal_response=true');
     App.HttpClient.get(componentConfigUrl, App.serviceMapper, {
       complete: callback
     });

+ 2 - 2
ambari-web/app/controllers/main/alerts_controller.js

@@ -139,8 +139,8 @@ App.MainAlertsController = Em.Controller.extend({
    */
   getAlertsSuccessCallback: function (json) {
     var alerts = [];
-    if (json && json.alerts && json.alerts.detail) {
-      json.alerts.detail.forEach(function (_alert) {
+    if (json && json.legacy_alerts && json.legacy_alerts.detail) {
+      json.legacy_alerts.detail.forEach(function (_alert) {
         alerts.pushObject(App.Alert.create({
           title: _alert.description,
           serviceType: _alert.service_name,

+ 2 - 2
ambari-web/app/controllers/main/host.js

@@ -122,7 +122,7 @@ App.MainHostController = Em.ArrayController.extend({
     },
     {
       key: 'criticalAlertsCount',
-      alias: 'alerts/summary/CRITICAL{0}|alerts/summary/WARNING{1}',
+      alias: 'legacy_alerts/summary/CRITICAL{0}|legacy_alerts/summary/WARNING{1}',
       type: 'CUSTOM'
     },
     {
@@ -368,7 +368,7 @@ App.MainHostController = Em.ArrayController.extend({
       'UNHEALTHY': data.Clusters.health_report['Host/host_status/UNHEALTHY'],
       'ALERT': data.Clusters.health_report['Host/host_status/ALERT'],
       'UNKNOWN': data.Clusters.health_report['Host/host_status/UNKNOWN'],
-      'health-status-WITH-ALERTS': (data.alerts) ? data.alerts.summary.CRITICAL + data.alerts.summary.WARNING : 0,
+      'health-status-WITH-ALERTS': (data.legacy_alerts) ? data.legacy_alerts.summary.CRITICAL + data.legacy_alerts.summary.WARNING : 0,
       'health-status-RESTART': data.Clusters.health_report['Host/stale_config'],
       'health-status-PASSIVE_STATE': data.Clusters.health_report['Host/maintenance_state'],
       'TOTAL': data.Clusters.total_hosts

+ 1 - 1
ambari-web/app/mappers/hosts_mapper.js

@@ -92,7 +92,7 @@ App.hostsMapper = App.QuickDataMapper.create({
           }
           serviceToHostComponentIdMap[serviceName].push(component.id);
         }, this);
-        item.critical_alerts_count = (item.alerts) ? item.alerts.summary.CRITICAL + item.alerts.summary.WARNING : 0;
+        item.critical_alerts_count = (item.legacy_alerts) ? item.legacy_alerts.summary.CRITICAL + item.legacy_alerts.summary.WARNING : 0;
         item.cluster_id = App.get('clusterName');
         item.index = index;
 

+ 4 - 4
ambari-web/app/mappers/service_mapper.js

@@ -30,8 +30,8 @@ App.serviceMapper = App.QuickDataMapper.create({
         cachedService.ServiceInfo.passive_state = service.ServiceInfo.maintenance_state;
 
         //check whether Nagios installed and started
-        if (service.alerts) {
-          cachedService.ServiceInfo.critical_alerts_count = service.alerts.summary.CRITICAL + service.alerts.summary.WARNING;
+        if (service.legacy_alerts) {
+          cachedService.ServiceInfo.critical_alerts_count = service.legacy_alerts.summary.CRITICAL + service.legacy_alerts.summary.WARNING;
         }
       } else {
         var serviceData = {
@@ -45,8 +45,8 @@ App.serviceMapper = App.QuickDataMapper.create({
         };
 
         //check whether Nagios installed and started
-        if (service.alerts) {
-          serviceData.ServiceInfo.critical_alerts_count = service.alerts.summary.CRITICAL + service.alerts.summary.WARNING;
+        if (service.legacy_alerts) {
+          serviceData.ServiceInfo.critical_alerts_count = service.legacy_alerts.summary.CRITICAL + service.legacy_alerts.summary.WARNING;
         }
         App.cache['services'].push(serviceData);
       }

+ 3 - 3
ambari-web/app/utils/ajax/ajax.js

@@ -291,11 +291,11 @@ var urls = {
   },
 
   'alerts.get_by_service': {
-    'real': '/clusters/{clusterName}/services/{serviceName}?fields=alerts',
+    'real': '/clusters/{clusterName}/services/{serviceName}?fields=legacy_alerts',
     'mock': '/data/alerts/HDP2/service_alerts.json'
   },
   'alerts.get_by_host': {
-    'real': '/clusters/{clusterName}/hosts/{hostName}?fields=alerts',
+    'real': '/clusters/{clusterName}/hosts/{hostName}?fields=legacy_alerts',
     'mock': '/data/alerts/HDP2/host_alerts.json'
   },
   'background_operations.get_most_recent': {
@@ -1747,7 +1747,7 @@ var urls = {
     }
   },
   'host.status.counters': {
-    'real': '/clusters/{clusterName}?fields=alerts,Clusters/health_report,Clusters/total_hosts&minimal_response=true',
+    'real': '/clusters/{clusterName}?fields=legacy_alerts,Clusters/health_report,Clusters/total_hosts&minimal_response=true',
     'mock': '/data/hosts/HDP2/host_status_counters.json'
   },
   'components.filter_by_status': {

+ 14 - 14
ambari-web/test/controllers/main/alerts_controller_test.js

@@ -171,18 +171,18 @@ describe('MainAlertsController', function () {
         result: []
       },
       {
-        title: 'data.alerts is null',
-        data: {alerts: null},
+        title: 'data.legacy_alerts is null',
+        data: {legacy_alerts: null},
         result: []
       },
       {
-        title: 'data.alerts.detail is null',
-        data: {alerts: {detail: null}},
+        title: 'data.legacy_alerts.detail is null',
+        data: {legacy_alerts: {detail: null}},
         result: []
       },
       {
-        title: 'data.alerts.detail is empty',
-        data: {alerts: {detail: []}},
+        title: 'data.legacy_alerts.detail is empty',
+        data: {legacy_alerts: {detail: []}},
         result: []
       }
     ];
@@ -195,7 +195,7 @@ describe('MainAlertsController', function () {
       });
     });
 
-    var data = {alerts: {detail: [
+    var data = {legacy_alerts: {detail: [
       {
         description: 't1',
         service_name: "s1",
@@ -208,27 +208,27 @@ describe('MainAlertsController', function () {
     ]}};
     var testCasesOfStatus = [
       {
-        title: 'data.alerts.detail is correct, OK status',
+        title: 'data.legacy_alerts.detail is correct, OK status',
         status: 'OK',
         result: '0'
       },
       {
-        title: 'data.alerts.detail is correct, WARNING status',
+        title: 'data.legacy_alerts.detail is correct, WARNING status',
         status: 'WARNING',
         result: '1'
       },
       {
-        title: 'data.alerts.detail is correct, CRITICAL status',
+        title: 'data.legacy_alerts.detail is correct, CRITICAL status',
         status: 'CRITICAL',
         result: '2'
       },
       {
-        title: 'data.alerts.detail is correct, PASSIVE status',
+        title: 'data.legacy_alerts.detail is correct, PASSIVE status',
         status: 'PASSIVE',
         result: '3'
       },
       {
-        title: 'data.alerts.detail is correct, unknown status',
+        title: 'data.legacy_alerts.detail is correct, unknown status',
         status: '',
         result: '4'
       }
@@ -236,7 +236,7 @@ describe('MainAlertsController', function () {
     testCasesOfStatus.forEach(function (test) {
       it(test.title, function () {
         controller.set('isLoaded', false);
-        data.alerts.detail[0].status = test.status;
+        data.legacy_alerts.detail[0].status = test.status;
         controller.getAlertsSuccessCallback(data);
         expect(controller.get('alerts.length')).to.equal(1);
         expect(controller.get('alerts').objectAt(0).get('status')).to.equal(test.result);
@@ -257,4 +257,4 @@ describe('MainAlertsController', function () {
       expect(controller.get('isLoaded')).to.be.true;
     });
   });
-});
+});