2017-05-18 21:21:33 +03:00
|
|
|
import { createSelector } from 'reselect';
|
2017-06-22 20:09:13 +03:00
|
|
|
import forceArray from 'force-array';
|
2017-05-18 21:21:33 +03:00
|
|
|
|
|
|
|
const apollo = state => state.apollo;
|
|
|
|
|
2017-05-25 23:03:39 +03:00
|
|
|
// Redux selectors //
|
2017-05-18 21:21:33 +03:00
|
|
|
|
|
|
|
const deploymentGroupBySlug = deploymentGroupSlug =>
|
|
|
|
createSelector(
|
|
|
|
[apollo],
|
|
|
|
apollo =>
|
|
|
|
apollo && apollo.data
|
|
|
|
? Object.keys(apollo.data).reduce(
|
|
|
|
(dg, k) =>
|
|
|
|
apollo.data[k].__typename === 'DeploymentGroup' &&
|
|
|
|
apollo.data[k].slug === deploymentGroupSlug
|
|
|
|
? apollo.data[k]
|
|
|
|
: dg,
|
|
|
|
null
|
|
|
|
)
|
|
|
|
: null
|
|
|
|
);
|
|
|
|
|
|
|
|
const serviceBySlug = serviceSlug =>
|
|
|
|
createSelector(
|
|
|
|
[apollo],
|
|
|
|
apollo =>
|
|
|
|
apollo && apollo.data
|
|
|
|
? Object.keys(apollo.data).reduce(
|
|
|
|
(s, k) =>
|
|
|
|
apollo.data[k].__typename === 'Service' &&
|
|
|
|
apollo.data[k].slug === serviceSlug
|
|
|
|
? apollo.data[k]
|
|
|
|
: s,
|
|
|
|
null
|
|
|
|
)
|
|
|
|
: null
|
|
|
|
);
|
|
|
|
|
2017-06-16 17:12:28 +03:00
|
|
|
const instancesByServiceId = serviceId =>
|
|
|
|
createSelector(
|
|
|
|
[apollo],
|
|
|
|
apollo =>
|
|
|
|
apollo && apollo.data
|
|
|
|
? Object.keys(apollo.data).reduce((is, i, k) => {
|
|
|
|
if (
|
|
|
|
apollo.data[k].__typename === 'Instance' &&
|
|
|
|
apollo.data[k].service === serviceId
|
|
|
|
) {
|
|
|
|
is.push(apollo.data[k]);
|
|
|
|
}
|
|
|
|
return is;
|
|
|
|
}, [])
|
|
|
|
: null
|
|
|
|
);
|
|
|
|
|
2017-05-25 23:03:39 +03:00
|
|
|
// Apollo gql utils //
|
2017-05-18 21:21:33 +03:00
|
|
|
|
|
|
|
const findService = (services, uuid) =>
|
|
|
|
services.reduce((service, s) => (s.uuid === uuid ? s : service), null);
|
|
|
|
|
|
|
|
const getService = (service, index, datacenter) => ({
|
|
|
|
index,
|
|
|
|
...service,
|
2017-05-25 23:03:39 +03:00
|
|
|
// Tmp for topology
|
2017-05-18 21:21:33 +03:00
|
|
|
metrics: [1, 2, 3].map(m => ({
|
|
|
|
name: `${m}`,
|
|
|
|
value: `${m}`
|
|
|
|
})),
|
2017-06-26 15:25:46 +03:00
|
|
|
// instances: service.instances.length,
|
2017-05-18 21:21:33 +03:00
|
|
|
datacenter
|
|
|
|
});
|
|
|
|
|
|
|
|
const processServices = (services, datacenter) => {
|
2017-06-22 20:09:13 +03:00
|
|
|
return forceArray(services).reduce((ss, s, i) => {
|
2017-05-18 21:21:33 +03:00
|
|
|
if (s.parent) {
|
2017-06-26 15:25:46 +03:00
|
|
|
const parents = ss.filter(parentS => parentS.id === s.parent);
|
|
|
|
let parent;
|
|
|
|
if (parents.length) {
|
|
|
|
parent = parents[0];
|
|
|
|
} else {
|
|
|
|
parent = { id: s.parent };
|
2017-05-18 21:21:33 +03:00
|
|
|
ss.push(parent);
|
|
|
|
}
|
|
|
|
if (!parent.children) {
|
|
|
|
parent.children = [];
|
|
|
|
}
|
|
|
|
parent.children.push(getService(s, i, datacenter));
|
2017-06-26 15:25:46 +03:00
|
|
|
} else {
|
|
|
|
const serviceIndex = ss.findIndex(existingS => existingS.id === s.id);
|
|
|
|
if (serviceIndex == -1) {
|
|
|
|
ss.push(getService(s, i, datacenter));
|
|
|
|
} else {
|
|
|
|
ss.splice(serviceIndex, 1, {
|
|
|
|
...ss[serviceIndex],
|
|
|
|
...getService(s, i, datacenter)
|
|
|
|
});
|
|
|
|
}
|
2017-05-18 21:21:33 +03:00
|
|
|
}
|
|
|
|
return ss;
|
|
|
|
}, []);
|
|
|
|
};
|
|
|
|
|
|
|
|
export {
|
|
|
|
deploymentGroupBySlug as deploymentGroupBySlugSelector,
|
|
|
|
serviceBySlug as serviceBySlugSelector,
|
2017-06-23 23:22:06 +03:00
|
|
|
processServices,
|
|
|
|
instancesByServiceId
|
2017-05-18 21:21:33 +03:00
|
|
|
};
|