package org.cloudbus.cloudsim.container.core;
import org.cloudbus.cloudsim.container.lists.ContainerVmPeList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* Created by sareh on 10/07/15.
*/
public class ContainerHostList {
/**
* Gets the Machine object for a particular ID.
*
* @param <T> the generic type
* @param hostList the host list
* @param id the host ID
* @return the Machine object or <tt>null</tt> if no machine exists
* @pre id >= 0
* @post $none
* @see
*/
public static <T extends ContainerHost> T getById(List<T> hostList, int id) {
for (T host : hostList) {
if (host.getId() == id) {
return host;
}
}
return null;
}
/**
* Gets the total number of PEs for all Machines.
*
* @param <T> the generic type
* @param hostList the host list
* @return number of PEs
* @pre $none
* @post $result >= 0
*/
public static <T extends ContainerHost> int getNumberOfPes(List<T> hostList) {
int numberOfPes = 0;
for (T host : hostList) {
numberOfPes += host.getPeList().size();
}
return numberOfPes;
}
/**
* Gets the total number of <tt>FREE</tt> or non-busy PEs for all Machines.
*
* @param <T> the generic type
* @param hostList the host list
* @return number of PEs
* @pre $none
* @post $result >= 0
*/
public static <T extends ContainerHost> int getNumberOfFreePes(List<T> hostList) {
int numberOfFreePes = 0;
for (T host : hostList) {
numberOfFreePes += ContainerVmPeList.getNumberOfFreePes(host.getPeList());
}
return numberOfFreePes;
}
/**
* Gets the total number of <tt>BUSY</tt> PEs for all Machines.
*
* @param <T> the generic type
* @param hostList the host list
* @return number of PEs
* @pre $none
* @post $result >= 0
*/
public static <T extends ContainerHost> int getNumberOfBusyPes(List<T> hostList) {
int numberOfBusyPes = 0;
for (T host : hostList) {
numberOfBusyPes += ContainerVmPeList.getNumberOfBusyPes(host.getPeList());
}
return numberOfBusyPes;
}
/**
* Gets a Machine with free Pe.
*
* @param <T> the generic type
* @param hostList the host list
* @return a machine object or <tt>null</tt> if not found
* @pre $none
* @post $none
*/
public static <T extends ContainerHost> T getHostWithFreePe(List<T> hostList) {
return getHostWithFreePe(hostList, 1);
}
/**
* Gets a Machine with a specified number of free Pe.
*
* @param <T> the generic type
* @param hostList the host list
* @param pesNumber the pes number
* @return a machine object or <tt>null</tt> if not found
* @pre $none
* @post $none
*/
public static <T extends ContainerHost> T getHostWithFreePe(List<T> hostList, int pesNumber) {
for (T host : hostList) {
if (ContainerVmPeList.getNumberOfFreePes(host.getPeList()) >= pesNumber) {
return host;
}
}
return null;
}
/**
* Sets the particular Pe status on a Machine.
*
* @param <T> the generic type
* @param hostList the host list
* @param status Pe status, either <tt>Pe.FREE</tt> or <tt>Pe.BUSY</tt>
* @param hostId the host id
* @param peId the pe id
* @return <tt>true</tt> if the Pe status has changed, <tt>false</tt> otherwise (Machine id or
* Pe id might not be exist)
* @pre machineID >= 0
* @pre peID >= 0
* @post $none
*/
public static <T extends ContainerHost> boolean setPeStatus(List<T> hostList, int status, int hostId, int peId) {
T host = getById(hostList, hostId);
if (host == null) {
return false;
}
return host.setPeStatus(peId, status);
}
/**
* Sort by cpu utilization.
*
* @param hostList the vm list
*/
public static <T extends ContainerHost> void sortByCpuUtilization(List<T> hostList) {
Collections.sort(hostList, new Comparator<T>() {
@Override
public int compare(T a, T b) throws ClassCastException {
Double aUtilization = ((PowerContainerHost) a).getUtilizationOfCpu();
Double bUtilization = ((PowerContainerHost) b).getUtilizationOfCpu();
return bUtilization.compareTo(aUtilization);
}
});
}
public static <T extends ContainerHost> void sortByCpuUtilizationDescending(List<T> hostList) {
Collections.sort(hostList, Collections.reverseOrder(new Comparator<T>() {
@Override
public int compare(T a, T b) throws ClassCastException {
Double aUtilization = ((PowerContainerHost) a).getUtilizationOfCpu();
Double bUtilization = ((PowerContainerHost) b).getUtilizationOfCpu();
return bUtilization.compareTo(aUtilization);
}
}));
}
}