@spotinst/spinnaker-deck
Version:
Spinnaker-Deck service, forked with support to Spotinst
169 lines (152 loc) • 6.22 kB
JavaScript
;
import { module } from 'angular';
import _ from 'lodash';
import { GCEProviderSettings } from '../gce.settings';
export const GOOGLE_LOADBALANCER_LOADBALANCER_TRANSFORMER = 'spinnaker.gce.loadBalancer.transformer';
export const name = GOOGLE_LOADBALANCER_LOADBALANCER_TRANSFORMER; // for backwards compatibility
module(GOOGLE_LOADBALANCER_LOADBALANCER_TRANSFORMER, []).factory('gceLoadBalancerTransformer', [
'$q',
function ($q) {
function updateHealthCounts(container) {
const instances = container.instances;
const serverGroups = container.serverGroups || [container];
container.instanceCounts = {
up: instances.filter((instance) => {
return instance.health[0].state === 'InService';
}).length,
down: instances.filter((instance) => {
return instance.health[0].state === 'OutOfService';
}).length,
outOfService: serverGroups.reduce((acc, serverGroup) => {
return (
serverGroup.instances.filter((instance) => {
return instance.healthState === 'OutOfService';
}).length + acc
);
}, 0),
};
}
function transformInstance(instance, loadBalancer) {
instance.health = instance.health || {};
instance.provider = loadBalancer.type;
instance.account = loadBalancer.account;
instance.region = loadBalancer.region;
instance.health.type = 'LoadBalancer';
instance.healthState = instance.health.state
? instance.health.state === 'InService'
? 'Up'
: 'Down'
: 'OutOfService';
instance.health = [instance.health];
instance.loadBalancers = [loadBalancer.name];
}
function normalizeLoadBalancer(loadBalancer) {
loadBalancer.serverGroups.forEach(function (serverGroup) {
serverGroup.account = loadBalancer.account;
if (serverGroup.detachedInstances) {
serverGroup.detachedInstances = serverGroup.detachedInstances.map(function (instanceId) {
return { id: instanceId };
});
serverGroup.instances = serverGroup.instances.concat(serverGroup.detachedInstances);
} else {
serverGroup.detachedInstances = [];
}
serverGroup.instances.forEach(function (instance) {
transformInstance(instance, loadBalancer);
});
updateHealthCounts(serverGroup);
});
const activeServerGroups = _.filter(loadBalancer.serverGroups, { isDisabled: false });
loadBalancer.provider = loadBalancer.type;
loadBalancer.instances = _.chain(activeServerGroups).map('instances').flatten().value();
loadBalancer.detachedInstances = _.chain(activeServerGroups).map('detachedInstances').flatten().value();
if (_.get(loadBalancer, 'backendService.healthCheck')) {
loadBalancer.backendService.healthCheck.timeout = loadBalancer.backendService.healthCheck.timeoutSec;
loadBalancer.backendService.healthCheck.interval = loadBalancer.backendService.healthCheck.checkIntervalSec;
}
updateHealthCounts(loadBalancer);
return $q.when(loadBalancer);
}
function convertLoadBalancerForEditing(loadBalancer) {
const toEdit = {
provider: 'gce',
region: loadBalancer.region,
credentials: loadBalancer.account,
listeners: [],
name: loadBalancer.name,
regionZones: loadBalancer.availabilityZones,
};
if (loadBalancer.elb) {
const elb = loadBalancer.elb;
toEdit.vpcId = elb.vpcid;
if (elb.listenerDescriptions) {
toEdit.listeners = elb.listenerDescriptions.map(function (description) {
const listener = description.listener;
return {
protocol: listener.protocol,
portRange: listener.loadBalancerPort,
healthCheck: elb.healthCheck !== undefined,
};
});
}
if (elb.healthCheck && elb.healthCheck.target) {
toEdit.healthTimeout = elb.healthCheck.timeout;
toEdit.healthInterval = elb.healthCheck.interval;
toEdit.healthyThreshold = elb.healthCheck.healthyThreshold;
toEdit.unhealthyThreshold = elb.healthCheck.unhealthyThreshold;
const healthCheck = loadBalancer.elb.healthCheck.target;
const protocolIndex = healthCheck.indexOf(':');
const pathIndex = healthCheck.indexOf('/');
if (protocolIndex !== -1 && pathIndex !== -1) {
toEdit.healthCheckProtocol = healthCheck.substring(0, protocolIndex);
toEdit.healthCheckPort = healthCheck.substring(protocolIndex + 1, pathIndex);
toEdit.healthCheckPath = healthCheck.substring(pathIndex);
if (!isNaN(toEdit.healthCheckPort)) {
toEdit.healthCheckPort = Number(toEdit.healthCheckPort);
}
}
} else {
toEdit.healthCheckProtocol = 'HTTP';
toEdit.healthCheckPort = 80;
toEdit.healthCheckPath = '/';
toEdit.healthTimeout = 5;
toEdit.healthInterval = 10;
toEdit.healthyThreshold = 10;
toEdit.unhealthyThreshold = 2;
}
toEdit.sessionAffinity = loadBalancer.sessionAffinity || 'None';
}
return toEdit;
}
function constructNewLoadBalancerTemplate() {
return {
provider: 'gce',
stack: '',
detail: '',
credentials: GCEProviderSettings.defaults.account,
region: GCEProviderSettings.defaults.region,
healthCheckProtocol: 'HTTP',
healthCheckPort: 80,
healthCheckPath: '/',
healthTimeout: 5,
healthInterval: 10,
healthyThreshold: 10,
unhealthyThreshold: 2,
sessionAffinity: 'NONE',
regionZones: [],
listeners: [
{
protocol: 'TCP',
portRange: '8080',
healthCheck: true,
},
],
};
}
return {
normalizeLoadBalancer: normalizeLoadBalancer,
convertLoadBalancerForEditing: convertLoadBalancerForEditing,
constructNewLoadBalancerTemplate: constructNewLoadBalancerTemplate,
};
},
]);