package com.sequenceiq.periscope.domain; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; 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.JoinColumn; 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.periscope.api.model.ClusterState; import com.sequenceiq.periscope.model.AmbariStack; @Entity @NamedQueries({ @NamedQuery(name = "Cluster.findAllByUser", query = "SELECT c FROM Cluster c WHERE c.user.id= :id"), @NamedQuery(name = "Cluster.find", query = "SELECT c FROM Cluster c WHERE c.id= :id"), @NamedQuery(name = "Cluster.findAllByState", query = "SELECT c FROM Cluster c WHERE c.state= :state") }) public class Cluster { private static final int DEFAULT_MIN_SIZE = 3; private static final int DEFAULT_MAX_SIZE = 100; private static final int DEFAULT_COOLDOWN = 30; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cluster_generator") @SequenceGenerator(name = "cluster_generator", sequenceName = "sequence_table") private long id; @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true) private Ambari ambari; @OneToOne(mappedBy = "cluster", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.LAZY) private SecurityConfig securityConfig; @ManyToOne @JoinColumn(name = "user_id") private PeriscopeUser user; @Enumerated(EnumType.STRING) private ClusterState state = ClusterState.RUNNING; @OneToMany(mappedBy = "cluster", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) private Set<MetricAlert> metricAlerts = new HashSet<>(); @OneToMany(mappedBy = "cluster", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) private Set<TimeAlert> timeAlerts = new HashSet<>(); @OneToMany(mappedBy = "cluster", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) private Set<PrometheusAlert> prometheusAlerts = new HashSet<>(); @Column(name = "min_size") private int minSize = DEFAULT_MIN_SIZE; @Column(name = "max_size") private int maxSize = DEFAULT_MAX_SIZE; @Column(name = "cooldown") private int coolDown = DEFAULT_COOLDOWN; @Column(name = "cb_stack_id") private Long stackId; @Column(name = "last_scaling_activity") private volatile long lastScalingActivity; public Cluster() { } public Cluster(PeriscopeUser user, AmbariStack ambariStack) { this.user = user; this.stackId = ambariStack.getStackId(); this.ambari = ambariStack.getAmbari(); } public void update(AmbariStack ambariStack) { Ambari ambari = ambariStack.getAmbari(); this.ambari.setHost(ambari.getHost()); this.ambari.setPort(ambari.getPort()); this.ambari.setUser(ambari.getUser()); this.ambari.setPass(ambari.getPass()); } public long getId() { return id; } public void setId(long id) { this.id = id; } public Ambari getAmbari() { return ambari; } public void setAmbari(Ambari ambari) { this.ambari = ambari; } public SecurityConfig getSecurityConfig() { return securityConfig; } public void setSecurityConfig(SecurityConfig securityConfig) { this.securityConfig = securityConfig; } public PeriscopeUser getUser() { return user; } public void setUser(PeriscopeUser user) { this.user = user; } public ClusterState getState() { return state; } public void setState(ClusterState state) { this.state = state; } public Set<MetricAlert> getMetricAlerts() { return metricAlerts; } public void setMetricAlerts(Set<MetricAlert> metricAlerts) { this.metricAlerts = metricAlerts; } public Set<TimeAlert> getTimeAlerts() { return timeAlerts; } public void setTimeAlerts(Set<TimeAlert> timeAlerts) { this.timeAlerts = timeAlerts; } public int getMinSize() { return minSize; } public void setMinSize(int minSize) { this.minSize = minSize; } public int getMaxSize() { return maxSize; } public void setMaxSize(int maxSize) { this.maxSize = maxSize; } public int getCoolDown() { return coolDown; } public void setCoolDown(int coolDown) { this.coolDown = coolDown; } public Long getStackId() { return stackId; } public void setStackId(Long stackId) { this.stackId = stackId; } public long getLastScalingActivity() { return lastScalingActivity; } public void setLastScalingActivity(long lastScalingActivity) { this.lastScalingActivity = lastScalingActivity; } public String getHost() { return ambari.getHost(); } public String getPort() { return ambari.getPort(); } public String getAmbariUser() { return ambari.getUser(); } public String getAmbariPass() { return ambari.getPass(); } public synchronized void setLastScalingActivityCurrent() { this.lastScalingActivity = System.currentTimeMillis(); } public boolean isRunning() { return ClusterState.RUNNING == getState(); } public void addMetricAlert(MetricAlert alert) { this.metricAlerts.add(alert); } public void addTimeAlert(TimeAlert alert) { this.timeAlerts.add(alert); } public Set<PrometheusAlert> getPrometheusAlerts() { return prometheusAlerts; } public void setPrometheusAlerts(Set<PrometheusAlert> prometheusAlerts) { this.prometheusAlerts = prometheusAlerts; } public void addPrometheusAlert(PrometheusAlert alert) { this.prometheusAlerts.add(alert); } }