/*
(c) Copyright 2011 Telefonica, I+D. Printed in Spain (Europe). All Rights
Reserved.
The copyright to the software program(s) is property of Telefonica I+D.
The program(s) may be used and or copied only with the express written
consent of Telefonica I+D or in accordance with the terms and conditions
stipulated in the agreement/contract under which the program(s) have
been supplied.
*/
package com.telefonica.claudia.slm.deployment;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Transient;
import com.telefonica.claudia.slm.common.PersistentObject;
import com.telefonica.claudia.slm.monitoring.MeasurableElement;
import com.telefonica.claudia.slm.naming.DirectoryEntry;
import com.telefonica.claudia.slm.naming.FQN;
import com.telefonica.claudia.slm.naming.ReservoirDirectory;
@Entity
@SuppressWarnings("unchecked")
public class VEE extends DirectoryEntry implements Comparable, PersistentObject, MeasurableElement {
public static enum VirtualizationTechnologyType {XEN, VMWARE, KVM, AMAZON};
@Id
@GeneratedValue
public long internalId;
private String veeName = null;
@ManyToOne
private ServiceApplication serviceApplication = null;
//@OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@Transient
private FQN veeFQN = null;
@Enumerated(EnumType.STRING)
private VirtualizationTechnologyType virtType = null;
@JoinTable(name="VEE_DISKSCONF")
@OneToMany(cascade=CascadeType.ALL)
private List<DiskConf> disksConf = new ArrayList<DiskConf>();
@JoinTable(name="VEE_CPUSCONF")
@OneToMany(cascade=CascadeType.ALL)
private List<CPUConf> cpusConf = new ArrayList<CPUConf>();
@JoinTable(name="VEE_NICSCONF")
@OneToMany(cascade=CascadeType.ALL)
private List<NICConf> nicsConf = new ArrayList<NICConf>();
@OneToOne(cascade=CascadeType.ALL)
private MemoryConf memoryConf = null;
private int maxReplicas = 1;
private int minReplicas = 1;
private int initReplicas = minReplicas;
private int currentReplicas= 0;
private boolean hotMigrationAllowed = true;
private boolean coldMigrationAllowed = true;
private int deploymentOrder = -1;
@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name="ALLOWED_DOMAINS")
private Set<GeographicDomain> allowedDomains = new HashSet<GeographicDomain>();
@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name="FORBIDDEN_DOMAINS")
private Set<GeographicDomain> forbiddenDomains = new HashSet<GeographicDomain>();
@OneToMany(cascade=CascadeType.ALL)
private Set<ISOImage> isoImages = new HashSet<ISOImage>();
@OneToMany(mappedBy="vee", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
private Set<VEEReplica> activeReplicas = new HashSet<VEEReplica>();
@Transient
private AvailabilityWindow availabilityWindow;
// RESERVOIR attributes
private String UUID=null;
private boolean migratable;
private double availabilityValue;
/**
* OVF document that describe the VEE template that will be used to generate virtual machine templates.
* The OVF document contains a collection of identifiers that will be replaced with current values when
* the VEE is being instantiated.
*/
@Column(columnDefinition = "TEXT")
private String ovfRepresentation=null;
public VEE() {}
public String getUUID() {
return UUID;
}
public void setUUID(String uuid) {
this.UUID = uuid;
}
public boolean getMigratable() {
return migratable;
}
public void setMigratable(boolean migrat) {
this.migratable = migrat;
}
public double getAvailabilityValue() {
return availabilityValue;
}
public void setAvailabilityValue(double availabilityValue) {
this.availabilityValue = availabilityValue;
}
public static class AvailabilityWindow {
public String unit;
public long value;
}
public VEE(String veeName) {
if(veeName == null)
throw new IllegalArgumentException("VEE name cannot be null");
this.veeName = veeName;
}
public void addDiskConf(DiskConf diskConf) {
System.out.println(" +++++ DiskConf " + diskConf.getImageURL() + " added to VEE " + getVEEName() + " configuration");
disksConf.add(diskConf);
}
public List<DiskConf> getDisksConf() {
return disksConf;
}
public void removeDiskConf(DiskConf diskConf){
if (disksConf.remove(diskConf))
System.out.println(" +++++ DiskConf " + diskConf.getImageURL() + " removed from VEE " + getFQN().toString() + " configuration");
System.out.println(" +++++ There are " + disksConf.size() + " disk configurations left in VEE");
for(DiskConf diskConfT : disksConf)
System.out.println(" +++++ DiskConf " + diskConf.getImageURL() + " has disk configuration " + diskConfT.getImageURL());
}
public void addCPUConf(CPUConf cpuConf) {
cpusConf.add(cpuConf);
}
public List<CPUConf> getCPUsConf() {
return cpusConf;
}
public void addNICConf(NICConf nicConf) {
nicsConf.add(nicConf);
}
public List<NICConf> getNICsConf() {
return nicsConf;
}
public void setMemoryConf(MemoryConf memoryConf) {
this.memoryConf = memoryConf;
}
public MemoryConf getMemoryConf() {
return memoryConf;
}
public String getVEEName() {
return veeName;
}
public int nextVEEReplicaId() {
int id = 0;
for (VEEReplica replica: activeReplicas) {
if (replica.getId() > id)
id = replica.getId();
}
return id+1;
}
public Set<VEEReplica> getVEEReplicas() {
return activeReplicas;
}
public void registerVEEReplica(VEEReplica veeReplica) {
if(veeReplica == null)
throw new IllegalArgumentException("Cannot register null VEE replica");
if(!veeReplica.getParentVEE().equals(this))
throw new IllegalArgumentException("Trying to register VEE Replica " + veeReplica + " in a different VEE " + this);
activeReplicas.add(veeReplica);
}
public boolean isVEEReplicaRegistered(VEEReplica veeReplica) {
return activeReplicas.contains(veeReplica);
}
public void unregisterVEEReplica(VEEReplica veeReplica) {
activeReplicas.remove(veeReplica);
}
public ServiceApplication getServiceApplication() {
return serviceApplication;
}
public void addIsoImage(ISOImage isoImage){
isoImages.add(isoImage);
}
public Set<ISOImage> getIsoImages() {
return isoImages;
}
public void addAllowedDomain(GeographicDomain domain) {
allowedDomains.add(domain);
}
public Set<GeographicDomain> getAllowedDomains() {
return allowedDomains;
}
public void addForbiddenDomain(GeographicDomain domain) {
forbiddenDomains.add(domain);
}
public Set<GeographicDomain> getForbiddenDomains() {
return forbiddenDomains;
}
public boolean isColdMigrationAllowed() {
return coldMigrationAllowed;
}
public void setColdMigrationAllowed(boolean coldMigrationAllowed) {
this.coldMigrationAllowed = coldMigrationAllowed;
}
public boolean isHotMigrationAllowed() {
return hotMigrationAllowed;
}
public void setHotMigrationAllowed(boolean hotMigrationAllowed) {
this.hotMigrationAllowed = hotMigrationAllowed;
}
public int getCurrentReplicas(){
return currentReplicas;
}
public void addCurrentReplicas(){
currentReplicas++;
}
public void removeCurrentReplicas(){
currentReplicas--;
}
public int getMaxReplicas() {
return maxReplicas;
}
public void setMaxReplicas(int maxReplicas) {
this.maxReplicas = maxReplicas;
}
public int getMinReplicas() {
return minReplicas;
}
public void setMinReplicas(int minReplicas) {
this.minReplicas = minReplicas;
}
public void setInitReplicas(int initReplicas) {
this.initReplicas = initReplicas;
}
public int getInitReplicas() {
return initReplicas;
}
public VirtualizationTechnologyType getVirtualizationType() {
return virtType;
}
public void setVirtualizationType(VirtualizationTechnologyType virtType) {
this.virtType = virtType;
}
public String getVirtType() {
return this.virtType.toString();
}
public FQN getFQN(){
if(veeFQN == null)
veeFQN = ReservoirDirectory.getInstance().buildFQN(this);
return veeFQN;
}
@Override
public String toString() {
return getFQN().toString();
}
@Override
public int hashCode(){
return (int) (internalId%5);
}
@Override
public boolean equals(Object object) {
if(object == null)
return false;
if(!(object instanceof VEE))
return false;
return ((VEE)object).internalId == this.internalId;
}
public int getDeploymentOrder() {
return deploymentOrder;
}
public void setDeploymentOrder(int deploymentOrder) {
this.deploymentOrder = deploymentOrder;
}
public int compareTo(Object arg0) {
if(arg0 instanceof VEE){ //if the object is-a VEE
VEE temp = (VEE)arg0; //Edit
if(temp.deploymentOrder == deploymentOrder)
return 0;
else if(temp.deploymentOrder < deploymentOrder)
return 1;
else return -1;
}
return 99;
}
public void setAvailabilityWindow(String units, long value) {
this.availabilityWindow = new AvailabilityWindow();
this.availabilityWindow.unit = units;
this.availabilityWindow.value = value;
}
public AvailabilityWindow getAvailabilityWindow() {
return availabilityWindow;
}
public void setOvfRepresentation(String ovfRepresentation) {
this.ovfRepresentation = ovfRepresentation;
}
public String getOvfRepresentation() {
return ovfRepresentation;
}
public Set<Object> getDescendants() {
Set<Object> result = new HashSet<Object>();
result.add(this);
result.addAll(disksConf);
result.addAll(cpusConf);
result.addAll(nicsConf);
result.add(memoryConf);
for (VEEReplica vr: getVEEReplicas()) {
result.addAll(vr.getDescendants());
}
return result;
}
public long getObjectId() {
return internalId;
}
public void setServiceApplication(ServiceApplication serviceApplication) {
this.serviceApplication = serviceApplication;
}
}