addNodesProgress.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  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. 'We found a few rebellious nodes! Take a look at the ' +
  178. '<a href="javascript:void(null)" id=errorInfoLinkId>' +
  179. 'Error Logs' +
  180. '</a>' +
  181. '?' +
  182. '</p>';
  183. installationStatusDivCssClass = 'statusError';
  184. } else {
  185. installationStatusDivContent =
  186. '<p>' +
  187. 'All done with discovering nodes. ' +
  188. '<a href="javascript:void(null)" id=successInfoLinkId>' +
  189. 'Great!' +
  190. '</a>' +
  191. '</p>';
  192. installationStatusDivCssClass = 'statusOk';
  193. }
  194. if( noNeedForFurtherPolling ) {
  195. /* We've made all the progress we could have, so stop polling. */
  196. discoverProgressDataSource.clearInterval( discoverProgressPollHandle );
  197. globalYui.one('#txnProgressStatusDivId').setStyle('display', 'block');
  198. globalYui.one('#txnProgressStatusDivId').addClass(installationStatusDivCssClass);
  199. var installationStatusDiv = globalYui.one('#txnProgressStatusMessageDivId');
  200. installationStatusDiv.setContent(installationStatusDivContent);
  201. /* If we stopped polling due to error, we need to do more work. */
  202. if( installationStatusDivCssClass == 'statusError' ) {
  203. /* Create the panel that'll display our error info. */
  204. var errorInfoPanel =
  205. createInformationalPanel( '#informationalPanelContainerDivId',
  206. 'Logs for the nodes\' initialization process.' );
  207. globalYui.one("#errorInfoLinkId").on( "click", function(err) {
  208. var bodyContent = "";
  209. for (subTxn in e.response.meta.stateInfo.subTxns) {
  210. var subTxnInfo = e.response.meta.stateInfo.subTxns[subTxn];
  211. var additionalInfoTable = '<table>' +
  212. '<thead><tr><th>Host</th><th>Info</th></tr></thead>';
  213. for (hostName in subTxnInfo.state) {
  214. additionalInfoTable += '<tr><td>' + hostName + '</td><td><pre>' +subTxnInfo.state[hostName] + '</pre></td></tr>'
  215. }
  216. additionalInfoTable += '</table>';
  217. bodyContent += '<div class="logEntry">' +
  218. '<div class="logEntryHeader">' + subTxnInfo.description + '</div>' +
  219. '<div class="logEntryBody">' +
  220. '<ul>' +
  221. '<li>Entry Id : ' + subTxnInfo.subTxnId + '</li>' +
  222. '<li>Final result : ' + subTxnInfo.opStatus + '</li>' +
  223. '<li>Progress at the end : ' + subTxnInfo.progress + '</li>' +
  224. '<li>Additional information : ' + additionalInfoTable + '</li>' +
  225. '</ul>' +
  226. '</div>' +
  227. '</div>';
  228. }
  229. // Set centered explicitly
  230. errorInfoPanel.set('centered', true);
  231. errorInfoPanel.set('bodyContent' , bodyContent);
  232. //errorInfoPanel.set( 'bodyContent', '<pre>' +
  233. // globalYui.JSON.stringify( e.response.meta.stateInfo, null, 4) + '</pre>' );
  234. errorInfoPanel.show();
  235. var linkInfo = '<a href="javascript:void(null)"' +
  236. 'id=errorBackNavLinkId>Back</a>';
  237. if (totalFailure == false) {
  238. linkInfo += ' <a href=' +
  239. '"javascript:void(null)" id=errorFwdNavLinkId>Continue</a>';
  240. }
  241. //REZYYY globalYui.one("#progressErrorInfoNavigateDivId").setContent(linkInfo);
  242. globalYui.one("#txnProgressStatusActionsDivId").setContent(linkInfo);
  243. // now can add the on-click feature for the links
  244. globalYui.one("#errorBackNavLinkId").on( "click", function(e) {
  245. cleanUpTxnProgress();
  246. errorInfoPanel.destroy();
  247. // give cleanup option
  248. // cleanupInstall();
  249. //REZYYY globalYui.one("#progressErrorInfoNavigateDivId").setContent("");
  250. globalYui.one("#txnProgressStatusActionsDivId").setContent("");
  251. globalYui.one('#txnProgressCoreDivId').setStyle('display', 'none');
  252. globalYui.one("#addNodesCoreDivId").setStyle('display', 'block');
  253. });
  254. if (totalFailure == false) {
  255. globalYui.one("#errorFwdNavLinkId").on( "click", function(e) {
  256. cleanUpTxnProgress();
  257. errorInfoPanel.destroy();
  258. //REZYYY globalYui.one("#progressErrorInfoNavigateDivId").setContent("");
  259. globalYui.one("#txnProgressStatusActionsDivId").setContent("");
  260. transitionToNextStage( "#txnProgressCoreDivId", discoverProgressInfo,
  261. "#selectServicesCoreDivId", discoverProgressInfo, renderSelectServicesBlock);
  262. });
  263. }
  264. //REZYYY globalYui.one("#progressErrorInfoNavigateDivId").setStyle( 'display', 'block' );
  265. });
  266. } else {
  267. globalYui.one("#successInfoLinkId").on( "click", function(e) {
  268. cleanUpTxnProgress();
  269. transitionToNextStage( "#txnProgressCoreDivId", discoverProgressInfo,
  270. "#selectServicesCoreDivId", discoverProgressInfo, renderSelectServicesBlock);
  271. });
  272. }
  273. }
  274. discoverProgressMarkup += '</ul>';
  275. // globalYui.log('About to generate markup: ' + discoverProgressMarkup);
  276. globalYui.one('#txnProgressDynamicRenderDivId').setContent( discoverProgressMarkup );
  277. globalYui.one("#txnProgressCoreDivId").setStyle("display", "block");
  278. },
  279. failure: function (e) {
  280. alert('Failed to fetch more progress!');
  281. /* No point making any more attempts. */
  282. discoverProgressDataSource.clearInterval( discoverProgressPollHandle );
  283. }
  284. }
  285. });
  286. }