tripleo-ui/src/js/selectors/nodesAssignment.js

98 lines
3.7 KiB
JavaScript

import { createSelector } from 'reselect';
import { getFormValues } from 'redux-form';
import { getParameters } from './parameters';
import { getRegisteredNodes, getNodeCapabilities } from './nodes';
import { getRoles } from './roles';
export const getAvailableNodes = createSelector(
getRegisteredNodes, (nodes) => nodes.filter(node => node.get('provision_state') === 'available')
);
export const getUntaggedAvailableNodes = createSelector(
getAvailableNodes, (availableNodes) =>
availableNodes.filterNot(node => getNodeCapabilities(node).profile)
);
/**
* Returns Nodes available for assignment for each Role (tagged to specific role
* + untagged nodes)
* TODO(jtomasek): remove this when NodesAssignment component is no longer used
*/
export const getAvailableNodesByRole = createSelector(
[getAvailableNodes, getUntaggedAvailableNodes, getRoles], (nodes, untaggedNodes, roles) =>
roles.map(role => nodes.filter(node => getNodeCapabilities(node).profile === role.identifier)
.merge(untaggedNodes))
);
/**
* Returns <RoleName>Count parameters for each Role
*/
export const getNodeCountParametersByRole = createSelector(
[getRoles, getParameters], (roles, parameters) =>
roles.map(role => parameters.get(`${role.name}Count`))
);
/**
* Returns <RoleName>Count parameters for each Role combined with values from
* nodesAssignment form
*/
export const getNodeCountParametersByRoleFromFormValues = createSelector(
[getNodeCountParametersByRole, getFormValues('nodesAssignment')],
(parametersByRole, formValues) =>
parametersByRole.map(parameter =>
parameter &&
parameter.set('default', formValues && formValues[parameter.name]
? formValues[parameter.name]
: parameter.default))
);
/**
* Returns sum of untagged assigned Nodes counts across all Roles
*/
export const getTotalUntaggedAssignedNodesCount = createSelector(
[getAvailableNodes, getRoles, getNodeCountParametersByRoleFromFormValues],
(nodes, roles, parametersByRole) =>
roles.reduce((total, role) => {
const taggedCount =
nodes.filter(node => getNodeCapabilities(node).profile === role.identifier).size;
const assignedCount = parametersByRole.getIn([role.identifier, 'default'], 0);
const remainder = Math.max(0, assignedCount - taggedCount);
return total + remainder;
}, 0)
);
/**
* Returns maximum Nodes count available to assign by each Role
*/
export const getAvailableNodesCountsByRole = createSelector(
[getAvailableNodes, getUntaggedAvailableNodes, getRoles,
getNodeCountParametersByRoleFromFormValues, getTotalUntaggedAssignedNodesCount],
(nodes, untaggedNodes, roles, parametersByRole, untaggedAssignedCount) =>
roles.map(role => {
const taggedCount
= nodes.filter(node => getNodeCapabilities(node).profile === role.identifier).size;
const assignedCount = parametersByRole.getIn([role.identifier, 'default'], 0);
const untaggedCount = untaggedNodes.size;
return taggedCount
+ Math.max(0, untaggedCount - untaggedAssignedCount
+ Math.max(0, assignedCount - taggedCount));
})
);
/**
* Returns 'default' value of <RoleName>Count parameter for each Role
* { ControllerCount: 1, ComputeCount: 0, ... }
*/
export const getAssignedNodesCountsByRole = createSelector(
getNodeCountParametersByRole, nodeCountParametersByRole =>
nodeCountParametersByRole.mapEntries(([role, parameter]) =>
parameter ? [parameter.name, parameter.default] : undefined)
);
export const getTotalAssignedNodesCount = createSelector(
getNodeCountParametersByRole, countParamsByRole =>
countParamsByRole.reduce((total, parameter) =>
parameter ? total + parseInt(parameter.default) : total, 0)
);