package org.cloudbus.cloudsim.container.resourceAllocatorMigrationEnabled;
import org.cloudbus.cloudsim.container.core.*;
import org.cloudbus.cloudsim.container.hostSelectionPolicies.HostSelectionPolicy;
import org.cloudbus.cloudsim.container.vmSelectionPolicies.PowerContainerVmSelectionPolicy;
import java.util.*;
/**
* Created by sareh on 17/11/15.
*/
public class PowerContainerVmAllocationPolicyMigrationAbstractHostSelection extends PowerContainerVmAllocationPolicyMigrationAbstract {
private HostSelectionPolicy hostSelectionPolicy;
private double utilizationThreshold = 0.9;
private double underUtilizationThreshold = 0.7;
/**
* Instantiates a new power vm allocation policy migration abstract.
*
* @param hostSelectionPolicy
* @param hostList the host list
* @param vmSelectionPolicy the vm selection policy
*/
public PowerContainerVmAllocationPolicyMigrationAbstractHostSelection(List<? extends ContainerHost> hostList, PowerContainerVmSelectionPolicy vmSelectionPolicy, HostSelectionPolicy hostSelectionPolicy, double OlThreshold, double UlThreshold) {
super(hostList, vmSelectionPolicy);
setHostSelectionPolicy(hostSelectionPolicy);
setUtilizationThreshold(OlThreshold);
setUnderUtilizationThreshold(UlThreshold);
}
@Override
/**
* Find host for vm.
*
* @param vm the vm
* @param excludedHosts the excluded hosts
* @return the power host
*/
public PowerContainerHost findHostForVm(ContainerVm vm, Set<? extends ContainerHost> excludedHosts) {
PowerContainerHost allocatedHost = null;
Boolean find = false;
Set<ContainerHost> excludedHost1 = new HashSet<>();
excludedHost1.addAll(excludedHosts);
while (!find) {
ContainerHost host = getHostSelectionPolicy().getHost(getContainerHostList(), vm, excludedHost1);
if (host == null) {
return allocatedHost;
}
if (host.isSuitableForContainerVm(vm)) {
find = true;
allocatedHost = (PowerContainerHost) host;
} else {
excludedHost1.add(host);
if (getContainerHostList().size() == excludedHost1.size()) {
return null;
}
}
}
return allocatedHost;
}
public HostSelectionPolicy getHostSelectionPolicy() {
return hostSelectionPolicy;
}
public void setHostSelectionPolicy(HostSelectionPolicy hostSelectionPolicy) {
this.hostSelectionPolicy = hostSelectionPolicy;
}
/**
* Checks if is host over utilized.
*
* @param host the _host
* @return true, if is host over utilized
*/
@Override
protected boolean isHostOverUtilized(PowerContainerHost host) {
addHistoryEntry(host, getUtilizationThreshold());
double totalRequestedMips = 0;
for (ContainerVm vm : host.getVmList()) {
totalRequestedMips += vm.getCurrentRequestedTotalMips();
}
double utilization = totalRequestedMips / host.getTotalMips();
return utilization > getUtilizationThreshold();
}
@Override
protected boolean isHostUnderUtilized(PowerContainerHost host) {
return false;
}
/**
* Sets the utilization threshold.
*
* @param utilizationThreshold the new utilization threshold
*/
protected void setUtilizationThreshold(double utilizationThreshold) {
this.utilizationThreshold = utilizationThreshold;
}
/**
* Gets the utilization threshold.
*
* @return the utilization threshold
*/
protected double getUtilizationThreshold() {
return utilizationThreshold;
}
public double getUnderUtilizationThreshold() {
return underUtilizationThreshold;
}
public void setUnderUtilizationThreshold(double underUtilizationThreshold) {
this.underUtilizationThreshold = underUtilizationThreshold;
}
@Override
/**
* Gets the under utilized host.
*Checks if the utilization is under the threshold then counts it as underUtilized :)
* @param excludedHosts the excluded hosts
* @return the under utilized host
*/
protected PowerContainerHost getUnderUtilizedHost(Set<? extends ContainerHost> excludedHosts) {
List<ContainerHost> underUtilizedHostList = getUnderUtilizedHostList(excludedHosts);
if (underUtilizedHostList.size() == 0) {
return null;
}
ContainerHostList.sortByCpuUtilizationDescending(underUtilizedHostList);
// Log.print(String.format("The under Utilized Hosts are %d", underUtilizedHostList.size()));
PowerContainerHost underUtilizedHost = (PowerContainerHost) underUtilizedHostList.get(0);
return underUtilizedHost;
}
/**
* Gets the under utilized host.
*
* @param excludedHosts the excluded hosts
* @return the under utilized host
*/
protected List<ContainerHost> getUnderUtilizedHostList(Set<? extends ContainerHost> excludedHosts) {
List<ContainerHost> underUtilizedHostList = new ArrayList<>();
for (PowerContainerHost host : this.<PowerContainerHost>getContainerHostList()) {
if (excludedHosts.contains(host)) {
continue;
}
double utilization = host.getUtilizationOfCpu();
if (!areAllVmsMigratingOutOrAnyVmMigratingIn(host) && utilization < getUnderUtilizationThreshold() && !areAllContainersMigratingOutOrAnyContainersMigratingIn(host)) {
underUtilizedHostList.add(host);
}
}
return underUtilizedHostList;
}
@Override
public void setDatacenter(ContainerDatacenter datacenter) {
}
}