package org.ovirt.engine.core.common.businessentities;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import org.ovirt.engine.core.common.businessentities.mapping.GuidType;
import org.ovirt.engine.core.common.queries.ValueObjectMap;
import org.ovirt.engine.core.common.validation.annotation.ValidName;
import org.ovirt.engine.core.common.validation.group.CreateEntity;
import org.ovirt.engine.core.common.validation.group.UpdateEntity;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.NGuid;
import org.ovirt.engine.core.compat.StringHelper;
@XmlAccessorType(XmlAccessType.NONE)
@XmlType(name = "VmTemplate")
@Entity
@Table(name = "vm_templates")
@TypeDef(name = "guid", typeClass = GuidType.class)
public class VmTemplate extends VmBase {
private static final long serialVersionUID = -522552511046744989L;
private static final ArrayList<String> _vmProperties = new ArrayList<String>(
Arrays.asList(new String[] { "name", "domain", "child_count", "description",
"default_display_type", "mem_size_mb", "vds_group_name", "status", "time_zone", "num_of_monitors",
"vds_group_id", "usb_policy", "num_of_sockets", "cpu_per_socket", "os", "is_auto_suspend",
"auto_startup", "priority", "default_boot_sequence", "is_stateless", "iso_path", "initrd_url",
"kernel_url", "kernel_params" }));
@Transient
private List<VmNetworkInterface> _Interfaces = new ArrayList<VmNetworkInterface>();
@Column(name = "child_count", nullable = false)
private int childCount;
@Size(min = 1, max = BusinessEntitiesDefinitions.VM_TEMPLATE_NAME_SIZE,
message = "VALIDATION.VM_TEMPLATE.NAME.MAX",
groups = { CreateEntity.class, UpdateEntity.class })
@ValidName(message = "ACTION_TYPE_FAILED_NAME_MAY_NOT_CONTAIN_SPECIAL_CHARS", groups = { CreateEntity.class,
UpdateEntity.class })
@Column(name = "name", length = BusinessEntitiesDefinitions.VM_TEMPLATE_NAME_SIZE, nullable = false)
private String name;
@Column(name = "num_of_monitors", nullable = false)
private int numOfMonitors;
@Column(name = "status", nullable = false)
@Enumerated
private VmTemplateStatus status = VmTemplateStatus.OK;
private String vdsGroupName;
@XmlElement(name = "storage_pool_id")
@Column(name = "storage_pool_id")
@Type(type = "guid")
private NGuid storagePoolId;
@XmlElement(name = "storage_pool_name")
@Transient
private String storagePoolName;
@XmlElement(name = "default_display_type")
@Column(name = "default_display_type", nullable = false)
@Enumerated
private DisplayType defaultDisplayType = DisplayType.vnc;
@Transient
private Map<String, DiskImage> diskMap = new HashMap<String, DiskImage>();
@Transient
private final ArrayList<DiskImage> diskList = new ArrayList<DiskImage>();
@Transient
private HashMap<String, DiskImageTemplate> diskTemplateMap = new HashMap<String, DiskImageTemplate>();
@XmlElement(name = "SizeGB")
@Transient
private double bootDiskSizeGB;
@Transient
private double actualDiskSize = 0;
public VmTemplate() {
setis_auto_suspend(false);
setnice_level(0);
diskTemplateMap = new HashMap<String, DiskImageTemplate>();
}
public VmTemplate(int child_count, Date creation_date, String description, int mem_size_mb, String name,
int num_of_sockets, int cpu_per_socket, VmOsType os, Guid vds_group_id, Guid vmt_guid, String domain,
int num_of_monitors, int status, int usb_policy, String time_zone, boolean is_auto_suspend, int nice_level,
boolean fail_back, BootSequence default_boot_sequence, VmType vm_type, HypervisorType hypervisor_type,
OperationMode operation_mode) {
super(vmt_guid,
vds_group_id,
os,
creation_date,
description,
mem_size_mb,
num_of_sockets,
cpu_per_socket,
domain,
time_zone,
vm_type,
UsbPolicy.forValue(usb_policy),
fail_back,
default_boot_sequence,
hypervisor_type,
operation_mode,
nice_level,
is_auto_suspend,
0,
false,
false,
null,
OriginType.ENGINE,
null,
null,
null);
diskTemplateMap = new HashMap<String, DiskImageTemplate>();
this.childCount = child_count;
this.name = name;
this.setnum_of_monitors(num_of_monitors);
this.setstatus(VmTemplateStatus.forValue(status));
}
@XmlElement
public int getchild_count() {
return this.childCount;
}
public void setchild_count(int value) {
this.childCount = value;
}
@XmlElement
public String getname() {
return this.name;
}
public void setname(String value) {
if (!StringHelper.EqOp(this.name, value)) {
this.name = value;
}
}
// no need fo DataMember, it's setter and calculated from 2 other fields
@XmlElement
public int getnum_of_cpus() {
return this.getcpu_per_socket() * this.getnum_of_sockets();
}
/**
* empty setters to fix CXF issue
*/
public void setnum_of_cpus(int val) {
}
@XmlElement
public int getnum_of_monitors() {
return numOfMonitors;
}
public void setnum_of_monitors(int value) {
numOfMonitors = value;
}
@XmlElement
public VmTemplateStatus getstatus() {
return status;
}
public void setstatus(VmTemplateStatus value) {
if (status != value) {
status = value;
}
}
@XmlElement
public String getvds_group_name() {
return vdsGroupName;
}
public void setvds_group_name(String value) {
vdsGroupName = value;
}
@XmlElement(name = "Interfaces")
public List<VmNetworkInterface> getInterfaces() {
return _Interfaces;
}
public void setInterfaces(List<VmNetworkInterface> value) {
_Interfaces = value;
}
public NGuid getstorage_pool_id() {
return storagePoolId;
}
public void setstorage_pool_id(NGuid value) {
storagePoolId = value;
}
public String getstorage_pool_name() {
return storagePoolName;
}
public void setstorage_pool_name(String value) {
storagePoolName = value;
}
public DisplayType getdefault_display_type() {
return defaultDisplayType;
}
public void setdefault_display_type(DisplayType value) {
defaultDisplayType = value;
}
public double getSizeGB() {
return bootDiskSizeGB;
}
public void setSizeGB(double value) {
bootDiskSizeGB = value;
}
public HashMap<String, DiskImageTemplate> getDiskMap() {
return diskTemplateMap;
}
@Override
public Object getQueryableId() {
return getId();
}
@Override
public ArrayList<String> getChangeablePropertiesList() {
return _vmProperties;
}
@XmlElement(name = "ActualDiskSize")
public double getActualDiskSize() {
if (actualDiskSize == 0 && getDiskImageMap() != null) {
for (DiskImage disk : getDiskImageMap().values()) {
actualDiskSize += disk.getActualSize();
}
}
return actualDiskSize;
}
/**
* empty setters to fix CXF issue
*/
public void setActualDiskSize(double actualDiskSize) {
}
public Map<String, DiskImage> getDiskImageMap() {
return diskMap;
}
public void setDiskImageMap(Map<String, DiskImage> value) {
diskMap = value;
}
@XmlElement(name = "DiskImageMap")
public ValueObjectMap getSerializedDiskImageMap() {
return new ValueObjectMap(diskMap, false);
}
public void setSerializedDiskImageMap(ValueObjectMap serializedDiskImageMap) {
diskMap = (serializedDiskImageMap == null) ? null : serializedDiskImageMap.asMap();
}
public ArrayList<DiskImage> getDiskList() {
return diskList;
}
public boolean addDiskImageTemplate(DiskImageTemplate dit) {
boolean retval = false;
if (!getDiskMap().containsKey(dit.getinternal_drive_mapping())) {
getDiskMap().put(dit.getinternal_drive_mapping(), dit);
retval = true;
}
return retval;
}
@Override
public boolean equals(Object obj) {
boolean returnValue = super.equals(obj);
if (!returnValue && obj != null && obj instanceof VmTemplate) {
returnValue = getId()
.equals(((VmTemplate) obj).getId());
}
return returnValue;
}
@Override
public int hashCode() {
return getId().hashCode();
}
}