package org.cloudbus.cloudsim.container.containerProvisioners;
import java.util.HashMap;
import java.util.Map;
import org.cloudbus.cloudsim.container.core.Container;
/**
* @author sareh
*/
public class ContainerRamProvisionerSimple extends ContainerRamProvisioner {
/**
* The RAM table.
*/
private Map<String, Float> containerRamTable;
/**
* @param availableRam the available ram
*/
public ContainerRamProvisionerSimple(float availableRam) {
super(availableRam);
setContainerRamTable(new HashMap<String, Float>());
}
/**
* @see ContainerRamProvisioner#allocateRamForContainer(Container, float)
* @param container the container
* @param ram the ram
* @return
*/
@Override
public boolean allocateRamForContainer(Container container,
float ram) {
float maxRam = container.getRam();
if (ram >= maxRam) {
ram = maxRam;
}
deallocateRamForContainer(container);
if (getAvailableVmRam() >= ram) {
setAvailableVmRam(getAvailableVmRam() - ram);
getContainerRamTable().put(container.getUid(), ram);
container.setCurrentAllocatedRam(getAllocatedRamForContainer(container));
return true;
}
container.setCurrentAllocatedRam(getAllocatedRamForContainer(container));
return false;
}
/**
* @link ContainerRamProvisioner#getAllocatedRamForContainer(Container)
* @param container the container
* @return
*/
@Override
public float getAllocatedRamForContainer(Container container) {
if (getContainerRamTable().containsKey(container.getUid())) {
return getContainerRamTable().get(container.getUid());
}
return 0;
}
/**
* @see ContainerRamProvisioner#deallocateRamForContainer(Container)
* @param container the container
*/
@Override
public void deallocateRamForContainer(Container container) {
if (getContainerRamTable().containsKey(container.getUid())) {
float amountFreed = getContainerRamTable().remove(container.getUid());
setAvailableVmRam(getAvailableVmRam() + amountFreed);
container.setCurrentAllocatedRam(0);
}
}
/**
* @see ContainerRamProvisioner#deallocateRamForAllContainers()
*/
@Override
public void deallocateRamForAllContainers() {
super.deallocateRamForAllContainers();
getContainerRamTable().clear();
}
/**
* @see ContainerRamProvisioner#isSuitableForContainer(Container, float)
* @param container the container
* @param ram the vm's ram
* @return
*/
@Override
public boolean isSuitableForContainer(Container container,
float ram) {
float allocatedRam = getAllocatedRamForContainer(container);
boolean result = allocateRamForContainer(container, ram);
deallocateRamForContainer(container);
if (allocatedRam > 0) {
allocateRamForContainer(container, allocatedRam);
}
return result;
}
/**
*
* @return the containerRamTable
*/
protected Map<String, Float> getContainerRamTable() {
return containerRamTable;
}
/**
* @param containerRamTable the containerRamTable to set
*/
protected void setContainerRamTable(Map<String, Float> containerRamTable) {
this.containerRamTable = containerRamTable;
}
}