Repository: ambari Updated Branches: refs/heads/branch-2.1 86a047583 -> 9d77d83ca
AMBARI-13529: Service Checks fail after PHD-Ambari 1.7.1 to 2.1.2 upgrade (jluniya) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/9d77d83c Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/9d77d83c Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/9d77d83c Branch: refs/heads/branch-2.1 Commit: 9d77d83cac4e4a0de422c9bddd757696838b92e1 Parents: 86a0475 Author: Jayush Luniya <jlun...@hortonworks.com> Authored: Fri Oct 23 09:31:23 2015 -0700 Committer: Jayush Luniya <jlun...@hortonworks.com> Committed: Fri Oct 23 09:31:23 2015 -0700 ---------------------------------------------------------------------- .../pluggable_stack_definition/configs/PHD.json | 3 + .../server/upgrade/AbstractUpgradeCatalog.java | 2 +- .../server/upgrade/SchemaUpgradeHelper.java | 5 +- .../server/upgrade/UpgradeCatalog2121.java | 169 +++++++++++++++++++ .../server/upgrade/UpgradeCatalog213.java | 2 +- .../server/upgrade/UpgradeCatalog2121Test.java | 118 +++++++++++++ 6 files changed, 295 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/9d77d83c/ambari-common/src/main/python/pluggable_stack_definition/configs/PHD.json ---------------------------------------------------------------------- diff --git a/ambari-common/src/main/python/pluggable_stack_definition/configs/PHD.json b/ambari-common/src/main/python/pluggable_stack_definition/configs/PHD.json index 431a26c..70b64f7 100644 --- a/ambari-common/src/main/python/pluggable_stack_definition/configs/PHD.json +++ b/ambari-common/src/main/python/pluggable_stack_definition/configs/PHD.json @@ -65,6 +65,9 @@ }, { "name": "PIG" + }, + { + "name": "GANGLIA" } ] }, http://git-wip-us.apache.org/repos/asf/ambari/blob/9d77d83c/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java index ed68313..92cc9e6 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java @@ -188,7 +188,7 @@ public abstract class AbstractUpgradeCatalog implements UpgradeCatalog { } return VersionUtils.compareVersions(upgradeCatalog1.getTargetVersion(), - upgradeCatalog2.getTargetVersion(), 3); + upgradeCatalog2.getTargetVersion(), 4); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/9d77d83c/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 7453d4b..5e22f71 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 @@ -138,10 +138,10 @@ public class SchemaUpgradeHelper { for (UpgradeCatalog upgradeCatalog : candidateCatalogs) { if (sourceVersion == null || VersionUtils.compareVersions(sourceVersion, - upgradeCatalog.getTargetVersion(), 3) < 0) { + upgradeCatalog.getTargetVersion(), 4) < 0) { // catalog version is newer than source if (VersionUtils.compareVersions(upgradeCatalog.getTargetVersion(), - targetVersion, 3) <= 0) { + targetVersion, 4) <= 0) { // catalog version is older or equal to target upgradeCatalogs.add(upgradeCatalog); } @@ -180,6 +180,7 @@ public class SchemaUpgradeHelper { catalogBinder.addBinding().to(UpgradeCatalog210.class); catalogBinder.addBinding().to(UpgradeCatalog211.class); catalogBinder.addBinding().to(UpgradeCatalog212.class); + catalogBinder.addBinding().to(UpgradeCatalog2121.class); catalogBinder.addBinding().to(UpgradeCatalog213.class); catalogBinder.addBinding().to(FinalUpgradeCatalog.class); http://git-wip-us.apache.org/repos/asf/ambari/blob/9d77d83c/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog2121.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog2121.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog2121.java new file mode 100644 index 0000000..ac06bb1 --- /dev/null +++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog2121.java @@ -0,0 +1,169 @@ +/* + * 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 com.google.inject.Inject; +import com.google.inject.Injector; +import org.apache.ambari.server.AmbariException; +import org.apache.ambari.server.controller.AmbariManagementController; +import org.apache.ambari.server.orm.dao.DaoUtils; +import org.apache.ambari.server.state.Cluster; +import org.apache.ambari.server.state.Clusters; +import org.apache.ambari.server.state.Config; +import org.apache.ambari.server.state.DesiredConfig; +import org.apache.ambari.server.state.StackId; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.SQLException; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Upgrade catalog for version 2.1.2.1 + */ +public class UpgradeCatalog2121 extends AbstractUpgradeCatalog { + + /** + * Logger. + */ + private static final Logger LOG = LoggerFactory.getLogger(UpgradeCatalog2121.class); + + @Inject + DaoUtils daoUtils; + + // ----- Constructors ------------------------------------------------------ + + /** + * Don't forget to register new UpgradeCatalogs in {@link org.apache.ambari.server.upgrade.SchemaUpgradeHelper.UpgradeHelperModule#configure()} + * + * @param injector Guice injector to track dependencies and uses bindings to inject them. + */ + @Inject + public UpgradeCatalog2121(Injector injector) { + super(injector); + + daoUtils = injector.getInstance(DaoUtils.class); + } + + // ----- UpgradeCatalog ---------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public String getTargetVersion() { + return "2.1.2.1"; + } + + // ----- AbstractUpgradeCatalog -------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public String getSourceVersion() { + return "2.1.2"; + } + + /** + * {@inheritDoc} + */ + @Override + protected void executeDDLUpdates() throws AmbariException, SQLException { + + } + + /** + * {@inheritDoc} + */ + @Override + protected void executePreDMLUpdates() throws AmbariException, SQLException { + + } + + /** + * {@inheritDoc} + */ + @Override + protected void executeDMLUpdates() throws AmbariException, SQLException { + updatePHDConfigs(); + } + + /** + * Update PHD stack configs + * @throws AmbariException + */ + protected void updatePHDConfigs() throws AmbariException { + + Map<String, String> replacements = new LinkedHashMap<String, String>(); + replacements.put("-Dstack.name=\\{\\{\\s*stack_name\\s*\\}\\}\\s*", ""); + replacements.put("-Dstack.name=\\$\\{stack.name\\}\\s*", ""); + replacements.put("-Dstack.version=\\{\\{\\s*stack_version_buildnum\\s*\\}\\}", "-Dhdp.version=\\$HDP_VERSION"); + replacements.put("-Dstack.version=\\$\\{stack.version\\}", "-Dhdp.version=\\$\\{hdp.version\\}"); + replacements.put("\\{\\{\\s*stack_name\\s*\\}\\}", "phd"); + replacements.put("\\$\\{stack.name\\}", "phd"); + replacements.put("\\$\\{stack.version\\}", "\\$\\{hdp.version\\}"); + + AmbariManagementController ambariManagementController = injector.getInstance(AmbariManagementController.class); + Clusters clusters = ambariManagementController.getClusters(); + if (clusters != null) { + Map<String, Cluster> clusterMap = clusters.getClusters(); + if ((clusterMap != null) && !clusterMap.isEmpty()) { + // Iterate through the clusters and perform any configuration updates + for (final Cluster cluster : clusterMap.values()) { + StackId currentStackVersion = cluster.getCurrentStackVersion(); + String currentStackName = currentStackVersion != null? currentStackVersion.getStackName() : null; + if (currentStackName != null && currentStackName.equalsIgnoreCase("PHD")) { + // Update configs only if PHD stack is deployed + Map<String, DesiredConfig> desiredConfigs = cluster.getDesiredConfigs(); + if(desiredConfigs != null && !desiredConfigs.isEmpty()) { + for (Map.Entry<String, DesiredConfig> dc : desiredConfigs.entrySet()) { + String configType = dc.getKey(); + DesiredConfig desiredConfig = dc.getValue(); + String configTag = desiredConfig.getTag(); + Config config = cluster.getConfig(configType, configTag); + + Map<String, String> properties = config.getProperties(); + if(properties != null && !properties.isEmpty()) { + Map<String, String> updates = new HashMap<String, String>(); + for (Map.Entry<String, String> property : properties.entrySet()) { + String propertyKey = property.getKey(); + String propertyValue = property.getValue(); + String modifiedPropertyValue = propertyValue; + for (String regex : replacements.keySet()) { + modifiedPropertyValue = modifiedPropertyValue.replaceAll(regex, replacements.get(regex)); + } + if (!modifiedPropertyValue.equals(propertyValue)) { + updates.put(propertyKey, modifiedPropertyValue); + } + } + if (!updates.isEmpty()) { + updateConfigurationPropertiesForCluster(cluster, configType, updates, true, false); + } + } + } + } + } + } + } + } + } +} + http://git-wip-us.apache.org/repos/asf/ambari/blob/9d77d83c/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog213.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog213.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog213.java index 3e5bd28..a3d3c53 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog213.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog213.java @@ -157,7 +157,7 @@ public class UpgradeCatalog213 extends AbstractUpgradeCatalog { */ @Override public String getSourceVersion() { - return "2.1.2"; + return "2.1.2.1"; } /** http://git-wip-us.apache.org/repos/asf/ambari/blob/9d77d83c/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog2121Test.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog2121Test.java b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog2121Test.java new file mode 100644 index 0000000..f6b1c78 --- /dev/null +++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog2121Test.java @@ -0,0 +1,118 @@ +/* + * 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 static junit.framework.Assert.assertEquals; +import static org.easymock.EasyMock.anyObject; +import static org.easymock.EasyMock.capture; +import static org.easymock.EasyMock.createMockBuilder; +import static org.easymock.EasyMock.createNiceMock; +import static org.easymock.EasyMock.createStrictMock; +import static org.easymock.EasyMock.eq; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.expectLastCall; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.reset; +import static org.easymock.EasyMock.verify; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.HashMap; +import java.util.Map; + +import javax.persistence.EntityManager; + +import org.apache.ambari.server.api.services.AmbariMetaInfo; +import org.apache.ambari.server.configuration.Configuration; +import org.apache.ambari.server.controller.AmbariManagementController; +import org.apache.ambari.server.orm.DBAccessor; +import org.apache.ambari.server.orm.DBAccessor.DBColumnInfo; +import org.apache.ambari.server.orm.GuiceJpaInitializer; +import org.apache.ambari.server.orm.InMemoryDefaultTestModule; +import org.apache.ambari.server.orm.dao.StackDAO; +import org.apache.ambari.server.orm.entities.StackEntity; +import org.apache.ambari.server.state.*; +import org.apache.ambari.server.state.stack.OsFamily; +import org.easymock.Capture; +import org.easymock.EasyMockSupport; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.google.inject.AbstractModule; +import com.google.inject.Binder; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Module; +import com.google.inject.Provider; +import com.google.inject.persist.PersistService; + + +public class UpgradeCatalog2121Test { + private Injector injector; + private Provider<EntityManager> entityManagerProvider = createStrictMock(Provider.class); + private EntityManager entityManager = createNiceMock(EntityManager.class); + private UpgradeCatalogHelper upgradeCatalogHelper; + private StackEntity desiredStackEntity; + + @Before + public void init() { + reset(entityManagerProvider); + expect(entityManagerProvider.get()).andReturn(entityManager).anyTimes(); + replay(entityManagerProvider); + injector = Guice.createInjector(new InMemoryDefaultTestModule()); + injector.getInstance(GuiceJpaInitializer.class); + + upgradeCatalogHelper = injector.getInstance(UpgradeCatalogHelper.class); + // inject AmbariMetaInfo to ensure that stacks get populated in the DB + injector.getInstance(AmbariMetaInfo.class); + // load the stack entity + StackDAO stackDAO = injector.getInstance(StackDAO.class); + desiredStackEntity = stackDAO.find("PHD", "3.0.0"); + } + + @After + public void tearDown() { + injector.getInstance(PersistService.class).stop(); + } + + @Test + public void testExecuteDMLUpdates() throws Exception { + Method updatePHDConfigs = UpgradeCatalog2121.class.getDeclaredMethod("updatePHDConfigs"); + + UpgradeCatalog2121 upgradeCatalog2121 = createMockBuilder(UpgradeCatalog2121.class) + .addMockedMethod(updatePHDConfigs) + .createMock(); + + upgradeCatalog2121.updatePHDConfigs(); + expectLastCall().once(); + + replay(upgradeCatalog2121); + + upgradeCatalog2121.executeDMLUpdates(); + + verify(upgradeCatalog2121); + } +} +