| /** |
| * 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'); |
| /** |
| * Used to manage slave component config. User could create different settings for separate group |
| * @type {*} |
| */ |
| App.SlaveComponentGroupsController = Em.ArrayController.extend({ |
| |
| name: 'slaveComponentGroupsController', |
| |
| contentBinding: 'App.router.wizardStep7Controller.slaveComponentHosts', |
| |
| stepConfigsBinding: 'App.router.wizardStep7Controller.stepConfigs', |
| |
| serviceBinding: 'App.router.wizardStep7Controller.selectedService', |
| |
| servicesBinding: 'App.router.wizardStep7Controller.content.services', |
| |
| clearStep: function () { |
| |
| }, |
| |
| loadStep: function () { |
| this.clearStep(); |
| this.loadGroups(); |
| }, |
| |
| loadGroups: function () { |
| |
| this.get('stepConfigs').forEach(function (_serviceConfig) { |
| var categoryConfig = _serviceConfig.get('configCategories'); |
| if (categoryConfig.someProperty('isForSlaveComponent', true)) { |
| var slaveCategory = categoryConfig.findProperty('isForSlaveComponent', true); |
| // this.get('content') -> Output of Step 6: Mapping of each slave component and set of hosts it runs on |
| if (this.get('content')) { |
| if (this.get('content').someProperty('componentName', slaveCategory.get('primaryName'))) { |
| // component --> each column in Step 6 is a component ( slave component ) |
| var component = this.get('content').findProperty('componentName', slaveCategory.get('primaryName')); |
| // slaveConfigs --> originally set as null in the class App.SlaveCategory in model/service_config.js |
| var slaveConfigs = slaveCategory.get('slaveConfigs'); |
| |
| slaveCategory.set('slaveConfigs', App.SlaveConfigs.create(component)); |
| var slaveGroups = []; |
| if (component.groups) { |
| component.groups.forEach(function (_group) { |
| slaveGroups.pushObject(_group); |
| }, this); |
| slaveCategory.set('slaveConfigs.groups', slaveGroups); |
| } |
| slaveCategory.set('slaveConfigs.componentName', component.componentName); |
| slaveCategory.set('slaveConfigs.displayName', component.displayName); |
| /*slaveCategory.set('slaveConfigs.groups.name', component.get('name')); |
| slaveCategory.set('slaveConfigs.groups.index', component.get('index')); |
| slaveCategory.set('slaveConfigs.groups.type', component.get('type')); |
| slaveCategory.set('slaveConfigs.groups.active', component.get('active'));*/ |
| if (!slaveCategory.get('slaveConfigs.groups')) { |
| slaveCategory.set('slaveConfigs.groups', []); |
| var componentProperties = this.componentProperties(_serviceConfig.serviceName); |
| var defaultGroup = {name: 'Default', index: 'default', type: 'default', active: true, properties: componentProperties}; |
| slaveCategory.get('slaveConfigs.groups').pushObject(App.Group.create(defaultGroup)); |
| } |
| } |
| } |
| } |
| }, this); |
| }, |
| |
| // returns key-value pairs i.e. all fields for slave component for this specific service. |
| componentProperties: function (serviceName) { |
| |
| var serviceConfigs = require('data/service_configs').findProperty('serviceName', serviceName); |
| |
| var configs = []; |
| var componentName = null; |
| switch (serviceName) { |
| case 'HDFS': |
| componentName = 'DataNode'; |
| break; |
| case 'MAPREDUCE': |
| componentName = 'TaskTracker'; |
| break; |
| case 'HBASE': |
| componentName = 'RegionServer'; |
| } |
| var slaveConfigs = serviceConfigs.configs.filterProperty('category', componentName); |
| slaveConfigs.forEach(function (_serviceConfigProperty) { |
| var serviceConfigProperty = App.ServiceConfigProperty.create(_serviceConfigProperty); |
| |
| switch(serviceConfigProperty.name){ |
| case 'dfs_data_dir' : |
| serviceConfigProperty.initialValue(); |
| break; |
| case 'mapred_local_dir' : |
| serviceConfigProperty.initialValue(); |
| break; |
| } |
| configs.pushObject(serviceConfigProperty); |
| serviceConfigProperty.validate(); |
| }, this); |
| return configs; |
| }, |
| |
| selectedComponentName: function () { |
| switch (App.router.get('wizardStep7Controller.selectedService.serviceName')) { |
| case 'HDFS': |
| return { name: 'DATANODE', |
| displayName: 'DataNode'}; |
| case 'MAPREDUCE': |
| return { name: 'TASKTRACKER', |
| displayName: 'TaskTracker'}; |
| |
| case 'HBASE': |
| return { name: 'HBASE_REGIONSERVER', |
| displayName: 'RegionServer'}; |
| default: |
| return null; |
| } |
| |
| }.property('service'), |
| |
| selectedComponentDisplayName: function() { |
| return App.format.role(this.get('selectedComponentName')); |
| }.property('selectedComponentName'), |
| |
| selectedSlaveComponent: function () { |
| var selectedComponentName = this.get('selectedComponentName') ? this.get('selectedComponentName').displayName : null; |
| var configs = null; |
| if (selectedComponentName) { |
| App.router.get('wizardStep7Controller.stepConfigs').forEach(function (_serviceConfig) { |
| var categoryConfig = _serviceConfig.get('configCategories'); |
| if (categoryConfig.someProperty('name', selectedComponentName)) { |
| configs = categoryConfig.findProperty('name', selectedComponentName).get('slaveConfigs'); |
| } |
| }, this); |
| } |
| return configs; |
| }.property('selectedComponentName', 'stepConfigs.@each.configCategories', 'stepConfigs.@each.configCategories.@each.slaveConfigs'), |
| |
| hosts: function () { |
| if (this.get('selectedSlaveComponent')) { |
| return this.get('selectedSlaveComponent').get('hosts'); |
| } |
| }.property('selectedSlaveComponent'), |
| |
| groups: function () { |
| var hosts = this.get('hosts'); |
| if(hosts){ |
| return hosts.mapProperty('group').uniq(); |
| } |
| }.property('hosts'), |
| |
| componentGroups: function () { |
| var component = this.get('selectedSlaveComponent'); |
| if (component && component.get('groups')) { |
| return component.get('groups'); |
| } |
| return []; |
| }.property('selectedSlaveComponent', 'selectedSlaveComponent.groups', 'stepConfigs.@each.configCategories.@each.slaveConfigs.groups.@each.properties.@each.value'), |
| |
| |
| getGroupsForDropDown: function () { |
| return this.get('componentGroups').getEach('name'); |
| }.property('selectedComponentName', 'componentGroups.@each.name'), |
| |
| activeGroup: function () { |
| var componentGroups = this.get('componentGroups'); |
| if (componentGroups) { |
| var active = componentGroups.findProperty('active', true); |
| if (active){ |
| return active; |
| } |
| } |
| return null; |
| }.property('componentGroups.@each.active', 'componentGroups.@each.name', 'componentGroups.@each.properties.@each.value'), |
| |
| |
| /** |
| * Show slave hosts to groups popup |
| * @param event |
| */ |
| showAddSlaveComponentGroup: function (event) { |
| var componentName = event.context; |
| var component = this.get('selectedSlaveComponent'); |
| App.ModalPopup.show({ |
| header: componentName + ' Groups', |
| bodyClass: Ember.View.extend({ |
| controllerBinding: 'App.router.slaveComponentGroupsController', |
| header: Em.I18n.t('installer.slaveComponentHostsPopup.header').format(this.get('selectedComponentDisplayName')), |
| templateName: require('templates/wizard/slave_component_hosts_popup') |
| }), |
| onPrimary: function (event) { |
| if (component.tempSelectedGroups && component.tempSelectedGroups.length) { |
| component.tempSelectedGroups.forEach(function (item) { |
| var changed = component.get('hosts').filterProperty('hostName', item.hostName); |
| changed.setEach('group', item.groupName); |
| }) |
| } |
| delete component.tempSelectedGroups; |
| this.hide(); |
| }, |
| onSecondary: function (event) { |
| delete component.tempSelectedGroups; |
| this.hide(); |
| }, |
| onClose: function (event) { |
| delete component.tempSelectedGroups; |
| this.hide(); |
| } |
| }); |
| }, |
| |
| /** |
| * Utility method. Save temporary info about changes in <code>slave hosts to groups</code> popup |
| * @param host |
| * @param groupName |
| */ |
| changeHostGroup: function (host, groupName) { |
| var component = this.get('selectedSlaveComponent'); |
| if (component.tempSelectedGroups === undefined) { |
| component.tempSelectedGroups = []; |
| } |
| var values = component.tempSelectedGroups.filterProperty('hostName', host.hostName); |
| if (values.length === 0) |
| component.tempSelectedGroups.pushObject({hostName: host.hostName, groupName: groupName}); |
| else |
| values.setEach('groupName', groupName); |
| |
| }, |
| |
| /** |
| * add new group to component(click on button) |
| */ |
| addSlaveComponentGroup: function () { |
| var component = this.get('selectedSlaveComponent'); |
| var newGroupName = 'New Group'; |
| component.get('groups').setEach('active', false); |
| var newGroups = component.get('groups').filterProperty('name', newGroupName); |
| if (newGroups.length === 0){ |
| component.newGroupIndex = 0; |
| } |
| else { |
| component.newGroupIndex = component.newGroupIndex || 0; |
| this.checkGroupName(); |
| newGroupName = 'New Group ' + component.newGroupIndex; |
| } |
| var newGroup = {name: newGroupName, index: component.newGroupIndex, type: 'new', active: true, properties: this.componentProperties(App.router.get('wizardStep7Controller.selectedService.serviceName'))}; |
| component.groups.pushObject(App.Group.create(newGroup)); |
| $('.remove-group-error').hide(); |
| }, |
| |
| checkGroupName: function () { |
| var component = this.get('selectedSlaveComponent'); |
| component.newGroupIndex++; |
| var newGroupName = 'New Group ' + component.newGroupIndex; |
| var groups = component.get('groups').filterProperty('name', newGroupName); |
| if (groups.length !== 0) { |
| this.checkGroupName(); |
| } |
| }, |
| |
| /** |
| * Onclick handler for <code>choose hosts for slave group</code> link |
| * @param event |
| */ |
| showEditSlaveComponentGroups: function (event) { |
| this.showAddSlaveComponentGroup(event); |
| }, |
| |
| getHostsByGroup: function (group) { |
| var hosts = this.get('hosts'); |
| if(hosts){ |
| return hosts.filterProperty('group', group.name); |
| } |
| }, |
| |
| /** |
| * Change tab |
| * @param event |
| */ |
| showSlaveComponentGroup: function (event) { |
| var component = this.get('selectedSlaveComponent'); |
| if(!component.groups){ |
| |
| } |
| component.get('groups').setEach('active', false); |
| var group = component.get('groups').filterProperty('name', event.context.name); |
| group.setEach('active', true); |
| var assignedHosts = component.get('hosts').filterProperty('group', event.context.name); |
| if (assignedHosts.length === 0) { |
| $('.remove-group-error').hide(); |
| } |
| }, |
| |
| /** |
| * Remove tab |
| * @param event |
| */ |
| removeSlaveComponentGroup: function (event) { |
| var group = event.context; |
| var component = this.get('selectedSlaveComponent'); |
| var assignedHosts = component.get('hosts').filterProperty('group', group.name); |
| if (assignedHosts.length !== 0) { |
| $('.remove-group-error').show(); |
| } else { |
| $('.remove-group-error').hide(); |
| var key = component.groups.indexOf(group); |
| component.groups.removeObject(component.groups[key]); |
| |
| var newGroups = component.groups.filterProperty('type', 'new'); |
| if (newGroups.length == 0) |
| component.newGroupIndex = 0; |
| else { |
| var lastNewGroup = newGroups[newGroups.length - 1]; |
| component.newGroupIndex = lastNewGroup.index; |
| } |
| if (group.active) { |
| var lastGroup; |
| if (key === component.groups.length) |
| lastGroup = component.groups.slice(key - 1, key); |
| else lastGroup = component.groups.slice(key, key + 1); |
| lastGroup.setEach('active', true); |
| } |
| } |
| }, |
| |
| /** |
| * change group name of slave component |
| * @param group |
| * @param newGroupName |
| * @return {Boolean} |
| */ |
| changeSlaveGroupName: function (group, newGroupName) { |
| var component = this.get('selectedSlaveComponent'); |
| var isExist = component.get('groups').filterProperty('name', newGroupName); |
| if (isExist.length !== 0) |
| return true; |
| else { |
| var assignedHosts = component.get('hosts').filterProperty('group', group.name); |
| if (assignedHosts.length !== 0){ |
| assignedHosts.setEach('group', newGroupName); |
| } |
| var groupFilter = component.get('groups').filterProperty('name', group.name); |
| groupFilter.setEach('name', newGroupName); |
| } |
| return false; |
| } |
| |
| }); |