package com.sequenceiq.cloudbreak.domain; import static com.sequenceiq.cloudbreak.api.model.Status.AVAILABLE; import static com.sequenceiq.cloudbreak.api.model.Status.CREATE_IN_PROGRESS; import static com.sequenceiq.cloudbreak.api.model.Status.DELETE_COMPLETED; import static com.sequenceiq.cloudbreak.api.model.Status.DELETE_IN_PROGRESS; import static com.sequenceiq.cloudbreak.api.model.Status.REQUESTED; import static com.sequenceiq.cloudbreak.api.model.Status.START_FAILED; import static com.sequenceiq.cloudbreak.api.model.Status.START_IN_PROGRESS; import static com.sequenceiq.cloudbreak.api.model.Status.START_REQUESTED; import static com.sequenceiq.cloudbreak.api.model.Status.STOPPED; import static com.sequenceiq.cloudbreak.api.model.Status.STOP_FAILED; import static com.sequenceiq.cloudbreak.api.model.Status.STOP_IN_PROGRESS; import static com.sequenceiq.cloudbreak.api.model.Status.STOP_REQUESTED; import static com.sequenceiq.cloudbreak.api.model.Status.UPDATE_IN_PROGRESS; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Convert; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.UniqueConstraint; import org.hibernate.annotations.Type; import com.sequenceiq.cloudbreak.api.model.ConfigStrategy; import com.sequenceiq.cloudbreak.api.model.Status; import com.sequenceiq.cloudbreak.domain.json.EncryptedJsonToString; import com.sequenceiq.cloudbreak.domain.json.Json; import com.sequenceiq.cloudbreak.domain.json.JsonToString; @Entity @Table(name = "Cluster", uniqueConstraints = { @UniqueConstraint(columnNames = {"account", "name"}) }) @NamedQueries({ @NamedQuery( name = "Cluster.findAllClustersByBlueprint", query = "SELECT c FROM Cluster c " + "WHERE c.blueprint.id= :id"), @NamedQuery( name = "Cluster.findAllClustersByRDSConfig", query = "SELECT c FROM Cluster c inner join c.rdsConfigs rc " + "WHERE rc.id= :id"), @NamedQuery( name = "Cluster.findAllClustersBySssdConfig", query = "SELECT c FROM Cluster c " + "WHERE c.sssdConfig.id= :id"), @NamedQuery( name = "Cluster.findAllClustersByLdapConfig", query = "SELECT c FROM Cluster c " + "WHERE c.ldapConfig.id= :id"), @NamedQuery( name = "Cluster.findOneWithLists", query = "SELECT c FROM Cluster c " + "LEFT JOIN FETCH c.hostGroups " + "LEFT JOIN FETCH c.containers " + "LEFT JOIN FETCH c.components " + "LEFT JOIN FETCH c.rdsConfigs " + "WHERE c.id= :id"), @NamedQuery( name = "Cluster.findByStatuses", query = "SELECT c FROM Cluster c " + "WHERE c.status IN :statuses" ), @NamedQuery( name = "Cluster.findByNameInAccount", query = "SELECT c FROM Cluster c " + "WHERE c.name= :name and c.account= :account"), @NamedQuery( name = "Cluster.findAllClustersForConstraintTemplate", query = "SELECT c FROM Cluster c inner join c.hostGroups hg " + "WHERE hg.constraint.constraintTemplate.id = :id"), }) public class Cluster implements ProvisionEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "cluster_generator") @SequenceGenerator(name = "cluster_generator", sequenceName = "cluster_id_seq", allocationSize = 1) private Long id; @OneToOne private Stack stack; @ManyToOne private Blueprint blueprint; @Column(nullable = false) private String name; @Column(nullable = false) private String owner; @Column(nullable = false) private String account; @Column(length = 1000000, columnDefinition = "TEXT") private String description; @Column(nullable = false) @Enumerated(EnumType.STRING) private Status status; private Long creationStarted; private Long creationFinished; private Long upSince; @Column(length = 1000000, columnDefinition = "TEXT") private String statusReason; private String ambariIp; @Type(type = "encrypted_string") @Column(nullable = false) private String userName; @Type(type = "encrypted_string") @Column(nullable = false) private String password; private String cloudbreakAmbariUser; @Type(type = "encrypted_string") private String cloudbreakAmbariPassword; @Column(nullable = false) private Boolean secure; @ManyToOne private KerberosConfig kerberosConfig; private Boolean ldapRequired; private Boolean enableShipyard; @ManyToOne private SssdConfig sssdConfig; @Column(nullable = false) private Boolean emailNeeded; @Column(nullable = false) private Boolean topologyValidation = Boolean.TRUE; private String emailTo; @OneToOne(mappedBy = "cluster", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) private Gateway gateway; @OneToMany(mappedBy = "cluster", cascade = CascadeType.ALL, orphanRemoval = true) private Set<HostGroup> hostGroups = new HashSet<>(); @OneToMany(mappedBy = "cluster", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.LAZY) private Set<ClusterComponent> components = new HashSet<>(); @OneToMany(mappedBy = "cluster", cascade = CascadeType.ALL, orphanRemoval = true) private Set<Container> containers = new HashSet<>(); @ManyToMany private Set<RDSConfig> rdsConfigs; @ManyToOne private FileSystem fileSystem; @Column(nullable = false) @Enumerated(EnumType.STRING) private ConfigStrategy configStrategy; @ManyToOne private LdapConfig ldapConfig; @Convert(converter = EncryptedJsonToString.class) @Column(columnDefinition = "TEXT") private Json attributes; @Convert(converter = EncryptedJsonToString.class) @Column(columnDefinition = "TEXT") private Json blueprintInputs; @Type(type = "encrypted_string") @Column(columnDefinition = "TEXT") private String blueprintCustomProperties; @Convert(converter = JsonToString.class) @Column(columnDefinition = "TEXT") private Json customContainerDefinition; public Stack getStack() { return stack; } public void setStack(Stack stack) { this.stack = stack; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Blueprint getBlueprint() { return blueprint; } public void setBlueprint(Blueprint blueprint) { this.blueprint = blueprint; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getOwner() { return owner; } public void setOwner(String owner) { this.owner = owner; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public Status getStatus() { return status; } public void setStatus(Status status) { this.status = status; } public Long getCreationStarted() { return creationStarted; } public void setCreationStarted(Long creationStarted) { this.creationStarted = creationStarted; } public Long getCreationFinished() { return creationFinished; } public void setCreationFinished(Long creationFinished) { this.creationFinished = creationFinished; } public Long getUpSince() { return upSince; } public void setUpSince(Long upSince) { this.upSince = upSince; } public String getStatusReason() { return statusReason; } public void setStatusReason(String statusReason) { this.statusReason = statusReason; } public Boolean getEmailNeeded() { return emailNeeded; } public void setEmailNeeded(Boolean emailNeeded) { this.emailNeeded = emailNeeded; } public Set<HostGroup> getHostGroups() { return hostGroups; } public void setHostGroups(Set<HostGroup> hostGroups) { this.hostGroups = hostGroups; } public Set<Container> getContainers() { return containers; } public void setContainers(Set<Container> containers) { this.containers = containers; } public boolean isCreateFailed() { return status.equals(Status.CREATE_FAILED); } public boolean isSecure() { return secure == null ? false : secure; } public Boolean isLdapRequired() { return ldapRequired == null ? false : ldapRequired; } public void setLdapRequired(Boolean ldapRequired) { this.ldapRequired = ldapRequired; } public SssdConfig getSssdConfig() { return sssdConfig; } public void setSssdConfig(SssdConfig sssdConfig) { this.sssdConfig = sssdConfig; } public Set<RDSConfig> getRdsConfigs() { return rdsConfigs; } public void setRdsConfigs(Set<RDSConfig> rdsConfigs) { this.rdsConfigs = rdsConfigs; } public FileSystem getFileSystem() { return fileSystem; } public void setFileSystem(FileSystem fileSystem) { this.fileSystem = fileSystem; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getAmbariIp() { return ambariIp; } public void setAmbariIp(String ambariIp) { this.ambariIp = ambariIp; } public boolean isClusterReadyForStop() { return AVAILABLE.equals(status) || STOPPED.equals(status); } public boolean isAvailable() { return AVAILABLE.equals(status); } public boolean isStopped() { return STOPPED.equals(status); } public boolean isStopFailed() { return STOP_FAILED.equals(status); } public boolean isStartFailed() { return START_FAILED.equals(status); } public boolean isStartRequested() { return START_REQUESTED.equals(status); } public boolean isStopInProgress() { return STOP_IN_PROGRESS.equals(status) || STOP_REQUESTED.equals(status); } public boolean isRequested() { return REQUESTED.equals(status); } public boolean isDeleteInProgress() { return DELETE_IN_PROGRESS.equals(status); } public boolean isDeleteCompleted() { return DELETE_COMPLETED.equals(status); } public Boolean getSecure() { return secure; } public void setSecure(Boolean secure) { this.secure = secure; } public Boolean getEnableShipyard() { return enableShipyard; } public void setEnableShipyard(Boolean enableShipyard) { this.enableShipyard = enableShipyard; } public boolean isClusterReadyForStart() { return STOPPED.equals(status) || START_REQUESTED.equals(status); } public boolean isModificationInProgress() { return CREATE_IN_PROGRESS.equals(status) || UPDATE_IN_PROGRESS.equals(status) || STOP_IN_PROGRESS.equals(status) || START_IN_PROGRESS.equals(status) || DELETE_IN_PROGRESS.equals(status); } public Json getAttributes() { return attributes; } public void setAttributes(Json attributes) { this.attributes = attributes; } public String getEmailTo() { return emailTo; } public void setEmailTo(String emailTo) { this.emailTo = emailTo; } public Gateway getGateway() { return gateway; } public void setGateway(Gateway gateway) { this.gateway = gateway; } public ConfigStrategy getConfigStrategy() { return configStrategy; } public void setConfigStrategy(ConfigStrategy configStrategy) { this.configStrategy = configStrategy; } public LdapConfig getLdapConfig() { return ldapConfig; } public void setLdapConfig(LdapConfig ldapConfig) { this.ldapConfig = ldapConfig; } public Json getBlueprintInputs() { return blueprintInputs; } public void setBlueprintInputs(Json blueprintInputs) { this.blueprintInputs = blueprintInputs; } public String getCloudbreakAmbariUser() { return cloudbreakAmbariUser; } public void setCloudbreakAmbariUser(String cloudbreakAmbariUser) { this.cloudbreakAmbariUser = cloudbreakAmbariUser; } public String getCloudbreakAmbariPassword() { return cloudbreakAmbariPassword; } public void setCloudbreakAmbariPassword(String cloudbreakAmbariPassword) { this.cloudbreakAmbariPassword = cloudbreakAmbariPassword; } public String getBlueprintCustomProperties() { return blueprintCustomProperties; } public void setBlueprintCustomProperties(String blueprintCustomProperties) { this.blueprintCustomProperties = blueprintCustomProperties; } public KerberosConfig getKerberosConfig() { return kerberosConfig; } public void setKerberosConfig(KerberosConfig kerberosConfig) { this.kerberosConfig = kerberosConfig; } public Boolean getTopologyValidation() { return topologyValidation; } public void setTopologyValidation(Boolean topologyValidation) { this.topologyValidation = topologyValidation; } public Json getCustomContainerDefinition() { return customContainerDefinition; } public void setCustomContainerDefinition(Json customContainerDefinition) { this.customContainerDefinition = customContainerDefinition; } public Set<ClusterComponent> getComponents() { return components; } public void setComponents(Set<ClusterComponent> components) { this.components = components; } }