ui/lib/istio/addon/components/http-route-destination/component.js

156 lines
4.1 KiB
JavaScript

import Component from '@ember/component';
import layout from './template';
import { get, set, observer, setProperties } from '@ember/object'
import EmberObject from '@ember/object';
import { isNumeric } from 'shared/utils/util';
export default Component.extend({
layout,
editing: true,
httpRouteDestinations: null,
init() {
this._super(...arguments);
this.initDestinations();
},
didInsertElement() {
if ( !get(this, 'route.type') && get(this, 'httpRouteDestinations.length') === 0 ) {
this.send('addDestination');
}
},
actions: {
addDestination() {
const destination = EmberObject.create({
destination: { subset: this.getNewVersion(), },
weight: get(this, 'httpRouteDestinations.length') === 0 ? 100 : 0
});
const hosts = get(this, 'hosts') || [];
const firstHost = get(hosts, 'firstObject');
if ( hosts.length === 1 && firstHost && firstHost.indexOf('*') === -1 ) {
set(destination, 'destination.host', firstHost);
}
get(this, 'httpRouteDestinations').pushObject(destination);
},
removeDestination(destination) {
get(this, 'httpRouteDestinations').removeObject(destination);
},
},
hostsDidChange: observer('hosts.[]', function() {
const hosts = get(this, 'hosts') || [];
const firstHost = get(hosts, 'firstObject');
if ( hosts.length === 1 && firstHost && firstHost.indexOf('*') === -1 ) {
(get(this, 'httpRouteDestinations') || []).forEach((destination) => {
set(destination, 'destination.host', firstHost);
});
}
}),
inputDidChange: observer('httpRouteDestinations.@each.{weight,portNumberOrName}', function() {
const httpRouteDestinations = (get(this, 'httpRouteDestinations') || []);
httpRouteDestinations.forEach((destination) => {
const port = get(destination, 'portNumberOrName');
if ( port && isNumeric(port) ) {
set(destination, 'destination.port', { number: parseInt(port, 10) });
} else if ( port ) {
set(destination, 'destination.port', { name: port });
} else {
delete destination.destination['port']
}
});
if ( httpRouteDestinations.length === 2 ) {
let { weight1, weight2 } = this.getCurrentWeights();
if ( weight1 === get(this, 'weight1') && weight2 !== get(this, 'weight2') ) {
weight1 = 100 - weight2;
set(httpRouteDestinations[0], 'weight', weight1);
} else if ( weight1 !== get(this, 'weight1') && weight2 === get(this, 'weight2') ) {
weight2 = 100 - weight1;
set(httpRouteDestinations[1], 'weight', weight2);
}
setProperties(this, {
weight1,
weight2
})
}
}),
getNewVersion() {
const name = get(this, 'httpRouteDestinations.lastObject.destination.subset');
if ( name ) {
const matches = name.match(/\d+$/);
if ( matches.length > 0) {
const prefix = name.slice(0, name.length - matches[0].length);
return `${ prefix }${ parseInt(matches[0], 10) + 1 }`
}
} else {
return 'v1';
}
return '';
},
getCurrentWeights() {
const httpRouteDestinations = (get(this, 'httpRouteDestinations') || []);
let weight1 = 0;
let weight2 = 0;
if ( httpRouteDestinations.length === 2 ) {
const dest1 = httpRouteDestinations[0];
const dest2 = httpRouteDestinations[1];
weight1 = get(dest1, 'weight');
weight2 = get(dest2, 'weight');
if ( !weight1 ) {
weight1 = 0;
}
if ( !weight2 ) {
weight2 = 0;
}
weight1 = parseInt(weight1, 10);
weight2 = parseInt(weight2, 10);
}
return {
weight1,
weight2
}
},
initDestinations() {
const httpRouteDestinations = (get(this, 'httpRouteDestinations') || []);
httpRouteDestinations.forEach((destination) => {
const port = get(destination, 'destination.port');
if ( port ) {
set(destination, 'portNumberOrName', get(port, 'name') || get(port, 'number') || null);
}
});
if ( httpRouteDestinations.length === 2 ) {
setProperties(this, this.getCurrentWeights());
}
}
});