Repository: ambari Updated Branches: refs/heads/trunk cf094a7e5 -> 4acfcf20d
AMBARI-10288. RU: Add host should not rely on Finalize action (ncole) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/4acfcf20 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/4acfcf20 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/4acfcf20 Branch: refs/heads/trunk Commit: 4acfcf20ddfd678543f1ed6de01cf90f087be1a4 Parents: cf094a7 Author: Nate Cole <[email protected]> Authored: Mon Mar 30 17:39:22 2015 -0400 Committer: Nate Cole <[email protected]> Committed: Tue Mar 31 08:36:25 2015 -0400 ---------------------------------------------------------------------- .../AmbariCustomCommandExecutionHelper.java | 61 ++++++++++++++++++-- .../upgrades/FinalizeUpgradeAction.java | 14 ----- .../upgrades/UpgradeActionTest.java | 31 +++++++++- 3 files changed, 86 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/4acfcf20/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java index e7bfbe0..cfc1d4e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java @@ -65,6 +65,9 @@ import org.apache.ambari.server.controller.internal.RequestResourceFilter; import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.metadata.ActionMetadata; import org.apache.ambari.server.orm.entities.ClusterVersionEntity; +import org.apache.ambari.server.orm.entities.OperatingSystemEntity; +import org.apache.ambari.server.orm.entities.RepositoryEntity; +import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.CommandScriptDefinition; @@ -92,6 +95,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -941,22 +947,24 @@ public class AmbariCustomCommandExecutionHelper { * @throws AmbariException if the repository information can not be obtained */ public String getRepoInfo(Cluster cluster, Host host) throws AmbariException { + StackId stackId = cluster.getDesiredStackVersion(); Map<String, List<RepositoryInfo>> repos = ambariMetaInfo.getRepository( stackId.getStackName(), stackId.getStackVersion()); - String repoInfo = ""; String family = os_family.find(host.getOsType()); if (null == family) { family = host.getOsFamily(); } + JsonElement gsonList = null; + // !!! check for the most specific first if (repos.containsKey(host.getOsType())) { - repoInfo = gson.toJson(repos.get(host.getOsType())); + gsonList = gson.toJsonTree(repos.get(host.getOsType())); } else if (null != family && repos.containsKey(family)) { - repoInfo = gson.toJson(repos.get(family)); + gsonList = gson.toJsonTree(repos.get(family)); } else { LOG.warn("Could not retrieve repo information for host" + ", hostname=" + host.getHostName() @@ -964,7 +972,52 @@ public class AmbariCustomCommandExecutionHelper { + ", stackInfo=" + stackId.getStackId()); } - return repoInfo; + if (null != gsonList) { + updateBaseUrls(cluster, JsonArray.class.cast(gsonList)); + return gsonList.toString(); + } else { + return ""; + } + } + + /** + * Checks repo URLs against the current version for the cluster and makes + * adjustments to the Base URL when the current is different. + * @param cluster the cluster to load the current version + * @param jsonArray the array containing stack repo data + */ + private void updateBaseUrls(Cluster cluster, JsonArray jsonArray) { + ClusterVersionEntity cve = cluster.getCurrentClusterVersion(); + if (null == cve || null == cve.getRepositoryVersion()) { + return; + } + + RepositoryVersionEntity rve = cve.getRepositoryVersion(); + + for (JsonElement e : jsonArray) { + JsonObject obj = e.getAsJsonObject(); + + String repoId = obj.has("repoId") ? obj.get("repoId").getAsString() : null; + String repoName = obj.has("repoName") ? obj.get("repoName").getAsString() : null; + String baseUrl = obj.has("baseUrl") ? obj.get("baseUrl").getAsString() : null; + String osType = obj.has("osType") ? obj.get("osType").getAsString() : null; + + if (null == repoId || null == baseUrl || null == osType || null == repoName) { + continue; + } + + for (OperatingSystemEntity ose : rve.getOperatingSystems()) { + if (ose.getOsType().equals(osType)) { + for (RepositoryEntity re : ose.getRepositories()) { + if (re.getName().equals(repoName) && + re.getRepositoryId().equals(repoId) && + !re.getBaseUrl().equals(baseUrl)) { + obj.addProperty("baseUrl", re.getBaseUrl()); + } + } + } + } + } } http://git-wip-us.apache.org/repos/asf/ambari/blob/4acfcf20/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java index 586e98c..01bd9c7 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java @@ -38,8 +38,6 @@ import org.apache.ambari.server.orm.entities.ClusterVersionEntity; import org.apache.ambari.server.orm.entities.HostComponentStateEntity; import org.apache.ambari.server.orm.entities.HostEntity; import org.apache.ambari.server.orm.entities.HostVersionEntity; -import org.apache.ambari.server.orm.entities.OperatingSystemEntity; -import org.apache.ambari.server.orm.entities.RepositoryEntity; import org.apache.ambari.server.serveraction.AbstractServerAction; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; @@ -206,18 +204,6 @@ public class FinalizeUpgradeAction extends AbstractServerAction { outSB.append(String.format("Will finalize the version for cluster %s.\n", clusterName)); cluster.transitionClusterVersion(stackId, version, RepositoryVersionState.CURRENT); - // !!! update the stack-defined repo url - for (OperatingSystemEntity ose : upgradingClusterVersion.getRepositoryVersion().getOperatingSystems()) { - for (RepositoryEntity re : ose.getRepositories()) { - ambariMetaInfo.updateRepoBaseURL( - upgradingClusterVersion.getRepositoryVersion().getStackName(), - upgradingClusterVersion.getRepositoryVersion().getStackVersion(), - ose.getOsType(), - re.getRepositoryId(), - re.getBaseUrl()); - } - } - outSB.append("Upgrade was successful!\n"); return createCommandReport(0, HostRoleStatus.COMPLETED, "{}", outSB.toString(), errSB.toString()); } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/ambari/blob/4acfcf20/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java index 1c0e195..87dd18b 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java @@ -19,6 +19,7 @@ package org.apache.ambari.server.serveraction.upgrades; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import java.util.Collections; import java.util.HashMap; @@ -30,6 +31,7 @@ import org.apache.ambari.server.actionmanager.HostRoleStatus; import org.apache.ambari.server.agent.CommandReport; import org.apache.ambari.server.agent.ExecutionCommand; import org.apache.ambari.server.api.services.AmbariMetaInfo; +import org.apache.ambari.server.controller.AmbariCustomCommandExecutionHelper; import org.apache.ambari.server.orm.GuiceJpaInitializer; import org.apache.ambari.server.orm.InMemoryDefaultTestModule; import org.apache.ambari.server.orm.OrmTestHelper; @@ -49,6 +51,10 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.persist.PersistService; @@ -261,10 +267,31 @@ public class UpgradeActionTest { assertEquals(HostRoleStatus.COMPLETED.name(), report.getStatus()); - // !!! verify the metainfo url has been updated + // !!! verify the metainfo url has not been updated, but an output command has AmbariMetaInfo metaInfo = m_injector.getInstance(AmbariMetaInfo.class); RepositoryInfo repo = metaInfo.getRepository("HDP", "2.1.1", "redhat6", "HDP-2.1.1"); - assertEquals("http://foo1", repo.getBaseUrl()); + assertEquals("http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.1.1.0-118", repo.getBaseUrl()); + + // !!! verify that a command will return the correct host info + AmbariCustomCommandExecutionHelper helper = m_injector.getInstance( + AmbariCustomCommandExecutionHelper.class); + Clusters clusters = m_injector.getInstance(Clusters.class); + Host host = clusters.getHost("h1"); + Cluster cluster = clusters.getCluster("c1"); + + String repoInfo = helper.getRepoInfo(cluster, host); + + Gson gson = new Gson(); + + JsonElement element = gson.fromJson(repoInfo, JsonElement.class); + assertTrue(element.isJsonArray()); + + JsonArray list = JsonArray.class.cast(element); + assertEquals(1, list.size()); + + JsonObject o = list.get(0).getAsJsonObject(); + assertTrue(o.has("baseUrl")); + assertEquals("http://foo1", o.get("baseUrl").getAsString()); }
