package org.ovirt.engine.core.common.businessentities;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
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.GenericGenerator;
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.HostnameOrIp;
import org.ovirt.engine.core.common.validation.group.CreateEntity;
import org.ovirt.engine.core.common.validation.group.PowerManagementCheck;
import org.ovirt.engine.core.common.validation.group.UpdateEntity;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.INotifyPropertyChanged;
@XmlAccessorType(XmlAccessType.NONE)
@XmlType(name = "VdsStatic")
@Entity
@Table(name = "vds_static")
@TypeDef(name = "guid", typeClass = GuidType.class)
@NamedQueries(
value = {
@NamedQuery(name = "all_vds_static_for_vds_group_without_migration",
query = "select s from VdsStatic s, VdsDynamic d, VmDynamic v where " +
"(s.vdsGroupId = :vds_group_id) and " +
"(d.id = s.id) and " +
"(d.status = 3) and " +
"(v.status in (5, 6, 11, 12)) and " +
"(s.id != v.run_on_vds)")
})
public class VdsStatic implements INotifyPropertyChanged, BusinessEntity<Guid> {
private static final long serialVersionUID = -1425566208615075937L;
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "org.ovirt.engine.core.dao.GuidGenerator")
@Column(name = "Id")
@Type(type = "guid")
private Guid id;
@Size(min = 1, max = BusinessEntitiesDefinitions.HOST_NAME_SIZE)
@Column(name = "vds_name")
private String name = ""; // GREGM prevents NPE
@HostnameOrIp(message = "VALIDATION.VDS.POWER_MGMT.ADDRESS.HOSTNAME_OR_IP", groups = PowerManagementCheck.class)
@Size(max = BusinessEntitiesDefinitions.HOST_IP_SIZE)
@Column(name = "ip")
private String ip;
@Size(max = BusinessEntitiesDefinitions.HOST_UNIQUE_ID_SIZE)
@Column(name = "vds_unique_id")
private String uniqueId;
@HostnameOrIp(message = "VALIDATION.VDS.HOSTNAME.HOSTNAME_OR_IP",
groups = { CreateEntity.class, UpdateEntity.class })
@Size(max = BusinessEntitiesDefinitions.HOST_HOSTNAME_SIZE)
@Column(name = "host_name", length = BusinessEntitiesDefinitions.HOST_HOSTNAME_SIZE)
private String hostname;
@Column(name = "port")
private int port;
@Column(name = "vds_group_id")
@Type(type = "guid")
private Guid vdsGroupId;
@Column(name = "server_ssl_enabled")
private Boolean serverSslEnabled;
@Column(name = "vds_type")
private VDSType vdsType = VDSType.VDS;
@Column(name = "vds_strength")
private Integer vdsStrength;
@XmlElement(name = "pm_type")
@Size(max = BusinessEntitiesDefinitions.HOST_PM_TYPE_SIZE)
@Column(name = "pm_type")
private String pmType;
@XmlElement(name = "pm_user")
@Size(max = BusinessEntitiesDefinitions.HOST_PM_USER_SIZE)
@Column(name = "pm_user")
private String pmUser;
@XmlElement(name = "pm_password")
@Size(max = BusinessEntitiesDefinitions.HOST_PM_PASSWD_SIZE)
@Column(name = "pm_password")
private String pmPassword;
@XmlElement(name = "pm_port", nillable = true)
@Column(name = "pm_port")
private Integer pmPort;
@Size(max = BusinessEntitiesDefinitions.GENERAL_MAX_SIZE)
@XmlElement(name = "pm_options", nillable = true)
@Column(name = "pm_options", length = BusinessEntitiesDefinitions.GENERAL_MAX_SIZE)
private String pmOptions;
@XmlElement(name = "pm_enabled")
@Column(name = "pm_enabled")
private boolean pmEnabled;
@XmlElement(name = "PmOptionsMap")
@Transient
private ValueObjectMap pmOptionsMap;
@Column(name = "otp_validity")
private long otpValidity;
public VdsStatic() {
serverSslEnabled = false;
vdsStrength = 100;
this.setpm_options("");
}
public VdsStatic(String host_name, String ip, String uniqueId, int port, Guid vds_group_id, Guid vds_id,
String vds_name, boolean server_SSL_enabled, VDSType vds_type) {
serverSslEnabled = false;
vdsStrength = 100;
this.hostname = host_name;
this.ip = ip;
this.uniqueId = uniqueId;
this.port = port;
this.vdsGroupId = vds_group_id;
this.id = vds_id;
this.name = vds_name;
this.serverSslEnabled = server_SSL_enabled;
this.setvds_type(vds_type);
this.setpm_options("");
}
@XmlElement
public boolean getserver_SSL_enabled() {
return serverSslEnabled;
}
public void setserver_SSL_enabled(boolean value) {
serverSslEnabled = value;
}
@XmlElement
public String gethost_name() {
return this.hostname;
}
public void sethost_name(String value) {
this.hostname = value;
}
@XmlElement(name = "ManagmentIp")
public String getManagmentIp() {
return this.ip;
}
public void setManagmentIp(String value) {
this.ip = value;
}
@XmlElement(name = "UniqueID")
public String getUniqueID() {
return uniqueId;
}
public void setUniqueID(String value) {
uniqueId = value;
}
@XmlElement
public int getport() {
return this.port;
}
public void setport(int value) {
this.port = value;
}
@XmlElement
public Guid getvds_group_id() {
return this.vdsGroupId;
}
public void setvds_group_id(Guid value) {
this.vdsGroupId = value;
}
@Override
@XmlElement(name = "Id")
public Guid getId() {
return this.id;
}
@Override
public void setId(Guid id) {
this.id = id;
}
@XmlElement
public String getvds_name() {
return this.name;
}
public void setvds_name(String value) {
this.name = value;
}
@XmlElement
public VDSType getvds_type() {
return this.vdsType;
}
public void setvds_type(VDSType value) {
this.vdsType = value;
}
@XmlElement
public int getvds_strength() {
return this.vdsStrength;
}
public void setvds_strength(int value) {
// strength should be between 1 and 100
this.vdsStrength = value < 1 ? 1 : value > 100 ? 100 : value;
}
public String getpm_type() {
return pmType;
}
public void setpm_type(String value) {
pmType = value;
}
public String getpm_user() {
return pmUser;
}
public void setpm_user(String value) {
pmUser = value;
}
public String getpm_password() {
return pmPassword;
}
public void setpm_password(String value) {
pmPassword = value;
}
public Integer getpm_port() {
return pmPort;
}
public void setpm_port(Integer value) {
pmPort = value;
}
public String getpm_options() {
return pmOptions;
}
public void setpm_options(String value) {
pmOptions = value;
// set pmOptionsMap value content to match the given string.
pmOptionsMap = PmOptionsStringToMap(value);
}
public ValueObjectMap getPmOptionsMap() {
return pmOptionsMap;
}
public void setPmOptionsMap(ValueObjectMap value) {
pmOptionsMap = value;
pmOptions = PmOptionsMapToString(value);
}
public boolean getpm_enabled() {
return pmEnabled;
}
public void setpm_enabled(boolean value) {
pmEnabled = value;
}
public long getOtpValidity() {
return otpValidity;
}
public void setOtpValidity(long otpValidity) {
this.otpValidity = otpValidity;
}
/**
* Converts a PM Options map to string
*
* @param map
* @return
*/
public static String PmOptionsMapToString(ValueObjectMap optionsMap) {
String result = "";
String seperator = "";
Map map = optionsMap.asMap();
Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String> pairs = it.next();
String value = pairs.getValue();
result +=
seperator + pairs.getKey()
+ ((value != null && value.length() > 0) ? "=" + value : "");
seperator = ",";
}
return result;
}
/**
* Converts a PM Options string to a map
*
* @param pmOptions
* @return
*/
public static ValueObjectMap PmOptionsStringToMap(String pmOptions) {
if(pmOptions.equals("")) {
return new ValueObjectMap();
}
HashMap<String, String> map = new HashMap<String, String>();
String[] tokens = pmOptions.split(",");
for (String token : tokens) {
String[] pair = token.split("=");
if (pair.length == 2) { // key=value setting
pair[1] = (pair[1] == null ? "" : pair[1]);
// ignore illegal settings
if (pair[0].trim().length() > 0 && pair[1].trim().length() > 0)
map.put(pair[0], pair[1]);
} else { // only key setting
map.put(pair[0], "");
}
}
return new ValueObjectMap(map, false);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((hostname == null) ? 0 : hostname.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((ip == null) ? 0 : ip.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + (int) (otpValidity ^ (otpValidity >>> 32));
result = prime * result + (pmEnabled ? 1231 : 1237);
result = prime * result + ((pmOptions == null) ? 0 : pmOptions.hashCode());
result = prime * result + ((pmOptionsMap == null) ? 0 : pmOptionsMap.hashCode());
result = prime * result + ((pmPassword == null) ? 0 : pmPassword.hashCode());
result = prime * result + ((pmPort == null) ? 0 : pmPort.hashCode());
result = prime * result + ((pmType == null) ? 0 : pmType.hashCode());
result = prime * result + ((pmUser == null) ? 0 : pmUser.hashCode());
result = prime * result + port;
result = prime * result + ((serverSslEnabled == null) ? 0 : serverSslEnabled.hashCode());
result = prime * result + ((uniqueId == null) ? 0 : uniqueId.hashCode());
result = prime * result + ((vdsGroupId == null) ? 0 : vdsGroupId.hashCode());
result = prime * result + ((vdsStrength == null) ? 0 : vdsStrength.hashCode());
result = prime * result + ((vdsType == null) ? 0 : vdsType.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
VdsStatic other = (VdsStatic) obj;
if (hostname == null) {
if (other.hostname != null)
return false;
} else if (!hostname.equals(other.hostname))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (ip == null) {
if (other.ip != null)
return false;
} else if (!ip.equals(other.ip))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (otpValidity != other.otpValidity)
return false;
if (pmEnabled != other.pmEnabled)
return false;
if (pmOptions == null) {
if (other.pmOptions != null)
return false;
} else if (!pmOptions.equals(other.pmOptions))
return false;
if (pmOptionsMap == null) {
if (other.pmOptionsMap != null)
return false;
} else if (!pmOptionsMap.equals(other.pmOptionsMap))
return false;
if (pmPassword == null) {
if (other.pmPassword != null)
return false;
} else if (!pmPassword.equals(other.pmPassword))
return false;
if (pmPort == null) {
if (other.pmPort != null)
return false;
} else if (!pmPort.equals(other.pmPort))
return false;
if (pmType == null) {
if (other.pmType != null)
return false;
} else if (!pmType.equals(other.pmType))
return false;
if (pmUser == null) {
if (other.pmUser != null)
return false;
} else if (!pmUser.equals(other.pmUser))
return false;
if (port != other.port)
return false;
if (serverSslEnabled == null) {
if (other.serverSslEnabled != null)
return false;
} else if (!serverSslEnabled.equals(other.serverSslEnabled))
return false;
if (uniqueId == null) {
if (other.uniqueId != null)
return false;
} else if (!uniqueId.equals(other.uniqueId))
return false;
if (vdsGroupId == null) {
if (other.vdsGroupId != null)
return false;
} else if (!vdsGroupId.equals(other.vdsGroupId))
return false;
if (vdsStrength == null) {
if (other.vdsStrength != null)
return false;
} else if (!vdsStrength.equals(other.vdsStrength))
return false;
if (vdsType != other.vdsType)
return false;
return true;
}
}