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 <adorosz...@hortonworks.com> Authored: Mon Jul 24 13:06:29 2017 +0200 Committer: Attila Doroszlai <adorosz...@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());