host_component_view.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650
  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 uiEffects = require('utils/ui_effects');
  20. App.HostComponentView = Em.View.extend({
  21. templateName: require('templates/main/host/details/host_component'),
  22. /**
  23. * @type {App.HostComponent}
  24. */
  25. content: null,
  26. didInsertElement: function () {
  27. App.tooltip($('[rel=componentHealthTooltip]'));
  28. App.tooltip($('[rel=passiveTooltip]'));
  29. if (this.get('isInProgress')) {
  30. this.doBlinking();
  31. }
  32. if (this.get('isDataNode')){
  33. this.loadDataNodeDecommissionStatus();
  34. }
  35. if (this.get('isNodeManager')){
  36. this.loadNodeManagerDecommissionStatus();
  37. }
  38. if (this.get('isTaskTracker')){
  39. this.loadTaskTrackerDecommissionStatus();
  40. }
  41. if (this.get('isRegionServer')){
  42. this.loadRegionServerDecommissionStatus();
  43. }
  44. },
  45. /**
  46. * @type {App.HostComponent}
  47. */
  48. hostComponent: function () {
  49. var hostComponent = null;
  50. var serviceComponent = this.get('content');
  51. var host = App.router.get('mainHostDetailsController.content');
  52. if (host) {
  53. hostComponent = host.get('hostComponents').findProperty('componentName', serviceComponent.get('componentName'));
  54. }
  55. return hostComponent;
  56. }.property('content', 'App.router.mainHostDetailsController.content'),
  57. /**
  58. * @type {String}
  59. */
  60. workStatus: function () {
  61. var workStatus = this.get('content.workStatus');
  62. var hostComponent = this.get('hostComponent');
  63. if (hostComponent) {
  64. workStatus = hostComponent.get('workStatus');
  65. }
  66. return workStatus;
  67. }.property('content.workStatus', 'hostComponent.workStatus'),
  68. /**
  69. * Return host component text status
  70. * @type {String}
  71. */
  72. componentTextStatus: function () {
  73. if (this.get('content.passiveState') != 'ACTIVE') {
  74. return Em.I18n.t('hosts.component.passive.short.mode');
  75. }
  76. var workStatus = this.get("workStatus");
  77. var componentTextStatus = this.get('content.componentTextStatus');
  78. var hostComponent = this.get('hostComponent');
  79. if (hostComponent) {
  80. componentTextStatus = hostComponent.get('componentTextStatus');
  81. if(this.get("isDataNode") && this.get('isDataNodeRecommissionAvailable')){
  82. if(this.get('isDataNodeDecommissioning')){
  83. componentTextStatus = Em.I18n.t('hosts.host.decommissioning');
  84. } else {
  85. componentTextStatus = Em.I18n.t('hosts.host.decommissioned');
  86. }
  87. }
  88. if(this.get("isNodeManager") && this.get('isNodeManagerRecommissionAvailable')){
  89. if(this.get('isNodeManagerDecommissioning')){
  90. componentTextStatus = Em.I18n.t('hosts.host.decommissioning');
  91. } else {
  92. componentTextStatus = Em.I18n.t('hosts.host.decommissioned');
  93. }
  94. }
  95. if(this.get("isTaskTracker") && this.get('isTaskTrackerRecommissionAvailable')){
  96. if(this.get('isTaskTrackerDecommissioning')){
  97. componentTextStatus = Em.I18n.t('hosts.host.decommissioning');
  98. } else {
  99. componentTextStatus = Em.I18n.t('hosts.host.decommissioned');
  100. }
  101. }
  102. if(this.get("isRegionServer") && this.get('isRegionServerRecommissionAvailable')){
  103. if(this.get('isRegionServerDecommissioning')){
  104. componentTextStatus = Em.I18n.t('hosts.host.decommissioning');
  105. } else {
  106. componentTextStatus = Em.I18n.t('hosts.host.decommissioned');
  107. }
  108. }
  109. }
  110. return componentTextStatus;
  111. }.property('content.passiveState','workStatus','isDataNodeRecommissionAvailable', 'isDataNodeDecommissioning', 'isNodeManagerRecommissionAvailable', 'isNodeManagerDecommissioning',
  112. 'isTaskTrackerRecommissionAvailable', 'isTaskTrackerDecommissioning', 'isRegionServerRecommissionAvailable', 'isRegionServerDecommissioning'),
  113. /**
  114. * @type {String}
  115. */
  116. passiveImpliedTextStatus: function() {
  117. if(this.get('parentView.content.passiveState') === 'PASSIVE') {
  118. return Em.I18n.t('hosts.component.passive.implied.host.mode.tooltip');
  119. }
  120. else
  121. if(this.get('content.service.passiveState') === 'PASSIVE') {
  122. return Em.I18n.t('hosts.component.passive.implied.service.mode.tooltip').format(this.get('content.service.serviceName'));
  123. }
  124. return '';
  125. }.property('content.passiveState','parentView.content.passiveState'),
  126. statusClass: function () {
  127. //If the component is DataNode
  128. if (this.get('isDataNode')) {
  129. if (this.get('isDataNodeRecommissionAvailable') && (this.get('isStart') || this.get('workStatus') == 'INSTALLED')) {
  130. return 'health-status-DEAD-ORANGE';
  131. }
  132. }
  133. //If the component is NodeManager
  134. if (this.get('isNodeManager')) {
  135. if (this.get('isNodeManagerRecommissionAvailable') && (this.get('isStart') || this.get('workStatus') == 'INSTALLED')) {
  136. return 'health-status-DEAD-ORANGE';
  137. }
  138. }
  139. //If the component is TaskTracker
  140. if (this.get('isTaskTracker')) {
  141. if (this.get('isTaskTrackerRecommissionAvailable') && (this.get('isStart') || this.get('workStatus') == 'INSTALLED')) {
  142. return 'health-status-DEAD-ORANGE';
  143. }
  144. }
  145. //If the component is RegionServer
  146. if (this.get('isRegionServer')) {
  147. if (this.get('isRegionServerRecommissionAvailable') && (this.get('isStart') || this.get('workStatus') == 'INSTALLED')) {
  148. return 'health-status-DEAD-ORANGE';
  149. }
  150. }
  151. //Class when install failed
  152. if (this.get('workStatus') === App.HostComponentStatus.install_failed) {
  153. return 'health-status-color-red icon-cog';
  154. }
  155. //Class when installing
  156. if (this.get('workStatus') === App.HostComponentStatus.installing) {
  157. return 'health-status-color-blue icon-cog';
  158. }
  159. //Class when maintenance
  160. if (this.get('content.passiveState') != "ACTIVE") {
  161. return 'icon-medkit';
  162. }
  163. //For all other cases
  164. return 'health-status-' + App.HostComponentStatus.getKeyName(this.get('workStatus'));
  165. }.property('content.passiveState','workStatus', 'isDataNodeRecommissionAvailable', 'isNodeManagerRecommissionAvailable', 'isTaskTrackerRecommissionAvailable', 'isRegionServerRecommissionAvailable'),
  166. /**
  167. * @type {String}
  168. */
  169. disabled: function () {
  170. return (this.get('parentView.content.healthClass') === "health-status-DEAD-YELLOW") ? 'disabled' : '';
  171. }.property('parentView.content.healthClass'),
  172. /**
  173. * For Upgrade failed state
  174. */
  175. isUpgradeFailed: function () {
  176. return App.HostComponentStatus.getKeyName(this.get('workStatus')) === "upgrade_failed";
  177. }.property("workStatus"),
  178. /**
  179. * For Install failed state
  180. */
  181. isInstallFailed: function () {
  182. return App.HostComponentStatus.getKeyName(this.get('workStatus')) === "install_failed";
  183. }.property("workStatus"),
  184. /**
  185. * Do blinking for 1 minute
  186. */
  187. doBlinking: function () {
  188. var workStatus = this.get('workStatus');
  189. var self = this;
  190. var pulsate = [ App.HostComponentStatus.starting, App.HostComponentStatus.stopping, App.HostComponentStatus.installing].contains(workStatus);
  191. if (!pulsate && (this.get('isDataNode') || this.get('isRegionServer') || this.get('isNodeManager') || this.get('isTaskTracker'))) {
  192. var component = this.get('content');
  193. if (component && workStatus != "INSTALLED") {
  194. pulsate = this.get('isDecommissioning');
  195. }
  196. }
  197. if (pulsate && !self.get('isBlinking')) {
  198. self.set('isBlinking', true);
  199. uiEffects.pulsate(self.$('.components-health'), 1000, function () {
  200. self.set('isBlinking', false);
  201. self.doBlinking();
  202. });
  203. }
  204. },
  205. /**
  206. * Start blinking when host component is starting/stopping/decommissioning
  207. */
  208. startBlinking: function () {
  209. this.$('.components-health').stop(true, true);
  210. this.$('.components-health').css({opacity: 1.0});
  211. this.doBlinking();
  212. }.observes('workStatus','isDataNodeRecommissionAvailable', 'isDecommissioning', 'isRegionServerRecommissionAvailable',
  213. 'isNodeManagerRecommissionAvailable', 'isTaskTrackerRecommissionAvailable'),
  214. isStart: function () {
  215. return (this.get('workStatus') == App.HostComponentStatus.started || this.get('workStatus') == App.HostComponentStatus.starting);
  216. }.property('workStatus'),
  217. isStop: function () {
  218. return (this.get('workStatus') == App.HostComponentStatus.stopped);
  219. }.property('workStatus'),
  220. isInstalling: function () {
  221. return (this.get('workStatus') == App.HostComponentStatus.installing);
  222. }.property('workStatus'),
  223. /**
  224. * No action available while component is starting/stopping/unknown
  225. */
  226. noActionAvailable: function () {
  227. var workStatus = this.get('workStatus');
  228. if ([App.HostComponentStatus.starting, App.HostComponentStatus.stopping, App.HostComponentStatus.unknown].contains(workStatus)) {
  229. return "hidden";
  230. }else{
  231. return "";
  232. }
  233. }.property('workStatus'),
  234. isInProgress: function () {
  235. return (this.get('workStatus') === App.HostComponentStatus.stopping ||
  236. this.get('workStatus') === App.HostComponentStatus.starting) ||
  237. this.get('isDecommissioning');
  238. }.property('workStatus', 'isDecommissioning'),
  239. isDataNode: function () {
  240. return this.get('content.componentName') === 'DATANODE';
  241. }.property('content'),
  242. isNodeManager: function () {
  243. return this.get('content.componentName') === 'NODEMANAGER';
  244. }.property('content'),
  245. isTaskTracker: function () {
  246. return this.get('content.componentName') === 'TASKTRACKER';
  247. }.property('content'),
  248. isRegionServer: function () {
  249. return this.get('content.componentName') === 'HBASE_REGIONSERVER';
  250. }.property('content'),
  251. isActive: function () {
  252. return (this.get('content.passiveState') == "ACTIVE");
  253. }.property('content.passiveState'),
  254. isImplied: function() {
  255. return (this.get('parentView.content.passiveState') === 'PASSIVE' || this.get('content.service.passiveState') === 'PASSIVE');
  256. }.property('content.passiveState'),
  257. isDecommissioning: function () {
  258. return ( (this.get('isDataNode') && this.get("isDataNodeDecommissioning")) || (this.get('isRegionServer') && this.get("isRegionServerDecommissioning"))
  259. || (this.get('isNodeManager') && this.get("isNodeManagerDecommissioning")) || (this.get('isTaskTracker') && this.get('isTaskTrackerDecommissioning')));
  260. }.property("workStatus", "isDataNodeDecommissioning", "isRegionServerDecommissioning", "isNodeManagerDecommissioning", "isTaskTrackerDecommissioning"),
  261. isDataNodeDecommissioning: null,
  262. isDataNodeDecommissionAvailable: null,
  263. isDataNodeRecommissionAvailable: null,
  264. /**
  265. * load Recommission/Decommission status from adminState of each live node
  266. */
  267. loadDataNodeDecommissionStatus: function () {
  268. var clusterName = App.router.get('clusterController.clusterName');
  269. var hostName = App.router.get('mainHostDetailsController.content.hostName');
  270. var componentName = 'NAMENODE';
  271. var slaveType = 'DATANODE';
  272. var version = App.get('currentStackVersionNumber');
  273. var dfd = $.Deferred();
  274. var self = this;
  275. this.getDNDecommissionStatus(clusterName, hostName, componentName).done(function () {
  276. var curObj = self.get('decommissionedStatusObject');
  277. self.set('decommissionedStatusObject', null);
  278. // HDP-2 stack
  279. if (version.charAt(0) == 2) {
  280. if (curObj) {
  281. var liveNodesJson = App.parseJSON(curObj.LiveNodes);
  282. if (liveNodesJson && liveNodesJson[hostName] ) {
  283. switch(liveNodesJson[hostName].adminState) {
  284. case "In Service":
  285. self.set('isDataNodeRecommissionAvailable', false);
  286. self.set('isDataNodeDecommissioning', false);
  287. self.set('isDataNodeDecommissionAvailable', self.get('isStart'));
  288. break;
  289. case "Decommission In Progress":
  290. self.set('isDataNodeRecommissionAvailable', true);
  291. self.set('isDataNodeDecommissioning', true);
  292. self.set('isDataNodeDecommissionAvailable', false);
  293. break;
  294. case "Decommissioned":
  295. self.set('isDataNodeRecommissionAvailable', true);
  296. self.set('isDataNodeDecommissioning', false);
  297. self.set('isDataNodeDecommissionAvailable', false);
  298. break;
  299. }
  300. } else {
  301. // if namenode is down, get desired_admin_state to decide if the user had issued a decommission
  302. var deferred = $.Deferred();
  303. self.getDesiredAdminState(clusterName, hostName, slaveType).done( function () {
  304. var desired_admin_state = self.get('desiredAdminState');
  305. self.set('desiredAdminState', null);
  306. switch(desired_admin_state) {
  307. case "INSERVICE":
  308. self.set('isDataNodeRecommissionAvailable', false);
  309. self.set('isDataNodeDecommissioning', false);
  310. self.set('isDataNodeDecommissionAvailable', self.get('isStart'));
  311. break;
  312. case "DECOMMISSIONED":
  313. self.set('isDataNodeRecommissionAvailable', true);
  314. self.set('isDataNodeDecommissioning', false);
  315. self.set('isDataNodeDecommissionAvailable', false);
  316. break;
  317. }
  318. deferred.resolve(desired_admin_state);
  319. });
  320. }
  321. }
  322. }
  323. // HDP-1 stack
  324. if (version.charAt(0) == 1) {
  325. if (curObj) {
  326. var liveNodesJson = App.parseJSON(curObj.LiveNodes);
  327. var decomNodesJson = App.parseJSON(curObj.DecomNodes);
  328. var deadNodesJson = App.parseJSON(curObj.DeadNodes);
  329. if (decomNodesJson && decomNodesJson[hostName] ) {
  330. self.set('isDataNodeRecommissionAvailable', true);
  331. self.set('isDataNodeDecommissioning', true);
  332. self.set('isDataNodeDecommissionAvailable', false);
  333. } else if (deadNodesJson && deadNodesJson[hostName] ) {
  334. self.set('isDataNodeRecommissionAvailable', true);
  335. self.set('isDataNodeDecommissioning', false);
  336. self.set('isDataNodeDecommissionAvailable', false);
  337. } else if (liveNodesJson && liveNodesJson[hostName] ) {
  338. self.set('isDataNodeRecommissionAvailable', false);
  339. self.set('isDataNodeDecommissioning', false);
  340. self.set('isDataNodeDecommissionAvailable', self.get('isStart'));
  341. } else {
  342. // if namenode is down, get desired_admin_state to decide if the user had issued a decommission
  343. var deferred = $.Deferred();
  344. self.getDesiredAdminState(clusterName, hostName, slaveType).done( function () {
  345. var desired_admin_state = self.get('desiredAdminState');
  346. self.set('desiredAdminState', null);
  347. switch(desired_admin_state) {
  348. case "INSERVICE":
  349. self.set('isDataNodeRecommissionAvailable', false);
  350. self.set('isDataNodeDecommissioning', false);
  351. self.set('isDataNodeDecommissionAvailable', self.get('isStart'));
  352. break;
  353. case "DECOMMISSIONED":
  354. self.set('isDataNodeRecommissionAvailable', true);
  355. self.set('isDataNodeDecommissioning', false);
  356. self.set('isDataNodeDecommissionAvailable', false);
  357. break;
  358. }
  359. deferred.resolve(desired_admin_state);
  360. });
  361. }
  362. }
  363. }
  364. dfd.resolve(curObj);
  365. });
  366. return dfd.promise();
  367. }.observes('App.router.mainHostDetailsController.content'),
  368. /**
  369. * get datanodes decommission status: from NAMENODE component, liveNodes property
  370. */
  371. getDNDecommissionStatus: function(clusterName, hostName, componentName){
  372. return App.ajax.send({
  373. name: 'host.host_component.datanodes_decommission_status',
  374. sender: this,
  375. data: {
  376. clusterName: clusterName,
  377. hostName: hostName,
  378. componentName: componentName
  379. },
  380. success: 'getDNDecommissionStatusSuccessCallback',
  381. error: 'getDNDecommissionStatusErrorCallback'
  382. });
  383. },
  384. decommissionedStatusObject: null,
  385. getDNDecommissionStatusSuccessCallback: function (response, request, data) {
  386. var statusObject = response.ServiceComponentInfo;
  387. if ( statusObject != null) {
  388. this.set('decommissionedStatusObject', statusObject);
  389. return statusObject;
  390. }
  391. },
  392. getDNDecommissionStatusErrorCallback: function (request, ajaxOptions, error) {
  393. console.log('ERROR: '+ error);
  394. this.set('decommissionedStatusObject', null);
  395. return null;
  396. },
  397. /**
  398. * get desired_admin_state status of DataNode, TaskTracker, NodeManager and RegionServer
  399. */
  400. getDesiredAdminState: function(clusterName, hostName, componentName){
  401. return App.ajax.send({
  402. name: 'host.host_component.slave_desired_admin_state',
  403. sender: this,
  404. data: {
  405. clusterName: clusterName,
  406. hostName: hostName,
  407. componentName: componentName
  408. },
  409. success: 'getDesiredAdminStateSuccessCallback',
  410. error: 'getDesiredAdminStateErrorCallback'
  411. });
  412. },
  413. desiredAdminState: null,
  414. getDesiredAdminStateSuccessCallback: function (response, request, data) {
  415. var status = response.HostRoles.desired_admin_state;
  416. if ( status != null) {
  417. this.set('desiredAdminState', status);
  418. return status;
  419. }
  420. },
  421. getDesiredAdminStateErrorCallback: function (request, ajaxOptions, error) {
  422. console.log('ERROR: '+ error);
  423. this.set('desiredAdminState', null);
  424. return null;
  425. },
  426. isNodeManagerDecommissionAvailable: null,
  427. isNodeManagerRecommissionAvailable: null,
  428. isNodeManagerDecommissioning: null,
  429. /**
  430. * load Recommission/Decommission status for nodeManager from nodeManagers list
  431. */
  432. loadNodeManagerDecommissionStatus: function () {
  433. var clusterName = App.router.get('clusterController.clusterName');
  434. var hostName = App.router.get('mainHostDetailsController.content.hostName');
  435. var componentName = 'RESOURCEMANAGER';
  436. var slaveType = 'NODEMANAGER';
  437. var dfd = $.Deferred();
  438. var self = this;
  439. this.getDesiredAdminState(clusterName, hostName, slaveType).done( function () {
  440. var desired_admin_state = self.get('desiredAdminState');
  441. self.set('desiredAdminState', null);
  442. switch(desired_admin_state) {
  443. case "INSERVICE":
  444. // can be decommissioned if already started
  445. self.set('isNodeManagerRecommissionAvailable', false);
  446. self.set('isNodeManagerDecommissioning', false);
  447. self.set('isNodeManagerDecommissionAvailable', self.get('isStart'));
  448. break;
  449. case "DECOMMISSIONED":
  450. var deferred = $.Deferred();
  451. self.getNMDecommissionStatus(clusterName, hostName, componentName).done( function() {
  452. var curObj = self.get('decommissionedStatusObject');
  453. self.set('decommissionedStatusObject', null);
  454. if (curObj && curObj.rm_metrics) {
  455. var nodeManagersArray = App.parseJSON(curObj.rm_metrics.cluster.nodeManagers);
  456. if (nodeManagersArray.findProperty('HostName', hostName)){
  457. // decommisioning ..
  458. self.set('isNodeManagerRecommissionAvailable', true);
  459. self.set('isNodeManagerDecommissioning', true);
  460. self.set('isNodeManagerDecommissionAvailable', false);
  461. } else {
  462. // decommissioned ..
  463. self.set('isNodeManagerRecommissionAvailable', true);
  464. self.set('isNodeManagerDecommissioning', false);
  465. self.set('isNodeManagerDecommissionAvailable', false);
  466. }
  467. }
  468. deferred.resolve(curObj);
  469. });
  470. break;
  471. }
  472. dfd.resolve(desired_admin_state);
  473. });
  474. return dfd.promise();
  475. }.observes('App.router.mainHostDetailsController.content'),
  476. /**
  477. * get NodeManager decommission status: from RESOURCEMANAGER component, rm_metrics/nodeManagers property
  478. */
  479. getNMDecommissionStatus: function(clusterName, hostName, componentName){
  480. return App.ajax.send({
  481. name: 'host.host_component.nodemanager_decommission_status',
  482. sender: this,
  483. data: {
  484. clusterName: clusterName,
  485. hostName: hostName,
  486. componentName: componentName
  487. },
  488. success: 'getDNDecommissionStatusSuccessCallback',
  489. error: 'getDNDecommissionStatusErrorCallback'
  490. });
  491. },
  492. isTaskTrackerDecommissionAvailable: null,
  493. isTaskTrackerRecommissionAvailable: null,
  494. isTaskTrackerDecommissioning: null,
  495. /**
  496. * load Recommission/Decommission status for TaskTracker from JobTracker/AliveNodes list
  497. */
  498. loadTaskTrackerDecommissionStatus: function () {
  499. var clusterName = App.router.get('clusterController.clusterName');
  500. var hostName = App.router.get('mainHostDetailsController.content.hostName');
  501. var componentName = 'JOBTRACKER';
  502. var slaveType = 'TASKTRACKER';
  503. var dfd = $.Deferred();
  504. var self = this;
  505. this.getDesiredAdminState(clusterName, hostName, slaveType).done( function () {
  506. var desired_admin_state = self.get('desiredAdminState');
  507. self.set('desiredAdminState', null);
  508. switch(desired_admin_state) {
  509. case "INSERVICE":
  510. // can be decommissioned if already started
  511. self.set('isTaskTrackerRecommissionAvailable', false);
  512. self.set('isTaskTrackerDecommissioning', false);
  513. self.set('isTaskTrackerDecommissionAvailable', self.get('isStart'));
  514. break;
  515. case "DECOMMISSIONED":
  516. var deferred = $.Deferred();
  517. self.getTTDecommissionStatus(clusterName, hostName, componentName).done( function() {
  518. var curObj = self.get('decommissionedStatusObject');
  519. self.set('decommissionedStatusObject', null);
  520. if (curObj) {
  521. var aliveNodesArray = App.parseJSON(curObj.AliveNodes);
  522. if (aliveNodesArray != null) {
  523. if (aliveNodesArray.findProperty('hostname', hostName)){
  524. //decommissioning ..
  525. self.set('isTaskTrackerRecommissionAvailable', true);
  526. self.set('isTaskTrackerDecommissioning', true);
  527. self.set('isTaskTrackerDecommissionAvailable', false);
  528. } else {
  529. //decommissioned
  530. self.set('isTaskTrackerRecommissionAvailable', true);
  531. self.set('isTaskTrackerDecommissioning', false);
  532. self.set('isTaskTrackerDecommissionAvailable', false);
  533. }
  534. }
  535. }
  536. deferred.resolve(curObj);
  537. });
  538. break;
  539. }
  540. dfd.resolve(desired_admin_state);
  541. });
  542. return dfd.promise();
  543. }.observes('App.router.mainHostDetailsController.content'),
  544. /**
  545. * get TaskTracker decommission status: from JobTracker component, AliveNodes property
  546. */
  547. getTTDecommissionStatus: function(clusterName, hostName, componentName){
  548. return App.ajax.send({
  549. name: 'host.host_component.tasktracker_decommission_status',
  550. sender: this,
  551. data: {
  552. clusterName: clusterName,
  553. hostName: hostName,
  554. componentName: componentName
  555. },
  556. success: 'getDNDecommissionStatusSuccessCallback',
  557. error: 'getDNDecommissionStatusErrorCallback'
  558. });
  559. },
  560. isRegionServerDecommissioning: null,
  561. isRegionServerDecommissionAvailable: null,
  562. isRegionServerRecommissionAvailable: null,
  563. /**
  564. * load Recommission/Decommission status of RegionServer
  565. */
  566. loadRegionServerDecommissionStatus: function () {
  567. var clusterName = App.router.get('clusterController.clusterName');
  568. var hostName = App.router.get('mainHostDetailsController.content.hostName');
  569. var slaveType = 'HBASE_REGIONSERVER';
  570. var self = this;
  571. var deferred = $.Deferred();
  572. self.getDesiredAdminState(clusterName, hostName, slaveType).done( function () {
  573. var desired_admin_state = self.get('desiredAdminState');
  574. self.set('desiredAdminState', null);
  575. switch(desired_admin_state) {
  576. case "INSERVICE":
  577. self.set('isRegionServerRecommissionAvailable', false);
  578. self.set('isRegionServerDecommissioning', false);
  579. self.set('isRegionServerDecommissionAvailable', self.get('isStart'));
  580. break;
  581. case "DECOMMISSIONED":
  582. self.set('isRegionServerRecommissionAvailable', true);
  583. self.set('isRegionServerDecommissioning', self.get('isStart'));
  584. self.set('isRegionServerDecommissionAvailable', false);
  585. break;
  586. }
  587. deferred.resolve(desired_admin_state);
  588. });
  589. return deferred.promise();
  590. }.observes('App.router.mainHostDetailsController.content'),
  591. /**
  592. * Shows whether we need to show Delete button
  593. */
  594. isDeletableComponent: function () {
  595. return App.get('components.deletable').contains(this.get('content.componentName'));
  596. }.property('content'),
  597. isDeleteComponentDisabled: function () {
  598. return !(this.get('workStatus') == App.HostComponentStatus.stopped || this.get('workStatus') == App.HostComponentStatus.unknown ||
  599. this.get('workStatus') == App.HostComponentStatus.install_failed || this.get('workStatus') == App.HostComponentStatus.upgrade_failed);
  600. }.property('workStatus'),
  601. isReassignable: function () {
  602. return App.supports.reassignMaster && App.get('components.reassignable').contains(this.get('content.componentName')) && App.Host.find().content.length > 1;
  603. }.property('content.componentName'),
  604. isRestartableComponent: function() {
  605. return App.get('components.restartable').contains(this.get('content.componentName'));
  606. }.property('content'),
  607. isRestartComponentDisabled: function() {
  608. var allowableStates = [App.HostComponentStatus.started];
  609. return !allowableStates.contains(this.get('workStatus'));
  610. }.property('workStatus')
  611. });