ui/lib/shared/addon/mixins/grouped-instances.js

141 lines
3.6 KiB
JavaScript

import Mixin from '@ember/object/mixin';
import C from 'ui/utils/constants';
import { computed } from '@ember/object';
function labelsMatching(ary, key, val) {
return ary.filter((x) => {
return (x.get('labels') || {})[key] === val;
});
}
export default Mixin.create({
groupedInstances: computed('filteredInstances.@each.{name,id}', function() {
var groups = [];
function getOrCreateGroup(id, name, isK8s) {
let group = groups.findBy('id', id);
if ( !group ) {
group = {
id,
name,
instances: [],
hasChildren: false,
kubernetes: isK8s
};
groups.push(group);
}
return group;
}
function getOrCreateUnit(groupId, groupName, deploymentUnit) {
var group = getOrCreateGroup(groupId, groupName);
var unit;
if ( deploymentUnit ) {
unit = group.instances.filterBy('unit', deploymentUnit)[0];
}
if ( !unit ) {
unit = {
unit: deploymentUnit,
main: null,
children: [],
group
};
group.instances.push(unit);
}
return unit;
}
let remaining = this.get('filteredInstances').slice();
while ( remaining.get('length') ) {
let instance = remaining.objectAt(0);
let labels = instance.get('labels') || {};
let deploymentUnit = labels[C.LABEL.DEPLOYMENT_UNIT] || null;
// let version = instance.get('version')||"";
let k8sName = (instance.get('labels') || {})[C.LABEL.K8S_POD_NAMESPACE] || '';
let stackId = instance.get('stack.id') || '';
let stackName = instance.get('stack.displayName') || '';
let groupId, groupName;
if ( k8sName ) {
groupId = `_k8s_${ k8sName }`;
groupName = k8sName || '';
} else {
groupId = stackId || '';
groupName = stackName || '';
}
getOrCreateGroup(groupId, groupName, !!k8sName);
let orphans = [];
if ( deploymentUnit ) {
let related = labelsMatching(remaining, C.LABEL.DEPLOYMENT_UNIT, deploymentUnit);
// related = related.filterBy('version', version);
let primary = labelsMatching(related, C.LABEL.LAUNCH_CONFIG, C.LABEL.LAUNCH_CONFIG_PRIMARY).sortBy('createdTS').reverse()[0];
// Normal case, there's a primary service and maybe some sidekicks and/or old primary.
if ( primary ) {
related.removeObject(primary);
let unit = getOrCreateUnit(groupId, groupName, deploymentUnit);
unit.group.hasChildren = true;
unit.main = primary;
unit.children.pushObjects(related);
remaining.removeObject(primary);
} else {
orphans = related;
}
remaining.removeObjects(related);
} else if ( stackId ) {
let unit = getOrCreateUnit(groupId, groupName, instance.get('id'));
unit.group.hasChildren = false;
unit.main = instance;
remaining.removeObject(instance);
} else {
orphans = [instance];
}
if ( orphans.length ) {
for ( let i = 0 ; i < orphans.length ; i++ ) {
let unit = getOrCreateUnit('', '', null);
unit.main = orphans[i];
}
remaining.removeObjects(orphans);
}
remaining.removeObject(instance);
}
// Sorting is nice
groups = groups.sortBy('name');
// Standalone last
let standalone = getOrCreateGroup('');
groups.removeObject(standalone);
groups.push(standalone);
// Collapse all
groups.forEach((group) => {
group.collapsed = true;
});
return groups;
}),
});