package com.sequenceiq.cloudbreak.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import org.hibernate.annotations.Type;
import com.sequenceiq.cloudbreak.api.model.InstanceMetadataType;
import com.sequenceiq.cloudbreak.api.model.InstanceStatus;
@Entity
@NamedQueries({
@NamedQuery(
name = "InstanceMetaData.findHostInStack",
query = "SELECT i FROM InstanceMetaData i "
+ "WHERE i.instanceGroup.stack.id= :stackId "
+ "AND i.discoveryFQDN= :hostName "
+ "AND i.instanceStatus <> 'TERMINATED' "),
@NamedQuery(
name = "InstanceMetaData.findUnregisteredHostsInInstanceGroup",
query = "SELECT i FROM InstanceMetaData i "
+ "WHERE i.instanceGroup.id= :instanceGroupId "
+ "AND i.instanceStatus = 'UNREGISTERED'"),
@NamedQuery(
name = "InstanceMetaData.findUnusedHostsInInstanceGroup",
query = "SELECT i FROM InstanceMetaData i "
+ "WHERE i.instanceGroup.id= :instanceGroupId "
+ "AND i.instanceStatus in ('CREATED', 'UNREGISTERED')"),
@NamedQuery(
name = "InstanceMetaData.findNotTerminatedForStack",
query = "SELECT i FROM InstanceMetaData i "
+ "WHERE i.instanceGroup.stack.id= :stackId "
+ "AND i.instanceStatus <> 'TERMINATED' "),
@NamedQuery(
name = "InstanceMetaData.findAllInStack",
query = "SELECT i FROM InstanceMetaData i "
+ "WHERE i.instanceGroup.stack.id= :stackId"),
@NamedQuery(
name = "InstanceMetaData.findByInstanceId",
query = "SELECT i FROM InstanceMetaData i "
+ "WHERE i.instanceId= :instanceId AND i.instanceGroup.stack.id= :stackId "),
@NamedQuery(
name = "InstanceMetaData.findAliveInstancesHostNamesInInstanceGroup",
query = "SELECT i.discoveryFQDN FROM InstanceMetaData i "
+ "WHERE i.instanceGroup.id = :instanceGroupId "
+ "AND i.instanceStatus <> 'TERMINATED' "),
@NamedQuery(
name = "InstanceMetaData.findAliveInstancesInInstanceGroup",
query = "SELECT i FROM InstanceMetaData i "
+ "WHERE i.instanceGroup.id = :instanceGroupId "
+ "AND i.instanceStatus <> 'TERMINATED' "),
@NamedQuery(
name = "InstanceMetaData.findRemovableInstances",
query = "SELECT i FROM InstanceMetaData i "
+ "WHERE i.instanceGroup.stack.id= :stackId "
+ "AND i.instanceGroup.groupName= :groupName "
+ "AND i.instanceStatus in ('CREATED', 'UNREGISTERED', 'DECOMMISSIONED', 'FAILED', 'STOPPED')"),
@NamedQuery(
name = "InstanceMetaData.findNotTerminatedByPrivateAddress",
query = "SELECT i FROM InstanceMetaData i "
+ "WHERE i.instanceGroup.stack.id= :stackId "
+ "AND i.privateIp= :privateAddress "
+ "AND i.instanceStatus <> 'TERMINATED' "),
@NamedQuery(
name = "InstanceMetaData.getServerCertByStackId",
query = "SELECT i.serverCert FROM InstanceMetaData i "
+ "WHERE i.instanceGroup.stack.id= :stackId "
+ "AND i.instanceMetadataType = 'GATEWAY_PRIMARY'")
})
public class InstanceMetaData implements ProvisionEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "instancemetadata_generator")
@SequenceGenerator(name = "instancemetadata_generator", sequenceName = "instancemetadata_id_seq", allocationSize = 1)
private Long id;
private Long privateId;
private String privateIp;
private String publicIp;
private Integer sshPort;
private String instanceId;
private Boolean ambariServer;
private Boolean consulServer;
private String discoveryFQDN;
@Type(type = "encrypted_string")
@Column(columnDefinition = "TEXT")
private String serverCert;
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private InstanceStatus instanceStatus;
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private InstanceMetadataType instanceMetadataType;
private String localityIndicator;
@ManyToOne
private InstanceGroup instanceGroup;
private Long startDate;
private Long terminationDate;
public InstanceMetaData() {
}
public InstanceGroup getInstanceGroup() {
return instanceGroup;
}
public void setInstanceGroup(InstanceGroup instanceGroup) {
this.instanceGroup = instanceGroup;
}
public String getInstanceGroupName() {
return instanceGroup.getGroupName();
}
public String getPrivateIp() {
return privateIp;
}
public void setPrivateIp(String privateIp) {
this.privateIp = privateIp;
}
public String getPublicIp() {
return publicIp;
}
public void setPublicIp(String publicIp) {
this.publicIp = publicIp;
}
public Integer getSshPort() {
return sshPort;
}
public void setSshPort(Integer sshPort) {
this.sshPort = sshPort;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getPrivateId() {
return privateId;
}
public void setPrivateId(Long privateId) {
this.privateId = privateId;
}
public String getInstanceId() {
return instanceId;
}
public void setInstanceId(String instanceId) {
this.instanceId = instanceId;
}
public Boolean getAmbariServer() {
return ambariServer;
}
public void setAmbariServer(Boolean ambariServer) {
this.ambariServer = ambariServer;
}
public String getDiscoveryFQDN() {
return discoveryFQDN;
}
public void setDiscoveryFQDN(String discoveryFQDN) {
this.discoveryFQDN = discoveryFQDN;
}
public String getDiscoveryName() {
if (discoveryFQDN == null) {
return null;
}
return discoveryFQDN.split("\\.")[0];
}
public InstanceStatus getInstanceStatus() {
return instanceStatus;
}
public void setInstanceStatus(InstanceStatus instanceStatus) {
this.instanceStatus = instanceStatus;
}
public Long getStartDate() {
return startDate;
}
public void setStartDate(Long startDate) {
this.startDate = startDate;
}
public Long getTerminationDate() {
return terminationDate;
}
public void setTerminationDate(Long terminationDate) {
this.terminationDate = terminationDate;
}
public Boolean getConsulServer() {
return consulServer;
}
public void setConsulServer(Boolean consulServer) {
this.consulServer = consulServer;
}
public boolean isCreated() {
return InstanceStatus.CREATED.equals(instanceStatus);
}
public boolean isFailed() {
return InstanceStatus.FAILED.equals(instanceStatus);
}
public boolean isDecommissioned() {
return InstanceStatus.DECOMMISSIONED.equals(instanceStatus);
}
public boolean isUnRegistered() {
return InstanceStatus.UNREGISTERED.equals(instanceStatus);
}
public boolean isTerminated() {
return InstanceStatus.TERMINATED.equals(instanceStatus);
}
public boolean isRegistered() {
return InstanceStatus.REGISTERED.equals(instanceStatus);
}
public boolean isRunning() {
return InstanceStatus.REGISTERED.equals(instanceStatus) || InstanceStatus.UNREGISTERED.equals(instanceStatus);
}
public String getLocalityIndicator() {
return localityIndicator;
}
public void setLocalityIndicator(String localityIndicator) {
this.localityIndicator = localityIndicator;
}
public String getPublicIpWrapper() {
if (publicIp == null) {
return privateIp;
}
return publicIp;
}
public InstanceMetadataType getInstanceMetadataType() {
return instanceMetadataType;
}
public void setInstanceMetadataType(InstanceMetadataType instanceMetadataType) {
this.instanceMetadataType = instanceMetadataType;
}
public String getServerCert() {
return serverCert;
}
public void setServerCert(String serverCert) {
this.serverCert = serverCert;
}
}