You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by yu...@apache.org on 2012/10/20 19:29:52 UTC
svn commit: r1400492 - in /incubator/ambari/branches/AMBARI-666: ./
ambari-web/app/ ambari-web/app/controllers/installer/
ambari-web/app/routes/ ambari-web/app/styles/
ambari-web/app/templates/installer/ ambari-web/app/utils/
ambari-web/app/views/insta...
Author: yusaku
Date: Sat Oct 20 17:29:51 2012
New Revision: 1400492
URL: http://svn.apache.org/viewvc?rev=1400492&view=rev
Log:
AMBARI-890. Add client library option to step6 (Assign slaves) of installer wizard. Also add indicator and popovers for hosts with master component. (Jaimin Jetly via yusaku)
Modified:
incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt
incubator/ambari/branches/AMBARI-666/ambari-web/app/controllers/installer/step5_controller.js
incubator/ambari/branches/AMBARI-666/ambari-web/app/controllers/installer/step6_controller.js
incubator/ambari/branches/AMBARI-666/ambari-web/app/messages.js
incubator/ambari/branches/AMBARI-666/ambari-web/app/routes/installer.js
incubator/ambari/branches/AMBARI-666/ambari-web/app/styles/application.less
incubator/ambari/branches/AMBARI-666/ambari-web/app/templates/installer/step6.hbs
incubator/ambari/branches/AMBARI-666/ambari-web/app/utils/db.js
incubator/ambari/branches/AMBARI-666/ambari-web/app/views/installer/step6_view.js
Modified: incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt?rev=1400492&r1=1400491&r2=1400492&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt (original)
+++ incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt Sat Oct 20 17:29:51 2012
@@ -12,8 +12,12 @@ AMBARI-666 branch (unreleased changes)
NEW FEATURES
+ AMBARI-890. Add client library option to step6 (Assign slaves) of
+ installer wizard. Also add indicator and popovers for hosts with
+ master component. (Jaimin Jetly via yusaku)
+
AMBARI-889. Provide cluster metric graphs on Ambari main dashboard.
- (yusaku)
+ (Srimanth Gunturi via yusaku)
AMBARI-886. Support filters in controller get* apis. (hitesh)
Modified: incubator/ambari/branches/AMBARI-666/ambari-web/app/controllers/installer/step5_controller.js
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-web/app/controllers/installer/step5_controller.js?rev=1400492&r1=1400491&r2=1400492&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-web/app/controllers/installer/step5_controller.js (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-web/app/controllers/installer/step5_controller.js Sat Oct 20 17:29:51 2012
@@ -576,9 +576,28 @@ App.InstallerStep5Controller = Em.Contro
});
App.db.setMasterComponentHosts(masterComponentHosts);
+ this.saveHostToMasterComponents();
},
+ saveHostToMasterComponents: function () {
+ var hostMasterComponents = App.db.getMasterComponentHosts();
+ var hosts = hostMasterComponents.mapProperty('hostName').uniq();
+ var hostsMasterServicesMapping = [];
+ hosts.forEach(function (_host) {
+ var componentsOnHost = hostMasterComponents.filterProperty('hostName', _host).mapProperty('component');
+ hostsMasterServicesMapping.push({
+ hostname: _host,
+ components: componentsOnHost
+ });
+ }, this);
+ App.db.setHostToMasterComponent(hostsMasterServicesMapping);
+ App.db.getHostToMasterComponent().forEach(function (_hostcomponent) {
+ console.log("INFO: the name of this thimg is: " + _hostcomponent.hostname);
+ console.log("INFO: the name of this thimg is: " + _hostcomponent.components);
+ }, this);
+ },
+
submit: function () {
this.saveComponentHostsToDb();
App.router.send('next');
Modified: incubator/ambari/branches/AMBARI-666/ambari-web/app/controllers/installer/step6_controller.js
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-web/app/controllers/installer/step6_controller.js?rev=1400492&r1=1400491&r2=1400492&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-web/app/controllers/installer/step6_controller.js (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-web/app/controllers/installer/step6_controller.js Sat Oct 20 17:29:51 2012
@@ -34,240 +34,276 @@ var db = require('utils/db');
*/
App.InstallerStep6Controller = Em.Controller.extend({
- hosts: [],
- // TODO: hook up with user host selection
- rawHosts: [],
- selectedServiceNames: [],
- masterComponentHosts: require('data/mock/master_component_hosts'),
- showHbase: false,
- showTaskTracker: false,
-
-
- hasMasterComponents: function (hostname) {
- var hasMaster = false;
- var masterComponentHosts = db.getMasterComponentHosts();
- return masterComponentHosts.someProperty('hostName', hostname);
- },
-
-
- isAllDataNodes: function () {
- return this.get('hosts').everyProperty('isDataNode', true);
- }.property('hosts.@each.isDataNode'),
-
- isAllTaskTrackers: function () {
- return this.get('hosts').everyProperty('isTaskTracker', true);
- }.property('hosts.@each.isTaskTracker'),
-
- isAllRegionServers: function () {
- return this.get('hosts').everyProperty('isRegionServer', true);
- }.property('hosts.@each.isRegionServer'),
-
- isNoDataNodes: function () {
- return this.get('hosts').everyProperty('isDataNode', false);
- }.property('hosts.@each.isDataNode'),
-
- isNoTaskTrackers: function () {
- return this.get('hosts').everyProperty('isTaskTracker', false);
- }.property('hosts.@each.isTaskTracker'),
-
- isNoRegionServers: function () {
- return this.get('hosts').everyProperty('isRegionServer', false);
- }.property('hosts.@each.isRegionServer'),
-
- isHbaseSelected: function () {
- var services = db.getSelectedServiceNames();
- return this.get('selectedServiceNames').contains('HBASE');
- },
-
- isMrSelected: function () {
- return this.get('selectedServiceNames').contains('MAPREDUCE');
- }.property('selectedServiceNames'),
-
- clearError: function () {
- if (this.get('isNoDataNodes') === false && this.get('isNoTaskTrackers') === false && this.get('isNoRegionServers') === false) {
- this.set('errorMessage', '');
- }
- }.observes('isNoDataNodes', 'isNoTaskTrackers', 'isNoRegionServers'),
-
- selectAllDataNodes: function () {
- this.get('hosts').setEach('isDataNode', true);
- },
-
- selectAllTaskTrackers: function () {
- this.get('hosts').setEach('isTaskTracker', true);
- },
-
- selectAllRegionServers: function () {
- this.get('hosts').setEach('isRegionServer', true);
- },
-
- deselectAllDataNodes: function () {
- this.get('hosts').setEach('isDataNode', false);
- },
-
- deselectAllTaskTrackers: function () {
- this.get('hosts').setEach('isTaskTracker', false);
- },
-
- deselectAllRegionServers: function () {
- this.get('hosts').setEach('isRegionServer', false);
- },
-
-
- clearStep: function () {
- this.set('hosts', []);
- this.set('selectedServiceNames', []);
- this.clearError();
- },
-
- loadStep: function () {
- console.log("TRACE: Loading step6: Assign Slaves");
- this.clearStep();
- this.set('selectedServiceNames', db.getSelectedServiceNames());
- this.set('showHbase', this.isHbaseSelected());
- this.set('showTaskTracker', this.get('isMrSelected'));
- this.setSlaveHost(this.getSlaveHosts());
- },
-
- getHostNames: function () {
- var hostInfo = db.getHosts();
- var hostNames = [];
- for (var index in hostInfo) {
- if (hostInfo[index].bootStatus === 'success')
- hostNames.push(hostInfo[index].name);
- }
- return hostNames;
- },
-
- getSlaveHosts: function () {
- var hostObjs = new Ember.Set();
- var allHosts = this.getHostNames();
- var slaveHosts = App.db.getSlaveComponentHosts();
- if (slaveHosts === undefined || slaveHosts === null) {
- allHosts.forEach(function (_hostname) {
- var hostObj = {};
- hostObj.hostname = _hostname;
- hostObj.isDataNode = !this.hasMasterComponents(_hostname);
- hostObj.isTaskTracker = !this.hasMasterComponents(_hostname);
- hostObj.isRegionServer = !this.hasMasterComponents(_hostname);
- hostObjs.add(hostObj);
- }, this);
- return hostObjs;
- } else {
- allHosts.forEach(function (_hostName) {
- hostObjs.add({
- hostname: _hostName
- });
- });
- var datanodes = slaveHosts.findProperty('componentName', 'DATANODE');
- datanodes.hosts.forEach(function (_datanode) {
- var datanode = hostObjs.findProperty('hostname', _datanode.hostname);
- if (datanode !== null) {
- datanode.isDataNode = true;
- }
- });
- if (this.get('isMrSelected')) {
- var taskTrackers = slaveHosts.findProperty('componentName', 'TASKTRACKER');
- taskTrackers.hosts.forEach(function (_taskTracker) {
- var taskTracker = hostObjs.findProperty('hostname', _taskTracker.hostname);
- if (taskTracker !== null) {
- taskTracker.isTaskTracker = true;
- }
- });
- }
- if (this.isHbaseSelected()) {
- var regionServers = slaveHosts.findProperty('componentName', 'HBASE_REGIONSERVER');
- regionServers.hosts.forEach(function (_regionServer) {
- var regionServer = hostObjs.findProperty('hostname', _regionServer.hostname);
- if (regionServer !== null) {
- regionServer.isRegionServer = true;
- }
- });
- }
- return hostObjs;
- }
- },
-
- setSlaveHost: function (hostObj) {
- hostObj.forEach(function (_hostObj) {
- this.get('hosts').pushObject(Ember.Object.create(_hostObj));
- }, this);
- },
-
- loadSlaveHost: function (hostNames) {
-
- hostNames.forEach(function (_hostName) {
- this.get('hosts').pushObject(Ember.Object.create({
- hostname: _hostName,
- isDataNode: !this.hasMasterComponents(_hostName),
- isTaskTracker: !this.hasMasterComponents(_hostName),
- isRegionServer: !this.hasMasterComponents(_hostName)
- }));
- }, this);
- },
-
-
- validate: function () {
- return !(this.get('isNoDataNodes') || this.get('isNoTaskTrackers') || this.get('isNoRegionServers'));
- },
-
- submit: function () {
- if (!this.validate()) {
- this.set('errorMessage', Ember.I18n.t('installer.step6.error.mustSelectOne'));
- return;
- }
- App.db.setHostSlaveComponents(this.get('host'));
-
- var dataNodeHosts = [];
- var taskTrackerHosts = [];
- var regionServerHosts = [];
-
- this.get('hosts').forEach(function (host) {
- if (host.get('isDataNode')) {
- dataNodeHosts.push({
- hostname: host.hostname,
- group: 'Default'
- });
- }
- if (this.get('isMrSelected') && host.get('isRegionServer')) {
- taskTrackerHosts.push({
- hostname: host.hostname,
- group: 'Default'
- });
- }
- if (this.isHbaseSelected() && host.get('isRegionServer')) {
- regionServerHosts.push({
- hostname: host.hostname,
- group: 'Default'
- });
- }
- }, this);
-
- var slaveComponentHosts = [];
- slaveComponentHosts.push({
- componentName: 'DATANODE',
- displayName: 'DataNode',
- hosts: dataNodeHosts
- });
- if (this.get('isMrSelected')) {
- slaveComponentHosts.push({
- componentName: 'TASKTRACKER',
- displayName: 'TaskTracker',
- hosts: taskTrackerHosts
- });
- }
- if (this.isHbaseSelected()) {
- slaveComponentHosts.push({
- componentName: 'HBASE_REGIONSERVER',
- displayName: 'RegionServer',
- hosts: regionServerHosts
- });
- }
-
- App.db.setSlaveComponentHosts(slaveComponentHosts);
-
- App.router.send('next');
-
- }
-})
-;
\ No newline at end of file
+ hosts: [],
+ // TODO: hook up with user host selection
+ rawHosts: [],
+ selectedServiceNames: [],
+ showHbase: false,
+ showTaskTracker: false,
+
+ hasMasterComponents: function (hostname) {
+ var hasMaster = false;
+ var masterComponentHosts = db.getMasterComponentHosts();
+ return masterComponentHosts.someProperty('hostName', hostname);
+ },
+
+ isAllDataNodes: function () {
+ return this.get('hosts').everyProperty('isDataNode', true);
+ }.property('hosts.@each.isDataNode'),
+
+ isAllTaskTrackers: function () {
+ return this.get('hosts').everyProperty('isTaskTracker', true);
+ }.property('hosts.@each.isTaskTracker'),
+
+ isAllRegionServers: function () {
+ return this.get('hosts').everyProperty('isRegionServer', true);
+ }.property('hosts.@each.isRegionServer'),
+
+ isAllClients: function () {
+ return this.get('hosts').everyProperty('isClient', true);
+ }.property('hosts.@each.isAllClient'),
+
+ isNoDataNodes: function () {
+ return this.get('hosts').everyProperty('isDataNode', false);
+ }.property('hosts.@each.isDataNode'),
+
+ isNoTaskTrackers: function () {
+ return this.get('hosts').everyProperty('isTaskTracker', false);
+ }.property('hosts.@each.isTaskTracker'),
+
+ isNoRegionServers: function () {
+ return this.get('hosts').everyProperty('isRegionServer', false);
+ }.property('hosts.@each.isRegionServer'),
+
+ isNoClients: function () {
+ return this.get('hosts').everyProperty('isClient', false);
+ }.property('hosts.@each.isClient'),
+
+ isHbaseSelected: function () {
+ var services = db.getSelectedServiceNames();
+ return this.get('selectedServiceNames').contains('HBASE');
+ },
+
+ isMrSelected: function () {
+ return this.get('selectedServiceNames').contains('MAPREDUCE');
+ }.property('selectedServiceNames'),
+
+ clearError: function () {
+ if (this.get('isNoDataNodes') === false && this.get('isNoTaskTrackers') === false && this.get('isNoRegionServers') === false && this.get('isNoClients') === false) {
+ this.set('errorMessage', '');
+ }
+ }.observes('isNoDataNodes', 'isNoTaskTrackers', 'isNoRegionServers', 'isNoClients'),
+
+ selectAllDataNodes: function () {
+ this.get('hosts').setEach('isDataNode', true);
+ },
+
+ selectAllTaskTrackers: function () {
+ this.get('hosts').setEach('isTaskTracker', true);
+ },
+
+ selectAllRegionServers: function () {
+ this.get('hosts').setEach('isRegionServer', true);
+ },
+
+ selectAllClients: function () {
+ this.get('hosts').setEach('isClient', true);
+ },
+
+ deselectAllDataNodes: function () {
+ this.get('hosts').setEach('isDataNode', false);
+ },
+
+ deselectAllTaskTrackers: function () {
+ this.get('hosts').setEach('isTaskTracker', false);
+ },
+
+ deselectAllRegionServers: function () {
+ this.get('hosts').setEach('isRegionServer', false);
+ },
+
+ deselectAllClients: function () {
+ this.get('hosts').setEach('isClient', false);
+ },
+
+ clearStep: function () {
+ this.set('hosts', []);
+ this.set('selectedServiceNames', []);
+ this.clearError();
+ },
+
+ loadStep: function () {
+ console.log("TRACE: Loading step6: Assign Slaves");
+ this.clearStep();
+ this.set('selectedServiceNames', db.getSelectedServiceNames());
+ this.set('showHbase', this.isHbaseSelected());
+ this.set('showTaskTracker', this.get('isMrSelected'));
+ this.setSlaveHost(this.getSlaveHosts());
+ },
+
+ getHostNames: function () {
+ var hostInfo = db.getHosts();
+ var hostNames = [];
+ for (var index in hostInfo) {
+ if (hostInfo[index].bootStatus === 'success')
+ hostNames.push(hostInfo[index].name);
+ }
+ return hostNames;
+ },
+
+ getSlaveHosts: function () {
+ var hostObjs = new Ember.Set();
+ var allHosts = this.getHostNames();
+ var slaveHosts = App.db.getSlaveComponentHosts();
+ if (slaveHosts === undefined || slaveHosts === null) {
+ allHosts.forEach(function (_hostname) {
+ var hostObj = {};
+ hostObj.hostname = _hostname;
+ hostObj.isMaster = this.hasMasterComponents(_hostname);
+ hostObj.isDataNode = !this.hasMasterComponents(_hostname);
+ hostObj.isTaskTracker = !this.hasMasterComponents(_hostname);
+ hostObj.isRegionServer = !this.hasMasterComponents(_hostname);
+ hostObj.isClient = false;
+ hostObjs.add(hostObj);
+ }, this);
+ hostObjs.findProperty('isDataNode', true).isClient = true;
+
+ return hostObjs;
+ } else {
+ allHosts.forEach(function (_hostName) {
+ hostObjs.add({
+ hostname: _hostName
+ });
+ }, this);
+ var datanodes = slaveHosts.findProperty('componentName', 'DATANODE');
+ datanodes.hosts.forEach(function (_datanode) {
+ var datanode = hostObjs.findProperty('hostname', _datanode.hostname);
+ if (datanode !== null) {
+ datanode.isDataNode = true;
+ }
+ }, this);
+ if (this.get('isMrSelected')) {
+ var taskTrackers = slaveHosts.findProperty('componentName', 'TASKTRACKER');
+ taskTrackers.hosts.forEach(function (_taskTracker) {
+ var taskTracker = hostObjs.findProperty('hostname', _taskTracker.hostname);
+ if (taskTracker !== null) {
+ taskTracker.isTaskTracker = true;
+ }
+ }, this);
+ }
+ if (this.isHbaseSelected()) {
+ var regionServers = slaveHosts.findProperty('componentName', 'HBASE_REGIONSERVER');
+ regionServers.hosts.forEach(function (_regionServer) {
+ var regionServer = hostObjs.findProperty('hostname', _regionServer.hostname);
+ if (regionServer !== null) {
+ regionServer.isRegionServer = true;
+ }
+ }, this);
+ }
+ var clients = slaveHosts.findProperty('componentName', 'CLIENT');
+ clients.hosts.forEach(function (_client) {
+ var client = hostObjs.findProperty('hostname', _client.hostname);
+ if (client !== null) {
+ client.isClient = true;
+ }
+ }, this);
+ allHosts.forEach(function (_hostname) {
+ var host = hostObjs.findProperty('hostname', _hostname);
+ if (host !== null) {
+ host.isMaster = this.hasMasterComponents(_hostname);
+ }
+ }, this);
+
+ return hostObjs;
+ }
+ },
+
+ getMasterComponentsforHost: function (hostname) {
+ if (App.db.getHostToMasterComponent().someProperty('hostname', hostname)) {
+ return App.db.getHostToMasterComponent().findProperty('hostname', hostname).components;
+ } else {
+ return false;
+ }
+ },
+
+ setSlaveHost: function (hostObj) {
+ hostObj.forEach(function (_hostObj) {
+ this.get('hosts').pushObject(Ember.Object.create(_hostObj));
+ }, this);
+ },
+
+ validate: function () {
+ return !(this.get('isNoDataNodes') || this.get('isNoTaskTrackers') || this.get('isNoRegionServers') || this.get('isNoClients'));
+ },
+
+ submit: function () {
+ if (!this.validate()) {
+ this.set('errorMessage', Ember.I18n.t('installer.step6.error.mustSelectOne'));
+ return;
+ }
+ App.db.setHostSlaveComponents(this.get('host'));
+
+ var dataNodeHosts = [];
+ var taskTrackerHosts = [];
+ var regionServerHosts = [];
+ var clientHosts = [];
+
+ this.get('hosts').forEach(function (host) {
+ if (host.get('isDataNode')) {
+ dataNodeHosts.push({
+ hostname: host.hostname,
+ group: 'Default'
+ });
+ }
+ if (this.get('isMrSelected') && host.get('isRegionServer')) {
+ taskTrackerHosts.push({
+ hostname: host.hostname,
+ group: 'Default'
+ });
+ }
+ if (this.isHbaseSelected() && host.get('isRegionServer')) {
+ regionServerHosts.push({
+ hostname: host.hostname,
+ group: 'Default'
+ });
+ }
+ if (host.get('isClient')) {
+ clientHosts.push({
+ hostname: host.hostname,
+ group: 'Default'
+ });
+ }
+ }, this);
+
+ var slaveComponentHosts = [];
+ slaveComponentHosts.push({
+ componentName: 'DATANODE',
+ displayName: 'DataNode',
+ hosts: dataNodeHosts
+ });
+ if (this.get('isMrSelected')) {
+ slaveComponentHosts.push({
+ componentName: 'TASKTRACKER',
+ displayName: 'TaskTracker',
+ hosts: taskTrackerHosts
+ });
+ }
+ if (this.isHbaseSelected()) {
+ slaveComponentHosts.push({
+ componentName: 'HBASE_REGIONSERVER',
+ displayName: 'RegionServer',
+ hosts: regionServerHosts
+ });
+ }
+ slaveComponentHosts.push({
+ componentName: 'CLIENT',
+ displayName: 'client',
+ hosts: clientHosts
+ });
+
+ App.db.setSlaveComponentHosts(slaveComponentHosts);
+
+ App.router.send('next');
+
+ }
+});
\ No newline at end of file
Modified: incubator/ambari/branches/AMBARI-666/ambari-web/app/messages.js
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-web/app/messages.js?rev=1400492&r1=1400491&r2=1400492&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-web/app/messages.js (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-web/app/messages.js Sat Oct 20 17:29:51 2012
@@ -18,286 +18,285 @@
Em.I18n.translations = {
- 'app.name':'Ambari',
+ 'app.name': 'Ambari',
- 'login.header':'Sign in',
- 'login.username':'Username',
- 'login.password':'Password',
- 'login.loginButton':'Sign in',
- 'login.error':'Invalid username/password combination.',
-
- 'services.nagios.description':'Nagios desc',
- 'services.ganglia.description':'Ganglia desc',
- 'services.hdfs.description':'HDFS desc',
- 'services.mapreduce.description':'MapReduce desc',
- 'services.sqoop.description':'Sqoop desc',
- 'services.pig.description':'Pig desc',
- 'services.hive.description':'Hive/HCat desc',
- 'services.oozie.description':'Oozie desc',
- 'services.zookeeper.description':'ZooKeeper desc',
- 'services.hbase.description':'HBase desc',
-
- 'topnav.help.href':'http://incubator.apache.org/ambari/install.html',
-
- 'installer.header':'Cluster Install Wizard',
- 'installer.step1.header':'Welcome',
- 'installer.step1.body.header':'Welcome to Apache Ambari!',
- 'installer.step1.body':'Ambari makes it easy to install, manage, and monitor Hadoop clusters.<br>' +
+ 'login.header': 'Sign in',
+ 'login.username': 'Username',
+ 'login.password': 'Password',
+ 'login.loginButton': 'Sign in',
+ 'login.error': 'Invalid username/password combination.',
+
+ 'services.nagios.description': 'Nagios desc',
+ 'services.ganglia.description': 'Ganglia desc',
+ 'services.hdfs.description': 'HDFS desc',
+ 'services.mapreduce.description': 'MapReduce desc',
+ 'services.sqoop.description': 'Sqoop desc',
+ 'services.pig.description': 'Pig desc',
+ 'services.hive.description': 'Hive/HCat desc',
+ 'services.oozie.description': 'Oozie desc',
+ 'services.zookeeper.description': 'ZooKeeper desc',
+ 'services.hbase.description': 'HBase desc',
+
+ 'topnav.help.href': 'http://incubator.apache.org/ambari/install.html',
+
+ 'installer.header': 'Cluster Install Wizard',
+ 'installer.step1.header': 'Welcome',
+ 'installer.step1.body.header': 'Welcome to Apache Ambari!',
+ 'installer.step1.body': 'Ambari makes it easy to install, manage, and monitor Hadoop clusters.<br>' +
'We will walk you through the cluster installation process with this step-by-step wizard.',
- 'installer.step1.clusterName':'Name your cluster',
- 'installer.step1.clusterName.tooltip.title':'Cluster Name',
- 'installer.step1.clusterName.tooltip.content':'Enter a unique cluster name. Cluster name cannot be changed later.',
- 'installer.step1.clusterName.error.required':'Cluster Name is required',
- 'installer.step1.clusterName.error.whitespaces':'Cluster Name cannot contain white spaces',
- 'installer.step1.clusterName.error.specialChar':'Cluster Name cannot contain special characters',
-
- 'installer.step2.header':'Install Options',
- 'installer.step2.body':'Enter the list of hosts to be included in the cluster, provide your SSH key, and optionally specify a local repository.',
- 'installer.step2.targetHosts':'Target Hosts',
- 'installer.step2.targetHosts.info':'Enter a list of host names, one per line',
- 'installer.step2.hostPattern.tooltip.title':'Pattern Expressions',
- 'installer.step2.hostPattern.tooltip.content':'You can use pattern expressions to specify a number of target hosts. Explain brackets.',
- 'installer.step2.hostName.error.required':'Host Names cannot be left empty',
- 'installer.step2.hostName.error.notRequired':'Host Names will be ignored if not using SSH to automatically configure hosts',
- 'installer.step2.hostName.error.invalid':'Invalid Host Name(s) - cannot start or end with a hyphen',
- 'installer.step2.sshKey':'Host Connectivity Information',
- 'installer.step2.sshKey.info':'Provide your SSH Private Key (<b>id_rsa</b> for <b>root</b>)',
- 'installer.step2.sshKey.error.required':'SSH Private Key is required',
- 'installer.step2.passphrase.error.match':'Passphrases do not match',
- 'installer.step2.manualInstall.label':'Do not use SSH to automatically configure hosts ',
- 'installer.step2.manualInstall.info':'By not using SSH to connect to the target hosts, you must manually install and start the ' +
+ 'installer.step1.clusterName': 'Name your cluster',
+ 'installer.step1.clusterName.tooltip.title': 'Cluster Name',
+ 'installer.step1.clusterName.tooltip.content': 'Enter a unique cluster name. Cluster name cannot be changed later.',
+ 'installer.step1.clusterName.error.required': 'Cluster Name is required',
+ 'installer.step1.clusterName.error.whitespaces': 'Cluster Name cannot contain white spaces',
+ 'installer.step1.clusterName.error.specialChar': 'Cluster Name cannot contain special characters',
+
+ 'installer.step2.header': 'Install Options',
+ 'installer.step2.body': 'Enter the list of hosts to be included in the cluster, provide your SSH key, and optionally specify a local repository.',
+ 'installer.step2.targetHosts': 'Target Hosts',
+ 'installer.step2.targetHosts.info': 'Enter a list of host names, one per line',
+ 'installer.step2.hostPattern.tooltip.title': 'Pattern Expressions',
+ 'installer.step2.hostPattern.tooltip.content': 'You can use pattern expressions to specify a number of target hosts. Explain brackets.',
+ 'installer.step2.hostName.error.required': 'Host Names cannot be left empty',
+ 'installer.step2.hostName.error.notRequired': 'Host Names will be ignored if not using SSH to automatically configure hosts',
+ 'installer.step2.hostName.error.invalid': 'Invalid Host Name(s) - cannot start or end with a hyphen',
+ 'installer.step2.sshKey': 'Host Connectivity Information',
+ 'installer.step2.sshKey.info': 'Provide your SSH Private Key (<b>id_rsa</b> for <b>root</b>)',
+ 'installer.step2.sshKey.error.required': 'SSH Private Key is required',
+ 'installer.step2.passphrase.error.match': 'Passphrases do not match',
+ 'installer.step2.manualInstall.label': 'Do not use SSH to automatically configure hosts ',
+ 'installer.step2.manualInstall.info': 'By not using SSH to connect to the target hosts, you must manually install and start the ' +
'Ambari Agent on each host in order for the wizard to perform the necessary configurations and software installs.',
- 'installer.step2.advancedOption':'Advanced Options',
- 'installer.step2.repoConf':'Software Repository Configuration File Path',
- 'installer.step2.localRepo.header':'Software repository',
- 'installer.step2.localRepo.label':'Use a local software repository',
- 'installer.step2.localRepo.error.required':'Local repository file path is required',
- 'installer.step2.localRepo.info':'The repository configuration file should be installed on each host in your cluster. ' +
+ 'installer.step2.advancedOption': 'Advanced Options',
+ 'installer.step2.repoConf': 'Software Repository Configuration File Path',
+ 'installer.step2.localRepo.header': 'Software repository',
+ 'installer.step2.localRepo.label': 'Use a local software repository',
+ 'installer.step2.localRepo.error.required': 'Local repository file path is required',
+ 'installer.step2.localRepo.info': 'The repository configuration file should be installed on each host in your cluster. ' +
'This file instructs the package manager to use your local software repository to retrieve software packages, instead of ' +
'downloading them from the internet.',
- 'installer.step2.localRepo.tooltip.title':'Local Software Repository',
- 'installer.step2.localRepo.tooltip.content':'The repository configuration file should be installed on each host ' +
+ 'installer.step2.localRepo.tooltip.title': 'Local Software Repository',
+ 'installer.step2.localRepo.tooltip.content': 'The repository configuration file should be installed on each host ' +
'in your cluster. This file instructs package manager to use your local' +
'software repository to retrieve software packages, instead of using the internet.',
- 'installer.step2.manualInstall.tooltip.title':'Not Using SSH (Manual Install)',
- 'installer.step2.manualInstall.tooltip.content':'If you do not wish Ambari to automatically configure the target hosts via SSH,' +
+ 'installer.step2.manualInstall.tooltip.title': 'Not Using SSH (Manual Install)',
+ 'installer.step2.manualInstall.tooltip.content': 'If you do not wish Ambari to automatically configure the target hosts via SSH,' +
' you have the option of configuring them yourself. This involves installing and starting Ambari Agent on each of your target hosts.',
- 'installer.step2.manualInstall.popup.header':'Before You Proceed',
- 'installer.step2.manualInstall.popup.body':'You must install Ambari Agents on each host you want to manage before you proceed. <a href="#" target="_blank">Learn more</a>',
+ 'installer.step2.manualInstall.popup.header': 'Before You Proceed',
+ 'installer.step2.manualInstall.popup.body': 'You must install Ambari Agents on each host you want to manage before you proceed. <a href="#" target="_blank">Learn more</a>',
- 'installer.step3.header':'Confirm Hosts',
- 'installer.step3.body':'Here are the results of the host discovery process.<br>' +
+ 'installer.step3.header': 'Confirm Hosts',
+ 'installer.step3.body': 'Here are the results of the host discovery process.<br>' +
'Please verify and remove the ones that you do not want to be part of the cluster.',
- 'installer.step3.hostLog.popup.header':'Log file for the host',
- 'installer.step3.hostLog.popup.body':'Placeholder for the log file',
- 'installer.step3.hosts.remove.popup.header':'Remove Hosts',
- 'installer.step3.hosts.remove.popup.body':'Are you sure you want to remove the selected host(s)?',
- 'installer.step3.hosts.retry.popup.header':'Retry Host Discovery',
- 'installer.step3.hosts.retry.popup.body':'Are you sure you want to retry discovery of the selected host(s)?',
-
- 'installer.step4.header':'Choose Services',
- 'installer.step4.body':'Choose which services you want to install on your cluster.<br>Note that some services have dependencies (e.g., HBase requires ZooKeeper.)',
- 'installer.step4.mapreduceCheck.popup.header':'MapReduce Needed',
- 'installer.step4.mapreduceCheck.popup.body':'You did not select MapReduce, but it is needed by other services you selected. We will automatically add MapReduce. Is this OK?',
- 'installer.step4.monitoringCheck.popup.header':'Limited Functionality Warning',
- 'installer.step4.monitoringCheck.popup.body':'You did not select Nagios and/or Ganglia. If both are not selected, monitoring and alerts will not function properly. Is this OK?',
-
- 'installer.step5.header':'Assign Masters',
- 'installer.step5.attention':' hosts not running master services',
- 'installer.step5.body':'Assign master components to hosts you want to run them on.',
-
- 'installer.step6.header':'Assign Slaves',
- 'installer.step6.body':'Assign slave components to hosts you want to run them on.',
- 'installer.step6.error.mustSelectOne':'You must assign at least one host to each.',
-
- 'installer.step7.header':'Customize Services',
- 'installer.step7.body':'We have come up with recommended configurations for the services you selected. Customize them as you see fit.',
- 'installer.step7.attentionNeeded':'<strong>Attention:</strong> Some configurations need your attention before you can proceed.',
-
- 'installer.step8.header':'Review',
- 'installer.step8.body':'Please review the cluster configuration before installation',
-
- 'installer.step9.header':'Install, Start and Test',
- 'installer.step9.body':'Wait to complete the cluster installation. Installing, Starting and Testing selected services',
- 'installer.step9.status.success':'Successfully installed the cluster',
- 'installer.step9.status.failed':'Failure in installation',
- 'installer.step9.host.status.success':'success',
- 'installer.step9.host.status.warning':'tolerable failures encountered',
- 'installer.step9.host.status.failed':'failures encountered',
-
- 'installer.step10.header':'Summary',
-
- 'form.create':'Create',
- 'form.save':'Save',
- 'form.cancel':'Cancel',
- 'form.password':'Password',
- 'form.passwordRetype':'Retype Password',
- 'form.saveSuccess':'Successfully saved.',
- 'form.saveError':'Sorry, errors occured.',
-
- 'form.validator.invalidIp':'Please enter valid ip address',
-
- 'admin.advanced.title':'Advanced',
- 'admin.advanced.caution':'This section is for advanced user only.<br/>Proceed with caution.',
- 'admin.advanced.button.uninstallIncludingData':'Uninstall cluster including all data.',
- 'admin.advanced.button.uninstallKeepData':'Uninstall cluster but keep data.',
+ 'installer.step3.hostLog.popup.header': 'Log file for the host',
+ 'installer.step3.hostLog.popup.body': 'Placeholder for the log file',
+ 'installer.step3.hosts.remove.popup.header': 'Remove Hosts',
+ 'installer.step3.hosts.remove.popup.body': 'Are you sure you want to remove the selected host(s)?',
+ 'installer.step3.hosts.retry.popup.header': 'Retry Host Discovery',
+ 'installer.step3.hosts.retry.popup.body': 'Are you sure you want to retry discovery of the selected host(s)?',
+
+ 'installer.step4.header': 'Choose Services',
+ 'installer.step4.body': 'Choose which services you want to install on your cluster.<br>Note that some services have dependencies (e.g., HBase requires ZooKeeper.)',
+ 'installer.step4.mapreduceCheck.popup.header': 'MapReduce Needed',
+ 'installer.step4.mapreduceCheck.popup.body': 'You did not select MapReduce, but it is needed by other services you selected. We will automatically add MapReduce. Is this OK?',
+ 'installer.step4.monitoringCheck.popup.header': 'Limited Functionality Warning',
+ 'installer.step4.monitoringCheck.popup.body': 'You did not select Nagios and/or Ganglia. If both are not selected, monitoring and alerts will not function properly. Is this OK?',
+
+ 'installer.step5.header': 'Assign Masters',
+ 'installer.step5.attention': ' hosts not running master services',
+ 'installer.step5.body': 'Assign master components to hosts you want to run them on.',
+
+ 'installer.step6.header': 'Assign Slaves and Clients',
+ 'installer.step6.body': 'Assign slave and client components to hosts you want to run them on. <br/>Client component will install Hadoop client, HBase client and Pig client on the machine.',
+ 'installer.step6.error.mustSelectOne': 'You must assign at least one host to each.',
+
+ 'installer.step7.header': 'Customize Services',
+ 'installer.step7.body': 'We have come up with recommended configurations for the services you selected. Customize them as you see fit.',
+ 'installer.step7.attentionNeeded': '<strong>Attention:</strong> Some configurations need your attention before you can proceed.',
+
+ 'installer.step8.header': 'Review',
+ 'installer.step8.body': 'Please review the cluster configuration before installation',
+
+ 'installer.step9.header': 'Install, Start and Test',
+ 'installer.step9.body': 'Wait to complete the cluster installation. Installing, Starting and Testing selected services',
+ 'installer.step9.status.success': 'Successfully installed the cluster',
+ 'installer.step9.status.failed': 'Failure in installation',
+ 'installer.step9.host.status.success': 'success',
+ 'installer.step9.host.status.warning': 'tolerable failures encountered',
+ 'installer.step9.host.status.failed': 'failures encountered',
+ 'installer.step10.header': 'Summary',
+ 'form.create': 'Create',
+ 'form.save': 'Save',
+ 'form.cancel': 'Cancel',
+ 'form.password': 'Password',
+ 'form.passwordRetype': 'Retype Password',
+ 'form.saveSuccess': 'Successfully saved.',
+ 'form.saveError': 'Sorry, errors occured.',
+
+ 'form.validator.invalidIp': 'Please enter valid ip address',
+
+ 'admin.advanced.title': 'Advanced',
+ 'admin.advanced.caution': 'This section is for advanced user only.<br/>Proceed with caution.',
+ 'admin.advanced.button.uninstallIncludingData': 'Uninstall cluster including all data.',
+ 'admin.advanced.button.uninstallKeepData': 'Uninstall cluster but keep data.',
+
+ 'admin.advanced.popup.header': 'Uninstall Cluster',
- 'admin.advanced.popup.header':'Uninstall Cluster',
/*'admin.advanced.popup.text':'Uninstall Cluster',*/
- 'admin.audit.grid.date':"Date/Time",
- 'admin.audit.grid.category':"Category",
- 'admin.audit.grid.operationName':"Operation",
- 'admin.audit.grid.performedBy':"Performed By",
- 'admin.audit.grid.service':"Category",
-
- 'admin.authentication.form.method.database':'Use Ambari Database to authenticate users',
- 'admin.authentication.form.method.ldap':'Use LDAP/Active Directory to authenticate',
- 'admin.authentication.form.primaryServer':'Primary Server',
- 'admin.authentication.form.secondaryServer':'Secondary Server',
- 'admin.authentication.form.useSsl':'Use SSL',
- 'admin.authentication.form.bind.anonymously':"Bind Anonymously",
- 'admin.authentication.form.bind.useCrenedtials':"Use Credentials To Bind",
- 'admin.authentication.form.bindUserDN':'Bind User DN',
- 'admin.authentication.form.searchBaseDN':'Search Base DN',
- 'admin.authentication.form.usernameAttribute':'Username Attribute',
-
- 'admin.authentication.form.userDN':'User DN',
- 'admin.authentication.form.password':'Password',
- 'admin.authentication.form.configurationTest':'Configuration Test',
- 'admin.authentication.form.testConfiguration':'Test Configuration',
-
- 'admin.authentication.form.test.success':'The configuration passes the test',
- 'admin.authentication.form.test.fail':'The configuration fails the test',
-
- 'admin.security.title':'Kerberos Security has not been enabled on this cluster.',
- 'admin.security.button.enable':'Enable Kerberos Security on this cluster',
-
- 'admin.users.ldapAuthentionUsed':'LDAP Authentication is being used to authenticate users',
- 'admin.users.deleteYourselfMessage':'You can\'t delete yourself',
- 'admin.users.addButton':'Add User',
- 'admin.users.delete':'delete',
- 'admin.users.edit':'edit',
- 'admin.users.privileges':'Admin',
- 'admin.users.password':'Password',
- 'admin.users.passwordRetype':'Retype Password',
- 'admin.users.username':'Username',
-
- 'question.sure':'Are you sure?',
-
- 'services.service.start':'Start',
- 'services.service.stop':'Stop',
- 'services.service.start.popup.header':'Confirmation',
- 'services.service.stop.popup.header':'Confirmation',
- 'services.service.start.popup.body':'Are you sure?',
- 'services.service.stop.popup.body':'Are you sure?',
- 'services.service.summary.version':'Version',
- 'services.service.summary.nameNode':'NameNode Web UI',
- 'services.service.summary.nameNodeUptime':'NameNode Uptime',
- 'services.service.summary.nameNodeHeap':'NameNode Heap',
- 'services.service.summary.pendingUpgradeStatus':'Upgrade Status',
- 'services.service.summary.safeModeStatus':'Safe Mode Status',
- 'services.service.summary.dataNodes':'DataNodes',
- 'services.service.summary.diskCapacity':'HDFS Disk Capacity',
- 'services.service.summary.blocksTotal':'Blocks (total)',
- 'services.service.summary.blockErrors':'Block Errors',
- 'services.service.summary.totalFiles':'Total Files + Dirs',
- 'services.service.summary.jobTracker':'JobTracker Web UI',
- 'services.service.summary.jobTrackerUptime':'JobTracker Uptime',
- 'services.service.summary.trackersLiveTotal':'Trackers',
- 'services.service.summary.trackersBlacklistGraylist':'Trackers',
- 'services.service.summary.jobTrackerHeap':'JobTracker Heap',
- 'services.service.summary.totalSlotsCapacity':'Total Slots Capacity',
- 'services.service.summary.totalJobs':'Total Jobs',
- 'services.service.summary.currentSlotUtiliMaps':'Map Slots',
- 'services.service.summary.currentSlotUtiliReduces':'Reduce Slots',
- 'services.service.summary.tasksMaps':'Tasks: Maps',
- 'services.service.summary.tasksReduces':'Tasks: Reduces',
- 'services.service.summary.hbaseMaster':'HBase Master Web UI',
- 'services.service.summary.regionServerCount':'Region Server Count',
- 'services.service.summary.regionInTransition':'Region In Transition',
- 'services.service.summary.masterStarted':'Master Started',
- 'services.service.summary.masterActivated':'Master Activated',
- 'services.service.summary.averageLoad':'Average Load',
- 'services.service.summary.masterHeap':'Master Heap',
- 'services.service.summary.moreStats':'more stats here',
-
- 'hosts.host.start.popup.header':'Confirmation',
- 'hosts.host.stop.popup.header':'Confirmation',
- 'hosts.host.start.popup.body':'Are you sure?',
- 'hosts.host.stop.popup.body':'Are you sure?',
- 'hosts.assignedToRack.popup.body':'Are you sure?',
- 'hosts.assignedToRack.popup.header':'Confirmation',
- 'hosts.decommission.popup.body':'Are you sure?',
- 'hosts.decommission.popup.header':'Confirmation',
- 'hosts.delete.popup.body':'Are you sure?',
- 'hosts.delete.popup.header':'Confirmation',
-
- 'charts.horizon.chart.showText':'show',
- 'charts.horizon.chart.hideText':'hide',
- 'charts.horizon.chart.attributes.cpu':'CPU',
- 'charts.horizon.chart.attributes.memory':'Memory',
- 'charts.horizon.chart.attributes.network':'Network',
- 'charts.horizon.chart.attributes.io':'I/O',
-
- 'metric.default':'combined',
- 'metric.cpu':'cpu',
- 'metric.memory':'disk used',
- 'metric.network':'network',
- 'metric.io':'io',
- 'metric.more':'more',
- 'metric.more.cpu':'Cpu',
+ 'admin.audit.grid.date': "Date/Time",
+ 'admin.audit.grid.category': "Category",
+ 'admin.audit.grid.operationName': "Operation",
+ 'admin.audit.grid.performedBy': "Performed By",
+ 'admin.audit.grid.service': "Category",
+
+ 'admin.authentication.form.method.database': 'Use Ambari Database to authenticate users',
+ 'admin.authentication.form.method.ldap': 'Use LDAP/Active Directory to authenticate',
+ 'admin.authentication.form.primaryServer': 'Primary Server',
+ 'admin.authentication.form.secondaryServer': 'Secondary Server',
+ 'admin.authentication.form.useSsl': 'Use SSL',
+ 'admin.authentication.form.bind.anonymously': "Bind Anonymously",
+ 'admin.authentication.form.bind.useCrenedtials': "Use Credentials To Bind",
+ 'admin.authentication.form.bindUserDN': 'Bind User DN',
+ 'admin.authentication.form.searchBaseDN': 'Search Base DN',
+ 'admin.authentication.form.usernameAttribute': 'Username Attribute',
+
+ 'admin.authentication.form.userDN': 'User DN',
+ 'admin.authentication.form.password': 'Password',
+ 'admin.authentication.form.configurationTest': 'Configuration Test',
+ 'admin.authentication.form.testConfiguration': 'Test Configuration',
+
+ 'admin.authentication.form.test.success': 'The configuration passes the test',
+ 'admin.authentication.form.test.fail': 'The configuration fails the test',
+
+ 'admin.security.title': 'Kerberos Security has not been enabled on this cluster.',
+ 'admin.security.button.enable': 'Enable Kerberos Security on this cluster',
+
+ 'admin.users.ldapAuthentionUsed': 'LDAP Authentication is being used to authenticate users',
+ 'admin.users.deleteYourselfMessage': 'You can\'t delete yourself',
+ 'admin.users.addButton': 'Add User',
+ 'admin.users.delete': 'delete',
+ 'admin.users.edit': 'edit',
+ 'admin.users.privileges': 'Admin',
+ 'admin.users.password': 'Password',
+ 'admin.users.passwordRetype': 'Retype Password',
+ 'admin.users.username': 'Username',
+
+ 'question.sure': 'Are you sure?',
+
+ 'services.service.start': 'Start',
+ 'services.service.stop': 'Stop',
+ 'services.service.start.popup.header': 'Confirmation',
+ 'services.service.stop.popup.header': 'Confirmation',
+ 'services.service.start.popup.body': 'Are you sure?',
+ 'services.service.stop.popup.body': 'Are you sure?',
+ 'services.service.summary.version': 'Version',
+ 'services.service.summary.nameNode': 'NameNode Web UI',
+ 'services.service.summary.nameNodeUptime': 'NameNode Uptime',
+ 'services.service.summary.nameNodeHeap': 'NameNode Heap',
+ 'services.service.summary.pendingUpgradeStatus': 'Upgrade Status',
+ 'services.service.summary.safeModeStatus': 'Safe Mode Status',
+ 'services.service.summary.dataNodes': 'DataNodes',
+ 'services.service.summary.diskCapacity': 'HDFS Disk Capacity',
+ 'services.service.summary.blocksTotal': 'Blocks (total)',
+ 'services.service.summary.blockErrors': 'Block Errors',
+ 'services.service.summary.totalFiles': 'Total Files + Dirs',
+ 'services.service.summary.jobTracker': 'JobTracker Web UI',
+ 'services.service.summary.jobTrackerUptime': 'JobTracker Uptime',
+ 'services.service.summary.trackersLiveTotal': 'Trackers',
+ 'services.service.summary.trackersBlacklistGraylist': 'Trackers',
+ 'services.service.summary.jobTrackerHeap': 'JobTracker Heap',
+ 'services.service.summary.totalSlotsCapacity': 'Total Slots Capacity',
+ 'services.service.summary.totalJobs': 'Total Jobs',
+ 'services.service.summary.currentSlotUtiliMaps': 'Map Slots',
+ 'services.service.summary.currentSlotUtiliReduces': 'Reduce Slots',
+ 'services.service.summary.tasksMaps': 'Tasks: Maps',
+ 'services.service.summary.tasksReduces': 'Tasks: Reduces',
+ 'services.service.summary.hbaseMaster': 'HBase Master Web UI',
+ 'services.service.summary.regionServerCount': 'Region Server Count',
+ 'services.service.summary.regionInTransition': 'Region In Transition',
+ 'services.service.summary.masterStarted': 'Master Started',
+ 'services.service.summary.masterActivated': 'Master Activated',
+ 'services.service.summary.averageLoad': 'Average Load',
+ 'services.service.summary.masterHeap': 'Master Heap',
+ 'services.service.summary.moreStats': 'more stats here',
+
+ 'hosts.host.start.popup.header': 'Confirmation',
+ 'hosts.host.stop.popup.header': 'Confirmation',
+ 'hosts.host.start.popup.body': 'Are you sure?',
+ 'hosts.host.stop.popup.body': 'Are you sure?',
+ 'hosts.assignedToRack.popup.body': 'Are you sure?',
+ 'hosts.assignedToRack.popup.header': 'Confirmation',
+ 'hosts.decommission.popup.body': 'Are you sure?',
+ 'hosts.decommission.popup.header': 'Confirmation',
+ 'hosts.delete.popup.body': 'Are you sure?',
+ 'hosts.delete.popup.header': 'Confirmation',
+
+ 'charts.horizon.chart.showText': 'show',
+ 'charts.horizon.chart.hideText': 'hide',
+ 'charts.horizon.chart.attributes.cpu': 'CPU',
+ 'charts.horizon.chart.attributes.memory': 'Memory',
+ 'charts.horizon.chart.attributes.network': 'Network',
+ 'charts.horizon.chart.attributes.io': 'I/O',
+
+ 'metric.default': 'combined',
+ 'metric.cpu': 'cpu',
+ 'metric.memory': 'disk used',
+ 'metric.network': 'network',
+ 'metric.io': 'io',
+ 'metric.more': 'more',
+ 'metric.more.cpu': 'Cpu',
- 'metric.more.memory':'Memory',
+ 'metric.more.memory': 'Memory',
'metric.more.memory.swapFree': 'swap_free',
'metric.more.memory.memCached': 'mem_cached',
- 'hosts.add.header':'Add Host Wizard',
- 'hosts.add.step2.warning':'Hosts are already part of the cluster and will be ignored',
+ 'hosts.add.header': 'Add Host Wizard',
+ 'hosts.add.step2.warning': 'Hosts are already part of the cluster and will be ignored',
- 'dashboard.services':'Services',
- 'dashboard.services.hosts':'Hosts',
- 'dashboard.services.uptime':'{0} days {1} hrs {2} mins',
- 'dashboard.services.hdfs.summary':'{0} of {1} nodes live, {2}% capacity free',
- 'dashboard.services.hdfs.capacity':'HDFS Capacity',
- 'dashboard.services.hdfs.capacityUsed':'{0} of {1} ({2}% used)',
- 'dashboard.services.hdfs.totalFilesAndDirs':'Total Files + Directories',
- 'dashboard.services.hdfs.nodes':'Data Nodes',
- 'dashboard.services.hdfs.nodes.live':'live',
- 'dashboard.services.hdfs.nodes.dead':'dead',
- 'dashboard.services.hdfs.nodes.decom':'decom',
- 'dashboard.services.hdfs.nodes.uptime':'NameNode Uptime',
- 'dashboard.services.hdfs.nodes.heap':'NameNode Heap',
- 'dashboard.services.hdfs.nodes.heapUsed':'{0} of {1}, {2}% used',
- 'dashboard.services.hdfs.chart.label':'Capacity (Free/Used)',
-
- 'dashboard.services.mapreduce.summary':'{0} of {1} trackers live, {2} jobs running',
- 'dashboard.services.mapreduce.trackers':'Trackers',
- 'dashboard.services.mapreduce.trackersSummary':'{0} live / {1} total',
- 'dashboard.services.mapreduce.jobs':'Jobs',
- 'dashboard.services.mapreduce.jobsSummary':'{0} running / {1} completed / {2} failed',
- 'dashboard.services.mapreduce.mapSlots':'Map Slots',
- 'dashboard.services.mapreduce.mapSlotsSummary':'{0} occuped / {1} reserved / {2} total',
- 'dashboard.services.mapreduce.reduceSlots':'Reduce Slots',
- 'dashboard.services.mapreduce.reduceSlotsSummary':'{0} occuped / {1} reserved / {2} total',
- 'dashboard.services.mapreduce.jobTrackerHeap':'JobTracker Heap',
- 'dashboard.services.mapreduce.jobTrackerHeapSummary':'{0} of {1} ({2}% used)',
- 'dashboard.services.mapreduce.jobTrackerUptime':'Job Trackers Uptime',
- 'dashboard.services.mapreduce.chart.label':'Jobs Running',
-
- 'dashboard.services.hbase.summary':'{0} of {1} region servers up, {2} average load',
- 'dashboard.services.hbase.masterServerHeap':'Master Server Heap',
- 'dashboard.services.hbase.masterServerHeap.summary':'{0} of {1} ({2}% used)',
- 'dashboard.services.hbase.masterServerUptime':'Master Server Uptime',
- 'dashboard.services.hbase.averageLoad':'Average Load',
- 'dashboard.services.hbase.regionServers':'Region Servers',
- 'dashboard.services.hbase.regionServersSummary':'{0} live / {1} total',
- 'dashboard.services.hbase.chart.label':'Request Count',
-
- 'timeRange.presets.1hour':'1h',
- 'timeRange.presets.12hour':'12h',
- 'timeRange.presets.1day':'1d',
- 'timeRange.presets.1week':'1wk',
- 'timeRange.presets.1month':'1mo',
- 'timeRange.presets.1year':'1yr'
+ 'dashboard.services': 'Services',
+ 'dashboard.services.hosts': 'Hosts',
+ 'dashboard.services.uptime': '{0} days {1} hrs {2} mins',
+ 'dashboard.services.hdfs.summary': '{0} of {1} nodes live, {2}% capacity free',
+ 'dashboard.services.hdfs.capacity': 'HDFS Capacity',
+ 'dashboard.services.hdfs.capacityUsed': '{0} of {1} ({2}% used)',
+ 'dashboard.services.hdfs.totalFilesAndDirs': 'Total Files + Directories',
+ 'dashboard.services.hdfs.nodes': 'Data Nodes',
+ 'dashboard.services.hdfs.nodes.live': 'live',
+ 'dashboard.services.hdfs.nodes.dead': 'dead',
+ 'dashboard.services.hdfs.nodes.decom': 'decom',
+ 'dashboard.services.hdfs.nodes.uptime': 'NameNode Uptime',
+ 'dashboard.services.hdfs.nodes.heap': 'NameNode Heap',
+ 'dashboard.services.hdfs.nodes.heapUsed': '{0} of {1}, {2}% used',
+ 'dashboard.services.hdfs.chart.label': 'Capacity (Free/Used)',
+
+ 'dashboard.services.mapreduce.summary': '{0} of {1} trackers live, {2} jobs running',
+ 'dashboard.services.mapreduce.trackers': 'Trackers',
+ 'dashboard.services.mapreduce.trackersSummary': '{0} live / {1} total',
+ 'dashboard.services.mapreduce.jobs': 'Jobs',
+ 'dashboard.services.mapreduce.jobsSummary': '{0} running / {1} completed / {2} failed',
+ 'dashboard.services.mapreduce.mapSlots': 'Map Slots',
+ 'dashboard.services.mapreduce.mapSlotsSummary': '{0} occuped / {1} reserved / {2} total',
+ 'dashboard.services.mapreduce.reduceSlots': 'Reduce Slots',
+ 'dashboard.services.mapreduce.reduceSlotsSummary': '{0} occuped / {1} reserved / {2} total',
+ 'dashboard.services.mapreduce.jobTrackerHeap': 'JobTracker Heap',
+ 'dashboard.services.mapreduce.jobTrackerHeapSummary': '{0} of {1} ({2}% used)',
+ 'dashboard.services.mapreduce.jobTrackerUptime': 'Job Trackers Uptime',
+ 'dashboard.services.mapreduce.chart.label': 'Jobs Running',
+
+ 'dashboard.services.hbase.summary': '{0} of {1} region servers up, {2} average load',
+ 'dashboard.services.hbase.masterServerHeap': 'Master Server Heap',
+ 'dashboard.services.hbase.masterServerHeap.summary': '{0} of {1} ({2}% used)',
+ 'dashboard.services.hbase.masterServerUptime': 'Master Server Uptime',
+ 'dashboard.services.hbase.averageLoad': 'Average Load',
+ 'dashboard.services.hbase.regionServers': 'Region Servers',
+ 'dashboard.services.hbase.regionServersSummary': '{0} live / {1} total',
+ 'dashboard.services.hbase.chart.label': 'Request Count',
+
+ 'timeRange.presets.1hour': '1h',
+ 'timeRange.presets.12hour': '12h',
+ 'timeRange.presets.1day': '1d',
+ 'timeRange.presets.1week': '1wk',
+ 'timeRange.presets.1month': '1mo',
+ 'timeRange.presets.1year': '1yr'
};
\ No newline at end of file
Modified: incubator/ambari/branches/AMBARI-666/ambari-web/app/routes/installer.js
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-web/app/routes/installer.js?rev=1400492&r1=1400491&r2=1400492&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-web/app/routes/installer.js (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-web/app/routes/installer.js Sat Oct 20 17:29:51 2012
@@ -26,7 +26,7 @@ module.exports = Em.Route.extend({
if (router.getAuthenticated()) {
console.log('In installer with successful authenticated');
- // router.loadAllPriorSteps(router.getInstallerCurrentStep());
+ // router.loadAllPriorSteps(router.getInstallerCurrentStep());
Ember.run.next(function () {
router.transitionTo('step' + router.getInstallerCurrentStep());
});
@@ -68,10 +68,10 @@ module.exports = Em.Route.extend({
router.get('installerController').connectOutlet('installerStep1');
},
next: function (router, context) {
- // App.db.setAllHostNames(undefined);
- // App.db.setInstallType(undefined);
- //App.db.setSoftRepo(undefined);
- router.transitionTo('step2');
+ // App.db.setAllHostNames(undefined);
+ // App.db.setInstallType(undefined);
+ //App.db.setSoftRepo(undefined);
+ router.transitionTo('step2');
}
}),
@@ -124,6 +124,7 @@ module.exports = Em.Route.extend({
back: Em.Router.transitionTo('step3'),
next: function (router, context) {
App.db.setMasterComponentHosts(undefined);
+ App.db.setHostToMasterComponent(undefined);
router.transitionTo('step5');
}
}),
Modified: incubator/ambari/branches/AMBARI-666/ambari-web/app/styles/application.less
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-web/app/styles/application.less?rev=1400492&r1=1400491&r2=1400492&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-web/app/styles/application.less (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-web/app/styles/application.less Sat Oct 20 17:29:51 2012
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-.gradient(@color: #FAFAFA, @start: #FFFFFF, @stop: #F2F2F2) {
+.gradient(@color: #FAFAFA, @start: #FFFFFF, @stop: #F2F2F2){
background: @color;
background: -webkit-gradient(linear, left top, left bottom, color-stop(0, @start), color-stop(1, @stop));
background: -ms-linear-gradient(top, @start, @stop);
@@ -49,7 +49,7 @@ footer {
}
#content {
- padding: 30px 0;
+ padding: 20px 0;
}
#top-nav {
@@ -139,7 +139,11 @@ footer {
margin: 0;
}
- margin-bottom: 30px;
+ margin-bottom: 20px;
+}
+
+.pre-scrollable {
+ overflow-y: auto;
}
@green: #69BE28;
@@ -164,11 +168,11 @@ h1 {
}
}
-.hide{
+.hide {
visibility: hidden;
}
-.show{
+.show {
visibility: visible;
}
@@ -231,6 +235,9 @@ h1 {
}
a.deselected {
}
+ i.icon-asterisks {
+ color: #FF4B4B;
+ }
}
#serviceConfig {
.accordion-heading {
@@ -553,18 +560,18 @@ a:focus {
/*end alerts summary*/
/*start cluster metrics*/
-.cluster-metrics{
- .chart-container{
+.cluster-metrics {
+ .chart-container {
position: relative;
margin: 20px 15px 0px 15px;
}
- .chart{
+ .chart {
padding-bottom: 0px !important;
position: relative;
height: 160px;
z-index: 1;
}
- .chart-y-axis{
+ .chart-y-axis {
position: absolute;
top: 0;
bottom: 0px;
@@ -572,28 +579,29 @@ a:focus {
z-index: 2;
margin-top: 15px;
}
- .chart-x-axis{
+ .chart-x-axis {
position: absolute;
top: 180px;
left: 35%;
width: 30%;
z-index: 2;
}
- .rickshaw_legend{
+ .rickshaw_legend {
background-color: #999999 !important;
}
- .chart-overlay{
+ .chart-overlay {
position: absolute;
top: 0;
bottom: 0;
width: 100%;
z-index: 5;
}
- .chart-title{
+ .chart-title {
text-align: center;
font-size: small;
}
}
+
/*end cluster metrics*/
/*****end styles for dashboard page*****/
@@ -1209,15 +1217,44 @@ ul.inline li {
/* TIME RANGE WIDGET */
/* css for timepicker */
-.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; }
-.ui-timepicker-div dl { text-align: left; }
-.ui-timepicker-div dl dt { height: 25px; margin-bottom: -25px; }
-.ui-timepicker-div dl dd { margin: 0 10px 10px 65px; }
-.ui-timepicker-div td { font-size: 90%; }
-.ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; }
-
-.ui-timepicker-rtl{ direction: rtl; }
-.ui-timepicker-rtl dl { text-align: right; }
-.ui-timepicker-rtl dl dd { margin: 0 65px 10px 10px; }
+.ui-timepicker-div .ui-widget-header {
+ margin-bottom: 8px;
+}
+
+.ui-timepicker-div dl {
+ text-align: left;
+}
+
+.ui-timepicker-div dl dt {
+ height: 25px;
+ margin-bottom: -25px;
+}
+
+.ui-timepicker-div dl dd {
+ margin: 0 10px 10px 65px;
+}
+
+.ui-timepicker-div td {
+ font-size: 90%;
+}
+
+.ui-tpicker-grid-label {
+ background: none;
+ border: none;
+ margin: 0;
+ padding: 0;
+}
+
+.ui-timepicker-rtl {
+ direction: rtl;
+}
+
+.ui-timepicker-rtl dl {
+ text-align: right;
+}
+
+.ui-timepicker-rtl dl dd {
+ margin: 0 65px 10px 10px;
+}
/* TIME RANGE WIDGET END */
Modified: incubator/ambari/branches/AMBARI-666/ambari-web/app/templates/installer/step6.hbs
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-web/app/templates/installer/step6.hbs?rev=1400492&r1=1400491&r2=1400492&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-web/app/templates/installer/step6.hbs (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-web/app/templates/installer/step6.hbs Sat Oct 20 17:29:51 2012
@@ -23,41 +23,65 @@
{{#if errorMessage}}
<div class="alert alert-error">{{errorMessage}}</div>
{{/if}}
- <table class="table table-striped">
- <thead>
- <tr>
- <th>Host</th>
- <th>
- <a href="#" {{bindAttr class="isAllDataNodes:selected:deselected"}} {{action selectAllDataNodes target="controller"}}>all</a> | <a href="#" {{bindAttr class="isNoDataNodes:selected:deselected"}} {{action deselectAllDataNodes target="controller"}}>none</a>
- </th>
- {{#if controller.isMrSelected}}
- <th>
- <a href="#" {{bindAttr class="isAllTaskTrackers:selected:deselected"}} {{action selectAllTaskTrackers target="controller"}}>all</a> | <a href="#" {{bindAttr class="isNoTaskTrackers:selected:deselected"}} {{action deselectAllTaskTrackers target="controller"}}>none</a>
- </th>
- {{/if}}
- {{#if showHbase}}
- <th>
- <a href="#" {{bindAttr class="isAllRegionServers:selected:deselected"}} {{action selectAllRegionServers target="controller"}}>all</a> | <a href="#" {{bindAttr class="isNoRegionServers:selected:deselected"}} {{action deselectAllRegionServers target="controller"}}>none</a>
- </th>
- {{/if}}
- </tr>
- </thead>
- <tbody>
- {{#each hosts}}
- <tr>
- <td>{{hostname}}</td>
- <td><label class="checkbox">{{view Ember.Checkbox checkedBinding="isDataNode"}}DataNode</label></td>
- {{#if controller.isMrSelected}}
- <td><label class="checkbox">{{view Ember.Checkbox checkedBinding="isTaskTracker"}}TaskTracker</label></td>
- {{/if}}
- {{#if controller.showHbase}}
- <td><label class="checkbox">{{view Ember.Checkbox checkedBinding="isRegionServer"}}RegionServer</label></td>
- {{/if}}
- </tr>
- {{/each}}
- </tbody>
- </table>
+ <div class="pre-scrollable" style="max-height: 440px;">
+ <table class="table table-striped">
+ <thead>
+ <tr>
+ <th>Host</th>
+ <th>
+ <a
+ href="#" {{bindAttr class="isAllDataNodes:selected:deselected"}} {{action selectAllDataNodes target="controller"}}>all</a>
+ |
+ <a
+ href="#" {{bindAttr class="isNoDataNodes:selected:deselected"}} {{action deselectAllDataNodes target="controller"}}>none</a>
+ </th>
+ {{#if controller.isMrSelected}}
+ <th>
+ <a
+ href="#" {{bindAttr class="isAllTaskTrackers:selected:deselected"}} {{action selectAllTaskTrackers target="controller"}}>all</a>
+ |
+ <a
+ href="#" {{bindAttr class="isNoTaskTrackers:selected:deselected"}} {{action deselectAllTaskTrackers target="controller"}}>none</a>
+ </th>
+ {{/if}}
+ {{#if showHbase}}
+ <th>
+ <a
+ href="#" {{bindAttr class="isAllRegionServers:selected:deselected"}} {{action selectAllRegionServers target="controller"}}>all</a>
+ |
+ <a
+ href="#" {{bindAttr class="isNoRegionServers:selected:deselected"}} {{action deselectAllRegionServers target="controller"}}>none</a>
+ </th>
+ {{/if}}
+ <th>
+ <a
+ href="#" {{bindAttr class="isAllClients:selected:deselected"}} {{action selectAllClients target="controller"}}>all</a>
+ |
+ <a
+ href="#" {{bindAttr class="isNoClients:selected:deselected"}} {{action deselectAllClients target="controller"}}>none</a>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+
+ {{#each hosts}}
+ <tr>
+ <td>{{#view App.InstallerStep6HostView hostBinding = "this" }} {{hostname}} {{#if isMaster}}<i
+ class=icon-asterisks>✵</i>{{/if}}{{/view}} </td>
+ <td><label class="checkbox">{{view Ember.Checkbox checkedBinding="isDataNode"}}DataNode</label></td>
+ {{#if controller.isMrSelected}}
+ <td><label class="checkbox">{{view Ember.Checkbox checkedBinding="isTaskTracker"}}TaskTracker</label></td>
+ {{/if}}
+ {{#if controller.showHbase}}
+ <td><label class="checkbox">{{view Ember.Checkbox checkedBinding="isRegionServer"}}RegionServer</label></td>
+ {{/if}}
+ <td><label class="checkbox">{{view Ember.Checkbox checkedBinding="isClient"}}Client</label></td>
+ </tr>
+ {{/each}}
+ </tbody>
+ </table>
+ </div>
<div class="btn-area">
<a class="btn" {{action back}}>← Back</a>
<a class="btn btn-success" style="float:right" {{action submit target="controller"}}>Next →</a>
Modified: incubator/ambari/branches/AMBARI-666/ambari-web/app/utils/db.js
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-web/app/utils/db.js?rev=1400492&r1=1400491&r2=1400492&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-web/app/utils/db.js (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-web/app/utils/db.js Sat Oct 20 17:29:51 2012
@@ -61,12 +61,10 @@ if (localStorage.getObject('ambari') ==
App.db.cleanUp();
}
-
/*
* setter methods
*/
-
App.db.setLoginName = function (name) {
console.log('TRACE: Entering db:setLoginName function');
App.db.data = localStorage.getObject('ambari');
@@ -189,7 +187,7 @@ App.db.setSoftRepo = function (softRepo)
localStorage.setObject('ambari', App.db.data);
}
-App.db.setBootStatus = function(status) {
+App.db.setBootStatus = function (status) {
console.log('TRACE: Entering db:setService function');
App.db.data = localStorage.getObject('ambari');
var user = App.db.data.app.loginName;
@@ -207,7 +205,7 @@ App.db.removeHosts = function (hostInfo)
App.db.setHosts(hostList);
}
-App.db.setService = function(serviceInfo) {
+App.db.setService = function (serviceInfo) {
console.log('TRACE: Entering db:setService function');
App.db.data = localStorage.getObject('ambari');
var user = App.db.data.app.loginName;
@@ -229,6 +227,12 @@ App.db.setMasterComponentHosts = functio
localStorage.setObject('ambari', App.db.data);
}
+App.db.setHostToMasterComponent = function (hostToMasterComponent) {
+ App.db.data = localStorage.getObject('ambari');
+ var user = App.db.data.app.loginName;
+ App.db.data[user].Installer.hostToMasterComponent = hostToMasterComponent;
+ localStorage.setObject('ambari', App.db.data);
+}
App.db.setHostSlaveComponents = function (hostSlaveComponents) {
App.db.data = localStorage.getObject('ambari');
@@ -244,7 +248,7 @@ App.db.setSlaveComponentHosts = function
localStorage.setObject('ambari', App.db.data);
}
-App.db.setServiceConfigs = function(serviceConfigs) {
+App.db.setServiceConfigs = function (serviceConfigs) {
App.db.data = localStorage.getObject('ambari');
var user = App.db.data.app.loginName;
App.db.data[user].Installer.serviceConfigs = serviceConfigs;
@@ -265,7 +269,6 @@ App.db.setClusterStatus = function (stat
localStorage.setObject('ambari', App.db.data);
}
-
/*
* getter methods
*/
@@ -391,14 +394,14 @@ App.db.getHosts = function () {
return App.db.data[user].Installer.hostInfo;
}
-App.db.getBootStatus = function() {
+App.db.getBootStatus = function () {
console.log('TRACE: Entering db:setService function');
App.db.data = localStorage.getObject('ambari');
var user = App.db.data.app.loginName;
return App.db.data[user].Installer.bootStatus;
}
-App.db.getService = function() {
+App.db.getService = function () {
console.log('TRACE: Entering db:getService function');
App.db.data = localStorage.getObject('ambari');
var user = App.db.data.app.loginName;
@@ -417,6 +420,12 @@ App.db.getMasterComponentHosts = functio
return App.db.data[user].Installer.masterComponentHosts;
}
+App.db.getHostToMasterComponent = function () {
+ App.db.data = localStorage.getObject('ambari');
+ var user = App.db.data.app.loginName;
+ return App.db.data[user].Installer.hostToMasterComponent;
+}
+
App.db.getHostSlaveComponents = function () {
App.db.data = localStorage.getObject('ambari');
var user = App.db.data.app.loginName;
@@ -429,7 +438,7 @@ App.db.getSlaveComponentHosts = function
return App.db.data[user].Installer.slaveComponentHosts;
}
-App.db.getServiceConfigs = function() {
+App.db.getServiceConfigs = function () {
App.db.data = localStorage.getObject('ambari');
var user = App.db.data.app.loginName;
return App.db.data[user].Installer.serviceConfigs;
@@ -441,12 +450,11 @@ App.db.getServiceConfigProperties = func
return App.db.data[user].Installer.configProperties;
}
-App.db.getClusterStatus = function() {
+App.db.getClusterStatus = function () {
console.log('TRACE: Entering db:setService function');
App.db.data = localStorage.getObject('ambari');
var user = App.db.data.app.loginName;
return App.db.data[user].Installer.clusterStatus;
}
-
module.exports = App.db;
Modified: incubator/ambari/branches/AMBARI-666/ambari-web/app/views/installer/step6_view.js
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-web/app/views/installer/step6_view.js?rev=1400492&r1=1400491&r2=1400492&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-web/app/views/installer/step6_view.js (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-web/app/views/installer/step6_view.js Sat Oct 20 17:29:51 2012
@@ -22,10 +22,29 @@ var App = require('app');
App.InstallerStep6View = Em.View.extend({
templateName: require('templates/installer/step6'),
-
didInsertElement: function () {
var controller = this.get('controller');
controller.loadStep();
}
+});
+
+App.InstallerStep6HostView = Em.View.extend({
+
+ host: null,
+ didInsertElement: function (event, context) {
+ var self = this;
+ var components = this.get('controller').getMasterComponentsforHost(this.get('host.hostname')).toString();
+ components = components.replace(/,/g, " /\n");
+ if (components === 'false') {
+ return;
+ } else {
+ this.$().popover({
+ title: 'master components hosted on ' + self.get('host.hostname'),
+ content: components,
+ placement: 'right',
+ trigger: 'hover'
+ });
+ }
+ }
});
\ No newline at end of file