/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var App = require('app'); App.HostComponent = DS.Model.extend({ workStatus: DS.attr('string'), passiveState: DS.attr('string'), componentName: DS.attr('string'), haStatus: DS.attr('string'), displayNameAdvanced: DS.attr('string'), staleConfigs: DS.attr('boolean'), host: DS.belongsTo('App.Host'), service: DS.belongsTo('App.Service'), /** * Determine if component is client * @returns {bool} */ isClient:function () { if(['PIG', 'SQOOP', 'HCAT', 'MAPREDUCE2_CLIENT'].contains(this.get('componentName'))){ return true; } return Boolean(this.get('componentName').match(/_client/gi)); }.property('componentName'), /** * Determine if component is running now * Based on workStatus * @returns {bool} */ isRunning: function(){ return (this.get('workStatus') == 'STARTED' || this.get('workStatus') == 'STARTING'); }.property('workStatus'), /** * Formatted componentName * @returns {String} */ displayName: function () { return App.format.role(this.get('componentName')); }.property('componentName'), /** * Determine if component is master * @returns {bool} */ isMaster: function () { switch (this.get('componentName')) { case 'NAMENODE': case 'SECONDARY_NAMENODE': case 'SNAMENODE': case 'JOURNALNODE': case 'JOBTRACKER': case 'ZOOKEEPER_SERVER': case 'HIVE_SERVER': case 'HIVE_METASTORE': case 'MYSQL_SERVER': case 'HBASE_MASTER': case 'NAGIOS_SERVER': case 'GANGLIA_SERVER': case 'OOZIE_SERVER': case 'WEBHCAT_SERVER': case 'HUE_SERVER': case 'HISTORYSERVER': case 'FLUME_SERVER': case 'FALCON_SERVER': case 'NIMBUS': case 'STORM_UI_SERVER': case 'LOGVIEWER_SERVER': case 'DRPC_SERVER': case 'RESOURCEMANAGER': case 'APP_TIMELINE_SERVER': return true; default: return false; } }.property('componentName'), /** * Determine if component is slave * @returns {bool} */ isSlave: function(){ switch (this.get('componentName')) { case 'DATANODE': case 'TASKTRACKER': case 'HBASE_REGIONSERVER': case 'GANGLIA_MONITOR': case 'NODEMANAGER': case 'ZKFC': case 'SUPERVISOR': return true; default: return false; } }.property('componentName'), /** * Only certain components can be deleted. * They include some from master components, * some from slave components, and rest from * client components. * @returns {bool} */ isDeletable: function() { var canDelete = false; switch (this.get('componentName')) { case 'DATANODE': case 'TASKTRACKER': case 'ZOOKEEPER_SERVER': case 'HBASE_REGIONSERVER': case 'GANGLIA_MONITOR': case 'SUPERVISOR': case 'NODEMANAGER': canDelete = true; break; default: } if (!canDelete) { canDelete = this.get('isClient'); } return canDelete; }.property('componentName', 'isClient'), /** * A host-component is decommissioning when it is in HDFS service's list of * decomNodes. * @returns {bool} */ isDecommissioning: function () { var decommissioning = false; var hostName = this.get('host.hostName'); var componentName = this.get('componentName'); var hdfsSvc = App.HDFSService.find().objectAt(0); if (componentName === 'DATANODE' && hdfsSvc) { var decomNodes = hdfsSvc.get('decommissionDataNodes'); var decomNode = decomNodes != null ? decomNodes.findProperty("hostName", hostName) : null; decommissioning = decomNode != null; } return decommissioning; }.property('componentName', 'host.hostName', 'App.router.clusterController.isLoaded', 'App.router.updateController.isUpdated'), /** * User friendly host component status * @returns {String} */ componentTextStatus: function () { return App.HostComponentStatus.getTextStatus(this.get("workStatus")); }.property('workStatus','isDecommissioning') }); App.HostComponent.FIXTURES = []; App.HostComponentStatus = { started: "STARTED", starting: "STARTING", stopped: "INSTALLED", stopping: "STOPPING", install_failed: "INSTALL_FAILED", installing: "INSTALLING", upgrade_failed: "UPGRADE_FAILED", unknown: "UNKNOWN", /** * Get host component status in "machine" format * @param {String} value * @returns {String} */ getKeyName:function(value){ switch(value){ case this.started: return 'started'; case this.starting: return 'starting'; case this.stopped: return 'installed'; case this.stopping: return 'stopping'; case this.install_failed: return 'install_failed'; case this.installing: return 'installing'; case this.upgrade_failed: return 'upgrade_failed'; case this.unknown: return 'unknown'; } return 'unknown'; }, /** * Get user-friendly host component status * @param {String} value * @returns {String} */ getTextStatus: function (value) { switch (value) { case this.installing: return 'Installing...'; case this.install_failed: return 'Install Failed'; case this.stopped: return 'Stopped'; case this.started: return 'Started'; case this.starting: return 'Starting...'; case this.stopping: return 'Stopping...'; case this.unknown: return 'Heartbeat lost...'; case this.upgrade_failed: return 'Upgrade Failed'; } return 'Unknown'; } };