package test.migrate; import schedframe.resources.computing.Node; import schedframe.resources.computing.profiles.energy.EnergyEvent; import schedframe.resources.computing.profiles.energy.power.PowerState; import schedframe.resources.computing.profiles.energy.power.StandardPowerStateName; import schedframe.resources.computing.profiles.energy.power.UserPowerStateName; import schedframe.resources.devices.PhysicalResource; import schedframe.scheduling.manager.tasks.JobRegistry; import simulator.DataCenterWorkloadSimulator; import example.energy.BaseEnergyEstimationPlugin; import gridsim.dcworms.DCWormsTags; public class NodeEnergyEstimationPlugin extends BaseEnergyEstimationPlugin { private static int POWER_CAP_LEVEL = 150; public double estimatePowerConsumption(EnergyEvent event, JobRegistry jobRegistry, PhysicalResource resource) { double powerConsumption = 0; Node node = (Node) resource; if(node.getPowerInterface().getPowerState().equals(StandardPowerStateName.ON)){ powerConsumption = getPowerConsumption(node); } if(powerConsumption > POWER_CAP_LEVEL ){ DataCenterWorkloadSimulator.getEventManager().sendToAllSchedulers(0, DCWormsTags.POWER_LIMIT_EXCEEDED, node.getFullName()); } return powerConsumption; } public double getPowerConsumption(Node node){ double powerConsumption = 0; double loadLevel = node.getLoadInterface().getRecentUtilization().getValue(); double lowestLoadLevel = 100; double highestLoadLevel = 0; try{ if(node.getPowerInterface().supportPowerState(new UserPowerStateName("ON_" + new Double(loadLevel).intValue()))){ powerConsumption = node.getPowerInterface().getPowerConsumption(new UserPowerStateName("ON_" + new Double(loadLevel).intValue())); } else { for(PowerState powerState: node.getPowerInterface().getSupportedPowerStates()){ Double load; try{ load = Double.valueOf(powerState.getName().getName().substring(3)); }catch (Exception e){ continue; } if(lowestLoadLevel > load){ lowestLoadLevel = load; } if(highestLoadLevel < load){ highestLoadLevel = load; } } if(loadLevel == 0){ powerConsumption = node.getPowerInterface().getPowerConsumption(new UserPowerStateName("ON_0")); } else { double lowerLoadLevel = lowestLoadLevel; double higherLoadLevel = highestLoadLevel; for(PowerState powerState: node.getPowerInterface().getSupportedPowerStates()){ Double load = Double.valueOf(powerState.getName().getName().substring(3)); if(loadLevel > load){ lowerLoadLevel = load; } else if(loadLevel < load){ higherLoadLevel = load; break; } } double powerBelow; double powerAbove; double a; double b; if(lowerLoadLevel != higherLoadLevel) { powerBelow = node.getPowerInterface().getPowerConsumption(new UserPowerStateName("ON_" + new Double(lowerLoadLevel).intValue())); powerAbove = node.getPowerInterface().getPowerConsumption(new UserPowerStateName("ON_" + new Double(higherLoadLevel).intValue())); a = (powerAbove - powerBelow)/(higherLoadLevel - lowerLoadLevel); b = powerAbove - a * higherLoadLevel; } else { powerBelow = node.getPowerInterface().getPowerConsumption(new UserPowerStateName("ON_" + new Double(lowestLoadLevel).intValue())); powerAbove = node.getPowerInterface().getPowerConsumption(new UserPowerStateName("ON_" + new Double(highestLoadLevel).intValue())); a = (powerAbove - powerBelow)/(highestLoadLevel - lowestLoadLevel); b = powerAbove - a * highestLoadLevel; } powerConsumption = a * loadLevel + b; } } } catch (Exception e){ } return powerConsumption; } }