addNodesProgress.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. /*
  2. function cleanupInstall ()
  3. {
  4. alert("We will cleanup the cluster now!");
  5. var cleanupRequestData = {
  6. "ClusterDeployUser" : globalYui.Lang.trim(globalYui.one("#clusterDeployUserId").get('value'))
  7. }
  8. var url = "../php/frontend/nodesAction.php?clusterName=" + InstallationWizard.AddNodes.renderData.clusterName + "&action=uninstall";
  9. globalYui.io(url, {
  10. method: 'POST',
  11. data: cleanupRequestData,
  12. timeout : 10000,
  13. on: {
  14. success: function (x,o) {
  15. globalYui.log("RAW JSON DATA: " + o.responseText);
  16. // Process the JSON data returned from the server
  17. try {
  18. setupNodesJson = globalYui.JSON.parse(o.responseText);
  19. } catch (e) {
  20. alert("JSON Parse failed!");
  21. return;
  22. }
  23. globalYui.log("PARSED DATA: " + globalYui.Lang.dump(setupNodesJson));
  24. if (setupNodesJson.result != 0) {
  25. // Error!
  26. alert("Got error!" + setupNodesJson.error);
  27. return;
  28. }
  29. setupNodesJson = setupNodesJson.response;
  30. hideLoadingImg();
  31. globalYui.one("#blackScreenDivId").setStyle("display", "block");
  32. renderProgress( setupNodesJson, "uninstall" );
  33. },
  34. failure: function (x,o) {
  35. alert("Async call failed!");
  36. }
  37. }
  38. });
  39. }
  40. */
  41. function getProgressStateCssClass (opStatus)
  42. {
  43. var cssMarkup;
  44. var error;
  45. switch (opStatus) {
  46. case "SUCCESS":
  47. cssMarkup = 'txnProgressStateDone';
  48. error = false;
  49. break;
  50. case "STARTED":
  51. cssMarkup = 'txnProgressStateInProgress';
  52. error = false
  53. break;
  54. case "FAILED":
  55. cssMarkup = 'txnProgressStateError';
  56. error = true;
  57. break;
  58. case "TOTALFAILURE":
  59. cssMarkup = 'txnProgressStateError';
  60. error = true;
  61. break;
  62. default:
  63. cssMarkup = 'txnProgressStatePending';
  64. error = false;
  65. break;
  66. }
  67. var cssMarkupAndError = {
  68. 'cssMarkup' : cssMarkup,
  69. 'error' : error
  70. };
  71. return cssMarkupAndError;
  72. }
  73. function cleanUpTxnProgress ()
  74. {
  75. globalYui.one('#installationWizardProgressBarDivId').setStyle('display', 'block');
  76. globalYui.one('#txnProgressStatusMessageDivId').setContent('');
  77. globalYui.one('#blackScreenDivId').setStyle('display', 'none');
  78. globalYui.one('#txnProgressStatusDivId').setStyle('display', 'none');
  79. globalYui.one('#addNodesCoreDivId').setStyle('display', 'none');
  80. globalYui.one('#txnProgressFieldSetId').setStyle("display", "block");
  81. //globalYui.one('#txnProgressDynamicRenderDivId').setContent
  82. // ( '<img id=txnProgressLoadingImgId class=loadingImg src=../images/loading.gif />' );
  83. }
  84. function generateSingleDiscoverProgressStateMarkup( discoverProgressStateTitle, discoverProgressStateCssClass ) {
  85. globalYui.log( 'Generating: ' + discoverProgressStateTitle + '-' + discoverProgressStateCssClass );
  86. var markup =
  87. '<li>' +
  88. '<div class=' + discoverProgressStateCssClass + '>' +
  89. discoverProgressStateTitle +
  90. '</div>' +
  91. '</li>';
  92. globalYui.log("XXX" + markup);
  93. return markup;
  94. }
  95. function renderProgress (discoverProgressInfo) {
  96. var discoverProgressDataSource = new globalYui.DataSource.IO ({
  97. source: '../php/frontend/nodesActionProgress.php'
  98. });
  99. discoverProgressDataSource.plug(globalYui.Plugin.DataSourceJSONSchema, {
  100. schema: {
  101. metaFields: {
  102. progressStates: 'progressStates',
  103. currentProgressStateIndex: 'currentProgressStateIndex',
  104. encounteredError: 'encounteredError',
  105. stateInfo: 'stateInfo'
  106. }
  107. }
  108. });
  109. var discoverProgressPollHandle = discoverProgressDataSource.setInterval( 3000, {
  110. request: '?clusterName=' + discoverProgressInfo.clusterName + '&txnId=' + discoverProgressInfo.txnId + '&action=addNodes',
  111. callback: {
  112. success: function (e) {
  113. var stateInfo = e.response.meta.stateInfo;
  114. var discoverProgressStates = e.response.meta.progressStates;
  115. var stateInfoLength = 0;
  116. var count = 0;
  117. var lastTxnId = 0;
  118. var discoverProgressMarkup = '<ul id=txnProgressStatesListId>';
  119. var overallFail = false;
  120. var numSubTxns = 0;
  121. for (txnId in stateInfo.subTxns) {
  122. numSubTxns++;
  123. }
  124. if (numSubTxns == 0) {
  125. var errorInfoPanelBodyContent =
  126. '<img id=errorInfoPanelLoadingImgId class=loadingImg src=../images/loading.gif />';
  127. // globalYui.log('About to generate markup: ' + discoverProgressMarkup);
  128. globalYui.one('#txnProgressDynamicRenderDivId').setContent( errorInfoPanelBodyContent );
  129. globalYui.one("#txnProgressCoreDivId").setStyle("display", "block");
  130. return;
  131. }
  132. for (txnId in stateInfo.subTxns) {
  133. var currentProgressStateCssClass = getProgressStateCssClass(stateInfo.subTxns[txnId].opStatus);
  134. var cssMarkup = currentProgressStateCssClass.cssMarkup ;
  135. // If all states are in pending or just the first one, let's mark the first one as in progress
  136. if (numSubTxns == 1 && cssMarkup != 'txnProgressStateError') {
  137. cssMarkup = 'txnProgressStateInProgress';
  138. }
  139. discoverProgressMarkup +=
  140. generateSingleDiscoverProgressStateMarkup(
  141. stateInfo.subTxns[txnId].description + " " + stateInfo.subTxns[txnId].progress,
  142. // discoverProgressStates[stateInfoLength],
  143. cssMarkup);
  144. stateInfoLength++;
  145. count++;
  146. lastTxnId = txnId;
  147. overallFail |= currentProgressStateCssClass.error;
  148. }
  149. // Render the remaining stages as pending
  150. if (stateInfoLength < discoverProgressStates.length) {
  151. for (; count < discoverProgressStates.length; count++ ) {
  152. var cssClass = 'txnProgressStatePending';
  153. discoverProgressMarkup +=
  154. generateSingleDiscoverProgressStateMarkup(
  155. discoverProgressStates[count],
  156. cssClass);
  157. }
  158. }
  159. var noNeedForFurtherPolling = false;
  160. var totalFailure = false;
  161. var installationStatusDivContent = '';
  162. var installationStatusDivCssClass = '';
  163. if (stateInfo.subTxns[lastTxnId].opStatus == "TOTALFAILURE") {
  164. noNeedForFurtherPolling = true;
  165. totalFailure = true;
  166. } else if (stateInfoLength == discoverProgressStates.length) {
  167. if ((stateInfo.subTxns[lastTxnId].opStatus == "SUCCESS")
  168. || (stateInfo.subTxns[lastTxnId].opStatus == "FAILED")) {
  169. noNeedForFurtherPolling = true;
  170. } else {
  171. noNeedForFurtherPolling = false;
  172. }
  173. }
  174. if (overallFail == true) {
  175. installationStatusDivContent =
  176. '<p>' +
  177. 'An error was encountered with some of the nodes. ' +
  178. '<a href="javascript:void(null)" id=errorInfoLinkId>' +
  179. 'Take a look at the logs to see what happened.' +
  180. '</a>'
  181. '</p>';
  182. installationStatusDivCssClass = 'statusError';
  183. var linkInfo = '<a href="javascript:void(null)"' +
  184. 'id="errorBackNavLinkId">Back to Add Nodes</a>';
  185. if (totalFailure == false) {
  186. linkInfo += ' <a href=' +
  187. '"javascript:void(null)" id="errorFwdNavLinkId" style="margin-left:20px">Ignore and Continue</a>';
  188. }
  189. globalYui.one("#txnProgressStatusActionsDivId").setContent(linkInfo);
  190. // now can add the on-click feature for the links
  191. globalYui.one("#errorBackNavLinkId").on( "click", function(e) {
  192. cleanUpTxnProgress();
  193. errorInfoPanel.destroy();
  194. // give cleanup option
  195. // cleanupInstall();
  196. globalYui.one("#txnProgressStatusActionsDivId").setContent("");
  197. globalYui.one('#txnProgressCoreDivId').setStyle('display', 'none');
  198. globalYui.one("#addNodesCoreDivId").setStyle('display', 'block');
  199. });
  200. if (totalFailure == false) {
  201. globalYui.one("#errorFwdNavLinkId").on( "click", function(e) {
  202. cleanUpTxnProgress();
  203. errorInfoPanel.destroy();
  204. //REZYYY globalYui.one("#progressErrorInfoNavigateDivId").setContent("");
  205. globalYui.one("#txnProgressStatusActionsDivId").setContent("");
  206. transitionToNextStage( "#txnProgressCoreDivId", discoverProgressInfo,
  207. "#selectServicesCoreDivId", discoverProgressInfo, renderSelectServicesBlock);
  208. });
  209. }
  210. } else {
  211. installationStatusDivContent =
  212. '<p>' +
  213. 'Finished node discovery and preparation. ' +
  214. '<a href="javascript:void(null)" id=successInfoLinkId>' +
  215. 'Proceed to Select Services' +
  216. '</a>' +
  217. '</p>';
  218. installationStatusDivCssClass = 'statusOk';
  219. }
  220. if( noNeedForFurtherPolling ) {
  221. /* We've made all the progress we could have, so stop polling. */
  222. discoverProgressDataSource.clearInterval( discoverProgressPollHandle );
  223. globalYui.one('#txnProgressStatusDivId').setStyle('display', 'block');
  224. globalYui.one('#txnProgressStatusDivId').addClass(installationStatusDivCssClass);
  225. var installationStatusDiv = globalYui.one('#txnProgressStatusMessageDivId');
  226. installationStatusDiv.setContent(installationStatusDivContent);
  227. /* If we stopped polling due to error, we need to do more work. */
  228. if( installationStatusDivCssClass == 'statusError' ) {
  229. /* Create the panel that'll display our error info. */
  230. var errorInfoPanel =
  231. createInformationalPanel( '#informationalPanelContainerDivId',
  232. 'Node Discovery and Preparation Logs' );
  233. globalYui.one("#errorInfoLinkId").on( "click", function(err) {
  234. var bodyContent = "";
  235. for (subTxn in e.response.meta.stateInfo.subTxns) {
  236. var subTxnInfo = e.response.meta.stateInfo.subTxns[subTxn];
  237. var additionalInfoTable = '<table>' +
  238. '<thead><tr><th>Host</th><th>Info</th></tr></thead>';
  239. for (hostName in subTxnInfo.state) {
  240. additionalInfoTable += '<tr><td>' + hostName + '</td><td><pre>' +subTxnInfo.state[hostName] + '</pre></td></tr>'
  241. }
  242. additionalInfoTable += '</table>';
  243. bodyContent += '<div class="logEntry">' +
  244. '<div class="logEntryHeader">' + subTxnInfo.description + '</div>' +
  245. '<div class="logEntryBody">' +
  246. '<ul>' +
  247. '<li>Entry Id : ' + subTxnInfo.subTxnId + '</li>' +
  248. '<li>Final result : ' + subTxnInfo.opStatus + '</li>' +
  249. '<li>Progress at the end : ' + subTxnInfo.progress + '</li>' +
  250. '<li>Additional information : ' + additionalInfoTable + '</li>' +
  251. '</ul>' +
  252. '</div>' +
  253. '</div>';
  254. }
  255. // Set centered explicitly
  256. errorInfoPanel.set('centered', true);
  257. errorInfoPanel.set('bodyContent' , bodyContent);
  258. //errorInfoPanel.set( 'bodyContent', '<pre>' +
  259. // globalYui.JSON.stringify( e.response.meta.stateInfo, null, 4) + '</pre>' );
  260. errorInfoPanel.show();
  261. //REZYYY globalYui.one("#progressErrorInfoNavigateDivId").setStyle( 'display', 'block' );
  262. });
  263. } else {
  264. globalYui.one("#successInfoLinkId").on( "click", function(e) {
  265. cleanUpTxnProgress();
  266. transitionToNextStage( "#txnProgressCoreDivId", discoverProgressInfo,
  267. "#selectServicesCoreDivId", discoverProgressInfo, renderSelectServicesBlock);
  268. });
  269. }
  270. }
  271. discoverProgressMarkup += '</ul>';
  272. // globalYui.log('About to generate markup: ' + discoverProgressMarkup);
  273. globalYui.one('#txnProgressDynamicRenderDivId').setContent( discoverProgressMarkup );
  274. globalYui.one("#txnProgressCoreDivId").setStyle("display", "block");
  275. },
  276. failure: function (e) {
  277. alert('Failed to fetch more progress!');
  278. /* No point making any more attempts. */
  279. discoverProgressDataSource.clearInterval( discoverProgressPollHandle );
  280. }
  281. }
  282. });
  283. }