stack_and_upgrade_controller.js 64 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965
  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. upgradeType: null,
  46. /**
  47. * @type {Em.Object}
  48. */
  49. upgradeTypeConfig: Em.computed.findByKey('upgradeMethods', 'type', 'upgradeType'),
  50. /**
  51. * @type {boolean}
  52. */
  53. cantBeStarted: Em.computed.alias('upgradeTypeConfig.cantBeStarted'),
  54. /**
  55. * @type {boolean}
  56. * @default true
  57. */
  58. downgradeAllowed: true,
  59. /**
  60. * @type {string}
  61. * @default null
  62. */
  63. upgradeTypeDisplayName: null,
  64. /**
  65. * @type {object}
  66. * @default null
  67. */
  68. failuresTolerance: null,
  69. /**
  70. * @type {boolean}
  71. * @default false
  72. */
  73. isDowngrade: false,
  74. /**
  75. * flag which indicate that upgrade suspended
  76. * @type {boolean}
  77. * @default false
  78. */
  79. isSuspended: false,
  80. /**
  81. * version that currently applied to server
  82. * should be plain object, because stored to localStorage
  83. * @type {object|null}
  84. */
  85. currentVersion: null,
  86. /**
  87. * versions to which cluster could be upgraded
  88. * @type {Array}
  89. */
  90. targetVersions: [],
  91. /**
  92. * @type {object}
  93. * @default null
  94. */
  95. slaveComponentStructuredInfo: null,
  96. /**
  97. * @type {Array}
  98. */
  99. serviceCheckFailuresServicenames: [],
  100. /**
  101. * Restricted type of upgrade, can't be viewed in wizard.
  102. * It's status visible only in upgrade status label
  103. * @type {boolean}
  104. * @default false
  105. */
  106. isWizardRestricted: false,
  107. /**
  108. * methods through which cluster could be upgraded, "allowed" indicated if the method is allowed
  109. * by stack upgrade path
  110. * @type {Array}
  111. */
  112. upgradeMethods: [
  113. Em.Object.create({
  114. displayName: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.RU.title'),
  115. type: 'ROLLING',
  116. icon: "icon-dashboard",
  117. description: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.RU.description'),
  118. selected: false,
  119. allowed: true,
  120. isCheckComplete: false,
  121. isCheckRequestInProgress: false,
  122. precheckResultsMessage: '',
  123. precheckResultsTitle: '',
  124. action: '',
  125. isWizardRestricted: false
  126. }),
  127. Em.Object.create({
  128. displayName: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.EU.title'),
  129. type: 'NON_ROLLING',
  130. icon: "icon-bolt",
  131. description: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.EU.description'),
  132. selected: false,
  133. allowed: true,
  134. isCheckComplete: false,
  135. isCheckRequestInProgress: false,
  136. precheckResultsMessage: '',
  137. precheckResultsTitle: '',
  138. action: '',
  139. isWizardRestricted: false
  140. }),
  141. Em.Object.create({
  142. displayName: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.HOU.title'),
  143. type: 'HOST_ORDERED',
  144. icon: "glyphicon glyphicon-bolt",
  145. description: '',
  146. selected: false,
  147. allowed: false,
  148. isCheckComplete: false,
  149. isCheckRequestInProgress: false,
  150. precheckResultsMessage: '',
  151. precheckResultsTitle: '',
  152. action: '',
  153. isWizardRestricted: !App.supports.enabledWizardForHostOrderedUpgrade,
  154. cantBeStarted: true
  155. })
  156. ],
  157. /**
  158. * pre-check messages map
  159. * @type {object}
  160. */
  161. preCheckMessages: {
  162. 'WARNING': {
  163. template: 'admin.stackUpgrade.preCheck.warning.message',
  164. precheckResultsMessageClass: 'ORANGE',
  165. isPrecheckFailed: false,
  166. precheckResultsMessageIconClass: 'icon-warning-sign'
  167. },
  168. 'BYPASS': {
  169. template: 'admin.stackUpgrade.preCheck.bypass.message',
  170. precheckResultsMessageClass: 'RED',
  171. isPrecheckFailed: false,
  172. precheckResultsMessageIconClass: 'icon-remove',
  173. bypassedFailures: true
  174. },
  175. 'FAIL': {
  176. template: 'admin.stackUpgrade.preCheck.fail.message',
  177. precheckResultsMessageClass: 'RED',
  178. isPrecheckFailed: true,
  179. precheckResultsMessageIconClass: 'icon-remove'
  180. }
  181. },
  182. runningCheckRequests: [],
  183. /**
  184. * @type {boolean} true if some request that should disable actions is in progress
  185. */
  186. requestInProgress: false,
  187. /**
  188. * @type {number} repo id, request for which is currently in progress
  189. */
  190. requestInProgressRepoId: null,
  191. /**
  192. * @type {boolean} true while no updated upgrade info is loaded after retry
  193. */
  194. isRetryPending: false,
  195. /**
  196. * properties that stored to localStorage to resume wizard progress
  197. */
  198. wizardStorageProperties: [
  199. 'upgradeId',
  200. 'upgradeVersion',
  201. 'currentVersion',
  202. 'upgradeTypeDisplayName',
  203. 'upgradeType',
  204. 'failuresTolerance',
  205. 'isDowngrade',
  206. 'downgradeAllowed',
  207. 'isSuspended',
  208. 'isWizardRestricted'
  209. ],
  210. /**
  211. * mutable properties of Upgrade Task
  212. * @type {Array}
  213. */
  214. taskDetailsProperties: ['status', 'stdout', 'stderr', 'error_log', 'host_name', 'output_log'],
  215. /**
  216. * Context for Finalize item
  217. * @type {string}
  218. */
  219. finalizeContext: 'Confirm Finalize',
  220. /**
  221. * Context for Slave component failures manual item
  222. * @type {string}
  223. */
  224. slaveFailuresContext: "Check Component Versions",
  225. /**
  226. * Context for Service check (may include slave component) failures manual item
  227. * @type {string}
  228. */
  229. serviceCheckFailuresContext: "Verifying Skipped Failures",
  230. /**
  231. * Check if current item is Finalize
  232. * @type {boolean}
  233. */
  234. isFinalizeItem: false,
  235. isLoadUpgradeDataPending: false,
  236. /**
  237. * path to the mock json
  238. * @type {String}
  239. */
  240. mockRepoUrl: '/data/stack_versions/repo_versions_all.json',
  241. /**
  242. * api to get RepoVersions
  243. * @type {String}
  244. */
  245. realRepoUrl: function () {
  246. return App.get('apiPrefix') + '/stacks?fields=versions/repository_versions/RepositoryVersions,' +
  247. 'versions/repository_versions/operating_systems/*,versions/repository_versions/operating_systems/repositories/*';
  248. }.property('App.stackVersionURL'),
  249. /**
  250. * path to the mock json
  251. * @type {String}
  252. */
  253. mockStackUrl: '/data/stack_versions/stack_version_all.json',
  254. /**
  255. * api to get ClusterStackVersions with repository_versions (use to init data load)
  256. * @type {String}
  257. */
  258. realStackUrl: function () {
  259. return App.get('apiPrefix') + '/clusters/' + App.get('clusterName') +
  260. '/stack_versions?fields=*,repository_versions/*,repository_versions/operating_systems/OperatingSystems/*,repository_versions/operating_systems/repositories/*';
  261. }.property('App.clusterName'),
  262. /**
  263. * api to get ClusterStackVersions without repository_versions (use to update data)
  264. * @type {String}
  265. */
  266. realUpdateUrl: function () {
  267. return App.get('apiPrefix') + '/clusters/' + App.get('clusterName') + '/stack_versions?fields=ClusterStackVersions/*';
  268. }.property('App.clusterName'),
  269. /**
  270. * Determines if list of services with checks that failed and were skipped by user during the upgrade is loaded
  271. * @type {boolean}
  272. */
  273. areSkippedServiceChecksLoaded: false,
  274. /**
  275. * List of services with checks that failed and were skipped by user during the upgrade
  276. * @type {array}
  277. */
  278. skippedServiceChecks: [],
  279. /**
  280. * status of tasks/items/groups which should be grayed out and disabled
  281. * @type {Array}
  282. */
  283. nonActiveStates: ['PENDING', 'ABORTED'],
  284. /**
  285. * status of Upgrade request
  286. * @type {string}
  287. */
  288. requestStatus: function () {
  289. if (this.get('upgradeData.Upgrade') && App.get('upgradeSuspended')) {
  290. return 'SUSPENDED';
  291. } else if (this.get('upgradeData.Upgrade')){
  292. return this.get('upgradeData.Upgrade.request_status');
  293. } else {
  294. return '';
  295. }
  296. }.property('upgradeData.Upgrade.request_status', 'App.upgradeSuspended'),
  297. init: function () {
  298. this.initDBProperties();
  299. },
  300. /**
  301. * restore data from localStorage
  302. */
  303. initDBProperties: function () {
  304. var props = this.getDBProperties(this.get('wizardStorageProperties'));
  305. Em.keys(props).forEach(function (k) {
  306. if (!Em.isNone(props[k])) {
  307. this.set(k, props[k]);
  308. }
  309. }, this);
  310. },
  311. /**
  312. * load all data:
  313. * - upgrade data
  314. * - stack versions
  315. * - repo versions
  316. */
  317. load: function () {
  318. var dfd = $.Deferred();
  319. var self = this;
  320. this.loadUpgradeData(true).done(function() {
  321. self.loadStackVersionsToModel(true).done(function () {
  322. self.loadRepoVersionsToModel().done(function() {
  323. self.loadCompatibleVersions().done(function() {
  324. var currentVersion = App.StackVersion.find().findProperty('state', 'CURRENT');
  325. if (currentVersion) {
  326. self.set('currentVersion', {
  327. repository_version: currentVersion.get('repositoryVersion.repositoryVersion'),
  328. repository_name: currentVersion.get('repositoryVersion.displayName')
  329. });
  330. }
  331. dfd.resolve();
  332. });
  333. });
  334. });
  335. });
  336. return dfd.promise();
  337. },
  338. /**
  339. * load upgrade tasks by upgrade id
  340. * @return {$.Deferred}
  341. * @param {boolean} onlyState
  342. */
  343. loadUpgradeData: function (onlyState) {
  344. var upgradeId = this.get('upgradeId'),
  345. deferred = $.Deferred(),
  346. self = this;
  347. if (Em.isNone(upgradeId)) {
  348. deferred.resolve();
  349. } else {
  350. this.set('isLoadUpgradeDataPending', true);
  351. App.ajax.send({
  352. name: (onlyState) ? 'admin.upgrade.state' : 'admin.upgrade.data',
  353. sender: this,
  354. data: {
  355. id: upgradeId
  356. },
  357. success: 'loadUpgradeDataSuccessCallback'
  358. }).then(deferred.resolve).complete(function () {
  359. self.set('isLoadUpgradeDataPending', false);
  360. });
  361. }
  362. return deferred.promise();
  363. },
  364. /**
  365. * parse and push upgrade tasks to controller
  366. * @param data
  367. */
  368. loadUpgradeDataSuccessCallback: function (data) {
  369. if (Em.isNone(data)) return;
  370. App.set('upgradeState', data.Upgrade.request_status);
  371. this.setDBProperty('upgradeState', data.Upgrade.request_status);
  372. this.set('isSuspended', data.Upgrade.suspended);
  373. this.setDBProperty('isSuspended', data.Upgrade.suspended);
  374. if (data.upgrade_groups) {
  375. this.updateUpgradeData(data);
  376. }
  377. if (this.get('isRetryPending') && data.Upgrade.request_status !== 'ABORTED') {
  378. this.setProperties({
  379. requestInProgress: false,
  380. isRetryPending: false
  381. });
  382. }
  383. if (data.Upgrade.request_status === 'COMPLETED') {
  384. this.finish();
  385. }
  386. },
  387. loadCompatibleVersions: function() {
  388. return App.ajax.send({
  389. name: 'admin.upgrade.get_compatible_versions',
  390. sender: this,
  391. data: {
  392. stackName: App.get('currentStackName'),
  393. stackVersion: App.get('currentStackVersionNumber')
  394. },
  395. success: 'loadCompatibleVersionsSuccessCallback'
  396. });
  397. },
  398. /**
  399. *
  400. * @param {object} data
  401. */
  402. loadCompatibleVersionsSuccessCallback: function(data) {
  403. App.RepositoryVersion.find().forEach(function(repo) {
  404. var version = repo.get('repositoryVersion');
  405. repo.set('isCompatible', data.items.someProperty('CompatibleRepositoryVersions.repository_version', version));
  406. });
  407. },
  408. /**
  409. * update data of Upgrade
  410. * @param {object} newData
  411. */
  412. updateUpgradeData: function (newData) {
  413. var oldData = this.get('upgradeData'),
  414. nonActiveStates = this.get('nonActiveStates'),
  415. groupsMap = {},
  416. itemsMap = {};
  417. if (Em.isNone(oldData) || (newData.upgrade_groups.length !== oldData.upgradeGroups.length)) {
  418. this.initUpgradeData(newData);
  419. } else {
  420. //create entities maps
  421. newData.upgrade_groups.forEach(function (newGroup) {
  422. groupsMap[newGroup.UpgradeGroup.group_id] = newGroup.UpgradeGroup;
  423. newGroup.upgrade_items.forEach(function (item) {
  424. itemsMap[item.UpgradeItem.stage_id] = item.UpgradeItem;
  425. })
  426. });
  427. //update existed entities with new data
  428. oldData.upgradeGroups.forEach(function (oldGroup) {
  429. oldGroup.set('status', groupsMap[oldGroup.get('group_id')].status);
  430. oldGroup.set('display_status', groupsMap[oldGroup.get('group_id')].display_status);
  431. oldGroup.set('progress_percent', groupsMap[oldGroup.get('group_id')].progress_percent);
  432. oldGroup.set('completed_task_count', groupsMap[oldGroup.get('group_id')].completed_task_count);
  433. oldGroup.upgradeItems.forEach(function (item) {
  434. item.set('status', itemsMap[item.get('stage_id')].status);
  435. item.set('display_status', itemsMap[item.get('stage_id')].display_status);
  436. item.set('progress_percent', itemsMap[item.get('stage_id')].progress_percent);
  437. });
  438. var hasExpandableItems = oldGroup.upgradeItems.some(function (item) {
  439. return !nonActiveStates.contains(item.get('status'));
  440. });
  441. oldGroup.set('hasExpandableItems', hasExpandableItems);
  442. });
  443. oldData.set('Upgrade', newData.Upgrade);
  444. }
  445. },
  446. /**
  447. * change structure of Upgrade
  448. * In order to maintain nested views in template object should have direct link to its properties, for example
  449. * item.UpgradeItem.<properties> -> item.<properties>
  450. * @param {object} newData
  451. */
  452. initUpgradeData: function (newData) {
  453. var upgradeGroups = [],
  454. nonActiveStates = this.get('nonActiveStates');
  455. //wrap all entities into App.upgradeEntity
  456. newData.upgrade_groups.forEach(function (newGroup) {
  457. var hasExpandableItems = newGroup.upgrade_items.some(function (item) {
  458. return !nonActiveStates.contains(item.UpgradeItem.status);
  459. }),
  460. oldGroup = App.upgradeEntity.create({type: 'GROUP', hasExpandableItems: hasExpandableItems}, newGroup.UpgradeGroup),
  461. upgradeItems = [];
  462. newGroup.upgrade_items.forEach(function (item) {
  463. var oldItem = App.upgradeEntity.create({type: 'ITEM'}, item.UpgradeItem);
  464. this.formatMessages(oldItem);
  465. oldItem.set('tasks', []);
  466. upgradeItems.pushObject(oldItem);
  467. }, this);
  468. upgradeItems.reverse();
  469. oldGroup.set('upgradeItems', upgradeItems);
  470. upgradeGroups.pushObject(oldGroup);
  471. }, this);
  472. upgradeGroups.reverse();
  473. this.set('upgradeData', Em.Object.create({
  474. upgradeGroups: upgradeGroups,
  475. Upgrade: newData.Upgrade
  476. }));
  477. this.set('downgradeAllowed', newData.Upgrade.downgrade_allowed);
  478. this.setDBProperty('downgradeAllowed', newData.Upgrade.downgrade_allowed);
  479. },
  480. /**
  481. * format upgrade item text
  482. * @param {App.upgradeEntity} oldItem
  483. */
  484. formatMessages: function (oldItem) {
  485. var text = oldItem.get('text');
  486. var messages = [];
  487. try {
  488. var messageArray = JSON.parse(text);
  489. for (var i = 0; i < messageArray.length; i++) {
  490. messages.push(messageArray[i].message);
  491. }
  492. oldItem.set('text', messages.join(' '));
  493. } catch (err) {
  494. console.warn('Upgrade Item has malformed text');
  495. }
  496. oldItem.set('messages', messages);
  497. },
  498. /**
  499. * request Upgrade Item and its tasks from server
  500. * @param {Em.Object} item
  501. * @param {Function} customCallback
  502. * @return {$.ajax}
  503. */
  504. getUpgradeItem: function (item, customCallback) {
  505. return App.ajax.send({
  506. name: 'admin.upgrade.upgrade_item',
  507. sender: this,
  508. data: {
  509. upgradeId: item.get('request_id'),
  510. groupId: item.get('group_id'),
  511. stageId: item.get('stage_id')
  512. },
  513. success: customCallback || 'getUpgradeItemSuccessCallback'
  514. });
  515. },
  516. /**
  517. * success callback of <code>getTasks</code>
  518. * @param {object} data
  519. */
  520. getUpgradeItemSuccessCallback: function (data) {
  521. this.get('upgradeData.upgradeGroups').forEach(function (group) {
  522. if (group.get('group_id') === data.UpgradeItem.group_id) {
  523. group.get('upgradeItems').forEach(function (item) {
  524. if (item.get('stage_id') === data.UpgradeItem.stage_id) {
  525. if (item.get('tasks.length')) {
  526. data.tasks.forEach(function (task) {
  527. var currentTask = item.get('tasks').findProperty('id', task.Tasks.id);
  528. this.get('taskDetailsProperties').forEach(function (property) {
  529. currentTask.set(property, task.Tasks[property]);
  530. }, this);
  531. }, this);
  532. } else {
  533. var tasks = [];
  534. data.tasks.forEach(function (task) {
  535. tasks.pushObject(App.upgradeEntity.create({type: 'TASK'}, task.Tasks));
  536. });
  537. item.set('tasks', tasks);
  538. }
  539. item.set('isTasksLoaded', true);
  540. }
  541. }, this);
  542. }
  543. }, this);
  544. },
  545. /**
  546. * Failures info may includes service_check and host_component failures. These two types should be displayed separately.
  547. */
  548. getServiceCheckItemSuccessCallback: function(data) {
  549. var task = data.tasks[0];
  550. var info = {
  551. hosts: [],
  552. host_detail: {}
  553. };
  554. if (task && task.Tasks && task.Tasks.structured_out && task.Tasks.structured_out.failures) {
  555. this.set('serviceCheckFailuresServicenames', task.Tasks.structured_out.failures.service_check || []);
  556. if (task.Tasks.structured_out.failures.host_component) {
  557. for (var hostname in task.Tasks.structured_out.failures.host_component){
  558. info.hosts.push(hostname);
  559. }
  560. info.host_detail = task.Tasks.structured_out.failures.host_component;
  561. }
  562. this.set('slaveComponentStructuredInfo', info);
  563. }
  564. },
  565. getSlaveComponentItemSuccessCallback: function(data) {
  566. var info = data.tasks[0];
  567. if (info && info.Tasks && info.Tasks.structured_out) {
  568. this.set('slaveComponentStructuredInfo', info.Tasks.structured_out);
  569. }
  570. },
  571. /**
  572. * downgrade confirmation popup
  573. * @param {object} event
  574. */
  575. confirmDowngrade: function (event) {
  576. var self = this;
  577. var currentVersion = this.get('currentVersion');
  578. return App.showConfirmationPopup(
  579. function() {
  580. self.downgrade.call(self, currentVersion, event);
  581. },
  582. Em.I18n.t('admin.stackUpgrade.downgrade.body').format(currentVersion.repository_name),
  583. null,
  584. Em.I18n.t('admin.stackUpgrade.dialog.downgrade.header').format(currentVersion.repository_name),
  585. Em.I18n.t('admin.stackUpgrade.downgrade.proceed')
  586. );
  587. },
  588. /**
  589. * make call to start downgrade process
  590. * @param {object} currentVersion
  591. * @param {object} event
  592. */
  593. downgrade: function (currentVersion, event) {
  594. var self = this;
  595. this.set('requestInProgress', true);
  596. this.abortUpgrade().done(function() {
  597. self.startDowngrade(currentVersion);
  598. });
  599. },
  600. /**
  601. * abort upgrade (in order to start Downgrade)
  602. */
  603. abortUpgrade: function () {
  604. var errorCallback = this.get('isDowngrade') ? 'abortDowngradeErrorCallback' : 'abortUpgradeErrorCallback';
  605. return App.ajax.send({
  606. name: 'admin.upgrade.abort',
  607. sender: this,
  608. data: {
  609. upgradeId: this.get('upgradeId'),
  610. isDowngrade: this.get('isDowngrade')
  611. },
  612. error: errorCallback
  613. });
  614. },
  615. /**
  616. * just request ro start downgrade,
  617. * should be performed only if <code>abortUpgrade<code> was completed
  618. */
  619. startDowngrade: function(currentVersion) {
  620. App.ajax.send({
  621. name: 'admin.downgrade.start',
  622. sender: this,
  623. data: {
  624. from: App.RepositoryVersion.find().findProperty('displayName', this.get('upgradeVersion')).get('repositoryVersion'),
  625. value: currentVersion.repository_version,
  626. label: currentVersion.repository_name,
  627. isDowngrade: true,
  628. upgradeType: this.get('upgradeType')
  629. },
  630. success: 'upgradeSuccessCallback',
  631. callback: function() {
  632. this.sender.set('requestInProgress', false);
  633. }
  634. });
  635. },
  636. /**
  637. * suspend upgrade (in order to restart it later)
  638. */
  639. abortUpgradeWithSuspend: function () {
  640. var errorCallback = this.get('isDowngrade') ? 'abortDowngradeErrorCallback' : 'abortUpgradeErrorCallback';
  641. return App.ajax.send({
  642. name: 'admin.upgrade.suspend',
  643. sender: this,
  644. data: {
  645. upgradeId: this.get('upgradeId'),
  646. isDowngrade: this.get('isDowngrade')
  647. },
  648. error: errorCallback
  649. });
  650. },
  651. /**
  652. * error callback of <code>abortUpgrade()</code>
  653. * @param {object} data
  654. */
  655. abortUpgradeErrorCallback: function (data) {
  656. var header = Em.I18n.t('admin.stackUpgrade.state.paused.fail.header');
  657. var body = Em.I18n.t('admin.stackUpgrade.state.paused.fail.body');
  658. if (data && data.responseText) {
  659. try {
  660. var json = $.parseJSON(data.responseText);
  661. body = body + ' ' + json.message;
  662. } catch (err) {}
  663. }
  664. App.showAlertPopup(header, body);
  665. },
  666. /**
  667. * error callback of <code>abortDowngrade()</code>
  668. * @param {object} data
  669. */
  670. abortDowngradeErrorCallback: function (data) {
  671. var header = Em.I18n.t('admin.stackDowngrade.state.paused.fail.header');
  672. var body = Em.I18n.t('admin.stackDowngrade.state.paused.fail.body');
  673. if(data && data.responseText){
  674. try {
  675. var json = $.parseJSON(data.responseText);
  676. body = body + ' ' + json.message;
  677. } catch (err) {}
  678. }
  679. App.showAlertPopup(header, body);
  680. },
  681. retryUpgrade: function () {
  682. this.setProperties({
  683. requestInProgress: true,
  684. isRetryPending: true
  685. });
  686. return App.ajax.send({
  687. name: 'admin.upgrade.retry',
  688. sender: this,
  689. data: {
  690. upgradeId: this.get('upgradeId')
  691. }
  692. });
  693. },
  694. /**
  695. * make call to start upgrade process and show popup with current progress
  696. * @param {object} version
  697. */
  698. upgrade: function (version) {
  699. this.set('requestInProgress', true);
  700. App.ajax.send({
  701. name: 'admin.upgrade.start',
  702. sender: this,
  703. data: version,
  704. success: 'upgradeSuccessCallback',
  705. error: 'upgradeErrorCallback',
  706. callback: function() {
  707. this.sender.set('requestInProgress', false);
  708. }
  709. });
  710. this.setDBProperty('currentVersion', this.get('currentVersion'));
  711. // Show a "preparing the upgrade..." dialog in case the api call returns too slow
  712. if (App.router.get('currentState.name') != 'stackUpgrade') {
  713. this.showPreparingUpgradeIndicator();
  714. }
  715. },
  716. /**
  717. * Should progress bar be displayed when preparing upgrade,
  718. * should show after Upgrade Options window and before Upgrade Wizard
  719. * @method showPreparingUpgradeIndicator
  720. */
  721. showPreparingUpgradeIndicator: function () {
  722. return App.ModalPopup.show({
  723. header: '',
  724. showFooter: false,
  725. showCloseButton: false,
  726. bodyClass: Em.View.extend({
  727. templateName: require('templates/wizard/step8/step8_log_popup'),
  728. controllerBinding: 'App.router.mainAdminStackAndUpgradeController',
  729. /**
  730. * Css-property for progress-bar
  731. * @type {string}
  732. */
  733. barWidth: 'width: 100%;',
  734. progressBarClass: 'progress progress-striped active log_popup',
  735. /**
  736. * Popup-message
  737. * @type {string}
  738. */
  739. message: Em.I18n.t('admin.stackUpgrade.dialog.prepareUpgrade.header'),
  740. /**
  741. * Hide popup when upgrade wizard is open
  742. * @method autoHide
  743. */
  744. autoHide: function () {
  745. if (!this.get('controller.requestInProgress')) {
  746. this.get('parentView').hide();
  747. }
  748. }.observes('controller.requestInProgress')
  749. })
  750. });
  751. },
  752. /**
  753. * error callback of <code>upgrade()</code>
  754. * @param {object} data
  755. */
  756. upgradeErrorCallback: function (data) {
  757. var header = Em.I18n.t('admin.stackVersions.upgrade.start.fail.title');
  758. var body = "";
  759. if (data && data.responseText) {
  760. try {
  761. var json = $.parseJSON(data.responseText);
  762. body = json.message;
  763. } catch (err) {}
  764. }
  765. App.showAlertPopup(header, body);
  766. },
  767. /**
  768. * success callback of <code>upgrade()</code>
  769. * @param {object} data
  770. */
  771. upgradeSuccessCallback: function (data, opt, params) {
  772. this.set('upgradeData', null);
  773. this.set('upgradeId', data.resources[0].Upgrade.request_id);
  774. this.set('upgradeVersion', params.label);
  775. this.set('isDowngrade', !!params.isDowngrade);
  776. var upgradeMethod = this.get('upgradeMethods').findProperty('type', params.type),
  777. upgradeTypeDisplayName = null,
  778. upgradeType = null,
  779. isWizardRestricted = false;
  780. if (upgradeMethod) {
  781. upgradeTypeDisplayName = upgradeMethod.get('displayName');
  782. upgradeType = upgradeMethod.get('type');
  783. isWizardRestricted = upgradeMethod.get('isWizardRestricted');
  784. }
  785. this.set('isWizardRestricted', isWizardRestricted);
  786. this.set('upgradeType', upgradeType);
  787. this.set('upgradeTypeDisplayName', upgradeTypeDisplayName);
  788. this.set('failuresTolerance', Em.Object.create({
  789. skipComponentFailures: params.skipComponentFailures == 'true',
  790. skipSCFailures: params.skipSCFailures == 'true'
  791. }));
  792. this.setDBProperties({
  793. upgradeVersion: params.label,
  794. upgradeId: data.resources[0].Upgrade.request_id,
  795. upgradeState: 'PENDING',
  796. isDowngrade: !!params.isDowngrade,
  797. upgradeType: upgradeType,
  798. isWizardRestricted: isWizardRestricted,
  799. upgradeTypeDisplayName: upgradeTypeDisplayName,
  800. failuresTolerance: Em.Object.create({
  801. skipComponentFailures: params.skipComponentFailures == 'true',
  802. skipSCFailures: params.skipSCFailures == 'true'
  803. })
  804. });
  805. App.set('upgradeState', 'PENDING');
  806. App.clusterStatus.setClusterStatus({
  807. wizardControllerName: this.get('name'),
  808. localdb: App.db.data
  809. });
  810. this.load();
  811. this.openUpgradeDialog();
  812. },
  813. /**
  814. * success callback of updating upgrade options including failures tolerance. etc
  815. * @param {object} data
  816. */
  817. updateOptionsSuccessCallback: function (data, opt, params) {
  818. this.set('failuresTolerance', Em.Object.create({
  819. skipComponentFailures: params.skipComponentFailures == 'true',
  820. skipSCFailures: params.skipSCFailures == 'true'
  821. }));
  822. },
  823. /**
  824. * run upgrade checks and add results to each method object and set selected method
  825. * @param {Em.Object} version
  826. */
  827. runUpgradeMethodChecks: function(version) {
  828. this.get('upgradeMethods').forEach(function (method) {
  829. if (method.get('allowed')) {
  830. this.runPreUpgradeCheckOnly({
  831. value: version.get('repositoryVersion'),
  832. label: version.get('displayName'),
  833. type: method.get('type')
  834. });
  835. } else {
  836. //if method not supported in current stack version, mark as check completed
  837. method.setProperties({
  838. isCheckComplete: false,
  839. isCheckRequestInProgress: false,
  840. action: ''
  841. });
  842. }
  843. }, this);
  844. },
  845. getConfigsWarnings: function (configsMergeWarning) {
  846. var configs = [];
  847. if (configsMergeWarning && Em.get(configsMergeWarning, 'UpgradeChecks.status') === 'WARNING') {
  848. var configsMergeCheckData = Em.get(configsMergeWarning, 'UpgradeChecks.failed_detail');
  849. if (configsMergeCheckData && Em.isArray(configsMergeCheckData)) {
  850. configs = configsMergeCheckData.map(function (item) {
  851. var isDeprecated = Em.isNone(item.new_stack_value),
  852. willBeRemoved = Em.isNone(item.result_value);
  853. return {
  854. type: item.type,
  855. name: item.property,
  856. currentValue: item.current,
  857. recommendedValue: isDeprecated ? Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.deprecated') : item.new_stack_value,
  858. isDeprecated: isDeprecated,
  859. resultingValue: willBeRemoved ? Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.willBeRemoved') : item.result_value,
  860. willBeRemoved: willBeRemoved
  861. };
  862. });
  863. }
  864. }
  865. return configs;
  866. },
  867. /**
  868. * Open upgrade options window: upgrade type and failures tolerance
  869. * @param {boolean} isInUpgradeWizard
  870. * @param {object} version
  871. * @return App.ModalPopup
  872. */
  873. upgradeOptions: function (isInUpgradeWizard, version) {
  874. var self = this,
  875. upgradeMethods = this.get('upgradeMethods'),
  876. runningCheckRequests = this.get('runningCheckRequests');
  877. if (!isInUpgradeWizard) {
  878. upgradeMethods.setEach('isCheckRequestInProgress', true);
  879. upgradeMethods.setEach('selected', false);
  880. var request = this.getSupportedUpgradeTypes(Ember.Object.create({
  881. stackName: App.get('currentStackVersion').split('-')[0],
  882. stackVersion: App.get('currentStackVersion').split('-')[1],
  883. toVersion: version.get('repositoryVersion')
  884. })).done(function () {
  885. if (App.get('router.currentState.name') === 'versions' && App.get('router.currentState.parentState.name') === 'stackAndUpgrade') {
  886. self.runUpgradeMethodChecks(version);
  887. }
  888. }).always(function () {
  889. self.set('runningCheckRequests', runningCheckRequests.rejectProperty('type', 'ALL'));
  890. });
  891. request.type = 'ALL';
  892. this.get('runningCheckRequests').push(request);
  893. } else {
  894. this.set('isUpgradeTypesLoaded', true);
  895. }
  896. return App.ModalPopup.show({
  897. encodeBody: false,
  898. primary: isInUpgradeWizard ? Em.I18n.t('ok') : Em.I18n.t('common.proceed'),
  899. primaryClass: 'btn-success',
  900. classNames: ['upgrade-options-popup'],
  901. header: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.header'),
  902. bodyClass: Em.View.extend({
  903. templateName: require('templates/main/admin/stack_upgrade/upgrade_options'),
  904. didInsertElement: function () {
  905. App.tooltip($(".failure-tolerance-tooltip"), {
  906. placement: "top",
  907. title: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.tolerance.tooltip')
  908. });
  909. Em.run.later(this, function () {
  910. App.tooltip($(".thumbnail.check-failed"), {
  911. placement: "bottom",
  912. title: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.failed.tooltip')
  913. });
  914. App.tooltip($(".not-allowed-by-version"), {
  915. placement: "bottom",
  916. title: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.notAllowed')
  917. });
  918. }, 1000);
  919. },
  920. upgradeMethods: function () {
  921. self.updateSelectedMethod(isInUpgradeWizard);
  922. return self.get('upgradeMethods');
  923. }.property().volatile(),
  924. isInUpgradeWizard: isInUpgradeWizard,
  925. showPreUpgradeChecks: App.get('supports.preUpgradeCheck') && !isInUpgradeWizard,
  926. versionText: isInUpgradeWizard ? '' : Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.bodyMsg.version').format(version.get('displayName')),
  927. selectMethod: function (event) {
  928. if (isInUpgradeWizard || !event.context.get('allowed') || event.context.get('isPrecheckFailed')) return;
  929. var selectedMethod = event.context;
  930. self.updateSelectedMethod(isInUpgradeWizard);
  931. self.get('upgradeMethods').forEach(function (method) {
  932. method.set('selected', false);
  933. });
  934. selectedMethod.set('selected', true);
  935. this.set('parentView.selectedMethod', selectedMethod);
  936. },
  937. runAction: function (event) {
  938. var method = event.context,
  939. action = method.get('action');
  940. if (action) {
  941. this.get(action)(event);
  942. }
  943. },
  944. rerunCheck: function (event) {
  945. self.runPreUpgradeCheckOnly({
  946. value: version.get('repositoryVersion'),
  947. label: version.get('displayName'),
  948. type: event.context.get('type')
  949. });
  950. },
  951. openMessage: function (event) {
  952. if (isInUpgradeWizard || !event.context.get('allowed')) return;
  953. var data = event.context.get('precheckResultsData');
  954. var failTitle = Em.I18n.t('popup.clusterCheck.Upgrade.fail.title');
  955. var failAlert = new Em.Handlebars.SafeString(Em.I18n.t('popup.clusterCheck.Upgrade.fail.alert'));
  956. var bypassedFailures = data.items.filterProperty('UpgradeChecks.status', 'BYPASS').length > 0;
  957. if (data.items.filterProperty('UpgradeChecks.status', 'ERROR').length == 0 && bypassedFailures) {
  958. failTitle = Em.I18n.t('popup.clusterCheck.Upgrade.bypassed-failures.title');
  959. failAlert = new Em.Handlebars.SafeString(Em.I18n.t('popup.clusterCheck.Upgrade.bypassed-failures.alert'));
  960. }
  961. var header = Em.I18n.t('popup.clusterCheck.Upgrade.header').format(version.get('displayName')),
  962. warningTitle = Em.I18n.t('popup.clusterCheck.Upgrade.warning.title'),
  963. warningAlert = new Em.Handlebars.SafeString(Em.I18n.t('popup.clusterCheck.Upgrade.warning.alert')),
  964. configsMergeWarning = data.items.findProperty('UpgradeChecks.id', "CONFIG_MERGE"),
  965. popupData = {
  966. items: data.items.rejectProperty('UpgradeChecks.id', 'CONFIG_MERGE')
  967. },
  968. configs = self.getConfigsWarnings(configsMergeWarning);
  969. App.showClusterCheckPopup(popupData, {
  970. header: header,
  971. failTitle: failTitle,
  972. failAlert: failAlert,
  973. warningTitle: warningTitle,
  974. warningAlert: warningAlert,
  975. primary: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.rerun'),
  976. secondary: Em.I18n.t('common.cancel'),
  977. bypassedFailures: bypassedFailures,
  978. callback: function () {
  979. self.runPreUpgradeCheckOnly.call(self, {
  980. value: version.get('repositoryVersion'),
  981. label: version.get('displayName'),
  982. type: event.context.get('type')
  983. });
  984. }
  985. }, configs, version.get('displayName'));
  986. }
  987. }),
  988. /**
  989. * @type {Em.Object}
  990. * @default null
  991. */
  992. selectedMethod: null,
  993. skipComponentFailures: self.get('failuresTolerance.skipComponentFailures'),
  994. skipSCFailures: self.get('failuresTolerance.skipSCFailures'),
  995. disablePrimary: function () {
  996. if (isInUpgradeWizard) return false;
  997. var selectedMethod = this.get('selectedMethod');
  998. if (selectedMethod) {
  999. if (App.get('supports.preUpgradeCheck')) {
  1000. return selectedMethod.get('isPrecheckFailed') || selectedMethod.get('isCheckRequestInProgress');
  1001. } else {
  1002. return false;
  1003. }
  1004. } else {
  1005. return true;
  1006. }
  1007. }.property('selectedMethod', 'selectedMethod.isPrecheckFailed', 'selectedMethod.isCheckRequestInProgress'),
  1008. onPrimary: function () {
  1009. this.hide();
  1010. if (isInUpgradeWizard) {
  1011. return App.ajax.send({
  1012. name: 'admin.upgrade.update.options',
  1013. sender: self,
  1014. data: {
  1015. upgradeId: self.get('upgradeId'),
  1016. skipComponentFailures: Boolean(this.get('skipComponentFailures')).toString(),
  1017. skipSCFailures: Boolean(this.get('skipSCFailures')).toString()
  1018. },
  1019. success: 'updateOptionsSuccessCallback'
  1020. });
  1021. } else {
  1022. var upgradeMethod = self.get('upgradeMethods').findProperty('selected');
  1023. version.upgradeType = upgradeMethod.get('type');
  1024. version.upgradeTypeDisplayName = upgradeMethod.get('displayName');
  1025. version.skipComponentFailures = this.get('skipComponentFailures');
  1026. version.skipSCFailures = this.get('skipSCFailures');
  1027. var fromVersion = self.get('upgradeVersion') || App.RepositoryVersion.find().findProperty('status', 'CURRENT').get('displayName');
  1028. var toVersion = version.get('displayName');
  1029. var bodyMessage = Em.Object.create({
  1030. confirmButton: Em.I18n.t('yes'),
  1031. confirmMsg: upgradeMethod.get('type') === 'ROLLING' ?
  1032. Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.RU.confirm.msg').format(fromVersion, toVersion) :
  1033. Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.EU.confirm.msg').format(fromVersion, toVersion)
  1034. });
  1035. return App.showConfirmationFeedBackPopup(function (query) {
  1036. return self.runPreUpgradeCheck.call(self, version);
  1037. }, bodyMessage);
  1038. }
  1039. }
  1040. });
  1041. },
  1042. /**
  1043. * open upgrade options from upgrade wizard
  1044. */
  1045. openUpgradeOptions: function () {
  1046. if (this.get('isDowngrade')) return;
  1047. this.upgradeOptions(true, null);
  1048. },
  1049. /**
  1050. * upgrade confirmation popup including upgrade options: upgrade type and failures tolerance
  1051. * @param {object} version
  1052. * @return App.ModalPopup
  1053. */
  1054. confirmUpgrade: function (version) {
  1055. this.upgradeOptions(false, version);
  1056. },
  1057. /**
  1058. * send request for pre upgrade check only
  1059. */
  1060. runPreUpgradeCheckOnly: function (data) {
  1061. if (App.get('supports.preUpgradeCheck')) {
  1062. var method = this.get('upgradeMethods').findProperty('type', data.type);
  1063. method.setProperties({
  1064. isCheckComplete: false,
  1065. isCheckRequestInProgress: true,
  1066. action: ''
  1067. });
  1068. var request = App.ajax.send({
  1069. name: "admin.upgrade.pre_upgrade_check",
  1070. sender: this,
  1071. data: data,
  1072. success: 'runPreUpgradeCheckOnlySuccess',
  1073. error: 'runPreUpgradeCheckOnlyError',
  1074. callback: function () {
  1075. var runningCheckRequests = this.sender.get('runningCheckRequests');
  1076. method.set('isCheckRequestInProgress', false);
  1077. this.sender.set('runningCheckRequests', runningCheckRequests.rejectProperty('type', this.data.type));
  1078. }
  1079. });
  1080. request.type = data.type;
  1081. this.get('runningCheckRequests').push(request);
  1082. }
  1083. },
  1084. /**
  1085. * send request to get available upgrade tye names
  1086. */
  1087. getSupportedUpgradeTypes: function(data) {
  1088. return App.ajax.send({
  1089. name: "admin.upgrade.get_supported_upgradeTypes",
  1090. sender: this,
  1091. data: data,
  1092. success: "getSupportedUpgradeTypesSuccess"
  1093. });
  1094. },
  1095. /**
  1096. * success callback of <code>getSupportedUpgradeTypes()</code>
  1097. * @param data {object}
  1098. */
  1099. getSupportedUpgradeTypesSuccess: function (data) {
  1100. var supportedUpgradeTypes = data.items[0] && data.items[0].CompatibleRepositoryVersions.upgrade_types;
  1101. this.get('upgradeMethods').forEach(function (method) {
  1102. method.set('allowed', Boolean(supportedUpgradeTypes && supportedUpgradeTypes.contains(method.get('type'))));
  1103. });
  1104. },
  1105. /**
  1106. * success callback of <code>runPreUpgradeCheckOnly()</code>
  1107. * Show a message how many fails/warnings/bypass/passed
  1108. * on clicking that message a popup window show up
  1109. * @param data {object}
  1110. * @param opt {object}
  1111. * @param params {object}
  1112. */
  1113. runPreUpgradeCheckOnlySuccess: function (data, opt, params) {
  1114. var properties = {
  1115. precheckResultsTitle: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.msg.title'),
  1116. precheckResultsData: data,
  1117. isCheckComplete: true,
  1118. action: 'openMessage',
  1119. precheckResultsMessage: '',
  1120. recheckResultsMessageClass: 'GREEN',
  1121. isPrecheckFailed: false,
  1122. precheckResultsMessageIconClass: 'icon-ok',
  1123. bypassedFailures: false
  1124. };
  1125. Object.keys(this.get('preCheckMessages')).forEach(function(status) {
  1126. if (data.items.someProperty('UpgradeChecks.status', status)) {
  1127. properties = this.formatPreCheckMessage(status, data, properties);
  1128. }
  1129. }, this);
  1130. if (!properties.precheckResultsMessage) {
  1131. properties.precheckResultsMessage = Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.allPassed');
  1132. }
  1133. this.get('upgradeMethods').findProperty('type', params.type).setProperties(properties);
  1134. this.updateSelectedMethod(false);
  1135. this.addPrecheckMessageTooltip();
  1136. },
  1137. /**
  1138. * @method formatPreCheckMessage
  1139. * @param {string} type
  1140. * @param {object} data
  1141. * @param {object} defaults
  1142. * @returns {object}
  1143. */
  1144. formatPreCheckMessage: function(type, data, defaults) {
  1145. var length = data.items.filterProperty('UpgradeChecks.status', type).length;
  1146. var properties = this.get('preCheckMessages')[type] || {};
  1147. var message = Em.I18n.t(properties.template).format(length, defaults.precheckResultsMessage);
  1148. defaults = $.extend(defaults, properties);
  1149. delete defaults.template;
  1150. defaults.precheckResultsMessage = message;
  1151. return defaults;
  1152. },
  1153. addPrecheckMessageTooltip: function() {
  1154. Em.run.later(this, function () {
  1155. // add tooltip for the type with preCheck errors
  1156. App.tooltip($(".thumbnail.check-failed"), {
  1157. placement: "bottom",
  1158. title: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.failed.tooltip')
  1159. });
  1160. // destroy the tooltip for the type wo preCheck errors
  1161. $(".thumbnail").not(".check-failed").not(".not-allowed-by-version").tooltip("destroy");
  1162. }, 1000);
  1163. },
  1164. runPreUpgradeCheckOnlyError: function (request, ajaxOptions, error, data, params) {
  1165. var method = this.get('upgradeMethods').findProperty('type', params.type);
  1166. method.setProperties({
  1167. precheckResultsMessage: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.msg.failed.link'),
  1168. precheckResultsTitle: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.msg.failed.title'),
  1169. precheckResultsMessageClass: 'RED',
  1170. isPrecheckFailed: true,
  1171. precheckResultsMessageIconClass: 'icon-warning-sign',
  1172. action: 'rerunCheck'
  1173. });
  1174. },
  1175. /**
  1176. * In Upgrade Wizard: update which method already been selected on open
  1177. * Not in upgrade wizard: de-select the method with pre-check errors
  1178. * @param isInUpgradeWizard {boolean}
  1179. */
  1180. updateSelectedMethod: function (isInUpgradeWizard) {
  1181. if (isInUpgradeWizard) {
  1182. this.get('upgradeMethods').forEach(function (method) {
  1183. method.set('selected', method.get('type') === this.get('upgradeType'));
  1184. }, this);
  1185. } else {
  1186. var ruMethod = this.get('upgradeMethods').findProperty('type', 'ROLLING');
  1187. var euMethod = this.get('upgradeMethods').findProperty('type', 'NON_ROLLING');
  1188. if (ruMethod && ruMethod.get('isPrecheckFailed')) ruMethod.set('selected', false);
  1189. if (euMethod && euMethod.get('isPrecheckFailed')) euMethod.set('selected', false);
  1190. }
  1191. },
  1192. /**
  1193. * send request for pre upgrade check
  1194. * @param version
  1195. */
  1196. runPreUpgradeCheck: function(version) {
  1197. var params = {
  1198. value: version.get('repositoryVersion'),
  1199. label: version.get('displayName'),
  1200. type: version.get('upgradeType'),
  1201. skipComponentFailures: version.get('skipComponentFailures') ? 'true' : 'false',
  1202. skipSCFailures: version.get('skipSCFailures') ? 'true' : 'false'
  1203. };
  1204. if (App.get('supports.preUpgradeCheck')) {
  1205. this.set('requestInProgress', true);
  1206. App.ajax.send({
  1207. name: "admin.upgrade.pre_upgrade_check",
  1208. sender: this,
  1209. data: params,
  1210. success: "runPreUpgradeCheckSuccess",
  1211. error: "runPreUpgradeCheckError"
  1212. });
  1213. } else {
  1214. this.upgrade(params);
  1215. }
  1216. },
  1217. /**
  1218. * success callback of <code>runPreUpgradeCheckSuccess()</code>
  1219. * if there are some fails - it shows popup else run upgrade
  1220. * @param data {object}
  1221. * @param opt {object}
  1222. * @param params {object}
  1223. * @returns {App.ModalPopup|undefined}
  1224. */
  1225. runPreUpgradeCheckSuccess: function (data, opt, params) {
  1226. var self = this;
  1227. if (data.items.someProperty('UpgradeChecks.status', 'FAIL') || data.items.someProperty('UpgradeChecks.status', 'WARNING') || data.items.someProperty('UpgradeChecks.status', 'BYPASS')) {
  1228. this.set('requestInProgress', false);
  1229. var hasFails = data.items.someProperty('UpgradeChecks.status', 'FAIL'),
  1230. header = Em.I18n.t('popup.clusterCheck.Upgrade.header').format(params.label),
  1231. failTitle = Em.I18n.t('popup.clusterCheck.Upgrade.fail.title'),
  1232. failAlert = new Em.Handlebars.SafeString(Em.I18n.t('popup.clusterCheck.Upgrade.fail.alert')),
  1233. warningTitle = Em.I18n.t('popup.clusterCheck.Upgrade.warning.title'),
  1234. warningAlert = new Em.Handlebars.SafeString(Em.I18n.t('popup.clusterCheck.Upgrade.warning.alert')),
  1235. bypassedFailures = data.items.someProperty('UpgradeChecks.status', 'BYPASS').length > 0,
  1236. configsMergeWarning = data.items.findProperty('UpgradeChecks.id', 'CONFIG_MERGE'),
  1237. popupData = {
  1238. items: data.items.rejectProperty('UpgradeChecks.id', 'CONFIG_MERGE')
  1239. },
  1240. configs = this.getConfigsWarnings(configsMergeWarning);
  1241. App.showClusterCheckPopup(popupData, {
  1242. header: header,
  1243. failTitle: failTitle,
  1244. failAlert: failAlert,
  1245. warningTitle: warningTitle,
  1246. warningAlert: warningAlert,
  1247. bypassedFailures: bypassedFailures,
  1248. noCallbackCondition: hasFails,
  1249. callback: function () {
  1250. self.upgrade(params);
  1251. }
  1252. }, configs, params.label);
  1253. } else {
  1254. this.upgrade(params);
  1255. }
  1256. },
  1257. runPreUpgradeCheckError: function() {
  1258. this.set('requestInProgress', false);
  1259. },
  1260. confirmRetryUpgrade: function (version) {
  1261. var self = this;
  1262. return App.showConfirmationPopup(
  1263. function () {
  1264. self.retryUpgrade();
  1265. },
  1266. Em.I18n.t('admin.stackUpgrade.upgrade.retry.confirm.body').format(version.get('displayName')),
  1267. null,
  1268. Em.I18n.t('admin.stackUpgrade.dialog.header').format(version.get('upgradeTypeDislayName'), version.get('displayName'))
  1269. );
  1270. },
  1271. confirmRetryDowngrade: function () {
  1272. var self = this,
  1273. currentVersion = this.get('currentVersion');
  1274. return App.showConfirmationPopup(
  1275. function() {
  1276. self.retryUpgrade();
  1277. },
  1278. Em.I18n.t('admin.stackUpgrade.downgrade.retry.body').format(currentVersion.repository_name),
  1279. null,
  1280. Em.I18n.t('admin.stackUpgrade.dialog.downgrade.header').format(currentVersion.repository_name),
  1281. Em.I18n.t('admin.stackUpgrade.downgrade.proceed')
  1282. );
  1283. },
  1284. /**
  1285. * confirmation popup before install repository version
  1286. */
  1287. installRepoVersionConfirmation: function (repo) {
  1288. var self = this;
  1289. return App.showConfirmationPopup(function () {
  1290. self.installRepoVersion(repo);
  1291. },
  1292. Em.I18n.t('admin.stackVersions.version.install.confirm').format(repo.get('displayName'))
  1293. );
  1294. },
  1295. /**
  1296. * sends request to install repoVersion to the cluster
  1297. * and create clusterStackVersion resourse
  1298. * @param {Em.Object} repo
  1299. * @return {$.ajax}
  1300. * @method installRepoVersion
  1301. */
  1302. installRepoVersion: function (repo) {
  1303. this.set('requestInProgress', true);
  1304. this.set('requestInProgressRepoId', repo.get('id'));
  1305. var data = {
  1306. ClusterStackVersions: {
  1307. stack: repo.get('stackVersionType'),
  1308. version: repo.get('stackVersionNumber'),
  1309. repository_version: repo.get('repositoryVersion')
  1310. },
  1311. id: repo.get('id')
  1312. };
  1313. return App.ajax.send({
  1314. name: 'admin.stack_version.install.repo_version',
  1315. sender: this,
  1316. data: data,
  1317. success: 'installRepoVersionSuccess',
  1318. error: 'installRepoVersionError',
  1319. callback: function() {
  1320. this.sender.set('requestInProgress', false);
  1321. this.sender.set('requestInProgressRepoId', null);
  1322. }
  1323. });
  1324. },
  1325. /**
  1326. * transform repo data into json for
  1327. * saving changes to repository version
  1328. * @param {Em.Object} repo
  1329. * @returns {{operating_systems: Array}}
  1330. */
  1331. prepareRepoForSaving: function(repo) {
  1332. var repoVersion = { "operating_systems": [] };
  1333. var ambari_managed_repositories = !repo.get('useRedhatSatellite');
  1334. repo.get('operatingSystems').forEach(function (os, k) {
  1335. repoVersion.operating_systems.push({
  1336. "OperatingSystems": {
  1337. "os_type": os.get("osType"),
  1338. "ambari_managed_repositories": ambari_managed_repositories
  1339. },
  1340. "repositories": []
  1341. });
  1342. os.get('repositories').forEach(function (repository) {
  1343. repoVersion.operating_systems[k].repositories.push({
  1344. "Repositories": {
  1345. "base_url": repository.get('baseUrl'),
  1346. "repo_id": repository.get('repoId'),
  1347. "repo_name": repository.get('repoName')
  1348. }
  1349. });
  1350. });
  1351. });
  1352. return repoVersion;
  1353. },
  1354. /**
  1355. * Return stack version for the repo object
  1356. * @param {Em.Object} repo
  1357. * */
  1358. getStackVersionNumber: function(repo){
  1359. var stackVersionNumber = repo.get('stackVersion');
  1360. if(null == stackVersionNumber)
  1361. stackVersionNumber = App.get('currentStackVersion');
  1362. return stackVersionNumber;
  1363. },
  1364. /**
  1365. * perform validation if <code>skip<code> is false and run save if
  1366. * validation successfull or run save without validation is <code>skip<code> is true
  1367. * @param {Em.Object} repo
  1368. * @param {boolean} skip
  1369. * @returns {$.Deferred}
  1370. */
  1371. saveRepoOS: function (repo, skip) {
  1372. var self = this;
  1373. var deferred = $.Deferred();
  1374. this.validateRepoVersions(repo, skip).done(function(data) {
  1375. if (data.length > 0) {
  1376. deferred.resolve(data);
  1377. } else {
  1378. var repoVersion = self.prepareRepoForSaving(repo);
  1379. var stackVersionNumber = self.getStackVersionNumber(repo);
  1380. App.ajax.send({
  1381. name: 'admin.stack_versions.edit.repo',
  1382. sender: this,
  1383. data: {
  1384. stackName: App.get('currentStackName'),
  1385. stackVersion: stackVersionNumber,
  1386. repoVersionId: repo.get('repoVersionId'),
  1387. repoVersion: repoVersion
  1388. }
  1389. }).success(function() {
  1390. deferred.resolve([]);
  1391. });
  1392. }
  1393. });
  1394. return deferred.promise();
  1395. },
  1396. /**
  1397. * send request for validation for each repository
  1398. * @param {Em.Object} repo
  1399. * @param {boolean} skip
  1400. * @returns {*}
  1401. */
  1402. validateRepoVersions: function(repo, skip) {
  1403. var deferred = $.Deferred(),
  1404. totalCalls = 0,
  1405. invalidUrls = [];
  1406. if (skip) {
  1407. deferred.resolve(invalidUrls);
  1408. } else {
  1409. var stackVersionNumber = this.getStackVersionNumber(repo);
  1410. repo.get('operatingSystems').forEach(function (os) {
  1411. if (os.get('isSelected')) {
  1412. os.get('repositories').forEach(function (repo) {
  1413. totalCalls++;
  1414. this.validationCall(repo, os, stackVersionNumber)
  1415. .success(function () {
  1416. totalCalls--;
  1417. if (totalCalls === 0) deferred.resolve(invalidUrls);
  1418. })
  1419. .error(function () {
  1420. repo.set('hasError', true);
  1421. invalidUrls.push(repo);
  1422. totalCalls--;
  1423. if (totalCalls === 0) deferred.resolve(invalidUrls);
  1424. });
  1425. }, this);
  1426. } else {
  1427. return deferred.resolve(invalidUrls);
  1428. }
  1429. }, this);
  1430. }
  1431. return deferred.promise();
  1432. },
  1433. /**
  1434. *
  1435. * @param {Em.Object} repo
  1436. * @param {Em.Object} os
  1437. * @param {string} stackVersionNumber
  1438. */
  1439. validationCall: function(repo, os, stackVersionNumber) {
  1440. return App.ajax.send({
  1441. name: 'admin.stack_versions.validate.repo',
  1442. sender: this,
  1443. data: {
  1444. repo: repo,
  1445. repoId: repo.get('repoId'),
  1446. baseUrl: repo.get('baseUrl'),
  1447. osType: os.get('osType'),
  1448. stackName: App.get('currentStackName'),
  1449. stackVersion: stackVersionNumber
  1450. }
  1451. })
  1452. },
  1453. /**
  1454. * success callback for <code>installRepoVersion()<code>
  1455. * saves request id to the db
  1456. * @param data
  1457. * @param opt
  1458. * @param params
  1459. * @method installStackVersionSuccess
  1460. */
  1461. installRepoVersionSuccess: function (data, opt, params) {
  1462. if (data && data.statusText === "timeout") {
  1463. App.showAlertPopup(Em.I18n.t('admin.stackVersions.upgrade.installPackage.fail.title'), Em.I18n.t('admin.stackVersions.upgrade.installPackage.fail.timeout'));
  1464. return false;
  1465. }
  1466. var version = App.RepositoryVersion.find(params.id);
  1467. App.db.set('repoVersionInstall', 'id', [data.Requests.id]);
  1468. App.clusterStatus.setClusterStatus({
  1469. wizardControllerName: this.get('name'),
  1470. localdb: App.db.data
  1471. });
  1472. version.set('defaultStatus', 'INSTALLING');
  1473. if (version.get('stackVersion')) {
  1474. version.set('stackVersion.state', 'INSTALLING');
  1475. }
  1476. },
  1477. /**
  1478. * error callback for <code>installRepoVersion()<code>
  1479. * show the error message
  1480. * @param data
  1481. * @method installStackVersionSuccess
  1482. */
  1483. installRepoVersionError: function (data) {
  1484. var header = Em.I18n.t('admin.stackVersions.upgrade.installPackage.fail.title');
  1485. var body = "";
  1486. if (data && data.responseText) {
  1487. try {
  1488. var json = $.parseJSON(data.responseText);
  1489. body = json.message;
  1490. } catch (err) {}
  1491. }
  1492. if (data && data.statusText === "timeout") {
  1493. body = Em.I18n.t('admin.stackVersions.upgrade.installPackage.fail.timeout');
  1494. }
  1495. App.showAlertPopup(header, body);
  1496. },
  1497. /**
  1498. * opens a popup with installations state per host
  1499. * @param {Em.Object} version
  1500. * @method showProgressPopup
  1501. */
  1502. showProgressPopup: function(version) {
  1503. var popupTitle = Em.I18n.t('admin.stackVersions.details.install.hosts.popup.title').format(version.get('displayName'));
  1504. var requestIds = App.get('testMode') ? [1] : App.db.get('repoVersionInstall', 'id');
  1505. var hostProgressPopupController = App.router.get('highAvailabilityProgressPopupController');
  1506. hostProgressPopupController.initPopup(popupTitle, requestIds, this);
  1507. },
  1508. /**
  1509. * reset upgradeState to INIT when upgrade is COMPLETED
  1510. * and clean auxiliary data
  1511. */
  1512. finish: function () {
  1513. var upgradeVersion = this.get('upgradeVersion') && this.get('upgradeVersion').match(/[a-zA-Z]+\-\d+\.\d+/);
  1514. this.setDBProperties({
  1515. upgradeId: undefined,
  1516. upgradeState: 'INIT',
  1517. upgradeVersion: undefined,
  1518. currentVersion: undefined,
  1519. upgradeTypeDisplayName: undefined,
  1520. upgradeType: undefined,
  1521. isWizardRestricted: false,
  1522. failuresTolerance: undefined,
  1523. isDowngrade: undefined,
  1524. downgradeAllowed: undefined
  1525. });
  1526. App.clusterStatus.setClusterStatus({
  1527. localdb: App.db.data
  1528. });
  1529. if (upgradeVersion && upgradeVersion[0]) {
  1530. App.set('currentStackVersion', upgradeVersion[0]);
  1531. }
  1532. App.set('upgradeState', 'INIT');
  1533. },
  1534. /**
  1535. * Check <code>App.upgradeState</code> for HOLDING
  1536. * If it is, send request to check if current item is Finalize
  1537. * @method updateFinalize
  1538. */
  1539. updateFinalize: function () {
  1540. var upgradeState = App.get('upgradeState');
  1541. if (upgradeState === 'HOLDING') {
  1542. return App.ajax.send({
  1543. name: 'admin.upgrade.finalizeContext',
  1544. sender: this,
  1545. success: 'updateFinalizeSuccessCallback',
  1546. error: 'updateFinalizeErrorCallback'
  1547. })
  1548. }
  1549. else {
  1550. this.set('isFinalizeItem', false);
  1551. }
  1552. }.observes('App.upgradeState'),
  1553. /**
  1554. *
  1555. * @param {object|null} data
  1556. * @method updateFinalizeSuccessCallback
  1557. */
  1558. updateFinalizeSuccessCallback: function (data) {
  1559. var context = data ? Em.get(data, 'items.firstObject.upgrade_groups.firstObject.upgrade_items.firstObject.UpgradeItem.context') : '';
  1560. this.set('isFinalizeItem', context === this.get('finalizeContext'));
  1561. },
  1562. updateFinalizeErrorCallback: function() {
  1563. this.set('isFinalizeItem', false);
  1564. },
  1565. /**
  1566. * show dialog with tasks of upgrade
  1567. * @return {App.ModalPopup}
  1568. */
  1569. openUpgradeDialog: function () {
  1570. if (App.isAuthorized('CLUSTER.UPGRADE_DOWNGRADE_STACK') && !this.get('isWizardRestricted')) {
  1571. App.propertyDidChange('upgradeSuspended');
  1572. App.router.transitionTo('admin.stackUpgrade');
  1573. }
  1574. },
  1575. /**
  1576. * returns url to get data for repoVersion or clusterStackVersion
  1577. * @param {Boolean} stack true if load clusterStackVersion
  1578. * @param {Boolean} fullLoad true if load all data
  1579. * @returns {String}
  1580. * @method getUrl
  1581. */
  1582. getUrl: function(stack, fullLoad) {
  1583. if (App.get('testMode')) {
  1584. return stack ? this.get('mockStackUrl') : this.get('mockRepoUrl')
  1585. } else {
  1586. if (fullLoad) {
  1587. return stack ? this.get('realStackUrl') : this.get('realRepoUrl');
  1588. } else {
  1589. return this.get('realUpdateUrl');
  1590. }
  1591. }
  1592. },
  1593. /**
  1594. * get stack versions from server and push it to model
  1595. * @return {*}
  1596. * @method loadStackVersionsToModel
  1597. */
  1598. loadStackVersionsToModel: function (fullLoad) {
  1599. var dfd = $.Deferred();
  1600. App.HttpClient.get(this.getUrl(true, fullLoad), App.stackVersionMapper, {
  1601. complete: function () {
  1602. dfd.resolve();
  1603. }
  1604. });
  1605. return dfd.promise();
  1606. },
  1607. /**
  1608. * get repo versions from server and push it to model
  1609. * @return {*}
  1610. * @params {Boolean} isUpdate - if true loads part of data that need to be updated
  1611. * @method loadRepoVersionsToModel()
  1612. */
  1613. loadRepoVersionsToModel: function () {
  1614. var dfd = $.Deferred();
  1615. App.HttpClient.get(this.getUrl(false, true), App.repoVersionMapper, {
  1616. complete: function () {
  1617. dfd.resolve();
  1618. }
  1619. });
  1620. return dfd.promise();
  1621. },
  1622. /**
  1623. * set status to Upgrade item
  1624. * @param item
  1625. * @param status
  1626. */
  1627. setUpgradeItemStatus: function(item, status) {
  1628. this.set('requestInProgress', true);
  1629. return App.ajax.send({
  1630. name: 'admin.upgrade.upgradeItem.setState',
  1631. sender: this,
  1632. data: {
  1633. upgradeId: item.get('request_id'),
  1634. itemId: item.get('stage_id'),
  1635. groupId: item.get('group_id'),
  1636. status: status
  1637. },
  1638. callback: function() {
  1639. this.sender.set('requestInProgress', false);
  1640. }
  1641. }).done(function () {
  1642. item.set('status', status);
  1643. });
  1644. },
  1645. currentVersionObserver: function () {
  1646. var versionNumber = this.get('currentVersion.repository_version');
  1647. var currentVersionObject = App.RepositoryVersion.find().findProperty('status', 'CURRENT');
  1648. var versionName = currentVersionObject && currentVersionObject.get('stackVersionType');
  1649. App.set('isStormMetricsSupported', versionName != 'HDP' || stringUtils.compareVersions(versionNumber, '2.2.2') > -1 || !versionNumber);
  1650. }.observes('currentVersion.repository_version'),
  1651. /**
  1652. * get the installed repositories of HDP from server
  1653. */
  1654. loadRepositories: function () {
  1655. if (App.router.get('clusterController.isLoaded')) {
  1656. var nameVersionCombo = App.get('currentStackVersion');
  1657. var stackName = nameVersionCombo.split('-')[0];
  1658. var stackVersion = nameVersionCombo.split('-')[1];
  1659. App.ajax.send({
  1660. name: 'cluster.load_repositories',
  1661. sender: this,
  1662. data: {
  1663. stackName: stackName,
  1664. stackVersion: stackVersion
  1665. },
  1666. success: 'loadRepositoriesSuccessCallback',
  1667. error: 'loadRepositoriesErrorCallback'
  1668. });
  1669. }
  1670. }.observes('App.router.clusterController.isLoaded'),
  1671. loadRepositoriesSuccessCallback: function (data) {
  1672. var allRepos = [];
  1673. data.items.forEach(function (os) {
  1674. os.repositories.forEach(function (repository) {
  1675. var osType = repository.Repositories.os_type;
  1676. var repo = Em.Object.create({
  1677. baseUrl: repository.Repositories.base_url,
  1678. osType: osType,
  1679. repoId: repository.Repositories.repo_id,
  1680. repoName : repository.Repositories.repo_name,
  1681. stackName : repository.Repositories.stack_name,
  1682. stackVersion : repository.Repositories.stack_version,
  1683. isFirst: false
  1684. });
  1685. var group = allRepos.findProperty('name', osType);
  1686. if (!group) {
  1687. group = {
  1688. name: osType,
  1689. repositories: []
  1690. };
  1691. repo.set('isFirst', true);
  1692. allRepos.push(group);
  1693. }
  1694. group.repositories.push(repo);
  1695. });
  1696. }, this);
  1697. allRepos.stackVersion = App.get('currentStackVersionNumber');
  1698. this.set('allRepos', allRepos);
  1699. },
  1700. loadRepositoriesErrorCallback: function (request, ajaxOptions, error) {
  1701. },
  1702. /**
  1703. * @returns {$.ajax}
  1704. */
  1705. suspendUpgrade: function () {
  1706. var self = this;
  1707. return this.abortUpgradeWithSuspend().done(function () {
  1708. App.set('upgradeState', 'ABORTED');
  1709. self.setDBProperty('upgradeState', 'ABORTED');
  1710. App.clusterStatus.setClusterStatus({
  1711. wizardControllerName: self.get('name'),
  1712. localdb: App.db.data
  1713. });
  1714. });
  1715. },
  1716. /**
  1717. * @returns {$.ajax}
  1718. */
  1719. resumeUpgrade: function() {
  1720. var self = this;
  1721. this.retryUpgrade().done(function () {
  1722. App.set('upgradeState', 'PENDING');
  1723. App.propertyDidChange('upgradeSuspended');
  1724. self.setDBProperty('upgradeState', 'PENDING');
  1725. App.clusterStatus.setClusterStatus({
  1726. wizardControllerName: self.get('name'),
  1727. localdb: App.db.data
  1728. });
  1729. });
  1730. },
  1731. /**
  1732. * restore last Upgrade data
  1733. * @param {object} lastUpgradeData
  1734. */
  1735. restoreLastUpgrade: function(lastUpgradeData) {
  1736. var self = this;
  1737. var upgradeType = this.get('upgradeMethods').findProperty('type', lastUpgradeData.Upgrade.upgrade_type);
  1738. this.setDBProperties({
  1739. upgradeId: lastUpgradeData.Upgrade.request_id,
  1740. isDowngrade: lastUpgradeData.Upgrade.direction === 'DOWNGRADE',
  1741. upgradeState: lastUpgradeData.Upgrade.request_status,
  1742. upgradeType: lastUpgradeData.Upgrade.upgrade_type,
  1743. isWizardRestricted: upgradeType.get('isWizardRestricted'),
  1744. downgradeAllowed: lastUpgradeData.Upgrade.downgrade_allowed,
  1745. upgradeTypeDisplayName: upgradeType.get('displayName'),
  1746. failuresTolerance: Em.Object.create({
  1747. skipComponentFailures: lastUpgradeData.Upgrade.skip_failures,
  1748. skipSCFailures: lastUpgradeData.Upgrade.skip_service_check_failures
  1749. })
  1750. });
  1751. this.loadRepoVersionsToModel().done(function () {
  1752. var toVersion = App.RepositoryVersion.find().findProperty('repositoryVersion', lastUpgradeData.Upgrade.to_version);
  1753. self.setDBProperty('upgradeVersion', toVersion && toVersion.get('displayName'));
  1754. self.initDBProperties();
  1755. self.loadUpgradeData(true);
  1756. });
  1757. },
  1758. /**
  1759. * Build table from configs list and open new window to show this table
  1760. * @param configs
  1761. */
  1762. openConfigsInNewWindow: function (configs) {
  1763. var newWindow;
  1764. var output = '';
  1765. output += '<table style="text-align: left;"><thead><tr>' +
  1766. '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.configType') + '</th>' +
  1767. '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.propertyName') + '</th>' +
  1768. '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.currentValue') + '</th>' +
  1769. '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.recommendedValue') + '</th>' +
  1770. '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.resultingValue') + '</th>' +
  1771. '</tr></thead><tbody>';
  1772. configs.context.forEach(function (config) {
  1773. output += '<tr>' +
  1774. '<td>' + config.type + '</td>' +
  1775. '<td>' + config.name + '</td>' +
  1776. '<td>' + config.currentValue + '</td>' +
  1777. '<td>' + config.recommendedValue + '</td>' +
  1778. '<td>' + config.resultingValue + '</td>' +
  1779. '</tr>';
  1780. });
  1781. output += '</tbody></table>';
  1782. newWindow = window.open();
  1783. newWindow.document.write(output);
  1784. newWindow.focus();
  1785. },
  1786. /**
  1787. * load version for services to display on Choose Services page
  1788. * should load from VersionDefinition endpoint
  1789. */
  1790. loadServiceVersionFromVersionDefinitions: function () {
  1791. return App.ajax.send({
  1792. name: 'cluster.load_current_repo_stack_services',
  1793. sender: this,
  1794. data: {
  1795. clusterName: App.get('clusterName')
  1796. },
  1797. success: 'loadServiceVersionFromVersionDefinitionsSuccessCallback',
  1798. error: 'loadServiceVersionFromVersionDefinitionsErrorCallback'
  1799. });
  1800. },
  1801. serviceVersionsMap: {},
  1802. /**
  1803. * @param {object|null} jsonData
  1804. */
  1805. loadServiceVersionFromVersionDefinitionsSuccessCallback: function (jsonData) {
  1806. var rv = Em.getWithDefault(jsonData, 'items', []).filter(function(i) {
  1807. return Em.getWithDefault(i, 'ClusterStackVersions.stack', null) === App.get('currentStackName') &&
  1808. Em.getWithDefault(i, 'ClusterStackVersions.version', null) === App.get('currentStackVersionNumber');
  1809. })[0];
  1810. var map = this.get('serviceVersionsMap');
  1811. var stackServices = Em.getWithDefault(rv || {}, 'repository_versions.0.RepositoryVersions.stack_services', false);
  1812. if (stackServices) {
  1813. stackServices.forEach(function (item) {
  1814. map[item.name] = item.versions[0];
  1815. });
  1816. }
  1817. },
  1818. loadServiceVersionFromVersionDefinitionsErrorCallback: function (request, ajaxOptions, error) {}
  1819. });