| /** |
| * 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'); |
| require('utils/config'); |
| |
| App.Service = DS.Model.extend({ |
| |
| serviceName: DS.attr('string'), |
| |
| workStatus: DS.attr('string'), |
| rand: DS.attr('string'), |
| alerts: DS.hasMany('App.Alert'), |
| quickLinks: DS.hasMany('App.QuickLinks'), |
| hostComponents: DS.hasMany('App.HostComponent'), |
| serviceConfigsTemplate: App.config.get('preDefinedServiceConfigs'), |
| runningHostComponents: DS.hasMany('App.HostComponent'), |
| unknownHostComponents: DS.hasMany('App.HostComponent'), |
| |
| // Instead of making healthStatus a computed property that listens on hostComponents.@each.workStatus, |
| // we are creating a separate observer _updateHealthStatus. This is so that healthStatus is updated |
| // only once after the run loop. This is because Ember invokes the computed property every time |
| // a property that it depends on changes. For example, App.statusMapper's map function would invoke |
| // the computed property too many times and freezes the UI without this hack. |
| // See http://stackoverflow.com/questions/12467345/ember-js-collapsing-deferring-expensive-observers-or-computed-properties |
| healthStatus: '', |
| isStopped: false, |
| isStarted: false, |
| |
| isConfigurable: function () { |
| var configurableServices = [ |
| "HDFS", |
| "YARN", |
| "MAPREDUCE", |
| "MAPREDUCE2", |
| "HBASE", |
| "OOZIE", |
| "HIVE", |
| "WEBHCAT", |
| "ZOOKEEPER", |
| "PIG", |
| "SQOOP", |
| "NAGIOS", |
| "GANGLIA", |
| "HUE" |
| ]; |
| return configurableServices.contains(this.get('serviceName')); |
| }.property('serviceName'), |
| |
| displayName: function () { |
| return App.Service.DisplayNames[this.get('serviceName')]; |
| }.property('serviceName'), |
| |
| /** |
| * For each host-component, if the desired_configs dont match the |
| * actual_configs, then a restart is required. Except for Global site |
| * properties, which need to be checked with map. |
| */ |
| isRestartRequired: function () { |
| var rhc = this.get('hostComponents').filterProperty('staleConfigs', true); |
| var hc = {}; |
| rhc.forEach(function(_rhc) { |
| var hostName = _rhc.get('host.publicHostName'); |
| if (!hc[hostName]) { |
| hc[hostName] = []; |
| } |
| hc[hostName].push(_rhc.get('displayName')); |
| }); |
| this.set('restartRequiredHostsAndComponents', hc); |
| return (rhc.length>0); |
| |
| }.property('serviceName', 'hostComponents.@each.staleConfigs'), |
| |
| /** |
| * Contains a map of which hosts and host_components |
| * need a restart. This is populated when calculating |
| * #isRestartRequired() |
| * Example: |
| * { |
| * 'publicHostName1': ['TaskTracker'], |
| * 'publicHostName2': ['JobTracker', 'TaskTracker'] |
| * } |
| */ |
| restartRequiredHostsAndComponents: {}, |
| |
| /** |
| * Based on the information in #restartRequiredHostsAndComponents |
| */ |
| restartRequiredMessage: function () { |
| var restartHC = this.get('restartRequiredHostsAndComponents'); |
| var hostCount = 0; |
| var hcCount = 0; |
| var hostsMsg = "<ul>"; |
| for(var host in restartHC){ |
| hostCount++; |
| hostsMsg += "<li>"+host+"</li><ul>"; |
| restartHC[host].forEach(function(c){ |
| hcCount++; |
| hostsMsg += "<li>"+c+"</li>"; |
| }) |
| hostsMsg += "</ul>"; |
| } |
| hostsMsg += "</ul>" |
| return this.t('services.service.config.restartService.TooltipMessage').format(hcCount, hostCount, hostsMsg); |
| }.property('restartRequiredHostsAndComponents') |
| }); |
| |
| App.Service.Health = { |
| live: "LIVE", |
| dead: "DEAD-RED", |
| starting: "STARTING", |
| stopping: "STOPPING", |
| unknown: "DEAD-YELLOW", |
| |
| getKeyName: function (value) { |
| switch (value) { |
| case this.live: |
| return 'live'; |
| case this.dead: |
| return 'dead'; |
| case this.starting: |
| return 'starting'; |
| case this.stopping: |
| return 'stopping'; |
| case this.unknown: |
| return 'unknown'; |
| } |
| return 'none'; |
| } |
| }; |
| |
| App.Service.DisplayNames = { |
| 'HDFS': 'HDFS', |
| 'YARN': 'YARN', |
| 'MAPREDUCE': 'MapReduce', |
| 'MAPREDUCE2': 'MapReduce2', |
| 'TEZ': 'Tez', |
| 'HBASE': 'HBase', |
| 'OOZIE': 'Oozie', |
| 'HIVE': 'Hive', |
| 'HCATALOG': 'HCat', |
| 'ZOOKEEPER': 'ZooKeeper', |
| 'PIG': 'Pig', |
| 'SQOOP': 'Sqoop', |
| 'WEBHCAT': 'WebHCat', |
| 'GANGLIA': 'Ganglia', |
| 'NAGIOS': 'Nagios', |
| 'HUE': 'Hue', |
| 'FLUME': 'Flume' |
| }; |
| |
| App.Service.servicesSortOrder = [ |
| 'HDFS', |
| 'YARN', |
| 'MAPREDUCE', |
| 'MAPREDUCE2', |
| 'TEZ', |
| 'HBASE', |
| 'HIVE', |
| 'HCATALOG', |
| 'WEBHCAT', |
| 'FLUME', |
| 'OOZIE', |
| 'GANGLIA', |
| 'NAGIOS', |
| 'ZOOKEEPER', |
| 'PIG', |
| 'SQOOP', |
| 'HUE' |
| ]; |
| |
| App.Service.FIXTURES = []; |