Calculating rack details
diff --git a/views/ngXosViews/diagnostic/src/js/rackHelper.js b/views/ngXosViews/diagnostic/src/js/rackHelper.js
new file mode 100644
index 0000000..037ecdd
--- /dev/null
+++ b/views/ngXosViews/diagnostic/src/js/rackHelper.js
@@ -0,0 +1,85 @@
+(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);
+
+ console.log('previousElEight ' + previousElEight);
+ const y =
+ serviceTopologyConfig.computeNode.margin
+ + (serviceTopologyConfig.computeNode.margin * position)
+ + previousElEight;
+
+
+ return [x, y];
+ };
+
+ });
+})();