package com.sequenceiq.cloudbreak.domain; 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.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; 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 com.sequenceiq.cloudbreak.api.model.InstanceGroupType; import com.sequenceiq.cloudbreak.domain.json.Json; import com.sequenceiq.cloudbreak.domain.json.JsonToString; @Entity @NamedQueries({ @NamedQuery(name = "InstanceGroup.findOneByGroupNameInStack", query = "SELECT i from InstanceGroup i " + "WHERE i.stack.id = :stackId " + "AND i.groupName = :groupName"), @NamedQuery( name = "InstanceGroup.findAllBySecurityGroup", query = "SELECT t FROM InstanceGroup t " + "WHERE t.securityGroup.id= :securityGroupId ") }) public class InstanceGroup implements ProvisionEntity, Comparable<InstanceGroup> { @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "instancegroup_generator") @SequenceGenerator(name = "instancegroup_generator", sequenceName = "instancegroup_id_seq", allocationSize = 1) private Long id; @OneToOne private Template template; @OneToOne private SecurityGroup securityGroup; @Column(nullable = false) private Integer nodeCount; @Column(nullable = false) private String groupName; @Column(nullable = false) @Enumerated(EnumType.STRING) private InstanceGroupType instanceGroupType = InstanceGroupType.CORE; @ManyToOne private Stack stack; @OneToMany(mappedBy = "instanceGroup", cascade = CascadeType.REMOVE, orphanRemoval = true) private Set<InstanceMetaData> instanceMetaData = new HashSet<>(); @Convert(converter = JsonToString.class) @Column(columnDefinition = "TEXT") private Json attributes; public String getGroupName() { return groupName; } public void setGroupName(String groupName) { this.groupName = groupName; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Template getTemplate() { return template; } public void setTemplate(Template template) { this.template = template; } public Integer getNodeCount() { return nodeCount; } public void setNodeCount(Integer nodeCount) { this.nodeCount = nodeCount; } public Stack getStack() { return stack; } public void setStack(Stack stack) { this.stack = stack; } public Set<InstanceMetaData> getInstanceMetaData() { Set<InstanceMetaData> resultSet = new HashSet<>(); for (InstanceMetaData metaData : instanceMetaData) { if (!metaData.isTerminated()) { resultSet.add(metaData); } } return resultSet; } public SecurityGroup getSecurityGroup() { return securityGroup; } public void setSecurityGroup(SecurityGroup securityGroup) { this.securityGroup = securityGroup; } public Set<InstanceMetaData> getAllInstanceMetaData() { return instanceMetaData; } public void setInstanceMetaData(Set<InstanceMetaData> instanceMetaData) { this.instanceMetaData = instanceMetaData; } public InstanceGroupType getInstanceGroupType() { return instanceGroupType; } public void setInstanceGroupType(InstanceGroupType instanceGroupType) { this.instanceGroupType = instanceGroupType; } public Json getAttributes() { return attributes; } public void setAttributes(Json attributes) { this.attributes = attributes; } @Override public int compareTo(InstanceGroup o) { return this.groupName.compareTo(o.groupName); } }