AMBARI-10189. RU: Adding new host fails after finalized upgrade (ncole)
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 01bd9c7..586e98c 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,6 +38,8 @@
 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;
@@ -204,6 +206,18 @@
       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) {
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 c107d89..1c0e195 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
@@ -29,6 +29,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.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
 import org.apache.ambari.server.orm.OrmTestHelper;
@@ -41,6 +42,7 @@
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Host;
+import org.apache.ambari.server.state.RepositoryInfo;
 import org.apache.ambari.server.state.RepositoryVersionState;
 import org.apache.ambari.server.state.StackId;
 import org.junit.After;
@@ -127,6 +129,70 @@
     hostVersionDao.create(entity);
   }
 
+  private void makeUpgradeCluster() throws Exception {
+    String clusterName = "c1";
+    String hostName = "h1";
+
+    Clusters clusters = m_injector.getInstance(Clusters.class);
+    clusters.addCluster(clusterName);
+
+    StackId stackId = new StackId("HDP-2.1.1");
+
+    Cluster c = clusters.getCluster(clusterName);
+    c.setDesiredStackVersion(stackId);
+
+    // add a host component
+    clusters.addHost(hostName);
+
+    Host host = clusters.getHost(hostName);
+
+    Map<String, String> hostAttributes = new HashMap<String, String>();
+    hostAttributes.put("os_family", "redhat");
+    hostAttributes.put("os_release_version", "6");
+    host.setHostAttributes(hostAttributes);
+    host.persist();
+
+    OrmTestHelper helper = m_injector.getInstance(OrmTestHelper.class);
+    RepositoryVersionDAO repositoryVersionDAO = m_injector.getInstance (RepositoryVersionDAO.class);
+
+    String urlInfo = "[{'repositories':[" +
+        "{'Repositories/base_url':'http://foo1','Repositories/repo_name':'HDP','Repositories/repo_id':'HDP-2.1.1'}" +
+        "], 'OperatingSystems/os_type':'redhat6'}]";
+
+    helper.getOrCreateRepositoryVersion(stackId.getStackId(), DOWNGRADE_VERSION);
+//    helper.getOrCreateRepositoryVersion(stackId.getStackId(), UPGRADE_VERSION);
+    repositoryVersionDAO.create(
+        stackId.getStackId (), UPGRADE_VERSION, String.valueOf(System.currentTimeMillis()), "pack",
+          urlInfo);
+
+    RepositoryVersionDAO repoVersionDao = m_injector.getInstance(RepositoryVersionDAO.class);
+    HostVersionDAO hostVersionDao = m_injector.getInstance(HostVersionDAO.class);
+
+    c.createClusterVersion(stackId.getStackId(), DOWNGRADE_VERSION, "admin",
+        RepositoryVersionState.UPGRADING);
+    c.createClusterVersion(stackId.getStackId(), UPGRADE_VERSION, "admin",
+        RepositoryVersionState.INSTALLING);
+
+    c.transitionClusterVersion(stackId.getStackId(), DOWNGRADE_VERSION, RepositoryVersionState.CURRENT);
+    c.transitionClusterVersion(stackId.getStackId(), UPGRADE_VERSION, RepositoryVersionState.INSTALLED);
+    c.transitionClusterVersion(stackId.getStackId(), UPGRADE_VERSION, RepositoryVersionState.UPGRADING);
+    c.transitionClusterVersion(stackId.getStackId(), UPGRADE_VERSION, RepositoryVersionState.UPGRADED);
+    c.setCurrentStackVersion(stackId);
+
+    c.mapHostVersions(Collections.singleton(hostName), c.getCurrentClusterVersion(),
+        RepositoryVersionState.CURRENT);
+
+    HostDAO hostDAO = m_injector.getInstance(HostDAO.class);
+
+    HostVersionEntity entity = new HostVersionEntity();
+    entity.setHostEntity(hostDAO.findByName(hostName));
+    entity.setHostName(hostName);
+    entity.setRepositoryVersion(
+        repoVersionDao.findByStackAndVersion(stackId.getStackId(), UPGRADE_VERSION));
+    entity.setState(RepositoryVersionState.UPGRADED);
+    hostVersionDao.create(entity);
+  }
+
 
   @Test
   public void testFinalizeDowngrade() throws Exception {
@@ -169,7 +235,36 @@
         assertEquals(RepositoryVersionState.INSTALLED, entity.getState());
       }
     }
+  }
 
+  @Test
+  public void testFinalizeUpgrade() throws Exception {
+    makeUpgradeCluster();
+
+    Map<String, String> commandParams = new HashMap<String, String>();
+    commandParams.put("upgrade_direction", "upgrade");
+    commandParams.put("version", UPGRADE_VERSION);
+
+    ExecutionCommand executionCommand = new ExecutionCommand();
+    executionCommand.setCommandParams(commandParams);
+    executionCommand.setClusterName("c1");
+
+    HostRoleCommand hostRoleCommand = new HostRoleCommand(null, null, null, null);
+    hostRoleCommand.setExecutionCommandWrapper(new ExecutionCommandWrapper(executionCommand));
+
+    FinalizeUpgradeAction action = m_injector.getInstance(FinalizeUpgradeAction.class);
+    action.setExecutionCommand(executionCommand);
+    action.setHostRoleCommand(hostRoleCommand);
+
+    CommandReport report = action.execute(null);
+    assertNotNull(report);
+    assertEquals(HostRoleStatus.COMPLETED.name(), report.getStatus());
+
+
+    // !!! verify the metainfo url has been updated
+    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());
   }