package tomekp.nodestest; import gridsim.gssim.GssimTags; import java.util.Arrays; import java.util.List; import schedframe.resources.PowerState; import test.rewolucja.energy.EnergyEvent; import test.rewolucja.energy.EnergyEventType; import test.rewolucja.energy.extension.EnergyExtension; import test.rewolucja.energy.profile.AbstractPowerProfile; import test.rewolucja.extensions.ExtensionType; import test.rewolucja.resources.ResourceStatus; import test.rewolucja.resources.physical.base.ComputingResource; import test.rewolucja.resources.physical.implementation.ComputingNode; public class ComputingNodePowerProfile extends AbstractPowerProfile{ public static double START_TIME = 600.0; public static double SHUTDOWN_TIME = 300.0; public static double START_COST = 1000; public static double SHUTDOWN_COST = 500; protected ComputingNode computingNode; public ComputingNodePowerProfile(){ powerState = PowerState.ON; } public void visit(ComputingNode compNode){ computingNode = compNode; energyExtension = (EnergyExtension) computingNode.getExtensionList().getExtension(ExtensionType.ENERGY_EXTENSION); } public boolean setPowerState(PowerState state){ if(!supportPowerState(state)) return false; //powerState = state; if(state == PowerState.OFF){ if(powerState == PowerState.SHUTDOWNING) powerState = PowerState.OFF; else if(powerState == PowerState.ON) powerState = PowerState.SHUTDOWNING; } else if(state == PowerState.ON){ if(powerState == PowerState.STARTING) powerState = PowerState.ON; else if(powerState == PowerState.OFF) powerState = PowerState.STARTING; } if(computingNode.getProcessors() != null) { for(ComputingResource child:computingNode.getProcessors()){ child.getPowerInterface().setPowerState(state); } } else { computingNode.handleEvent(new EnergyEvent(EnergyEventType.POWER_STATE_CHANGED, computingNode.getName())); } if(state == PowerState.OFF){ if(powerState == PowerState.SHUTDOWNING) computingNode.getLogicalResource().sendInternal(SHUTDOWN_TIME, GssimTags.SHUTDOWN, computingNode.getName()); computingNode.setStatus(ResourceStatus.UNAVAILABLE); } else if(state == PowerState.ON){ if(powerState == PowerState.STARTING) computingNode.getLogicalResource().sendInternal(START_TIME, GssimTags.START, computingNode.getName()); computingNode.setStatus(ResourceStatus.FREE); } //computingNode.handleEvent(new EnergyEvent(EnergyEventType.POWER_STATE_CHANGED, computingNode.getName())); return true; } public double getPowerConsumption(PowerState state) { if(powerState == PowerState.OFF) return 0; else if(powerState == PowerState.ON) { if( computingNode.getCategory().getName().equals("A")) return 240; else if( computingNode.getCategory().getName().equals("B")) return 95; }else if(powerState == PowerState.STARTING) return START_COST; else if (powerState == PowerState.SHUTDOWNING) return SHUTDOWN_COST; return 150; } public boolean supportPowerState(PowerState state) { switch(state){ case ON: return true; case OFF: return true; case SLEEP: return true; case HIBERNATE: return true; default: return false; } } public List getSupportedPowerStates() { return Arrays.asList(new PowerState[]{PowerState.ON, PowerState.OFF, PowerState.SLEEP, PowerState.HIBERNATE}); } public void turnOn(){ setPowerState(PowerState.ON); } public void turnOff(){ setPowerState(PowerState.OFF); } }