mirror of https://github.com/rancher/ui.git
141 lines
3.6 KiB
JavaScript
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;
|
|
}),
|
|
});
|