package org.cloudbus.cloudsim.container.core; import org.cloudbus.cloudsim.container.schedulers.ContainerCloudletScheduler; import org.cloudbus.cloudsim.*; import org.cloudbus.cloudsim.util.MathUtil; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; /** * Created by sareh on 9/07/15. */ public class Container { /** * The id. */ private int id; /** * The user id. */ private int userId; /** * The uid. */ private String uid; /** * The size. */ private long size; /** * The MIPS. */ private double mips; /** * The workloadMips. */ private double workloadMips; /** * The number of PEs. */ private int numberOfPes; /** * The ram. */ private float ram; /** * The bw. */ private long bw; /** * The containerManager. */ private String containerManager; /** * The ContainerCloudlet scheduler. */ private ContainerCloudletScheduler containerCloudletScheduler; /** * The ContainerVm. */ private ContainerVm vm; /** * In migration flag. */ private boolean inMigration; /** * The current allocated size. */ private long currentAllocatedSize; /** * The current allocated ram. */ private float currentAllocatedRam; /** * The current allocated bw. */ private long currentAllocatedBw; /** * The current allocated mips. */ private List<Double> currentAllocatedMips; /** * The VM is being instantiated. */ private boolean beingInstantiated; /** * The mips allocation history. */ private final List<VmStateHistoryEntry> stateHistory = new LinkedList<VmStateHistoryEntry>(); // added from the power Vm /** * The Constant HISTORY_LENGTH. */ public static final int HISTORY_LENGTH = 30; /** * The utilization history. */ private final List<Double> utilizationHistory = new LinkedList<Double>(); /** * The previous time. */ private double previousTime; /** * The scheduling interval. */ private double schedulingInterval; /** * Creates a new Container object. * @param id * @param userId * @param mips * @param numberOfPes * @param ram * @param bw * @param size * @param containerManager * @param containerCloudletScheduler * @param schedulingInterval */ public Container( int id, int userId, double mips, int numberOfPes, int ram, long bw, long size, String containerManager, ContainerCloudletScheduler containerCloudletScheduler, double schedulingInterval) { setWorkloadMips(mips); setId(id); setUserId(userId); setUid(getUid(userId, id)); setMips(mips); setNumberOfPes(numberOfPes); setRam(ram); setBw(bw); setSize(size); setContainerManager(containerManager); setContainerCloudletScheduler(containerCloudletScheduler); setInMigration(false); setBeingInstantiated(true); setCurrentAllocatedBw(0); setCurrentAllocatedMips(null); setCurrentAllocatedRam(0); setCurrentAllocatedSize(0); setSchedulingInterval(schedulingInterval); } /** * Updates the processing of cloudlets running on this Container. * * @param currentTime current simulation time * @param mipsShare array with MIPS share of each Pe available to the scheduler * @return time predicted completion time of the earliest finishing cloudlet, or 0 if there is no * next events * @pre currentTime >= 0 * @post $none */ public double updateContainerProcessing(double currentTime, List<Double> mipsShare) { if (mipsShare != null) { return getContainerCloudletScheduler().updateContainerProcessing(currentTime, mipsShare); } return 0.0; } /** * Gets the current requested total mips. * * @return the current requested total mips */ public double getCurrentRequestedTotalMips() { double totalRequestedMips = 0; for (double mips : getCurrentRequestedMips()) { totalRequestedMips += mips; } return totalRequestedMips; } /** * Gets the current requested max mips among all virtual PEs. * * @return the current requested max mips */ public double getCurrentRequestedMaxMips() { double maxMips = 0; for (double mips : getCurrentRequestedMips()) { if (mips > maxMips) { maxMips = mips; } } return maxMips; } /** * Gets the current requested bw. * * @return the current requested bw */ public long getCurrentRequestedBw() { if (isBeingInstantiated()) { return getBw(); } return (long) (getContainerCloudletScheduler().getCurrentRequestedUtilizationOfBw() * getBw()); } /** * Gets the current requested ram. * * @return the current requested ram */ public float getCurrentRequestedRam() { if (isBeingInstantiated()) { return getRam(); } return (float) (getContainerCloudletScheduler().getCurrentRequestedUtilizationOfRam() * getRam()); } /** * Get utilization created by all cloudlets running on this container. * * @param time the time * @return total utilization */ public double getTotalUtilizationOfCpu(double time) { //Log.printLine("Container: get Current getTotalUtilizationOfCpu"+ getContainerCloudletScheduler().getTotalUtilizationOfCpu(time)); return getContainerCloudletScheduler().getTotalUtilizationOfCpu(time); } /** * Get utilization created by all cloudlets running on this container in MIPS. * * @param time the time * @return total utilization */ public double getTotalUtilizationOfCpuMips(double time) { //Log.printLine("Container: get Current getTotalUtilizationOfCpuMips"+getTotalUtilizationOfCpu(time) * getMips()); return getTotalUtilizationOfCpu(time) * getMips(); } /** * Sets the uid. * * @param uid the new uid */ public void setUid(String uid) { this.uid = uid; } /** * Get unique string identificator of the container. * * @return string uid */ public String getUid() { return uid; } /** * Generate unique string identificator of the container. * * @param userId the user id * @param containerId the container id * @return string uid */ public static String getUid(int userId, int containerId) { return userId + "-" + containerId; } /** * Gets the id. * * @return the id */ public int getId() { return id; } /** * Sets the id. * * @param id the new id */ protected void setId(int id) { this.id = id; } /** * Sets the user id. * * @param userId the new user id */ protected void setUserId(int userId) { this.userId = userId; } /** * Gets the ID of the owner of the container. * * @return container's owner ID * @pre $none * @post $none */ public int getUserId() { return userId; } /** * Gets the mips. * * @return the mips */ public double getMips() { return mips; } /** * Sets the mips. * * @param mips the new mips */ protected void setMips(double mips) { this.mips = mips; } /** * Sets the mips. * * @param mips the new mips */ public void changeMips(double mips) { this.mips = mips; } /** * Gets the number of pes. * * @return the number of pes */ public int getNumberOfPes() { return numberOfPes; } /** * Sets the number of pes. * * @param numberOfPes the new number of pes */ protected void setNumberOfPes(int numberOfPes) { this.numberOfPes = numberOfPes; } /** * Gets the amount of ram. * * @return amount of ram * @pre $none * @post $none */ public float getRam() { return ram; } /** * Sets the amount of ram. * * @param ram new amount of ram * @pre ram > 0 * @post $none */ public void setRam(int ram) { this.ram = ram; } /** * Gets the amount of bandwidth. * * @return amount of bandwidth * @pre $none * @post $none */ public long getBw() { return bw; } /** * Sets the amount of bandwidth. * * @param bw new amount of bandwidth * @pre bw > 0 * @post $none */ public void setBw(long bw) { this.bw = bw; } /** * Gets the amount of storage. * * @return amount of storage * @pre $none * @post $none */ public long getSize() { return size; } /** * Sets the amount of storage. * * @param size new amount of storage * @pre size > 0 * @post $none */ public void setSize(long size) { this.size = size; } /** * Gets the VMM. * * @return VMM * @pre $none * @post $none */ public String getContainerManager() { return containerManager; } /** * Sets the VMM. * * @param containerManager the new containerManager */ protected void setContainerManager(String containerManager) { this.containerManager = containerManager; } /** * Gets the vm. * * @return the vm */ public ContainerVm getVm() { return vm; } /** * Gets the containerCloudletScheduler. * * @return the containerCloudletScheduler */ public ContainerCloudletScheduler getContainerCloudletScheduler() { return containerCloudletScheduler; } /** * Sets the VM that runs this container. * * @param vm VM running the container * @pre vm != $null * @post $none */ public void setVm(ContainerVm vm) { this.vm = vm; } /** * Sets the Container Cloudlet Scheduler. * * @param containerCloudletScheduler the new Container Cloudlet Scheduler */ protected void setContainerCloudletScheduler(ContainerCloudletScheduler containerCloudletScheduler) { this.containerCloudletScheduler = containerCloudletScheduler; } /** * Checks if is in migration. * * @return true, if is in migration */ public boolean isInMigration() { return inMigration; } /** * Sets the in migration. * * @param inMigration the new in migration */ public void setInMigration(boolean inMigration) { this.inMigration = inMigration; } /** * Gets the current allocated size. * * @return the current allocated size */ public long getCurrentAllocatedSize() { return currentAllocatedSize; } /** * Sets the current allocated size. * * @param currentAllocatedSize the new current allocated size */ protected void setCurrentAllocatedSize(long currentAllocatedSize) { this.currentAllocatedSize = currentAllocatedSize; } /** * Gets the current allocated ram. * * @return the current allocated ram */ public float getCurrentAllocatedRam() { return currentAllocatedRam; } /** * Sets the current allocated ram. * * @param currentAllocatedRam the new current allocated ram */ public void setCurrentAllocatedRam(float currentAllocatedRam) { this.currentAllocatedRam = currentAllocatedRam; } /** * Gets the current allocated bw. * * @return the current allocated bw */ public long getCurrentAllocatedBw() { return currentAllocatedBw; } /** * Sets the current allocated bw. * * @param currentAllocatedBw the new current allocated bw */ public void setCurrentAllocatedBw(long currentAllocatedBw) { this.currentAllocatedBw = currentAllocatedBw; } /** * Gets the current allocated mips. * * @return the current allocated mips */ public List<Double> getCurrentAllocatedMips() { return currentAllocatedMips; } /** * Sets the current allocated mips. * * @param currentAllocatedMips the new current allocated mips */ public void setCurrentAllocatedMips(List<Double> currentAllocatedMips) { this.currentAllocatedMips = currentAllocatedMips; } /** * Checks if is being instantiated. * * @return true, if is being instantiated */ public boolean isBeingInstantiated() { return beingInstantiated; } /** * Sets the being instantiated. * * @param beingInstantiated the new being instantiated */ public void setBeingInstantiated(boolean beingInstantiated) { this.beingInstantiated = beingInstantiated; } /** * Gets the state history. * * @return the state history */ public List<VmStateHistoryEntry> getStateHistory() { return stateHistory; } /** * Adds the state history entry. * * @param time the time * @param allocatedMips the allocated mips * @param requestedMips the requested mips * @param isInMigration the is in migration */ public void addStateHistoryEntry( double time, double allocatedMips, double requestedMips, boolean isInMigration) { VmStateHistoryEntry newState = new VmStateHistoryEntry( time, allocatedMips, requestedMips, isInMigration); if (!getStateHistory().isEmpty()) { VmStateHistoryEntry previousState = getStateHistory().get(getStateHistory().size() - 1); if (previousState.getTime() == time) { getStateHistory().set(getStateHistory().size() - 1, newState); return; } } getStateHistory().add(newState); } /** * Gets the utilization MAD in MIPS. * * @return the utilization mean in MIPS */ public double getUtilizationMad() { double mad = 0; if (!getUtilizationHistory().isEmpty()) { int n = HISTORY_LENGTH; if (HISTORY_LENGTH > getUtilizationHistory().size()) { n = getUtilizationHistory().size(); } double median = MathUtil.median(getUtilizationHistory()); double[] deviationSum = new double[n]; for (int i = 0; i < n; i++) { deviationSum[i] = Math.abs(median - getUtilizationHistory().get(i)); } mad = MathUtil.median(deviationSum); } return mad; } /** * Gets the utilization mean in percents. * * @return the utilization mean in MIPS */ public double getUtilizationMean() { double mean = 0; if (!getUtilizationHistory().isEmpty()) { int n = HISTORY_LENGTH; if (HISTORY_LENGTH > getUtilizationHistory().size()) { n = getUtilizationHistory().size(); } for (int i = 0; i < n; i++) { mean += getUtilizationHistory().get(i); } mean /= n; } return mean * getMips(); } /** * Gets the utilization variance in MIPS. * * @return the utilization variance in MIPS */ public double getUtilizationVariance() { double mean = getUtilizationMean(); double variance = 0; if (!getUtilizationHistory().isEmpty()) { int n = HISTORY_LENGTH; if (HISTORY_LENGTH > getUtilizationHistory().size()) { n = getUtilizationHistory().size(); } for (int i = 0; i < n; i++) { double tmp = getUtilizationHistory().get(i) * getMips() - mean; variance += tmp * tmp; } variance /= n; } return variance; } /** * Adds the utilization history value. * * @param utilization the utilization */ public void addUtilizationHistoryValue(final double utilization) { getUtilizationHistory().add(0, utilization); if (getUtilizationHistory().size() > HISTORY_LENGTH) { getUtilizationHistory().remove(HISTORY_LENGTH); } } /** * Gets the utilization history. * * @return the utilization history */ protected List<Double> getUtilizationHistory() { return utilizationHistory; } /** * Gets the previous time. * * @return the previous time */ public double getPreviousTime() { return previousTime; } /** * Sets the previous time. * * @param previousTime the new previous time */ public void setPreviousTime(final double previousTime) { this.previousTime = previousTime; } /** * Gets the scheduling interval. * * @return the schedulingInterval */ public double getSchedulingInterval() { return schedulingInterval; } /** * Sets the scheduling interval. * * @param schedulingInterval the schedulingInterval to set */ protected void setSchedulingInterval(double schedulingInterval) { this.schedulingInterval = schedulingInterval; } // public List<Double> getCurrentRequestedMips() { if (isBeingInstantiated()) { List<Double> currentRequestedMips = new ArrayList<>(); for (int i = 0; i < getNumberOfPes(); i++) { currentRequestedMips.add(getMips()); } return currentRequestedMips; } return getContainerCloudletScheduler().getCurrentRequestedMips(); } public double getWorkloadMips() { return workloadMips; } public void setWorkloadMips(double workloadMips) { this.workloadMips = workloadMips; } /** * Gets the current requested total mips. * * @return the current requested total mips */ public double getWorkloadTotalMips() { //Log.printLine("Container: get Current totalRequestedMips"+ totalRequestedMips); return getWorkloadMips() * getNumberOfPes(); } }