1 package at.ac.tuwien.lsdc.types;
3 import java.util.HashMap;
5 import at.ac.tuwien.lsdc.exception.ActiveApplicationsException;
6 import at.ac.tuwien.lsdc.exception.VMsRunningException;
7 import at.ac.tuwien.lsdc.types.VirtualMachine.VMType;
9 public class PhysicalMachine {
11 private static int count = 0;
13 private HashMap<Integer, VirtualMachine> VMs = new HashMap<Integer, VirtualMachine>();
17 private final int maxSize = 50000;
18 private final int maxRAM = 4700;
19 private final int maxCPU = 2400;
25 private final int initialSize = 850;
26 private final int initialRAM = 300;
27 private final int initialCPU = 500;
29 private boolean running = false;
31 public PhysicalMachine() {
43 public void stop() throws VMsRunningException {
45 throw new VMsRunningException("PM cannot be stopped. Some VMs still running");
47 VMs = new HashMap<Integer, VirtualMachine>();
54 public double getConsumption() {
56 return 200.0 + 0.3 * (CPU - initialCPU);
63 public VirtualMachine startVirtualMachine(int sz, int ram, int cpu, VMType type) {
64 if (checkVM(sz, ram, cpu)) {
65 VirtualMachine vm = new VirtualMachine(sz, ram, cpu, this, type);
66 VMs.put(vm.getId(), vm);
67 size = size + vm.getSize();
68 RAM = RAM + vm.getRAM();
69 CPU = CPU + vm.getCPU();
75 public void stopVirtualMachine(VirtualMachine vm) throws ActiveApplicationsException {
76 if (VMs.containsKey(vm.getId())) {
77 if (vm.getApplications().size() != 0) {
78 throw new ActiveApplicationsException("Applications must be migrated before stopping a VM, VM id "+vm.getId());
80 VMs.remove(vm.getId());
81 size = size - vm.getSize();
82 RAM = RAM - vm.getRAM();
83 CPU = CPU - vm.getCPU();
88 public boolean checkVM(int size, int RAM, int CPU) {
89 return (size <= availableSize()) && (RAM <= availableRAM())
90 && (CPU <= availableCPU());
93 private int availableSize() {
94 return maxSize - size;
97 private int availableRAM() {
101 private int availableCPU() {
105 public int getCurrentSize() {
109 public int getCurrentRam() {
113 public int getCurrentCpu() {
117 public double getSizeUtilization() {
118 return ((double)(size - initialSize) / (maxSize - initialSize)) * 100;
121 public double getRamUtilization() {
122 return ((double)(RAM - initialRAM) / (maxRAM - initialRAM)) * 100;
125 public double getCpuUtilization() {
126 return ((double)(CPU - initialCPU) / (maxCPU - initialCPU)) * 100;
129 public double getAverageUtilization() {
130 return (getSizeUtilization() + getRamUtilization() + getCpuUtilization()) / 3.0;
137 public boolean isRunning() {
141 public VirtualMachine getVirtualMachine(int id) {
145 public int countCurrentlyRunningVMs() {
146 return VMs.values().size();