package org.cloudbus.cloudsim.container.resourceAllocators;
import org.cloudbus.cloudsim.container.core.Container;
import org.cloudbus.cloudsim.container.core.ContainerVm;
import org.cloudbus.cloudsim.Log;
import org.cloudbus.cloudsim.core.CloudSim;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by sareh on 16/07/15.
*/
public abstract class PowerContainerAllocationPolicy extends ContainerAllocationPolicy{
/** The container table. */
private final Map<String, ContainerVm> containerTable = new HashMap<>();
/**
* Instantiates a new power vm allocation policy abstract.
*
*/
public PowerContainerAllocationPolicy() {
super();
}
/*
* (non-Javadoc)
* @see org.cloudbus.cloudsim.VmAllocationPolicy#allocateHostForVm(org.cloudbus.cloudsim.Vm)
*/
@Override
public boolean allocateVmForContainer(Container container, List<ContainerVm> containerVmList) {
setContainerVmList(containerVmList);
return allocateVmForContainer(container, findVmForContainer(container));
}
/*
* (non-Javadoc)
* @see org.cloudbus.cloudsim.VmAllocationPolicy#allocateHostForVm(org.cloudbus.cloudsim.Vm,
* org.cloudbus.cloudsim.Host)
*/
@Override
public boolean allocateVmForContainer(Container container, ContainerVm containerVm) {
if (containerVm == null) {
Log.formatLine("%.2f: No suitable VM found for Container#" + container.getId() + "\n", CloudSim.clock());
return false;
}
if (containerVm.containerCreate(container)) { // if vm has been succesfully created in the host
getContainerTable().put(container.getUid(), containerVm);
// container.setVm(containerVm);
Log.formatLine(
"%.2f: Container #" + container.getId() + " has been allocated to the VM #" + containerVm.getId(),
CloudSim.clock());
return true;
}
Log.formatLine(
"%.2f: Creation of Container #" + container.getId() + " on the Vm #" + containerVm.getId() + " failed\n",
CloudSim.clock());
return false;
}
/**
* Find host for vm.
*
* @param container the vm
* @return the power host
*/
public ContainerVm findVmForContainer(Container container) {
for (ContainerVm containerVm : getContainerVmList()) {
// Log.printConcatLine("Trying vm #",containerVm.getId(),"For container #", container.getId());
if (containerVm.isSuitableForContainer(container)) {
return containerVm;
}
}
return null;
}
/*
* (non-Javadoc)
* @see org.cloudbus.cloudsim.VmAllocationPolicy#deallocateHostForVm(org.cloudbus.cloudsim.Vm)
*/
@Override
public void deallocateVmForContainer(Container container) {
ContainerVm containerVm = getContainerTable().remove(container.getUid());
if (containerVm != null) {
containerVm.containerDestroy(container);
}
}
/*
* (non-Javadoc)
* @see org.cloudbus.cloudsim.VmAllocationPolicy#getHost(org.cloudbus.cloudsim.Vm)
*/
@Override
public ContainerVm getContainerVm(Container container) {
return getContainerTable().get(container.getUid());
}
/*
* (non-Javadoc)
* @see org.cloudbus.cloudsim.VmAllocationPolicy#getHost(int, int)
*/
@Override
public ContainerVm getContainerVm(int containerId, int userId) {
return getContainerTable().get(Container.getUid(userId, containerId));
}
/**
* Gets the vm table.
*
* @return the vm table
*/
public Map<String, ContainerVm> getContainerTable() {
return containerTable;
}
}