Browse Source

AMBARI-330. Provide a way to resume if browser crashes/is closed during the deploy-in-progress (Contributed by Varun)

git-svn-id: https://svn.apache.org/repos/asf/incubator/ambari/branches/ambari-186@1346602 13f79535-47bb-0310-9956-ffa450edef68
Vikram Dixit K 13 years ago
parent
commit
2e2c67f178

+ 2 - 0
CHANGES.txt

@@ -6,6 +6,8 @@ characters wide.
 
 Release 0.1.x - unreleased
 
+  AMBARI-330. Provide a way to resume if browser crashes/is closed during the deploy-in-progress (Varun via Vikram)
+
   AMBARI-320. Reconfiguring a stopped service starts it incorrectly (Hitesh via Vikram)
 
   AMBARI-340. Info logs for PuppetInvoker (Jitendra via Vikram)

+ 45 - 0
hmc/html/showDeployProgress.php

@@ -0,0 +1,45 @@
+<?php require_once "./head.inc" ?>
+<html>
+  <head>
+    <title id="pageTitleId"><?php echo $RES['page.title'] ?></title>
+
+    <!-- CSS -->
+    <link type="text/css" rel="stylesheet" href="../yui-3.5.1/build/cssreset/cssreset-min.css">
+    <link type="text/css" rel="stylesheet" href="../css/bootstrap.css" media="screen"/>
+    <link type="text/css" rel="stylesheet" href="../css/common.css" media="screen"/>
+    <link type="text/css" rel="stylesheet" href="../css/common2.css" media="screen"/>
+    <link type="text/css" rel="stylesheet" href="../css/common3.css" media="screen"/>
+    <link rel="shortcut icon" href="../images/logo-micro.gif">
+    <!-- End CSS -->
+  </head>
+
+  <body class="yui3-skin-sam">
+    <?php require "./topnav.htmli"; ?>
+
+    <div id="contentDivId"> 
+
+      <?php require "./utils.htmli"; ?>
+      <?php require "./txnUtils.htmli"; ?>
+
+    </div>
+    <!-- End of contentDivId -->
+
+    <?php require "./footer.htmli"; ?>
+
+    <!-- Javascript Scaffolding -->
+    <script type="text/javascript">
+      /* Minimal data required to bootstrap clusters.js. */
+      var clusterName = '<?php echo $_GET['clusterName']; ?>';
+
+      var jsFilesToLoad = [ 
+        '../js/utils.js',
+        '../js/txnUtils.js',
+        '../js/deployProgress.js',
+        '../js/showDeployProgress.js' 
+      ];
+    </script>
+
+    <?php require "./bootstrapJs.htmli"; ?>
+    <!-- End of Javascript Scaffolding -->
+  </body>
+</html> 

+ 9 - 1
hmc/js/deployProgress.js

@@ -68,7 +68,15 @@ function renderDeployProgress (deployProgressInfo) {
    * and have asked for a deploy, so there's no going back - remove
    * all traces of #installationWizardProgressBarDivId.
    */
-  globalYui.one('#installationWizardProgressBarDivId').setStyle('display', 'none');
+  var installationWizardProgressBarDiv = globalYui.one('#installationWizardProgressBarDivId');
+
+  /* But be safe and perform this removal only if #installationWizardProgressBarDivId 
+   * actually exists on the page - this .js file is now being used in more 
+   * than one place, so this robustness is needed.
+   */
+  if (installationWizardProgressBarDiv) {
+    installationWizardProgressBarDiv.setStyle('display', 'none')
+  }
 
   var hmcRestartMsg = '';
   if (deployProgressInfo.nagiosGangliaCoHosted != null

+ 2 - 0
hmc/js/showDeployProgress.js

@@ -0,0 +1,2 @@
+/* Main() */
+executeStage( '../php/frontend/deploy.php?clusterName=' + clusterName, renderDeployProgress );

+ 56 - 9
hmc/php/frontend/deploy.php

@@ -9,6 +9,7 @@ include_once "../orchestrator/HMC.php";
 include_once "../db/OrchestratorDB.php";
 include_once "../puppet/DBReader.php";
 include_once "../puppet/PuppetInvoker.php";
+include_once "../util/clusterState.php";
 
 $dbPath = $GLOBALS["DB_PATH"];
 $clusterName = $_GET['clusterName'];
@@ -16,23 +17,69 @@ $clusterName = $_GET['clusterName'];
 $startTime = time();
 $hmc = new HMC($dbPath, $clusterName);
 
-$result = $hmc->deployHDP();
-if ($result["result"] != 0) {
-  print json_encode($result);
+/* For returning in our JSON at the very end. */
+$result = 0;
+$error = "";
+
+$txnId = -1;
+
+$dbAccessor = new HMCDBAccessor($dbPath);
+$clusterStateResponse = $dbAccessor->getClusterState($clusterName);
+
+if ($clusterStateResponse['result'] != 0) {
+  print json_encode($clusterStateResponse);
   return;
 }
 
-if (!isset($result["txnId"])) {
-  print json_encode ( array("result" => 1, "error" => "Could not obtain txn info for triggered command"));
-  return;
+$clusterState = json_decode($clusterStateResponse['state'], true);
+
+/* Run an actual deploy only if this cluster has passed the stage of 
+ * configuring its services (which means the next thing to do is to
+ * kick off the deploy). 
+ */
+if (($clusterState['state'] == 'CONFIGURATION_IN_PROGRESS') && 
+    ($clusterState['context']['stage'] == 'CONFIGURE_SERVICES')) {
+
+  $deployResult = $hmc->deployHDP();
+  if ($deployResult["result"] != 0) {
+    print json_encode($deployResult);
+    return;
+  }
+
+  if (!isset($deployResult["txnId"])) {
+    print json_encode ( array("result" => 1, "error" => "Could not obtain txn info for triggered command"));
+    return;
+  }
+
+  $txnId = $deployResult["txnId"];
+
+  /* (And when we kick off the deploy is the only time to update the state of the cluster) */
+  $state = "DEPLOYMENT_IN_PROGRESS";
+  $displayName = "Deployment in progress";
+  $context = array (
+    'txnId' => $txnId
+  );
+
+  $retval = updateClusterState($clusterName, $state, $displayName, $context);
+  if ($retval['result'] != 0) {
+    $result = $retval['result'];
+    $error = $retval['error'];
+  }
 }
+/* In case the deploy is already running or has ended, just return the txnId 
+ * from the DB instead of kicking off a fresh deploy - this is so we can use
+ * this entrypoint to show the cluster's deploy progress at any time in the
+ * future, not just during a live deploy. 
+ */
+elseif (($clusterState['state'] == 'DEPLOYMENT_IN_PROGRESS') ||
+        ($clusterState['state'] == 'DEPLOYED')) {
 
-$txnId = $result["txnId"];
+  $txnId = $clusterState['context']['txnId'];
+}
 
 $thisHostName = trim(strtolower(exec('hostname -f')));
 
 $nagiosGangliaCoHosted = FALSE;
-$dbAccessor = new HMCDBAccessor($dbPath);
 
 // check if nagios hosted on same server
 if (!$nagiosGangliaCoHosted) {
@@ -63,6 +110,6 @@ $jsonOutput = array(
 /* ...and spit it out. */
 header("Content-type: application/json");
 
-print (json_encode(array("result" => 0, "error" => 0, "response" => $jsonOutput)));
+print (json_encode(array("result" => $result, "error" => $error, "response" => $jsonOutput)));
 
 ?>