| (function () { |
| angular.module('xos.serviceTopology') |
| .service('RackHelper', function(serviceTopologyConfig, lodash){ |
| |
| this.getComputeNodeLabelSize = () => { |
| return serviceTopologyConfig.computeNode.labelHeight + (serviceTopologyConfig.instance.margin * 2) |
| } |
| |
| /** |
| * Given a list of instance should get the Compute Node size. |
| * They are placed in rows of 2 with 5px margin on each side. |
| */ |
| |
| this.getComputeNodeSize = lodash.memoize((instances) => { |
| const width = (serviceTopologyConfig.instance.margin * 3) + (serviceTopologyConfig.instance.width *2); |
| |
| const rows = Math.round(instances.length / 2); |
| |
| const labelSpace = this.getComputeNodeLabelSize(); |
| |
| const height = (serviceTopologyConfig.instance.height * rows) + (serviceTopologyConfig.instance.margin * (rows + 1)) + labelSpace; |
| |
| return [width, height]; |
| }); |
| |
| /** |
| * Give a list on Compute Node should calculate the Rack Size. |
| * Compute nodes are placed in a single column with 5px margin on each side. |
| */ |
| this.getRackSize = (nodes) => { |
| |
| let width = 0; |
| let height = serviceTopologyConfig.computeNode.margin; |
| |
| lodash.forEach(nodes, (node) => { |
| let [instanceWidth, instanceHeight] = this.getComputeNodeSize(node.instances); |
| |
| width = instanceWidth + (serviceTopologyConfig.computeNode.margin * 2); |
| height += (instanceHeight + serviceTopologyConfig.computeNode.margin); |
| }); |
| |
| return [width, height]; |
| }; |
| |
| /** |
| * Given an instance index, return the coordinates |
| */ |
| |
| this.getInstancePosition = (position) => { |
| const row = Math.floor(position / 2); |
| const column = (position % 2) ? 1 : 0; |
| |
| // add ComputeNode label size |
| const labelSpace = this.getComputeNodeLabelSize(); |
| |
| // x = margin + (width * column) + ( maring * column) |
| const x = serviceTopologyConfig.instance.margin + (serviceTopologyConfig.instance.width * column) + (serviceTopologyConfig.instance.margin * column); |
| |
| // y = label + margin + (height * row) + ( maring * row) |
| const y = labelSpace + serviceTopologyConfig.instance.margin + (serviceTopologyConfig.instance.height * row) + (serviceTopologyConfig.instance.margin * row); |
| return [x, y]; |
| }; |
| |
| /** |
| * Given an Compute Node index, return the coordinates |
| */ |
| |
| this.getComputeNodePosition = (nodes, position) => { |
| |
| const x = serviceTopologyConfig.computeNode.margin; |
| |
| let previousElEight = lodash.reduce(nodes.slice(0, position), (val, node) => { |
| return val + this.getComputeNodeSize(node.instances)[1] |
| }, 0); |
| |
| const y = |
| serviceTopologyConfig.computeNode.margin |
| + (serviceTopologyConfig.computeNode.margin * position) |
| + previousElEight; |
| |
| return [x, y]; |
| }; |
| |
| }); |
| })(); |