stack_and_upgrade_controller.js 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290
  1. /**
  2. * Licensed to the Apache Software Foundation (ASF) under one
  3. * or more contributor license agreements. See the NOTICE file
  4. * distributed with this work for additional information
  5. * regarding copyright ownership. The ASF licenses this file
  6. * to you under the Apache License, Version 2.0 (the
  7. * "License"); you may not use this file except in compliance
  8. * with the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. var App = require('app');
  19. var stringUtils = require('utils/string_utils');
  20. App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage, {
  21. name: 'mainAdminStackAndUpgradeController',
  22. /**
  23. * @type {boolean}
  24. */
  25. isLoaded: false,
  26. /**
  27. * @type {object}
  28. * @default null
  29. */
  30. upgradeData: null,
  31. /**
  32. * @type {number}
  33. * @default null
  34. */
  35. upgradeId: null,
  36. /**
  37. * @type {string}
  38. * @default null
  39. */
  40. upgradeVersion: null,
  41. /**
  42. * @type {string}
  43. * @default null
  44. */
  45. upgradeTypeDisplayName: null,
  46. /**
  47. * @type {object}
  48. * @default null
  49. */
  50. failuresTolerance: null,
  51. /**
  52. * @type {boolean}
  53. * @default false
  54. */
  55. isDowngrade: false,
  56. /**
  57. * version that currently applied to server
  58. * should be plain object, because stored to localStorage
  59. * @type {object|null}
  60. */
  61. currentVersion: null,
  62. /**
  63. * versions to which cluster could be upgraded
  64. * @type {Array}
  65. */
  66. targetVersions: [],
  67. /**
  68. * methods through which cluster could be upgraded, "allowed" indicated if the method is allowed
  69. * by stack upgrade path
  70. * @type {Array}
  71. */
  72. upgradeMethods: [
  73. Em.Object.create({
  74. displayName: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.RU.title'),
  75. type: 'ROLLING',
  76. icon: "icon-dashboard",
  77. description: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.RU.description'),
  78. selected: false,
  79. allowed: true
  80. }),
  81. Em.Object.create({
  82. displayName: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.EU.title'),
  83. type: 'NON-ROLLING',
  84. icon: "icon-bolt",
  85. description: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.EU.description'),
  86. selected: false,
  87. allowed: true
  88. })
  89. ],
  90. /**
  91. * @type {boolean} true if some request that should disable actions is in progress
  92. */
  93. requestInProgress: false,
  94. /**
  95. * @type {boolean} true while no updated upgrade info is loaded after retry
  96. */
  97. isRetryPending: false,
  98. /**
  99. * properties that stored to localStorage to resume wizard progress
  100. */
  101. wizardStorageProperties: ['upgradeId', 'upgradeVersion', 'currentVersion', 'upgradeTypeDisplayName', 'failuresTolerance', 'isDowngrade', 'isSuspended'],
  102. /**
  103. * mutable properties of Upgrade Task
  104. * @type {Array}
  105. */
  106. taskDetailsProperties: ['status', 'stdout', 'stderr', 'error_log', 'host_name', 'output_log'],
  107. /**
  108. * Context for Finalize item
  109. * @type {string}
  110. */
  111. finalizeContext: 'Confirm Finalize',
  112. /**
  113. * Check if current item is Finalize
  114. * @type {boolean}
  115. */
  116. isFinalizeItem: false,
  117. isLoadUpgradeDataPending: false,
  118. /**
  119. * path to the mock json
  120. * @type {String}
  121. */
  122. mockRepoUrl: '/data/stack_versions/repo_versions_all.json',
  123. /**
  124. * api to get RepoVersions
  125. * @type {String}
  126. */
  127. realRepoUrl: function () {
  128. return App.get('apiPrefix') + App.get('stackVersionURL') +
  129. '/compatible_repository_versions?fields=*,operating_systems/*,operating_systems/repositories/*';
  130. }.property('App.stackVersionURL'),
  131. /**
  132. * path to the mock json
  133. * @type {String}
  134. */
  135. mockStackUrl: '/data/stack_versions/stack_version_all.json',
  136. /**
  137. * api to get ClusterStackVersions with repository_versions (use to init data load)
  138. * @type {String}
  139. */
  140. realStackUrl: function () {
  141. return App.get('apiPrefix') + '/clusters/' + App.get('clusterName') +
  142. '/stack_versions?fields=*,repository_versions/*,repository_versions/operating_systems/repositories/*';
  143. }.property('App.clusterName'),
  144. /**
  145. * api to get ClusterStackVersions without repository_versions (use to update data)
  146. * @type {String}
  147. */
  148. realUpdateUrl: function () {
  149. return App.get('apiPrefix') + '/clusters/' + App.get('clusterName') + '/stack_versions?fields=ClusterStackVersions/*';
  150. }.property('App.clusterName'),
  151. /**
  152. * Determines if list of services with checks that failed and were skipped by user during the upgrade is loaded
  153. * @type {boolean}
  154. */
  155. areSkippedServiceChecksLoaded: false,
  156. /**
  157. * List of services with checks that failed and were skipped by user during the upgrade
  158. * @type {array}
  159. */
  160. skippedServiceChecks: [],
  161. /**
  162. * status of tasks/items/groups which should be grayed out and disabled
  163. * @type {Array}
  164. */
  165. nonActiveStates: ['PENDING', 'ABORTED'],
  166. /**
  167. * status of Upgrade request
  168. * @type {string}
  169. */
  170. requestStatus: function () {
  171. if (this.get('isSuspended')) {
  172. return 'SUSPENDED';
  173. } else {
  174. return App.get('upgradeState');
  175. }
  176. }.property('isSuspended', 'App.upgradeState'),
  177. init: function () {
  178. this.initDBProperties();
  179. },
  180. /**
  181. * restore data from localStorage
  182. */
  183. initDBProperties: function () {
  184. var props = this.getDBProperties(this.get('wizardStorageProperties'));
  185. Em.keys(props).forEach(function (k) {
  186. if (props[k]) {
  187. this.set(k, props[k]);
  188. }
  189. }, this);
  190. },
  191. /**
  192. * load all data:
  193. * - upgrade data
  194. * - stack versions
  195. * - repo versions
  196. */
  197. load: function () {
  198. var dfd = $.Deferred();
  199. var self = this;
  200. this.loadUpgradeData(true).done(function() {
  201. self.loadStackVersionsToModel(true).done(function () {
  202. self.loadRepoVersionsToModel().done(function() {
  203. var currentVersion = App.StackVersion.find().findProperty('state', 'CURRENT');
  204. if (currentVersion) {
  205. self.set('currentVersion', {
  206. repository_version: currentVersion.get('repositoryVersion.repositoryVersion'),
  207. repository_name: currentVersion.get('repositoryVersion.displayName')
  208. });
  209. }
  210. dfd.resolve();
  211. });
  212. });
  213. });
  214. return dfd.promise();
  215. },
  216. /**
  217. * load upgrade tasks by upgrade id
  218. * @return {$.Deferred}
  219. * @param {boolean} onlyState
  220. */
  221. loadUpgradeData: function (onlyState) {
  222. var upgradeId = this.get('upgradeId'),
  223. deferred = $.Deferred(),
  224. self = this;
  225. if (Em.isNone(upgradeId)) {
  226. deferred.resolve();
  227. console.log('Upgrade in INIT state');
  228. } else {
  229. this.set('isLoadUpgradeDataPending', true);
  230. App.ajax.send({
  231. name: (onlyState) ? 'admin.upgrade.state' : 'admin.upgrade.data',
  232. sender: this,
  233. data: {
  234. id: upgradeId
  235. },
  236. success: 'loadUpgradeDataSuccessCallback'
  237. }).then(deferred.resolve).complete(function () {
  238. self.set('isLoadUpgradeDataPending', false);
  239. });
  240. }
  241. return deferred.promise();
  242. },
  243. /**
  244. * parse and push upgrade tasks to controller
  245. * @param data
  246. */
  247. loadUpgradeDataSuccessCallback: function (data) {
  248. if (Em.isNone(data)) return;
  249. App.set('upgradeState', data.Upgrade.request_status);
  250. this.setDBProperty('upgradeState', data.Upgrade.request_status);
  251. if (data.upgrade_groups) {
  252. this.updateUpgradeData(data);
  253. }
  254. if (this.get('isRetryPending') && data.Upgrade.request_status != 'ABORTED') {
  255. this.setProperties({
  256. requestInProgress: false,
  257. isRetryPending: false
  258. });
  259. }
  260. },
  261. /**
  262. * update data of Upgrade
  263. * @param {object} newData
  264. */
  265. updateUpgradeData: function (newData) {
  266. var oldData = this.get('upgradeData'),
  267. nonActiveStates = this.get('nonActiveStates'),
  268. groupsMap = {},
  269. itemsMap = {};
  270. if (Em.isNone(oldData) || (newData.upgrade_groups.length !== oldData.upgradeGroups.length)) {
  271. this.initUpgradeData(newData);
  272. } else {
  273. //create entities maps
  274. newData.upgrade_groups.forEach(function (newGroup) {
  275. groupsMap[newGroup.UpgradeGroup.group_id] = newGroup.UpgradeGroup;
  276. newGroup.upgrade_items.forEach(function (item) {
  277. itemsMap[item.UpgradeItem.stage_id] = item.UpgradeItem;
  278. })
  279. });
  280. //update existed entities with new data
  281. oldData.upgradeGroups.forEach(function (oldGroup) {
  282. oldGroup.set('status', groupsMap[oldGroup.get('group_id')].status);
  283. oldGroup.set('progress_percent', groupsMap[oldGroup.get('group_id')].progress_percent);
  284. oldGroup.set('completed_task_count', groupsMap[oldGroup.get('group_id')].completed_task_count);
  285. oldGroup.upgradeItems.forEach(function (item) {
  286. item.set('status', itemsMap[item.get('stage_id')].status);
  287. item.set('progress_percent', itemsMap[item.get('stage_id')].progress_percent);
  288. });
  289. var hasExpandableItems = oldGroup.upgradeItems.some(function (item) {
  290. return !nonActiveStates.contains(item.get('status'));
  291. });
  292. oldGroup.set('hasExpandableItems', hasExpandableItems);
  293. });
  294. oldData.set('Upgrade', newData.Upgrade);
  295. }
  296. },
  297. /**
  298. * change structure of Upgrade
  299. * In order to maintain nested views in template object should have direct link to its properties, for example
  300. * item.UpgradeItem.<properties> -> item.<properties>
  301. * @param {object} newData
  302. */
  303. initUpgradeData: function (newData) {
  304. var upgradeGroups = [],
  305. nonActiveStates = this.get('nonActiveStates');
  306. //wrap all entities into App.upgradeEntity
  307. newData.upgrade_groups.forEach(function (newGroup) {
  308. var hasExpandableItems = newGroup.upgrade_items.some(function (item) {
  309. return !nonActiveStates.contains(item.UpgradeItem.status);
  310. }),
  311. oldGroup = App.upgradeEntity.create({type: 'GROUP', hasExpandableItems: hasExpandableItems}, newGroup.UpgradeGroup),
  312. upgradeItems = [];
  313. newGroup.upgrade_items.forEach(function (item) {
  314. var oldItem = App.upgradeEntity.create({type: 'ITEM'}, item.UpgradeItem);
  315. oldItem.set('tasks', []);
  316. upgradeItems.pushObject(oldItem);
  317. });
  318. upgradeItems.reverse();
  319. oldGroup.set('upgradeItems', upgradeItems);
  320. upgradeGroups.pushObject(oldGroup);
  321. });
  322. upgradeGroups.reverse();
  323. this.set('upgradeData', Em.Object.create({
  324. upgradeGroups: upgradeGroups,
  325. Upgrade: newData.Upgrade
  326. }));
  327. },
  328. /**
  329. * request Upgrade Item and its tasks from server
  330. * @return {$.ajax}
  331. */
  332. getUpgradeItem: function (item) {
  333. return App.ajax.send({
  334. name: 'admin.upgrade.upgrade_item',
  335. sender: this,
  336. data: {
  337. upgradeId: item.get('request_id'),
  338. groupId: item.get('group_id'),
  339. stageId: item.get('stage_id')
  340. },
  341. success: 'getUpgradeItemSuccessCallback'
  342. });
  343. },
  344. /**
  345. * success callback of <code>getTasks</code>
  346. * @param {object} data
  347. */
  348. getUpgradeItemSuccessCallback: function (data) {
  349. this.get('upgradeData.upgradeGroups').forEach(function (group) {
  350. if (group.get('group_id') === data.UpgradeItem.group_id) {
  351. group.get('upgradeItems').forEach(function (item) {
  352. if (item.get('stage_id') === data.UpgradeItem.stage_id) {
  353. if (item.get('tasks.length')) {
  354. item.set('isTasksLoaded', true);
  355. data.tasks.forEach(function (task) {
  356. var currentTask = item.get('tasks').findProperty('id', task.Tasks.id);
  357. this.get('taskDetailsProperties').forEach(function (property) {
  358. currentTask.set(property, task.Tasks[property]);
  359. }, this);
  360. }, this);
  361. } else {
  362. var tasks = [];
  363. data.tasks.forEach(function (task) {
  364. tasks.pushObject(App.upgradeEntity.create({type: 'TASK'}, task.Tasks));
  365. });
  366. item.set('tasks', tasks);
  367. }
  368. item.set('isTasksLoaded', true);
  369. }
  370. }, this);
  371. }
  372. }, this);
  373. },
  374. /**
  375. * downgrade confirmation popup
  376. * @param {object} event
  377. */
  378. confirmDowngrade: function (event) {
  379. var self = this;
  380. var currentVersion = this.get('currentVersion');
  381. return App.showConfirmationPopup(
  382. function() {
  383. self.downgrade.call(self, currentVersion, event);
  384. },
  385. Em.I18n.t('admin.stackUpgrade.downgrade.body').format(currentVersion.repository_name),
  386. null,
  387. Em.I18n.t('admin.stackUpgrade.dialog.downgrade.header').format(currentVersion.repository_name),
  388. Em.I18n.t('admin.stackUpgrade.downgrade.proceed')
  389. );
  390. },
  391. /**
  392. * make call to start downgrade process
  393. * @param {object} currentVersion
  394. * @param {object} event
  395. */
  396. downgrade: function (currentVersion, event) {
  397. this.set('requestInProgress', true);
  398. this.abortUpgrade();
  399. App.ajax.send({
  400. name: 'admin.downgrade.start',
  401. sender: this,
  402. data: {
  403. from: App.RepositoryVersion.find().findProperty('displayName', this.get('upgradeVersion')).get('repositoryVersion'),
  404. value: currentVersion.repository_version,
  405. label: currentVersion.repository_name,
  406. isDowngrade: true
  407. },
  408. success: 'upgradeSuccessCallback',
  409. callback: function() {
  410. this.sender.set('requestInProgress', false);
  411. }
  412. });
  413. },
  414. /**
  415. * abort upgrade (in order to start Downgrade)
  416. */
  417. abortUpgrade: function () {
  418. return App.ajax.send({
  419. name: 'admin.upgrade.abort',
  420. sender: this,
  421. data: {
  422. upgradeId: this.get('upgradeId')
  423. }
  424. });
  425. },
  426. retryUpgrade: function () {
  427. this.setProperties({
  428. requestInProgress: true,
  429. isRetryPending: true
  430. });
  431. return App.ajax.send({
  432. name: 'admin.upgrade.retry',
  433. sender: this,
  434. data: {
  435. upgradeId: this.get('upgradeId')
  436. }
  437. });
  438. },
  439. /**
  440. * make call to start upgrade process and show popup with current progress
  441. * @param {object} version
  442. */
  443. upgrade: function (version) {
  444. this.set('requestInProgress', true);
  445. App.ajax.send({
  446. name: 'admin.upgrade.start',
  447. sender: this,
  448. data: version,
  449. success: 'upgradeSuccessCallback',
  450. callback: function() {
  451. this.sender.set('requestInProgress', false);
  452. }
  453. });
  454. this.setDBProperty('currentVersion', this.get('currentVersion'));
  455. },
  456. /**
  457. * success callback of <code>upgrade()</code>
  458. * @param {object} data
  459. */
  460. upgradeSuccessCallback: function (data, opt, params) {
  461. this.set('upgradeData', null);
  462. this.set('upgradeId', data.resources[0].Upgrade.request_id);
  463. this.set('upgradeVersion', params.label);
  464. this.set('isDowngrade', !!params.isDowngrade);
  465. var upgradeMethod = this.get('upgradeMethods').findProperty('type', params.type);
  466. var upgradeTypeDisplayName = upgradeMethod ? upgradeMethod.get('displayName') : null;
  467. this.set('upgradeTypeDisplayName', upgradeTypeDisplayName);
  468. this.set('failuresTolerance', Em.Object.create({
  469. skipComponentFailures: params.skipComponentFailures,
  470. skipSCFailures: params.skipSCFailures
  471. }));
  472. this.setDBProperties({
  473. upgradeVersion: params.label,
  474. upgradeId: data.resources[0].Upgrade.request_id,
  475. upgradeState: 'PENDING',
  476. isDowngrade: !!params.isDowngrade,
  477. upgradeTypeDisplayName: upgradeTypeDisplayName,
  478. failuresTolerance: Em.Object.create({
  479. skipComponentFailures: params.skipComponentFailures,
  480. skipSCFailures: params.skipSCFailures
  481. })
  482. });
  483. App.set('upgradeState', 'PENDING');
  484. App.clusterStatus.setClusterStatus({
  485. wizardControllerName: this.get('name'),
  486. localdb: App.db.data
  487. });
  488. this.load();
  489. this.openUpgradeDialog();
  490. },
  491. /**
  492. * success callback of updating upgrade options including failures tolerance. etc
  493. * @param {object} data
  494. */
  495. updateOptionsSuccessCallback: function (data, opt, params) {
  496. this.set('failuresTolerance', Em.Object.create({
  497. skipComponentFailures: params.skipComponentFailures,
  498. skipSCFailures: params.skipSCFailures
  499. }));
  500. },
  501. /**
  502. * Open upgrade options window: upgrade type and failures tolerance
  503. * @param {boolean} isInUpgradeWizard
  504. * @param {object} version
  505. * @return App.ModalPopup
  506. */
  507. upgradeOptions: function(isInUpgradeWizard, version) {
  508. var self = this;
  509. return App.ModalPopup.show({
  510. encodeBody: false,
  511. primary: isInUpgradeWizard? Em.I18n.t('ok') : Em.I18n.t('common.proceed'),
  512. primaryClass: 'btn-success',
  513. classNames: ['upgrade-options-popup'],
  514. header: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.header'),
  515. bodyClass: Em.View.extend({
  516. templateName: require('templates/main/admin/stack_upgrade/upgrade_options'),
  517. didInsertElement: function() {
  518. //add pre-upgrade check results to each method object and set selected method
  519. var view = this;
  520. self.get('upgradeMethods').forEach(function(method){
  521. if (!isInUpgradeWizard && method.get('allowed')) {
  522. self.runPreUpgradeCheckOnly.call(self, {
  523. value: version.get('repositoryVersion'),
  524. label: version.get('displayName'),
  525. type: method.get('type')
  526. });
  527. }
  528. if (method.get('selected')) {
  529. view.set('parentView.selectedMethod', method);
  530. }
  531. });
  532. App.tooltip($(".not-allowed.thumbnail"), {
  533. placement: "bottom",
  534. title: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.notAllowed')
  535. });
  536. },
  537. parentView: this.get('parentView'),
  538. isInUpgradeWizard: isInUpgradeWizard,
  539. versionText: isInUpgradeWizard? '' : Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.bodyMsg.version').format(version.get('displayName')),
  540. upgradeMethods: function () {
  541. if (isInUpgradeWizard) {
  542. self.get('upgradeMethods').forEach(function(method){
  543. if (method.get('displayName') == self.get('upgradeTypeDisplayName')) {
  544. method.set('selected', true);
  545. } else {
  546. method.set('selected', false);
  547. }
  548. });
  549. } else {
  550. var ruMethod = self.get('upgradeMethods').findProperty('type', 'ROLLING');
  551. var ssuMethod = self.get('upgradeMethods').findProperty('type', 'NON-ROLLING');
  552. ruMethod.set('selected', ruMethod.get('allowed'));
  553. ssuMethod.set('selected', !ruMethod.get('allowed') && ssuMethod.get('allowed'));
  554. }
  555. return self.get('upgradeMethods');
  556. }.property('self.upgradeMethods', 'upgradeTypeDisplayName'),
  557. selectMethod: function(event) {
  558. if (isInUpgradeWizard || !event.context.get('allowed')) return;
  559. var selectedMethod = event.context;
  560. this.get('upgradeMethods').forEach(function(method){
  561. method.set('selected', false);
  562. });
  563. selectedMethod.set('selected', true);
  564. this.set('parentView.selectedMethod', selectedMethod);
  565. },
  566. openMessage: function(event) {
  567. if (isInUpgradeWizard || !event.context.get('allowed')) return;
  568. var data = event.context.get('precheckResultsData');
  569. var header = Em.I18n.t('popup.clusterCheck.Upgrade.header').format(version.get('displayName')),
  570. failTitle = Em.I18n.t('popup.clusterCheck.Upgrade.fail.title'),
  571. failAlert = new Em.Handlebars.SafeString(Em.I18n.t('popup.clusterCheck.Upgrade.fail.alert')),
  572. warningTitle = Em.I18n.t('popup.clusterCheck.Upgrade.warning.title'),
  573. warningAlert = new Em.Handlebars.SafeString(Em.I18n.t('popup.clusterCheck.Upgrade.warning.alert')),
  574. configsMergeWarning = data.items.findProperty('UpgradeChecks.id', "CONFIG_MERGE"),
  575. configs = [];
  576. if (configsMergeWarning && Em.get(configsMergeWarning, 'UpgradeChecks.status') === 'WARNING') {
  577. data.items = data.items.rejectProperty('UpgradeChecks.id', 'CONFIG_MERGE');
  578. var configsMergeCheckData = Em.get(configsMergeWarning, 'UpgradeChecks.failed_detail');
  579. if (configsMergeCheckData) {
  580. configs = configsMergeCheckData.map(function (item) {
  581. var isDeprecated = Em.isNone(item.new_stack_value),
  582. willBeRemoved = Em.isNone(item.result_value);
  583. return {
  584. type: item.type,
  585. name: item.property,
  586. currentValue: item.current,
  587. recommendedValue: isDeprecated ? Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.deprecated') : item.new_stack_value,
  588. isDeprecated: isDeprecated,
  589. resultingValue: willBeRemoved ? Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.willBeRemoved') : item.result_value,
  590. willBeRemoved: willBeRemoved
  591. };
  592. });
  593. }
  594. }
  595. App.showPreUpgradeCheckPopup(data, header, failTitle, failAlert, warningTitle, warningAlert, function () {
  596. self.runPreUpgradeCheckOnly.call(self, {
  597. value: version.get('repositoryVersion'),
  598. label: version.get('displayName'),
  599. type: event.context.get('type')
  600. });
  601. }, configs, version.get('displayName'));
  602. }
  603. }),
  604. selectedMethod: '',
  605. skipComponentFailures: self.get('failuresTolerance.skipComponentFailures'),
  606. skipSCFailures: self.get('failuresTolerance.skipSCFailures'),
  607. disablePrimary: function() {
  608. if (isInUpgradeWizard) return false;
  609. var selectedMethod = self.get('upgradeMethods').findProperty('selected', true);
  610. return selectedMethod ? selectedMethod.get('precheckResultsMessageClass') == 'RED' : true;
  611. }.property('selectedMethod', 'selectedMethod.precheckResultsMessageClass'),
  612. onPrimary: function () {
  613. this.hide();
  614. if (isInUpgradeWizard) {
  615. return App.ajax.send({
  616. name: 'admin.upgrade.update.options',
  617. sender: self,
  618. data: {
  619. upgradeId: self.get('upgradeId'),
  620. skipComponentFailures: this.get('skipComponentFailures') || false,
  621. skipSCFailures: this.get('skipSCFailures') || false
  622. },
  623. success: 'updateOptionsSuccessCallback'
  624. });
  625. } else {
  626. version.upgradeType = self.get('upgradeMethods').findProperty('selected', true).get('type');
  627. version.upgradeTypeDisplayName = self.get('upgradeMethods').findProperty('selected', true).get('displayName');
  628. version.skipComponentFailures = this.get('skipComponentFailures');
  629. version.skipSCFailures = this.get('skipSCFailures');
  630. self.runPreUpgradeCheck.call(self, version);
  631. }
  632. },
  633. onSecondary: function () {
  634. this.hide();
  635. },
  636. onClose: function () {
  637. this.hide();
  638. }
  639. });
  640. },
  641. /**
  642. * open upgrade options from upgrade wizard
  643. * @return App.ModalPopup
  644. */
  645. openUpgradeOptions: function () {
  646. this.upgradeOptions(true, null);
  647. },
  648. /**
  649. * upgrade confirmation popup including upgrade options: upgrade type and failures tolerance
  650. * @param {object} version
  651. * @return App.ModalPopup
  652. */
  653. confirmUpgrade: function (version) {
  654. this.upgradeOptions(false, version);
  655. },
  656. /**
  657. * send request for pre upgrade check only
  658. */
  659. runPreUpgradeCheckOnly: function(data) {
  660. if (App.get('supports.preUpgradeCheck')) {
  661. App.ajax.send({
  662. name: "admin.upgrade.pre_upgrade_check",
  663. sender: this,
  664. data: data,
  665. success: "runPreUpgradeCheckOnlySuccess",
  666. error: "runPreUpgradeCheckError"
  667. });
  668. }
  669. },
  670. /**
  671. * success callback of <code>runPreUpgradeCheckOnly()</code>
  672. * Show a message how many fails/warnings/passed
  673. * on clicking that message a popup window show up
  674. * @param data {object}
  675. * @param opt {object}
  676. * @param params {object}
  677. */
  678. runPreUpgradeCheckOnlySuccess: function (data, opt, params) {
  679. var self = this;
  680. var message = '';
  681. var messageClass = 'GREEN';
  682. var messageIconClass = 'icon-ok';
  683. if (data.items.someProperty('UpgradeChecks.status', 'WARNING')) {
  684. message = message + data.items.filterProperty('UpgradeChecks.status', 'WARNING').length + ' Warning ';
  685. messageClass = 'ORANGE';
  686. messageIconClass = 'icon-warning-sign';
  687. }
  688. if (data.items.someProperty('UpgradeChecks.status', 'FAIL')) {
  689. message = data.items.filterProperty('UpgradeChecks.status', 'FAIL').length + ' Required ' + message;
  690. messageClass = 'RED';
  691. messageIconClass = 'icon-remove';
  692. }
  693. if (!message) {
  694. message = Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.allPassed');
  695. }
  696. var method = self.get('upgradeMethods').findProperty('type', params.type);
  697. method.set('precheckResultsMessage', message);
  698. method.set('precheckResultsMessageClass', messageClass);
  699. method.set('precheckResultsMessageIconClass', messageIconClass);
  700. method.set('precheckResultsData', data);
  701. },
  702. /**
  703. * send request for pre upgrade check
  704. * @param version
  705. */
  706. runPreUpgradeCheck: function(version) {
  707. var params = {
  708. value: version.get('repositoryVersion'),
  709. label: version.get('displayName'),
  710. type: version.get('upgradeType'),
  711. skipComponentFailures: version.get('skipComponentFailures'),
  712. skipSCFailures: version.get('skipSCFailures')
  713. };
  714. if (App.get('supports.preUpgradeCheck')) {
  715. this.set('requestInProgress', true);
  716. App.ajax.send({
  717. name: "admin.upgrade.pre_upgrade_check",
  718. sender: this,
  719. data: params,
  720. success: "runPreUpgradeCheckSuccess",
  721. error: "runPreUpgradeCheckError"
  722. });
  723. } else {
  724. this.upgrade(params);
  725. }
  726. },
  727. /**
  728. * success callback of <code>runPreUpgradeCheckSuccess()</code>
  729. * if there are some fails - it shows popup else run upgrade
  730. * @param data {object}
  731. * @param opt {object}
  732. * @param params {object}
  733. * @returns {App.ModalPopup|undefined}
  734. */
  735. runPreUpgradeCheckSuccess: function (data, opt, params) {
  736. var self = this;
  737. if (data.items.someProperty('UpgradeChecks.status', 'FAIL') || data.items.someProperty('UpgradeChecks.status', 'WARNING')) {
  738. this.set('requestInProgress', false);
  739. var header = Em.I18n.t('popup.clusterCheck.Upgrade.header').format(params.label),
  740. failTitle = Em.I18n.t('popup.clusterCheck.Upgrade.fail.title'),
  741. failAlert = new Em.Handlebars.SafeString(Em.I18n.t('popup.clusterCheck.Upgrade.fail.alert')),
  742. warningTitle = Em.I18n.t('popup.clusterCheck.Upgrade.warning.title'),
  743. warningAlert = new Em.Handlebars.SafeString(Em.I18n.t('popup.clusterCheck.Upgrade.warning.alert')),
  744. configsMergeWarning = data.items.findProperty('UpgradeChecks.id', "CONFIG_MERGE"),
  745. configs = [];
  746. if (configsMergeWarning && Em.get(configsMergeWarning, 'UpgradeChecks.status') === 'WARNING') {
  747. data.items = data.items.rejectProperty('UpgradeChecks.id', 'CONFIG_MERGE');
  748. var configsMergeCheckData = Em.get(configsMergeWarning, 'UpgradeChecks.failed_detail');
  749. if (configsMergeCheckData) {
  750. configs = configsMergeCheckData.map(function (item) {
  751. var isDeprecated = Em.isNone(item.new_stack_value),
  752. willBeRemoved = Em.isNone(item.result_value);
  753. return {
  754. type: item.type,
  755. name: item.property,
  756. currentValue: item.current,
  757. recommendedValue: isDeprecated ? Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.deprecated') : item.new_stack_value,
  758. isDeprecated: isDeprecated,
  759. resultingValue: willBeRemoved ? Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.willBeRemoved') : item.result_value,
  760. willBeRemoved: willBeRemoved
  761. };
  762. });
  763. }
  764. }
  765. App.showClusterCheckPopup(data, header, failTitle, failAlert, warningTitle, warningAlert, function () {
  766. self.upgrade(params);
  767. }, configs, params.label);
  768. } else {
  769. this.upgrade(params);
  770. }
  771. },
  772. runPreUpgradeCheckError: function() {
  773. this.set('requestInProgress', false);
  774. },
  775. confirmRetryUpgrade: function (version) {
  776. var self = this;
  777. return App.showConfirmationPopup(
  778. function () {
  779. self.retryUpgrade();
  780. },
  781. Em.I18n.t('admin.stackUpgrade.upgrade.retry.confirm.body').format(version.get('displayName')),
  782. null,
  783. Em.I18n.t('admin.stackUpgrade.dialog.header').format(version.get('upgradeTypeDislayName'), version.get('displayName'))
  784. );
  785. },
  786. confirmRetryDowngrade: function () {
  787. var self = this,
  788. currentVersion = this.get('currentVersion');
  789. return App.showConfirmationPopup(
  790. function() {
  791. self.retryUpgrade();
  792. },
  793. Em.I18n.t('admin.stackUpgrade.downgrade.retry.body').format(currentVersion.repository_name),
  794. null,
  795. Em.I18n.t('admin.stackUpgrade.dialog.downgrade.header').format(currentVersion.repository_name),
  796. Em.I18n.t('admin.stackUpgrade.downgrade.proceed')
  797. );
  798. },
  799. /**
  800. * confirmation popup before install repository version
  801. */
  802. installRepoVersionConfirmation: function (repo) {
  803. var self = this;
  804. return App.showConfirmationPopup(function () {
  805. self.installRepoVersion(repo);
  806. },
  807. Em.I18n.t('admin.stackVersions.version.install.confirm').format(repo.get('displayName'))
  808. );
  809. },
  810. /**
  811. * sends request to install repoVersion to the cluster
  812. * and create clusterStackVersion resourse
  813. * @param {Em.Object} repo
  814. * @return {$.ajax}
  815. * @method installRepoVersion
  816. */
  817. installRepoVersion: function (repo) {
  818. this.set('requestInProgress', true);
  819. var data = {
  820. ClusterStackVersions: {
  821. stack: repo.get('stackVersionType'),
  822. version: repo.get('stackVersionNumber'),
  823. repository_version: repo.get('repositoryVersion')
  824. },
  825. id: repo.get('id')
  826. };
  827. return App.ajax.send({
  828. name: 'admin.stack_version.install.repo_version',
  829. sender: this,
  830. data: data,
  831. success: 'installRepoVersionSuccess',
  832. callback: function() {
  833. this.sender.set('requestInProgress', false);
  834. }
  835. });
  836. },
  837. /**
  838. * transform repo data into json for
  839. * saving changes to repository version
  840. * @param {Em.Object} repo
  841. * @returns {{operating_systems: Array}}
  842. */
  843. prepareRepoForSaving: function(repo) {
  844. var repoVersion = { "operating_systems": [] };
  845. repo.get('operatingSystems').forEach(function (os, k) {
  846. repoVersion.operating_systems.push({
  847. "OperatingSystems": {
  848. "os_type": os.get("osType")
  849. },
  850. "repositories": []
  851. });
  852. os.get('repositories').forEach(function (repository) {
  853. repoVersion.operating_systems[k].repositories.push({
  854. "Repositories": {
  855. "base_url": repository.get('baseUrl'),
  856. "repo_id": repository.get('repoId'),
  857. "repo_name": repository.get('repoName')
  858. }
  859. });
  860. });
  861. });
  862. return repoVersion;
  863. },
  864. /**
  865. * Return stack version for the repo object
  866. * @param {Em.Object} repo
  867. * */
  868. getStackVersionNumber: function(repo){
  869. var stackVersionNumber = repo.get('stackVersion');
  870. if(null == stackVersionNumber)
  871. stackVersionNumber = App.get('currentStackVersion');
  872. return stackVersionNumber;
  873. },
  874. /**
  875. * perform validation if <code>skip<code> is false and run save if
  876. * validation successfull or run save without validation is <code>skip<code> is true
  877. * @param {Em.Object} repo
  878. * @param {boolean} skip
  879. * @returns {$.Deferred}
  880. */
  881. saveRepoOS: function (repo, skip) {
  882. var self = this;
  883. var deferred = $.Deferred();
  884. this.validateRepoVersions(repo, skip).done(function(data) {
  885. if (data.length > 0) {
  886. deferred.resolve(data);
  887. } else {
  888. var repoVersion = self.prepareRepoForSaving(repo);
  889. var stackVersionNumber = self.getStackVersionNumber(repo);
  890. console.log("Repository stack version:"+stackVersionNumber);
  891. App.ajax.send({
  892. name: 'admin.stack_versions.edit.repo',
  893. sender: this,
  894. data: {
  895. stackName: App.get('currentStackName'),
  896. stackVersion: stackVersionNumber,
  897. repoVersionId: repo.get('repoVersionId'),
  898. repoVersion: repoVersion
  899. }
  900. }).success(function() {
  901. deferred.resolve([]);
  902. });
  903. }
  904. });
  905. return deferred.promise();
  906. },
  907. /**
  908. * send request for validation for each repository
  909. * @param {Em.Object} repo
  910. * @param {boolean} skip
  911. * @returns {*}
  912. */
  913. validateRepoVersions: function(repo, skip) {
  914. var deferred = $.Deferred(),
  915. totalCalls = 0,
  916. invalidUrls = [];
  917. if (skip) {
  918. deferred.resolve(invalidUrls);
  919. } else {
  920. var stackVersionNumber = this.getStackVersionNumber(repo);
  921. repo.get('operatingSystems').forEach(function (os) {
  922. if (os.get('isSelected')) {
  923. os.get('repositories').forEach(function (repo) {
  924. totalCalls++;
  925. App.ajax.send({
  926. name: 'admin.stack_versions.validate.repo',
  927. sender: this,
  928. data: {
  929. repo: repo,
  930. repoId: repo.get('repoId'),
  931. baseUrl: repo.get('baseUrl'),
  932. osType: os.get('osType'),
  933. stackName: App.get('currentStackName'),
  934. stackVersion: stackVersionNumber
  935. }
  936. })
  937. .success(function () {
  938. totalCalls--;
  939. if (totalCalls === 0) deferred.resolve(invalidUrls);
  940. })
  941. .error(function () {
  942. repo.set('hasError', true);
  943. invalidUrls.push(repo);
  944. totalCalls--;
  945. if (totalCalls === 0) deferred.resolve(invalidUrls);
  946. });
  947. });
  948. } else {
  949. return deferred.resolve(invalidUrls);
  950. }
  951. });
  952. }
  953. return deferred.promise();
  954. },
  955. /**
  956. * success callback for <code>installRepoVersion()<code>
  957. * saves request id to the db
  958. * @param data
  959. * @param opt
  960. * @param params
  961. * @method installStackVersionSuccess
  962. */
  963. installRepoVersionSuccess: function (data, opt, params) {
  964. var version = App.RepositoryVersion.find(params.id);
  965. App.db.set('repoVersionInstall', 'id', [data.Requests.id]);
  966. App.clusterStatus.setClusterStatus({
  967. wizardControllerName: this.get('name'),
  968. localdb: App.db.data
  969. });
  970. version.set('defaultStatus', 'INSTALLING');
  971. if (version.get('stackVersion')) {
  972. version.set('stackVersion.state', 'INSTALLING');
  973. }
  974. },
  975. /**
  976. * opens a popup with installations state per host
  977. * @param {Em.Object} version
  978. * @method showProgressPopup
  979. */
  980. showProgressPopup: function(version) {
  981. var popupTitle = Em.I18n.t('admin.stackVersions.details.install.hosts.popup.title').format(version.get('displayName'));
  982. var requestIds = App.get('testMode') ? [1] : App.db.get('repoVersionInstall', 'id');
  983. var hostProgressPopupController = App.router.get('highAvailabilityProgressPopupController');
  984. hostProgressPopupController.initPopup(popupTitle, requestIds, this);
  985. },
  986. /**
  987. * reset upgradeState to INIT when upgrade is COMPLETED
  988. * and clean auxiliary data
  989. */
  990. finish: function () {
  991. if (App.get('upgradeState') === 'COMPLETED') {
  992. this.setDBProperties({
  993. upgradeId: undefined,
  994. upgradeState: 'INIT',
  995. upgradeVersion: undefined,
  996. currentVersion: undefined,
  997. upgradeTypeDisplayName: undefined,
  998. failuresTolerance: undefined,
  999. isDowngrade: undefined
  1000. });
  1001. App.clusterStatus.setClusterStatus({
  1002. localdb: App.db.data
  1003. });
  1004. App.set('upgradeState', 'INIT');
  1005. }
  1006. }.observes('App.upgradeState'),
  1007. /**
  1008. * Check <code>App.upgradeState</code> for HOLDING
  1009. * If it is, send request to check if current item is Finalize
  1010. * @method updateFinalize
  1011. */
  1012. updateFinalize: function () {
  1013. var upgradeState = App.get('upgradeState');
  1014. if (upgradeState === 'HOLDING') {
  1015. return App.ajax.send({
  1016. name: 'admin.upgrade.finalizeContext',
  1017. sender: this,
  1018. success: 'updateFinalizeSuccessCallback',
  1019. error: 'updateFinalizeErrorCallback'
  1020. })
  1021. }
  1022. else {
  1023. this.set('isFinalizeItem', false);
  1024. }
  1025. }.observes('App.upgradeState'),
  1026. /**
  1027. *
  1028. * @param {object|null} data
  1029. * @method updateFinalizeSuccessCallback
  1030. */
  1031. updateFinalizeSuccessCallback: function (data) {
  1032. var context = data ? Em.get(data, 'items.firstObject.upgrade_groups.firstObject.upgrade_items.firstObject.UpgradeItem.context') : '';
  1033. this.set('isFinalizeItem', context === this.get('finalizeContext'));
  1034. },
  1035. updateFinalizeErrorCallback: function() {
  1036. this.set('isFinalizeItem', false);
  1037. },
  1038. /**
  1039. * show dialog with tasks of upgrade
  1040. * @return {App.ModalPopup}
  1041. */
  1042. openUpgradeDialog: function () {
  1043. App.router.transitionTo('admin.stackUpgrade');
  1044. },
  1045. /**
  1046. * returns url to get data for repoVersion or clusterStackVersion
  1047. * @param {Boolean} stack true if load clusterStackVersion
  1048. * @param {Boolean} fullLoad true if load all data
  1049. * @returns {String}
  1050. * @method getUrl
  1051. */
  1052. getUrl: function(stack, fullLoad) {
  1053. if (App.get('testMode')) {
  1054. return stack ? this.get('mockStackUrl') : this.get('mockRepoUrl')
  1055. } else {
  1056. if (fullLoad) {
  1057. return stack ? this.get('realStackUrl') : this.get('realRepoUrl');
  1058. } else {
  1059. return this.get('realUpdateUrl');
  1060. }
  1061. }
  1062. },
  1063. /**
  1064. * get stack versions from server and push it to model
  1065. * @return {*}
  1066. * @method loadStackVersionsToModel
  1067. */
  1068. loadStackVersionsToModel: function (fullLoad) {
  1069. var dfd = $.Deferred();
  1070. App.HttpClient.get(this.getUrl(true, fullLoad), App.stackVersionMapper, {
  1071. complete: function () {
  1072. dfd.resolve();
  1073. }
  1074. });
  1075. return dfd.promise();
  1076. },
  1077. /**
  1078. * get repo versions from server and push it to model
  1079. * @return {*}
  1080. * @params {Boolean} isUpdate - if true loads part of data that need to be updated
  1081. * @method loadRepoVersionsToModel()
  1082. */
  1083. loadRepoVersionsToModel: function () {
  1084. var dfd = $.Deferred();
  1085. App.HttpClient.get(this.getUrl(false, true), App.repoVersionMapper, {
  1086. complete: function () {
  1087. dfd.resolve();
  1088. }
  1089. });
  1090. return dfd.promise();
  1091. },
  1092. /**
  1093. * set status to Upgrade item
  1094. * @param item
  1095. * @param status
  1096. */
  1097. setUpgradeItemStatus: function(item, status) {
  1098. this.set('requestInProgress', true);
  1099. return App.ajax.send({
  1100. name: 'admin.upgrade.upgradeItem.setState',
  1101. sender: this,
  1102. data: {
  1103. upgradeId: item.get('request_id'),
  1104. itemId: item.get('stage_id'),
  1105. groupId: item.get('group_id'),
  1106. status: status
  1107. },
  1108. callback: function() {
  1109. this.sender.set('requestInProgress', false);
  1110. }
  1111. }).done(function () {
  1112. item.set('status', status);
  1113. });
  1114. },
  1115. currentVersionObserver: function () {
  1116. var versionNumber = this.get('currentVersion.repository_version');
  1117. var currentVersionObject = App.RepositoryVersion.find().findProperty('status', 'CURRENT');
  1118. var versionName = currentVersionObject && currentVersionObject.get('stackVersionType');
  1119. App.set('isStormMetricsSupported', versionName != 'HDP' || stringUtils.compareVersions(versionNumber, '2.2.2') > -1 || !versionNumber);
  1120. }.observes('currentVersion.repository_version'),
  1121. /**
  1122. * get the installed repositories of HDP from server
  1123. */
  1124. loadRepositories: function () {
  1125. if (App.router.get('clusterController.isLoaded')) {
  1126. var nameVersionCombo = App.get('currentStackVersion');
  1127. var stackName = nameVersionCombo.split('-')[0];
  1128. var stackVersion = nameVersionCombo.split('-')[1];
  1129. App.ajax.send({
  1130. name: 'cluster.load_repositories',
  1131. sender: this,
  1132. data: {
  1133. stackName: stackName,
  1134. stackVersion: stackVersion
  1135. },
  1136. success: 'loadRepositoriesSuccessCallback',
  1137. error: 'loadRepositoriesErrorCallback'
  1138. });
  1139. }
  1140. }.observes('App.router.clusterController.isLoaded'),
  1141. loadRepositoriesSuccessCallback: function (data) {
  1142. var allRepos = [];
  1143. data.items.forEach(function (os) {
  1144. os.repositories.forEach(function (repository) {
  1145. var osType = repository.Repositories.os_type;
  1146. var repo = Em.Object.create({
  1147. baseUrl: repository.Repositories.base_url,
  1148. osType: osType,
  1149. repoId: repository.Repositories.repo_id,
  1150. repoName : repository.Repositories.repo_name,
  1151. stackName : repository.Repositories.stack_name,
  1152. stackVersion : repository.Repositories.stack_version,
  1153. isFirst: false
  1154. });
  1155. var group = allRepos.findProperty('name', osType);
  1156. if (!group) {
  1157. group = {
  1158. name: osType,
  1159. repositories: []
  1160. };
  1161. repo.set('isFirst', true);
  1162. allRepos.push(group);
  1163. }
  1164. group.repositories.push(repo);
  1165. });
  1166. }, this);
  1167. allRepos.stackVersion = App.get('currentStackVersionNumber');
  1168. this.set('allRepos', allRepos);
  1169. },
  1170. loadRepositoriesErrorCallback: function (request, ajaxOptions, error) {
  1171. console.log('Error message is: ' + request.responseText);
  1172. },
  1173. /**
  1174. * @returns {$.ajax}
  1175. */
  1176. suspendUpgrade: function () {
  1177. var self = this;
  1178. return this.abortUpgrade().done(function () {
  1179. App.set('upgradeState', 'ABORTED');
  1180. self.set('isSuspended', true);
  1181. self.setDBProperty('upgradeState', 'ABORTED');
  1182. self.setDBProperty('isSuspended', true);
  1183. App.clusterStatus.setClusterStatus({
  1184. wizardControllerName: self.get('name'),
  1185. localdb: App.db.data
  1186. });
  1187. });
  1188. },
  1189. /**
  1190. * @returns {$.ajax}
  1191. */
  1192. resumeUpgrade: function() {
  1193. var self = this;
  1194. this.retryUpgrade().done(function () {
  1195. App.set('upgradeState', 'PENDING');
  1196. App.propertyDidChange('upgradeAborted');
  1197. self.set('isSuspended', false);
  1198. self.setDBProperty('upgradeState', 'PENDING');
  1199. self.setDBProperty('isSuspended', false);
  1200. App.clusterStatus.setClusterStatus({
  1201. wizardControllerName: self.get('name'),
  1202. localdb: App.db.data
  1203. });
  1204. });
  1205. }
  1206. });