You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jo...@apache.org on 2017/07/25 14:35:22 UTC

[18/19] ambari git commit: AMBARI-21559. Alert definition paths should be updated on upgrade

AMBARI-21559. Alert definition paths should be updated on upgrade


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

Branch: refs/heads/branch-feature-AMBARI-21450
Commit: cfedbdf7812cab362ae33b4cdc9b5215837acb70
Parents: 37b5f23
Author: Attila Doroszlai <ad...@hortonworks.com>
Authored: Mon Jul 24 13:06:29 2017 +0200
Committer: Attila Doroszlai <ad...@hortonworks.com>
Committed: Tue Jul 25 16:20:57 2017 +0200

----------------------------------------------------------------------
 .../server/api/services/AmbariMetaInfo.java     | 34 ++++++++++--
 .../ambari/server/controller/AmbariServer.java  | 10 ++--
 .../state/alert/AlertDefinitionFactory.java     | 31 ++++++++---
 .../ambari/server/state/alert/ScriptSource.java |  4 ++
 .../upgrade/AbstractFinalUpgradeCatalog.java    | 58 ++++++++++++++++++++
 .../server/upgrade/FinalUpgradeCatalog.java     | 45 ++++-----------
 .../server/upgrade/SchemaUpgradeHelper.java     |  3 +-
 .../server/upgrade/UpdateAlertScriptPaths.java  | 48 ++++++++++++++++
 .../server/api/services/AmbariMetaInfoTest.java |  6 +-
 9 files changed, 182 insertions(+), 57 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/cfedbdf7/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
----------------------------------------------------------------------
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 2d13cba..91e3ed0 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
@@ -35,6 +35,7 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Scanner;
 import java.util.Set;
 
@@ -73,6 +74,9 @@ import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.StackInfo;
 import org.apache.ambari.server.state.alert.AlertDefinition;
 import org.apache.ambari.server.state.alert.AlertDefinitionFactory;
+import org.apache.ambari.server.state.alert.ScriptSource;
+import org.apache.ambari.server.state.alert.Source;
+import org.apache.ambari.server.state.alert.SourceType;
 import org.apache.ambari.server.state.kerberos.KerberosDescriptor;
 import org.apache.ambari.server.state.kerberos.KerberosDescriptorFactory;
 import org.apache.ambari.server.state.kerberos.KerberosServiceDescriptor;
@@ -1086,9 +1090,10 @@ public class AmbariMetaInfo {
    * service.
    *
    * @param clusters all clusters
-   * @throws AmbariException
+   * @param updateScriptPaths whether existing script-based alerts should be updated
+   *        with possibly new paths from the stack definition
    */
-  public void reconcileAlertDefinitions(Clusters clusters)
+  public void reconcileAlertDefinitions(Clusters clusters, boolean updateScriptPaths)
       throws AmbariException {
 
     Map<String, Cluster> clusterMap = clusters.getClusters();
@@ -1167,6 +1172,26 @@ public class AmbariMetaInfo {
           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();
+            if (databaseSource.getType() == SourceType.SCRIPT && stackSource.getType() == SourceType.SCRIPT) {
+              ScriptSource databaseScript = (ScriptSource) databaseSource;
+              ScriptSource stackScript = (ScriptSource) stackSource;
+              String oldPath = databaseScript.getPath();
+              String newPath = stackScript.getPath();
+              if (!Objects.equals(oldPath, newPath)) {
+                databaseScript.setPath(newPath);
+                entity = alertDefinitionFactory.mergeSource(databaseScript, entity);
+                persist.add(entity);
+
+                LOG.info("Updating script path for the alert named {} from '{}' to '{}'",
+                  stackDefinition.getName(), oldPath, newPath
+                );
+              }
+            }
+          }
         }
       }
 
@@ -1196,10 +1221,7 @@ public class AmbariMetaInfo {
 
       // persist any new or updated definition
       for (AlertDefinitionEntity entity : persist) {
-        if (LOG.isDebugEnabled()) {
-          LOG.info("Merging Alert Definition {} into the database",
-              entity.getDefinitionName());
-        }
+        LOG.debug("Merging Alert Definition {} into the database", entity.getDefinitionName());
         alertDefinitionDao.createOrUpdate(entity);
       }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/cfedbdf7/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
index e8c986b..1ebcac2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
@@ -19,9 +19,6 @@
 package org.apache.ambari.server.controller;
 
 
-import javax.crypto.BadPaddingException;
-import javax.servlet.DispatcherType;
-
 import java.io.File;
 import java.io.IOException;
 import java.net.Authenticator;
@@ -33,6 +30,9 @@ import java.util.Enumeration;
 import java.util.Map;
 import java.util.logging.LogManager;
 
+import javax.crypto.BadPaddingException;
+import javax.servlet.DispatcherType;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.StateRecoveryManager;
 import org.apache.ambari.server.StaticallyInject;
@@ -99,10 +99,10 @@ import org.apache.ambari.server.security.CertificateManager;
 import org.apache.ambari.server.security.SecurityFilter;
 import org.apache.ambari.server.security.authorization.AmbariLdapAuthenticationProvider;
 import org.apache.ambari.server.security.authorization.AmbariLocalUserProvider;
+import org.apache.ambari.server.security.authorization.AmbariPamAuthenticationProvider;
 import org.apache.ambari.server.security.authorization.AmbariUserAuthorizationFilter;
 import org.apache.ambari.server.security.authorization.PermissionHelper;
 import org.apache.ambari.server.security.authorization.Users;
-import org.apache.ambari.server.security.authorization.AmbariPamAuthenticationProvider;
 import org.apache.ambari.server.security.authorization.internal.AmbariInternalAuthenticationProvider;
 import org.apache.ambari.server.security.ldap.AmbariLdapDataPopulator;
 import org.apache.ambari.server.security.unsecured.rest.CertificateDownload;
@@ -523,7 +523,7 @@ public class AmbariServer {
       LOG.info(clusterDump.toString());
 
       LOG.info("********* Reconciling Alert Definitions **********");
-      ambariMetaInfo.reconcileAlertDefinitions(clusters);
+      ambariMetaInfo.reconcileAlertDefinitions(clusters, false);
 
       LOG.info("********* Initializing ActionManager **********");
       ActionManager manager = injector.getInstance(ActionManager.class);

http://git-wip-us.apache.org/repos/asf/ambari/blob/cfedbdf7/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertDefinitionFactory.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertDefinitionFactory.java b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertDefinitionFactory.java
index acbb881..769920f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertDefinitionFactory.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertDefinitionFactory.java
@@ -249,7 +249,6 @@ public class AlertDefinitionFactory {
     entity.setDefinitionName(definition.getName());
     entity.setEnabled(definition.isEnabled());
     entity.setHostIgnored(definition.isHostIgnored());
-    entity.setHash(UUID.randomUUID().toString());
     entity.setLabel(definition.getLabel());
     entity.setDescription(definition.getDescription());
     entity.setScheduleInterval(definition.getInterval());
@@ -263,24 +262,42 @@ public class AlertDefinitionFactory {
 
     entity.setScope(scope);
 
-    Source source = definition.getSource();
+    return mergeSource(definition.getSource(), entity);
+  }
+
+  /**
+   * Updates source and source type of <code>entity</code> from <code>source</code>.
+   * Also updates UUID, which must be done for any change in to the entity for it
+   * to take effect on the agents.
+   *
+   * @return the updated entity to be persisted, or null if alert source cannot be serialized to JSON
+   */
+  public AlertDefinitionEntity mergeSource(Source source, AlertDefinitionEntity entity) {
     entity.setSourceType(source.getType());
 
     try {
       String sourceJson = m_gson.toJson(source);
       entity.setSource(sourceJson);
-    } catch (Exception exception) {
-      LOG.error(
-          "Unable to serialize the alert definition source during coercion",
-          exception);
-
+    } catch (Exception e) {
+      LOG.error("Unable to serialize the alert definition source during merge", e);
       return null;
     }
 
+    assignNewUUID(entity);
+
     return entity;
   }
 
   /**
+   * Updates <code>entity</code> with a new UUID.
+   */
+  private static void assignNewUUID(AlertDefinitionEntity entity) {
+    if (entity != null) {
+      entity.setHash(UUID.randomUUID().toString());
+    }
+  }
+
+  /**
    * Gets an instance of {@link Gson} that can correctly serialize and
    * deserialize an {@link AlertDefinition}.
    *

http://git-wip-us.apache.org/repos/asf/ambari/blob/cfedbdf7/ambari-server/src/main/java/org/apache/ambari/server/state/alert/ScriptSource.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/ScriptSource.java b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/ScriptSource.java
index d1b7070..eed6f7c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/ScriptSource.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/ScriptSource.java
@@ -37,6 +37,10 @@ public class ScriptSource extends ParameterizedSource {
     return m_path;
   }
 
+  public void setPath(String path) {
+    m_path = path;
+  }
+
   /**
    * {@inheritDoc}
    */

http://git-wip-us.apache.org/repos/asf/ambari/blob/cfedbdf7/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractFinalUpgradeCatalog.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractFinalUpgradeCatalog.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractFinalUpgradeCatalog.java
new file mode 100644
index 0000000..9abf548
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractFinalUpgradeCatalog.java
@@ -0,0 +1,58 @@
+/*
+ * 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.upgrade;
+
+import java.sql.SQLException;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.utils.VersionUtils;
+
+import com.google.inject.Injector;
+
+/**
+ * Upgrade catalog which is executed after all version-dependent catalogs.
+ */
+public abstract class AbstractFinalUpgradeCatalog extends AbstractUpgradeCatalog {
+  AbstractFinalUpgradeCatalog(Injector injector) {
+    super(injector);
+  }
+
+  @Override
+  protected void executeDDLUpdates() throws AmbariException, SQLException {
+    //no-op
+  }
+
+  @Override
+  protected void executePreDMLUpdates() throws AmbariException, SQLException {
+    //no-op
+  }
+
+  @Override
+  public String getTargetVersion() {
+    return getFinalVersion();
+  }
+
+  @Override
+  public boolean isFinal() {
+    return true;
+  }
+
+  private String getFinalVersion() {
+    return VersionUtils.getVersionSubstring(configuration.getServerVersion());
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/cfedbdf7/ambari-server/src/main/java/org/apache/ambari/server/upgrade/FinalUpgradeCatalog.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/FinalUpgradeCatalog.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/FinalUpgradeCatalog.java
index 1ac0118..dad0ecf 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/FinalUpgradeCatalog.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/FinalUpgradeCatalog.java
@@ -18,30 +18,30 @@
 
 package org.apache.ambari.server.upgrade;
 
-import com.google.inject.Inject;
-import com.google.inject.Injector;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.ConfigHelper;
+import org.apache.ambari.server.state.PropertyInfo;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.StackInfo;
-import org.apache.ambari.server.state.PropertyInfo;
-import org.apache.ambari.server.state.ConfigHelper;
-import org.apache.ambari.server.utils.VersionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.List;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
 
 /**
  * Final upgrade catalog which simply updates database version (in case if no db changes between releases)
  */
-public class FinalUpgradeCatalog extends AbstractUpgradeCatalog {
+public class FinalUpgradeCatalog extends AbstractFinalUpgradeCatalog {
 
   /**
    * Logger.
@@ -54,16 +54,6 @@ public class FinalUpgradeCatalog extends AbstractUpgradeCatalog {
   }
 
   @Override
-  protected void executeDDLUpdates() throws AmbariException, SQLException {
-    //noop
-  }
-
-  @Override
-  protected void executePreDMLUpdates() throws AmbariException, SQLException {
-    //noop
-  }
-
-  @Override
   protected void executeDMLUpdates() throws AmbariException, SQLException {
     updateClusterEnv();
   }
@@ -77,8 +67,6 @@ public class FinalUpgradeCatalog extends AbstractUpgradeCatalog {
    *
    * Note: Config properties stack_features and stack_tools should always be updated to latest values as defined
    * in the stack on an Ambari upgrade.
-   *
-   * @throws Exception
    */
   protected void updateClusterEnv() throws AmbariException {
 
@@ -104,17 +92,4 @@ public class FinalUpgradeCatalog extends AbstractUpgradeCatalog {
     }
   }
 
-  @Override
-  public String getTargetVersion() {
-    return getFinalVersion();
-  }
-
-  @Override
-  public boolean isFinal() {
-    return true;
-  }
-
-  private String getFinalVersion() {
-    return VersionUtils.getVersionSubstring(configuration.getServerVersion());
-  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/cfedbdf7/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java
index af2a7d1..77f683c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java
@@ -39,13 +39,13 @@ import org.apache.ambari.server.utils.EventBusSynchronizer;
 import org.apache.ambari.server.utils.VersionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.jdbc.support.JdbcUtils;
 
 import com.google.inject.Guice;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.multibindings.Multibinder;
 import com.google.inject.persist.PersistService;
-import org.springframework.jdbc.support.JdbcUtils;
 
 public class SchemaUpgradeHelper {
   private static final Logger LOG = LoggerFactory.getLogger
@@ -193,6 +193,7 @@ public class SchemaUpgradeHelper {
       catalogBinder.addBinding().to(UpgradeCatalog250.class);
       catalogBinder.addBinding().to(UpgradeCatalog251.class);
       catalogBinder.addBinding().to(UpgradeCatalog252.class);
+      catalogBinder.addBinding().to(UpdateAlertScriptPaths.class);
       catalogBinder.addBinding().to(FinalUpgradeCatalog.class);
 
       EventBusSynchronizer.synchronizeAmbariEventPublisher(binder());

http://git-wip-us.apache.org/repos/asf/ambari/blob/cfedbdf7/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpdateAlertScriptPaths.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpdateAlertScriptPaths.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpdateAlertScriptPaths.java
new file mode 100644
index 0000000..087a5af
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpdateAlertScriptPaths.java
@@ -0,0 +1,48 @@
+/*
+ * 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.upgrade;
+
+import java.sql.SQLException;
+
+import javax.inject.Inject;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
+import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.state.Clusters;
+
+import com.google.inject.Injector;
+
+/**
+ * Updates script-based alert definitions with paths from the stack.
+ */
+public class UpdateAlertScriptPaths extends AbstractFinalUpgradeCatalog {
+
+  @Inject
+  public UpdateAlertScriptPaths(Injector injector) {
+    super(injector);
+  }
+
+  @Override
+  protected void executeDMLUpdates() throws AmbariException, SQLException {
+    AmbariManagementController ambariManagementController = injector.getInstance(AmbariManagementController.class);
+    AmbariMetaInfo ambariMetaInfo = injector.getInstance(AmbariMetaInfo.class);
+    Clusters clusters = ambariManagementController.getClusters();
+    ambariMetaInfo.reconcileAlertDefinitions(clusters, true);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/cfedbdf7/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java
index bc1c19a..bfb3c31 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java
@@ -1871,7 +1871,7 @@ public class AmbariMetaInfoTest {
 
     cluster.addService("HDFS");
 
-    metaInfo.reconcileAlertDefinitions(clusters);
+    metaInfo.reconcileAlertDefinitions(clusters, false);
 
     AlertDefinitionDAO dao = injector.getInstance(AlertDefinitionDAO.class);
     List<AlertDefinitionEntity> definitions = dao.findAll(clusterId);
@@ -1895,7 +1895,7 @@ public class AmbariMetaInfoTest {
       dao.merge(definition);
     }
 
-    metaInfo.reconcileAlertDefinitions(clusters);
+    metaInfo.reconcileAlertDefinitions(clusters, false);
 
     definitions = dao.findAll();
     assertEquals(12, definitions.size());
@@ -1929,7 +1929,7 @@ public class AmbariMetaInfoTest {
     assertEquals(12, definitions.size());
 
     // reconcile, which should disable our bad definition
-    metaInfo.reconcileAlertDefinitions(clusters);
+    metaInfo.reconcileAlertDefinitions(clusters, false);
 
     // find all enabled for the cluster should find 6
     definitions = dao.findAllEnabled(cluster.getClusterId());