ui/app/service/new-balancer/controller.js

160 lines
4.5 KiB
JavaScript

import Ember from 'ember';
import Cattle from 'ui/utils/cattle';
import EditLoadBalancerConfig from 'ui/mixins/edit-loadbalancerconfig';
import EditHealthCheck from 'ui/mixins/edit-healthcheck';
export default Ember.ObjectController.extend(Cattle.NewOrEditMixin, EditLoadBalancerConfig, EditHealthCheck, {
queryParams: ['environmentId','serviceId','tab'],
environmentId: null,
serviceId: null,
tab: 'listeners',
error: null,
editing: false,
primaryResource: Ember.computed.alias('model.balancer'),
actions: {
addTargetService: function() {
this.get('targetsArray').pushObject({isService: true, value: null});
},
removeTarget: function(obj) {
this.get('targetsArray').removeObject(obj);
},
},
initFields: function() {
this._super();
this.initListeners();
this.initTargets();
this.initHealthCheck();
this.initStickiness();
},
useExisting: 'no',
isUseExisting: Ember.computed.equal('useExisting','yes'),
hasNoExisting: Ember.computed.equal('activeConfigs.length',0),
existingConfigId: null,
initHosts: function() {
},
hostDisabled: Ember.computed.equal('hostChoices.length',0),
hostChoices: function() {
return this.get('allHosts').filter((host) => {
return host.get('state') === 'active';
}).sortBy('name','id');
}.property('allHosts.@each.{id,name,state}'),
targetsArray: null,
initTargets: function() {
var existing = this.get('balancer.consumedServices');
var out = [];
if ( existing )
{
existing.forEach((service) => {
out.push({ isService: true, value: Ember.get(service,'id') });
});
}
else
{
out.push({isService: true, value: null});
}
this.set('targetsArray', out);
},
targetServiceIds: function() {
return this.get('targetsArray').filterProperty('isService',true).filterProperty('value').map((choice) => {
return Ember.get(choice,'value');
}).uniq();
}.property('targetsArray.@each.{isService,value}'),
targetChoices: function() {
var list = [];
var env = this.get('environment');
var envName = env.get('name') || ('(Environment '+env.get('id')+')');
env.get('services').map((service) => {
list.pushObject({
group: 'Environment: ' + envName,
id: service.get('id'),
name: service.get('name') || ('(' + service.get('id') + ')')
});
});
return list.sortBy('group','name','id');
}.property('environment.services.@each.{name,id},environment.{name,id}').volatile(),
activeConfigs: function() {
return this.get('allConfigs').filter((config) => {
return config.get('state') === 'active';
});
}.property('allConfigs.@each.state'),
validate: function() {
this._super();
var errors = this.get('errors')||[];
if ( !this.get('targetServiceIds.length') )
{
errors.push('Choose one or more targets to send traffic to');
}
if (!this.get('listenersArray.length') )
{
errors.push('One or more listening ports are required');
}
errors.pushObjects(this.get('config').validationErrors());
this.get('listenersArray').forEach((listener) => {
errors.pushObjects(listener.validationErrors());
});
errors.pushObjects(this.get('balancer').validationErrors());
if ( errors.length )
{
this.set('errors',errors.uniq());
return false;
}
return true;
},
listenersChanged: function() {
var list = [];
this.get('listenersArray').forEach(function(listener) {
var src = listener.get('sourcePort');
var proto = listener.get('sourceProtocol');
var tgt = listener.get('targetPort');
if ( src && proto )
{
list.pushObject(src + ':' + (tgt ? tgt : src) + (proto === 'http' ? '': '/' + proto ) );
}
});
this.set('model.launchConfig.ports', list.sort().uniq());
}.observes('listenersArray.@each.{sourcePort,sourceProtocol,targetPort,targetProtocol}'),
nameChanged: function() {
this.set('config.name', this.get('balancer.name') + ' config');
}.observes('balancer.name'),
descriptionChanged: function() {
this.set('config.description', this.get('balancer.description'));
}.observes('balancer.description'),
didSave: function() {
var balancer = this.get('model.balancer');
// Set balancer targets
return balancer.waitForNotTransitioning().then(() => {
return balancer.doAction('setservicelinks', {
serviceIds: this.get('targetServiceIds'),
});
});
},
doneSaving: function() {
this.transitionToRoute('environment', this.get('environment.id'));
},
});