/** * Create a DPod object layered over the given list of entities. * * @param seList A list of entities layered over the DPod * @param scName The name of the Storage Controller that defined this DPod * @return The DPod created */ public static DPod createDPod( DPod dPod, final Set<ServiceEntity> seList, HistoryUtil historyLayeredOver, HistoryUtil historyUnderlying) { // Need a naming method for DPod dPod.setDisplayName(dPod.getName()); // Create all the relationships between the providers and the dPod Map<String, Float> key2flowCap = new HashMap<String, Float>(); key2flowCap.put(PodUtil.FLOW_KEYS[1], 0f); key2flowCap.put(PodUtil.FLOW_KEYS[2], 0f); float cpuCap = 0f, memCap = 0f, stCap = 0f; for (ServiceEntity se : seList) { attachDPodToProvider(se, dPod, historyLayeredOver); // calculate the sum of the capacities for each type of commodity for (Commodity comm : se.getCommodities()) { if (comm.eClass() == AbstractionPackage.eINSTANCE.getFlow()) { if (comm.getKey().contains(PodUtil.FLOW_KEYS[1])) { key2flowCap.put( PodUtil.FLOW_KEYS[1], key2flowCap.get(PodUtil.FLOW_KEYS[1]) + comm.getCapacity()); logger.trace( "Flow-1 Commodity: " + comm.getDisplayName() + " has capacity " + comm.getCapacity()); logger.trace( "Flow-1 capacity (after addition): " + key2flowCap.get(PodUtil.FLOW_KEYS[1])); } else if (comm.getKey().contains(PodUtil.FLOW_KEYS[2])) { key2flowCap.put( PodUtil.FLOW_KEYS[2], key2flowCap.get(PodUtil.FLOW_KEYS[2]) + comm.getCapacity()); logger.trace("Flow-2 Commodity has capacity " + comm.getCapacity()); logger.trace( "Flow-2 capacity (after addition): " + key2flowCap.get(PodUtil.FLOW_KEYS[2])); } } else if (comm.eClass() == AbstractionPackage.eINSTANCE.getCPU()) { cpuCap += comm.getCapacity(); } else if (comm.eClass() == AbstractionPackage.eINSTANCE.getMem()) { memCap += comm.getCapacity(); } else if (comm.eClass() == AbstractionPackage.eINSTANCE.getStorageAmount()) { stCap += comm.getCapacity(); } } } // Create commodities sold by the DPod // The capacity of the commodities is equal to the sum of the capacities on all underlying // entities StorageAllocation stAlloc = (StorageAllocation) createObject( AbstractionPackage.eINSTANCE.getStorageAllocation(), "ST-" + dPod.getName()); stAlloc.setCapacity(stCap); stAlloc.setKey(CommodityImpl.dynCommKey(dPod)); stAlloc.setResizeable(false); dPod.getCommodities().add(stAlloc); CPUAllocation cpuAlloc = (CPUAllocation) createObject(AbstractionPackage.eINSTANCE.getCPUAllocation(), "CPU-" + dPod.getName()); cpuAlloc.setCapacity(cpuCap); cpuAlloc.setKey(CommodityImpl.dynCommKey(dPod)); cpuAlloc.setResizeable(false); dPod.getCommodities().add(cpuAlloc); MemAllocation memAlloc = (MemAllocation) createObject(AbstractionPackage.eINSTANCE.getMemAllocation(), "MEM-" + dPod.getName()); memAlloc.setCapacity(memCap); memAlloc.setKey(CommodityImpl.dynCommKey(dPod)); memAlloc.setResizeable(false); dPod.getCommodities().add(memAlloc); for (int level = 1; level < PodUtil.FLOW_KEYS.length; level++) { FlowAllocation flowAlloc = (FlowAllocation) createObject( AbstractionPackage.eINSTANCE.getFlowAllocation(), "FlowAllocation-" + level + "-" + dPod.getName()); logger.info( "Flow-" + level + " Allocation capacity " + key2flowCap.get(PodUtil.FLOW_KEYS[level])); if (key2flowCap.get(PodUtil.FLOW_KEYS[level]) >= 9e14) { logger.trace("Flow-" + level + " Allocation capacity is too high."); logger.trace( "Flow-" + level + " Allocation Capacity is " + key2flowCap.get(PodUtil.FLOW_KEYS[level])); } flowAlloc.setCapacity(key2flowCap.get(PodUtil.FLOW_KEYS[level])); flowAlloc.setKey(PodUtil.getFlowKey(CommodityImpl.dynCommKey(dPod), level)); flowAlloc.setResizeable(false); dPod.getCommodities().add(flowAlloc); } return dPod; }