add_controller.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653
  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. App.AddServiceController = App.WizardController.extend(App.AddSecurityConfigs, {
  20. name: 'addServiceController',
  21. // @TODO: remove after Kerberos Automation supports
  22. totalSteps: App.supports.automatedKerberos ? 8 : 7,
  23. /**
  24. * Used for hiding back button in wizard
  25. */
  26. hideBackButton: true,
  27. /**
  28. * @type {object}
  29. * @default null
  30. */
  31. serviceToInstall: null,
  32. /**
  33. *
  34. */
  35. installClientQueueLength: 0,
  36. /**
  37. * All wizards data will be stored in this variable
  38. *
  39. * cluster - cluster name
  40. * installOptions - ssh key, repo info, etc.
  41. * services - services list
  42. * hosts - list of selected hosts
  43. * slaveComponentHosts, - info about slave hosts
  44. * masterComponentHosts - info about master hosts
  45. * config??? - to be described later
  46. */
  47. content: Em.Object.create({
  48. cluster: null,
  49. hosts: null,
  50. installOptions: null,
  51. services: null,
  52. slaveComponentHosts: null,
  53. masterComponentHosts: null,
  54. serviceConfigProperties: null,
  55. advancedServiceConfig: null,
  56. controllerName: 'addServiceController',
  57. configGroups: [],
  58. clients: [],
  59. additionalClients: [],
  60. smokeuser: "ambari-qa",
  61. group: "hadoop"
  62. }),
  63. loadMap: {
  64. '1': [
  65. {
  66. type: 'sync',
  67. callback: function () {
  68. this.loadServices();
  69. }
  70. }
  71. ],
  72. '2': [
  73. {
  74. type: 'sync',
  75. callback: function () {
  76. this.loadMasterComponentHosts();
  77. this.load('hosts');
  78. }
  79. }
  80. ],
  81. '2': [
  82. {
  83. type: 'async',
  84. callback: function () {
  85. var dfd = $.Deferred();
  86. var self = this;
  87. this.loadHosts().done(function () {
  88. self.loadMasterComponentHosts();
  89. self.load('hosts');
  90. dfd.resolve();
  91. });
  92. return dfd.promise();
  93. }
  94. }
  95. ],
  96. '3': [
  97. {
  98. type: 'async',
  99. callback: function () {
  100. var dfd = $.Deferred();
  101. var self = this;
  102. this.loadHosts().done(function () {
  103. self.loadServices();
  104. self.loadClients();
  105. self.loadSlaveComponentHosts();//depends on loadServices
  106. dfd.resolve();
  107. });
  108. return dfd.promise();
  109. }
  110. }
  111. ],
  112. '4': [
  113. {
  114. type: 'async',
  115. callback: function () {
  116. var self = this;
  117. var dfd = $.Deferred();
  118. this.loadKerberosDescriptorConfigs().done(function() {
  119. self.loadServiceConfigGroups();
  120. self.loadServiceConfigProperties();
  121. dfd.resolve();
  122. });
  123. return dfd.promise();
  124. }
  125. }
  126. ],
  127. '5': [
  128. {
  129. type: 'sync',
  130. callback: function () {
  131. this.checkSecurityStatus();
  132. this.load('cluster');
  133. this.set('content.additionalClients', []);
  134. this.set('installClientQueueLength', 0);
  135. this.set('installClietsQueue', App.ajaxQueue.create({abortOnError: false}));
  136. }
  137. }
  138. ]
  139. },
  140. setCurrentStep: function (currentStep, completed) {
  141. this._super(currentStep, completed);
  142. App.clusterStatus.setClusterStatus({
  143. wizardControllerName: this.get('name'),
  144. localdb: App.db.data
  145. });
  146. },
  147. loadHosts: function () {
  148. var dfd;
  149. if (this.getDBProperty('hosts')) {
  150. dfd = $.Deferred();
  151. dfd.resolve();
  152. } else {
  153. dfd = App.ajax.send({
  154. name: 'hosts.confirmed',
  155. sender: this,
  156. data: {},
  157. success: 'loadHostsSuccessCallback',
  158. error: 'loadHostsErrorCallback'
  159. });
  160. }
  161. return dfd.promise();
  162. },
  163. loadHostsSuccessCallback: function (response) {
  164. var installedHosts = {};
  165. response.items.forEach(function (item, indx) {
  166. installedHosts[item.Hosts.host_name] = {
  167. name: item.Hosts.host_name,
  168. cpu: item.Hosts.cpu_count,
  169. memory: item.Hosts.total_mem,
  170. disk_info: item.Hosts.disk_info,
  171. osType: item.Hosts.os_type,
  172. osArch: item.Hosts.os_arch,
  173. ip: item.Hosts.ip,
  174. bootStatus: "REGISTERED",
  175. isInstalled: true,
  176. hostComponents: item.host_components,
  177. id: indx++
  178. };
  179. });
  180. this.setDBProperty('hosts', installedHosts);
  181. this.set('content.hosts', installedHosts);
  182. },
  183. loadHostsErrorCallback: function (jqXHR, ajaxOptions, error, opt) {
  184. App.ajax.defaultErrorHandler(jqXHR, opt.url, opt.method, jqXHR.status);
  185. console.log('Loading hosts failed');
  186. },
  187. /**
  188. * Load services data. Will be used at <code>Select services(step4)</code> step
  189. */
  190. loadServices: function () {
  191. var services = this.getDBProperty('services');
  192. if (!services) {
  193. services = {
  194. selectedServices: [],
  195. installedServices: []
  196. };
  197. App.StackService.find().forEach(function (item) {
  198. var isInstalled = App.Service.find().someProperty('id', item.get('serviceName'));
  199. var isSelected = item.get('serviceName') == this.get('serviceToInstall');
  200. item.set('isSelected', isInstalled || isSelected);
  201. item.set('isInstalled', isInstalled);
  202. if (isInstalled) {
  203. services.selectedServices.push(item.get('serviceName'));
  204. services.installedServices.push(item.get('serviceName'));
  205. } else if(isSelected) {
  206. services.selectedServices.push(item.get('serviceName'));
  207. }
  208. }, this);
  209. this.setDBProperty('services', services);
  210. } else {
  211. App.StackService.find().forEach(function (item) {
  212. var isSelected = services.selectedServices.contains(item.get('serviceName')) || item.get('serviceName') == this.get('serviceToInstall');
  213. var isInstalled = services.installedServices.contains(item.get('serviceName'));
  214. item.set('isSelected', isSelected || (this.get("currentStep") == "1" ? isInstalled : isSelected));
  215. item.set('isInstalled', isInstalled);
  216. }, this);
  217. var isServiceWithSlave = App.StackService.find().filterProperty('isSelected').filterProperty('hasSlave').filterProperty('isInstalled', false).length;
  218. var isServiceWithClient = App.StackService.find().filterProperty('isSelected').filterProperty('hasClient').filterProperty('isInstalled', false).length;
  219. var isServiceWithCustomAssignedNonMasters = App.StackService.find().filterProperty('isSelected').filterProperty('hasNonMastersWithCustomAssignment').filterProperty('isInstalled', false).length;
  220. this.set('content.skipSlavesStep', !isServiceWithSlave && !isServiceWithClient || !isServiceWithCustomAssignedNonMasters);
  221. if (this.get('content.skipSlavesStep')) {
  222. this.get('isStepDisabled').findProperty('step', 3).set('value', this.get('content.skipSlavesStep'));
  223. }
  224. }
  225. this.set('content.services', App.StackService.find());
  226. },
  227. /**
  228. * Save data to model
  229. * @param stepController App.WizardStep4Controller
  230. */
  231. saveServices: function (stepController) {
  232. var services = {
  233. selectedServices: [],
  234. installedServices: []
  235. };
  236. var selectedServices = stepController.get('content').filterProperty('isSelected', true).filterProperty('isInstalled', false).mapProperty('serviceName');
  237. services.selectedServices.pushObjects(selectedServices);
  238. services.installedServices.pushObjects(stepController.get('content').filterProperty('isInstalled', true).mapProperty('serviceName'));
  239. // save services that already installed but ignored on choose services page
  240. // these services marked by `isInstallable` flag with value `false`, for example `Kerberos` service
  241. services.installedServices.pushObjects(App.Service.find().mapProperty('serviceName').filter(function(serviceName) {
  242. return !services.installedServices.contains(serviceName);
  243. }));
  244. this.setDBProperty('services', services);
  245. console.log('AddServiceController.saveServices: saved data', stepController.get('content'));
  246. this.set('content.selectedServiceNames', selectedServices);
  247. this.setDBProperty('selectedServiceNames', selectedServices);
  248. var isServiceWithSlave = stepController.get('content').filterProperty('isSelected').filterProperty('hasSlave').filterProperty('isInstalled', false).mapProperty('serviceName').length;
  249. var isServiceWithClient = App.StackService.find().filterProperty('isSelected').filterProperty('hasClient').filterProperty('isInstalled', false).mapProperty('serviceName').length;
  250. this.set('content.skipSlavesStep', !isServiceWithSlave && !isServiceWithClient);
  251. if (this.get('content.skipSlavesStep')) {
  252. this.get('isStepDisabled').findProperty('step', 3).set('value', this.get('content.skipSlavesStep'));
  253. }
  254. },
  255. /**
  256. * Save Master Component Hosts data to Main Controller
  257. * @param stepController App.WizardStep5Controller
  258. */
  259. saveMasterComponentHosts: function (stepController) {
  260. var obj = stepController.get('selectedServicesMasters');
  261. var masterComponentHosts = [];
  262. var installedComponents = App.HostComponent.find();
  263. obj.forEach(function (_component) {
  264. var installedComponent = installedComponents.findProperty('componentName', _component.component_name);
  265. masterComponentHosts.push({
  266. display_name: _component.display_name,
  267. component: _component.component_name,
  268. hostName: _component.selectedHost,
  269. serviceId: _component.serviceId,
  270. isInstalled: !!installedComponent,
  271. workStatus: installedComponent && installedComponent.get('workStatus')
  272. });
  273. });
  274. console.log("AddServiceController.saveMasterComponentHosts: saved hosts ", masterComponentHosts);
  275. this.setDBProperty('masterComponentHosts', masterComponentHosts);
  276. this.set('content.masterComponentHosts', masterComponentHosts);
  277. this.set('content.skipMasterStep', this.get('content.masterComponentHosts').everyProperty('isInstalled', true));
  278. this.get('isStepDisabled').findProperty('step', 2).set('value', this.get('content.skipMasterStep'));
  279. },
  280. /**
  281. * Load master component hosts data for using in required step controllers
  282. */
  283. loadMasterComponentHosts: function () {
  284. this._super();
  285. this.set('content.skipMasterStep', App.StackService.find().filterProperty('isSelected').filterProperty('hasMaster').everyProperty('isInstalled', true));
  286. this.get('isStepDisabled').findProperty('step', 2).set('value', this.get('content.skipMasterStep'));
  287. },
  288. /**
  289. * Does service have any configs
  290. * @param {string} serviceName
  291. * @returns {boolean}
  292. */
  293. isServiceNotConfigurable: function (serviceName) {
  294. return App.get('services.noConfigTypes').contains(serviceName);
  295. },
  296. /**
  297. * Should Config Step be skipped (based on selected services list)
  298. * @returns {boolean}
  299. */
  300. skipConfigStep: function () {
  301. var skipConfigStep = true;
  302. var selectedServices = this.get('content.services').filterProperty('isSelected', true).filterProperty('isInstalled', false).mapProperty('serviceName');
  303. selectedServices.map(function (serviceName) {
  304. skipConfigStep = skipConfigStep && this.isServiceNotConfigurable(serviceName);
  305. }, this);
  306. return skipConfigStep;
  307. },
  308. loadServiceConfigProperties: function () {
  309. this._super();
  310. if (!this.get('content.services')) {
  311. this.loadServices();
  312. }
  313. if (this.get('currentStep') > 1 && this.get('currentStep') < 6) {
  314. this.set('content.skipConfigStep', this.skipConfigStep());
  315. this.get('isStepDisabled').findProperty('step', 4).set('value', this.get('content.skipConfigStep'));
  316. }
  317. },
  318. /**
  319. * Load kerberos descriptor configuration
  320. * @returns {$.Deferred}
  321. */
  322. loadKerberosDescriptorConfigs: function() {
  323. var self = this,
  324. dfd = $.Deferred();
  325. if (App.router.get('mainAdminKerberosController.securityEnabled')) {
  326. this.getDescriptorConfigs().then(function(properties) {
  327. self.set('kerberosDescriptorConfigs', properties);
  328. dfd.resolve();
  329. });
  330. } else {
  331. dfd.resolve();
  332. }
  333. return dfd.promise();
  334. },
  335. saveServiceConfigProperties: function (stepController) {
  336. this._super(stepController);
  337. if (this.get('currentStep') > 1 && this.get('currentStep') < 6) {
  338. this.set('content.skipConfigStep', this.skipConfigStep());
  339. this.get('isStepDisabled').findProperty('step', 4).set('value', this.get('content.skipConfigStep'));
  340. }
  341. },
  342. /**
  343. * Load master component hosts data for using in required step controllers
  344. */
  345. loadSlaveComponentHosts: function () {
  346. var slaveComponentHosts = this.getDBProperty('slaveComponentHosts'),
  347. hosts = this.getDBProperty('hosts'),
  348. host_names = Em.keys(hosts);
  349. if (!Em.isNone(slaveComponentHosts)) {
  350. slaveComponentHosts.forEach(function (component) {
  351. component.hosts.forEach(function (host) {
  352. //Em.set(host, 'hostName', hosts[host.host_id].name);
  353. for (var i = 0; i < host_names.length; i++) {
  354. if (hosts[host_names[i]].id === host.host_id) {
  355. host.hostName = host_names[i];
  356. break;
  357. }
  358. }
  359. });
  360. });
  361. }
  362. if (!slaveComponentHosts) {
  363. slaveComponentHosts = this.getSlaveComponentHosts();
  364. }
  365. this.set("content.slaveComponentHosts", slaveComponentHosts);
  366. console.log("AddServiceController.loadSlaveComponentHosts: loaded hosts ", slaveComponentHosts);
  367. },
  368. /**
  369. * return slaveComponents bound to hosts
  370. * @return {Array}
  371. */
  372. getSlaveComponentHosts: function () {
  373. var components = this.get('slaveComponents');
  374. var result = [];
  375. var installedServices = App.Service.find().mapProperty('serviceName');
  376. var selectedServices = this.get('content.services').filterProperty('isSelected', true).mapProperty('serviceName');
  377. var installedComponentsMap = {};
  378. var uninstalledComponents = [];
  379. var hosts = this.getDBProperty('hosts') || this.get('content.hosts');
  380. var masterComponents = App.get('components.masters');
  381. var nonMasterComponentHosts = [];
  382. components.forEach(function (component) {
  383. if (installedServices.contains(component.get('serviceName'))) {
  384. installedComponentsMap[component.get('componentName')] = [];
  385. } else if (selectedServices.contains(component.get('serviceName'))) {
  386. uninstalledComponents.push(component);
  387. }
  388. }, this);
  389. for (var hostName in hosts) {
  390. if (hosts[hostName].isInstalled) {
  391. var isMasterComponentHosted = false;
  392. hosts[hostName].hostComponents.forEach(function (component) {
  393. if (installedComponentsMap[component.HostRoles.component_name]) {
  394. installedComponentsMap[component.HostRoles.component_name].push(hostName);
  395. }
  396. if (masterComponents.contains(component.HostRoles.component_name)) {
  397. isMasterComponentHosted = true;
  398. }
  399. }, this);
  400. if (!isMasterComponentHosted) {
  401. nonMasterComponentHosts.push(hostName);
  402. }
  403. }
  404. }
  405. for (var componentName in installedComponentsMap) {
  406. var component = {
  407. componentName: componentName,
  408. displayName: App.format.role(componentName),
  409. hosts: [],
  410. isInstalled: true
  411. };
  412. installedComponentsMap[componentName].forEach(function (hostName) {
  413. component.hosts.push({
  414. group: "Default",
  415. hostName: hostName,
  416. isInstalled: true
  417. });
  418. }, this);
  419. result.push(component);
  420. }
  421. if (!nonMasterComponentHosts.length) {
  422. nonMasterComponentHosts.push(Object.keys(hosts)[0]);
  423. }
  424. var uninstalledComponentHosts = nonMasterComponentHosts.map(function(_hostName){
  425. return {
  426. group: "Default",
  427. hostName: _hostName,
  428. isInstalled: false
  429. }
  430. });
  431. uninstalledComponents.forEach(function (component) {
  432. result.push({
  433. componentName: component.get('componentName'),
  434. displayName: App.format.role(component.get('componentName')),
  435. hosts: uninstalledComponentHosts,
  436. isInstalled: false
  437. })
  438. });
  439. return result;
  440. },
  441. /**
  442. * Generate clients list for selected services and save it to model
  443. * @param stepController step4WizardController
  444. */
  445. saveClients: function (stepController) {
  446. var clients = [];
  447. var serviceComponents = App.StackServiceComponent.find();
  448. this.get('content.services').filterProperty('isSelected').filterProperty('isInstalled',false).forEach(function (_service) {
  449. var serviceClients = serviceComponents.filterProperty('serviceName', _service.get('serviceName')).filterProperty('isClient');
  450. serviceClients.forEach(function (client) {
  451. clients.push({
  452. component_name: client.get('componentName'),
  453. display_name: client.get('displayName'),
  454. isInstalled: false
  455. });
  456. }, this);
  457. }, this);
  458. this.setDBProperty('clientInfo', clients);
  459. this.set('content.clients', clients);
  460. console.log("AddServiceController.saveClients: saved list ", clients);
  461. },
  462. /**
  463. * Remove all loaded data.
  464. * Created as copy for App.router.clearAllSteps
  465. */
  466. clearAllSteps: function () {
  467. this.clearInstallOptions();
  468. // clear temporary information stored during the install
  469. this.set('content.cluster', this.getCluster());
  470. },
  471. /**
  472. * Clear all temporary data
  473. */
  474. finish: function () {
  475. this.clearAllSteps();
  476. this.clearStorageData();
  477. this.resetDbNamespace();
  478. App.router.get('updateController').updateAll();
  479. },
  480. /**
  481. * genarates data for ajax request to launch install services
  482. * @method generateDataForInstallServices
  483. * @param {Array} selectedServices
  484. * @returns {{context: *, ServiceInfo: {state: string}, urlParams: string}}
  485. */
  486. generateDataForInstallServices: function(selectedServices) {
  487. if (selectedServices.contains('OOZIE')) {
  488. selectedServices = selectedServices.concat(['HDFS', 'YARN', 'MAPREDUCE2']);
  489. }
  490. return {
  491. "context": Em.I18n.t('requestInfo.installServices'),
  492. "ServiceInfo": {"state": "INSTALLED"},
  493. "urlParams": "ServiceInfo/service_name.in(" + selectedServices.join(',') + ")"
  494. };
  495. },
  496. /**
  497. * run this method after success/error callbacks
  498. * for <code>installServicesRequest<code>
  499. */
  500. installServicesComplete: function () {
  501. App.get('router.wizardStep8Controller').set('servicesInstalled', true);
  502. this.setInfoForStep9();
  503. this.saveClusterState('ADD_SERVICES_INSTALLING_3');
  504. App.router.transitionTo('step7');
  505. },
  506. /**
  507. * main method for installinf clients
  508. * @method installServices
  509. */
  510. installServices: function () {
  511. var self = this;
  512. this.set('content.cluster.oldRequestsId', []);
  513. this.installAdditionalClients().done(function () {
  514. self.installSelectedServices();
  515. });
  516. },
  517. installSelectedServices: function () {
  518. var name = 'common.services.update';
  519. var selectedServices = this.get('content.services').filterProperty('isInstalled', false).filterProperty('isSelected', true).mapProperty('serviceName');
  520. var data = this.generateDataForInstallServices(selectedServices);
  521. this.installServicesRequest(name, data, this.installServicesComplete.bind(this));
  522. },
  523. installServicesRequest: function (name, data, callback) {
  524. callback = callback || Em.K;
  525. App.ajax.send({
  526. name: name,
  527. sender: this,
  528. data: data,
  529. success: 'installServicesSuccessCallback',
  530. error: 'installServicesErrorCallback'
  531. }).then(callback, callback);
  532. },
  533. /**
  534. * installs clients before install new services
  535. * on host where some components require this
  536. * @method installAdditionalClients
  537. */
  538. installAdditionalClients: function () {
  539. var dfd = $.Deferred();
  540. if (this.get('content.additionalClients.length') > 0) {
  541. this.get('content.additionalClients').forEach(function (c, k) {
  542. if (c.hostNames.length > 0) {
  543. var queryStr = 'HostRoles/component_name='+ c.componentName + '&HostRoles/host_name.in(' + c.hostNames.join() + ')';
  544. this.get('installClietsQueue').addRequest({
  545. name: 'common.host_component.update',
  546. sender: this,
  547. data: {
  548. query: queryStr,
  549. context: 'Install ' + App.format.role(c.componentName),
  550. HostRoles: {
  551. state: 'INSTALLED'
  552. },
  553. counter: k,
  554. deferred: dfd
  555. },
  556. success: 'installClientSuccess',
  557. error: 'installClientError'
  558. });
  559. }
  560. }, this);
  561. if (this.get('installClietsQueue.queue.length') == 0) {
  562. return dfd.resolve();
  563. } else {
  564. this.set('installClientQueueLength', this.get('installClietsQueue.queue.length'));
  565. App.get('router.wizardStep8Controller').set('servicesInstalled', true);
  566. this.get('installClietsQueue').start();
  567. }
  568. } else {
  569. dfd.resolve();
  570. }
  571. return dfd.promise();
  572. },
  573. /**
  574. * callback for when install clients success
  575. * @param data
  576. * @param opt
  577. * @param params
  578. * @method installClientComplete
  579. */
  580. installClientSuccess: function(data, opt, params) {
  581. if (this.get('installClientQueueLength') - 1 == params.counter) {
  582. params.deferred.resolve();
  583. }
  584. },
  585. /**
  586. * callback for when install clients fail
  587. * @param request
  588. * @param ajaxOptions
  589. * @param error
  590. * @param opt
  591. * @param params
  592. */
  593. installClientError: function(request, ajaxOptions, error, opt, params) {
  594. if (this.get('installClientQueueLength') - 1 == params.counter) {
  595. params.deferred.resolve();
  596. }
  597. },
  598. checkSecurityStatus: function() {
  599. if (App.supports.automatedKerberos) {
  600. if (!App.router.get('mainAdminKerberosController.securityEnabled')) {
  601. this.set('skipConfigureIdentitiesStep', true);
  602. this.get('isStepDisabled').findProperty('step', 5).set('value', true);
  603. }
  604. }
  605. }
  606. });