You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ha...@apache.org on 2018/07/02 16:54:47 UTC

[ambari] branch trunk updated: AMBARI-24232 Alert definitions have not updated after stack upgrade (dgrinenko)

This is an automated email from the ASF dual-hosted git repository.

hapylestat pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/trunk by this push:
     new f8f46de  AMBARI-24232 Alert definitions have not updated after stack upgrade (dgrinenko)
f8f46de is described below

commit f8f46deea10e18597f8d1c2e3a703c480970e12b
Author: Reishin <ha...@gmail.com>
AuthorDate: Mon Jul 2 14:55:00 2018 +0300

    AMBARI-24232 Alert definitions have not updated after stack upgrade (dgrinenko)
---
 .../ambari/server/api/services/AmbariMetaInfo.java | 46 ++++++++++++++--------
 .../upgrade/StackUpgradeFinishListener.java        |  7 ++++
 .../upgrade/StackUpgradeFinishListenerTest.java    | 38 +++++++++---------
 3 files changed, 54 insertions(+), 37 deletions(-)

diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
index bcebe2f..712737c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
@@ -1075,9 +1075,7 @@ public class AmbariMetaInfo {
    * @param updateScriptPaths whether existing script-based alerts should be updated
    *        with possibly new paths from the stack definition
    */
-  public void reconcileAlertDefinitions(Clusters clusters, boolean updateScriptPaths)
-      throws AmbariException {
-
+  public void reconcileAlertDefinitions(Clusters clusters, boolean updateScriptPaths)  throws AmbariException {
     Map<String, Cluster> clusterMap = clusters.getClusters();
     if (null == clusterMap || clusterMap.size() == 0) {
       return;
@@ -1085,6 +1083,29 @@ public class AmbariMetaInfo {
 
     // for every cluster
     for (Cluster cluster : clusterMap.values()) {
+       reconcileAlertDefinitions(cluster, updateScriptPaths);
+    }
+
+  }
+
+  /**
+   * Compares the alert definitions defined on the stack with those in the
+   * database and merges any new or updated definitions. This method will first
+   * determine the services that are installed on each cluster to prevent alert
+   * definitions from undeployed services from being shown.
+   * <p/>
+   * This method will also detect "agent" alert definitions, which are
+   * definitions that should be run on agent hosts but are not associated with a
+   * service.
+   *
+   * @param cluster cluster
+   * @param updateScriptPaths whether existing script-based alerts should be updated
+   *        with possibly new paths from the stack definition
+   */
+  public void reconcileAlertDefinitions(Cluster cluster, boolean updateScriptPaths) throws AmbariException {
+      if (null == cluster) {
+        return;
+      }
 
       long clusterId = cluster.getClusterId();
       Map<String, ServiceInfo> stackServiceMap = new HashMap<>();
@@ -1137,11 +1158,6 @@ public class AmbariMetaInfo {
         // use the REST APIs to modify them instead
         AlertDefinition databaseDefinition = alertDefinitionFactory.coerce(entity);
         if (!stackDefinition.deeplyEquals(databaseDefinition)) {
-
-          LOG.debug(
-              "The alert named {} has been modified from the stack definition and will not be merged",
-              stackDefinition.getName());
-
           if (updateScriptPaths) {
             Source databaseSource = databaseDefinition.getSource();
             Source stackSource = stackDefinition.getSource();
@@ -1160,6 +1176,9 @@ public class AmbariMetaInfo {
                 );
               }
             }
+          } else {
+            LOG.debug("The alert named {} has been modified from the stack definition and will not be merged",
+              stackDefinition.getName());
           }
         }
       }
@@ -1179,9 +1198,7 @@ public class AmbariMetaInfo {
       // all definition resolved; publish their registration
       for (AlertDefinitionEntity def : alertDefinitionDao.findAll(cluster.getClusterId())) {
         AlertDefinition realDef = alertDefinitionFactory.coerce(def);
-
-        AlertDefinitionRegistrationEvent event = new AlertDefinitionRegistrationEvent(
-            cluster.getClusterId(), realDef);
+        AlertDefinitionRegistrationEvent event = new AlertDefinitionRegistrationEvent(cluster.getClusterId(), realDef);
 
         eventPublisher.publish(event);
       }
@@ -1223,13 +1240,8 @@ public class AmbariMetaInfo {
       for (AlertDefinitionEntity definition : definitionsToDisable) {
         definition.setEnabled(false);
         alertDefinitionDao.merge(definition);
-
-        AlertDefinitionDisabledEvent event = new AlertDefinitionDisabledEvent(
-            clusterId, definition.getDefinitionId());
-
-        eventPublisher.publish(event);
+        eventPublisher.publish(new AlertDefinitionDisabledEvent(clusterId, definition.getDefinitionId()));
       }
-    }
   }
 
   /**
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackUpgradeFinishListener.java b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackUpgradeFinishListener.java
index 41c2c2b..8737784 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackUpgradeFinishListener.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackUpgradeFinishListener.java
@@ -93,6 +93,13 @@ public class StackUpgradeFinishListener {
         CachedRoleCommandOrderProvider cachedRcoProvider = (CachedRoleCommandOrderProvider) roleCommandOrderProvider.get();
         cachedRcoProvider.clearRoleCommandOrderCache();
       }
+
+      try {
+        ambariMetaInfo.get().reconcileAlertDefinitions(cluster, true);
+      } catch (AmbariException e){
+        LOG.error("Caught AmbariException when update alert definitions", e);
+      }
+
     }
 
   }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/events/listeners/upgrade/StackUpgradeFinishListenerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/events/listeners/upgrade/StackUpgradeFinishListenerTest.java
index c4b1f0b..a9b31fd 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/events/listeners/upgrade/StackUpgradeFinishListenerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/events/listeners/upgrade/StackUpgradeFinishListenerTest.java
@@ -18,20 +18,19 @@
 package org.apache.ambari.server.events.listeners.upgrade;
 
 import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
 
 import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.events.StackUpgradeFinishEvent;
 import org.apache.ambari.server.events.publishers.VersionEventPublisher;
 import org.apache.ambari.server.metadata.RoleCommandOrderProvider;
-import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
-import org.apache.ambari.server.orm.entities.UpgradeEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
-import org.apache.ambari.server.state.ServiceComponentHost;
 import org.easymock.EasyMockRunner;
 import org.easymock.EasyMockSupport;
 import org.easymock.Mock;
@@ -50,42 +49,41 @@ import com.google.inject.Provider;
 @RunWith(EasyMockRunner.class)
 public class StackUpgradeFinishListenerTest extends EasyMockSupport {
 
-  private static final String INVALID_NEW_VERSION = "1.2.3.4-5678";
-  private static final String VALID_NEW_VERSION = "2.4.0.0-1000";
-  private static final String SERVICE_COMPONENT_NAME = "Some component name";
-  private static final String SERVICE_NAME = "Service name";
-  private static final Long CLUSTER_ID = 1L;
-  private static final String UNKNOWN_VERSION = "UNKNOWN";
-  private static final String VALID_PREVIOUS_VERSION = "2.2.0.0";
-  private static final RepositoryVersionEntity DUMMY_REPOSITORY_VERSION_ENTITY = new RepositoryVersionEntity();
-  private static final UpgradeEntity DUMMY_UPGRADE_ENTITY = new UpgradeEntity();
   public static final String STACK_NAME = "HDP-2.4.0.0";
   public static final String STACK_VERSION = "2.4.0.0";
 
-  private Cluster cluster;
-  private ServiceComponentHost sch;
-  private Service service;
-  private ServiceComponent serviceComponent;
   private VersionEventPublisher publisher = new VersionEventPublisher();
 
+  private Cluster cluster;
+
   @TestSubject
   private StackUpgradeFinishListener listener = new StackUpgradeFinishListener(publisher);
 
-  @Mock(type = MockType.NICE)
+  @Mock(type = MockType.NICE, fieldName = "roleCommandOrderProvider")
   private Provider<RoleCommandOrderProvider> roleCommandOrderProviderProviderMock;
 
+  @Mock(type = MockType.NICE, fieldName = "ambariMetaInfo")
+  private Provider<AmbariMetaInfo> ambariMetaInfoProvider = null;
+
   @Before
   public void setup() throws Exception {
+    AmbariMetaInfo ami = createNiceMock(AmbariMetaInfo.class);
+
     cluster = createNiceMock(Cluster.class);
-    serviceComponent = createNiceMock(ServiceComponent.class);
-    service = createNiceMock(Service.class);
+    ServiceComponent serviceComponent = createNiceMock(ServiceComponent.class);
+    Service service = createNiceMock(Service.class);
     Map<String, Service> services = new HashMap<>();
-    services.put("mock_service",service);
     Map<String, ServiceComponent> components = new HashMap<>();
+
+    services.put("mock_service",service);
     components.put("mock_component", serviceComponent);
 
     expect(cluster.getServices()).andReturn(services);
     expect(service.getServiceComponents()).andReturn(components);
+    expect(ambariMetaInfoProvider.get()).andReturn(ami);
+    ami.reconcileAlertDefinitions(cluster,true);
+    expectLastCall();
+
     serviceComponent.updateComponentInfo();
     service.updateServiceInfo();
   }