blob: 38d99f0e5b8fc3d38ca6532fddef535eb4c5cdf5 [file] [log] [blame]
/**
* 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');
/**
* Mixin for host select view on step 5 install wizard
* Implements base login for select, input types
* Each view which use this mixin should redefine method <code>changeHandler</code> (with
* observing <code>controller.hostNameCheckTrigger</code>)
*
* @type {Ember.Mixin}
*/
App.SelectHost = Em.Mixin.create({
/**
* Element of <code>controller.servicesMasters</code>
* Binded from template
* @type {object}
*/
component: null,
/**
* List of avaiable host names
* @type {string[]}
*/
content: [],
/**
* Host component name
* @type {string}
*/
componentName: null,
/**
* Handler for selected value change
* Triggers <code>changeHandler</code> execution
* @method change
*/
change: function () {
if ('destroyed' === this.get('state')) return;
this.set('controller.lastChangedComponent', this.get('component.component_name'));
this.get('controller').toggleProperty('hostNameCheckTrigger');
},
/**
* Add or remove <code>error</code> class from parent div-element
* @param {bool} flag true - add class, false - remove
* @method updateErrorStatus
*/
updateErrorStatus: function(flag) {
var parentBlock = this.$().parent('div');
/* istanbul ignore next */
if (flag) {
parentBlock.removeClass('error');
}
else {
parentBlock.addClass('error');
}
},
/**
* If component is multiple (defined in <code>controller.multipleComponents</code>),
* should update <code>controller.componentToRebalance</code> and trigger rebalancing
* @method tryTriggerRebalanceForMultipleComponents
*/
tryTriggerRebalanceForMultipleComponents: function() {
var componentIsMultiple = this.get('controller.multipleComponents').contains(this.get("component.component_name"));
if(componentIsMultiple) {
this.get('controller').set('componentToRebalance', this.get("component.component_name"));
this.get('controller').incrementProperty('rebalanceComponentHostsCounter');
}
},
/**
* Handler for value changing
* Should be redeclared in child views
* Each redeclarion should contains code:
* <code>
* if (!this.shouldChangeHandlerBeCalled()) return;
* </code>
* @method changeHandler
*/
changeHandler: function() {}.observes('controller.hostNameCheckTrigger'),
/**
* If view is destroyed or not current component's host name was changed we should do nothing
* This method should be called from <code>changeHandler</code>:
* <code>
* changeHandler: function() {
* if (!this.shouldChangeHandlerBeCalled()) return;
* // your code
* }.observes(...)
* </code>
* @returns {boolean}
* @method shouldChangeHandlerBeCalled
*/
shouldChangeHandlerBeCalled: function() {
return !(('destroyed' === this.get('state')) || (this.get('controller.lastChangedComponent') !== this.get("component.component_name")));
},
/**
* If <code>component.isHostNameValid</code> was changed,
* error status should be updated according to new value
* @method isHostNameValidObs
*/
isHostNameValidObs: function() {
this.updateErrorStatus(this.get('component.isHostNameValid'));
}.observes('component.isHostNameValid'),
/**
* Recalculate available hosts
* This should be done only once per Ember loop
* @method rebalanceComponentHosts
*/
rebalanceComponentHosts: function () {
Em.run.once(this, 'rebalanceComponentHostsOnce');
}.observes('controller.rebalanceComponentHostsCounter'),
/**
* Recalculate available hosts
* @method rebalanceComponentHostsOnce
*/
rebalanceComponentHostsOnce: function() {
if (this.get('component.component_name') === this.get('controller.componentToRebalance')) {
this.initContent();
}
},
/**
* Get available hosts
* multipleComponents component can be assigned to multiple hosts,
* shared hosts among the same component should be filtered out
* @return {string[]}
* @method getAvailableHosts
*/
getAvailableHosts: function () {
var hosts = this.get('controller.hosts').slice(),
componentName = this.get('component.component_name'),
multipleComponents = this.get('controller.multipleComponents'),
occupiedHosts = this.get('controller.selectedServicesMasters')
.filterProperty('component_name', componentName)
.mapProperty('selectedHost')
.without(this.get('component.selectedHost'));
if (multipleComponents.contains(componentName)) {
return hosts.filter(function (host) {
return !occupiedHosts.contains(host.get('host_name'));
}, this);
}
return hosts;
},
/**
* Extract hosts from controller,
* filter out available to selection and
* push them into form element content
* @method initContent
*/
initContent: function () {
this.set("content", this.getAvailableHosts());
}
});