package org.openstack.atlas.service.domain.repository; import org.hibernate.Session; import org.openstack.atlas.service.domain.pojos.LoadBalancerIdAndName; import org.openstack.atlas.service.domain.entities.*; import org.openstack.atlas.service.domain.entities.AccessList; import org.openstack.atlas.service.domain.entities.AccountUsage; import org.openstack.atlas.service.domain.entities.HealthMonitor; import org.openstack.atlas.service.domain.entities.LoadBalancer; import org.openstack.atlas.service.domain.entities.LoadBalancerStatus; import org.openstack.atlas.service.domain.entities.LoadbalancerMeta; import org.openstack.atlas.service.domain.entities.Node; import org.openstack.atlas.service.domain.entities.SessionPersistence; import org.openstack.atlas.service.domain.entities.SslTermination; import org.openstack.atlas.service.domain.entities.VirtualIp; import org.openstack.atlas.service.domain.exceptions.*; import org.openstack.atlas.service.domain.exceptions.EntityNotFoundException; import org.openstack.atlas.service.domain.pojos.*; import org.openstack.atlas.service.domain.pojos.AccountBilling; import org.openstack.atlas.service.domain.util.Constants; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import javax.persistence.*; import javax.persistence.criteria.*; import javax.persistence.metamodel.MapAttribute; import java.math.BigDecimal; import java.math.BigInteger; import java.sql.Connection; import java.sql.SQLException; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import static org.openstack.atlas.service.domain.entities.LoadBalancerProtocol.DNS_TCP; import static org.openstack.atlas.service.domain.entities.LoadBalancerProtocol.DNS_UDP; import static org.openstack.atlas.service.domain.entities.LoadBalancerProtocol.UDP_STREAM; import static org.openstack.atlas.service.domain.entities.LoadBalancerStatus.DELETED; @Repository @Transactional public class LoadBalancerRepository { private final Log LOG = LogFactory.getLog(LoadBalancerRepository.class); @PersistenceContext(unitName = "loadbalancing") private EntityManager entityManager; public LoadBalancer getById(Integer id) throws EntityNotFoundException { LoadBalancer lb = entityManager.find(LoadBalancer.class, id); if (lb == null) { String message = Constants.LoadBalancerNotFound; LOG.warn(message); throw new EntityNotFoundException(message); } return lb; } public boolean getByIdForOp(Integer id) throws EntityNotFoundException { String qStr = "from LoadBalancer lb where lb.id=:lid"; List<LoadBalancer> lbList; Query q = entityManager.createQuery(qStr).setLockMode(LockModeType.PESSIMISTIC_READ). setParameter("lid", id); lbList = q.getResultList(); if (lbList.size() < 1) { throw new EntityNotFoundException(); } return true ? lbList.get(0).getStatus().equals(LoadBalancerStatus.ACTIVE) : false; } public List<LoadBalancerIdAndName> getAllLoadbalancerIdsAndNames() { List<LoadBalancerIdAndName> lbs = new ArrayList<LoadBalancerIdAndName>(); String queryString = "select l.id,l.accountId,l.name from LoadBalancer l"; Query q = entityManager.createQuery(queryString); List<Object> rows = q.getResultList(); for (Object uncastedRowArrayObj : rows) { // Each element of rows is actually an Object[] whith each element representing a column Object[] row = (Object[]) uncastedRowArrayObj; LoadBalancerIdAndName lb = new LoadBalancerIdAndName(); lb.setLoadbalancerId((Integer) row[0]); lb.setAccountId((Integer) row[1]); lb.setName((String) row[2]); lbs.add(lb); } return lbs; } public List<LoadBalancerIdAndName> getActiveLoadbalancerIdsAndNames() { List<LoadBalancerIdAndName> lbs = new ArrayList<LoadBalancerIdAndName>(); String queryString = "select l.id,l.accountId,l.name from LoadBalancer l where l.status = 'ACTIVE'"; Query q = entityManager.createQuery(queryString); List<Object> rows = q.getResultList(); for (Object uncastedRowArrayObj : rows) { // Each element of rows is actually an Object[] whith each element representing a column Object[] row = (Object[]) uncastedRowArrayObj; LoadBalancerIdAndName lb = new LoadBalancerIdAndName(); lb.setLoadbalancerId((Integer) row[0]); lb.setAccountId((Integer) row[1]); lb.setName((String) row[2]); lbs.add(lb); } return lbs; } public String getLoadBalancerNameById(Integer lbid, Integer aid) throws EntityNotFoundException { String lbName; String qStr = "SELECT l.name from LoadBalancer l where l.id = :lbid and l.accountId = :aid "; Query q = entityManager.createQuery(qStr); q.setParameter("lbid", lbid); q.setParameter("aid", aid); lbName = (String) q.getSingleResult(); if (lbName == null) { String message = Constants.LoadBalancerNotFound; LOG.warn(message); throw new EntityNotFoundException(message); } return lbName; } public LoadBalancer getByIdAndAccountId(Integer id, Integer accountId) throws EntityNotFoundException { LoadBalancer lb; lb = getById(id); if (!lb.getAccountId().equals(accountId)) { String message = Constants.LoadBalancerNotFound; LOG.warn(message); throw new EntityNotFoundException(message); } return lb; } public LoadBalancer getByIdAndAccountIdWithUserPages(Integer id, Integer accountId) throws EntityNotFoundException { LoadBalancer lb; lb = getById(id); if (!lb.getAccountId().equals(accountId)) { String message = Constants.LoadBalancerNotFound; LOG.warn(message); throw new EntityNotFoundException(message); } try { lb.getUserPages(); } catch (Exception e) { UserPages up = new UserPages(); up.setErrorpage(null); lb.setUserPages(up); } return lb; } public void detach(Object entity) { entityManager.detach(entity); } public List<LoadBalancer> getExpiredLbs() { Calendar threeMonthsAgo = Calendar.getInstance(); threeMonthsAgo.add(Calendar.DATE, -90); String queryStr = "select l from LoadBalancer l where l.status = :status and l.updated <= :threeMonthsAgo"; Query query = entityManager.createQuery(queryStr); query.setParameter("threeMonthsAgo", threeMonthsAgo); query.setParameter("status", LoadBalancerStatus.DELETED); List results = query.getResultList(); return results; } public void removeExpiredLb(int lbId) { LoadBalancer lb = entityManager.find(LoadBalancer.class, lbId); entityManager.remove(lb); } public List<Integer> getLoadbalancerIdsByAccountIDAndUsageNeedsPushed(Integer aid) { List<Integer> lbs; String qStr = "SELECT l.id from LoadBalancer l " + " WHERE l.accountId = :aid "; Query q = entityManager.createQuery(qStr); q.setParameter("aid", aid); lbs = q.getResultList(); return lbs; } public AccessList getNetworkItemByAccountIdLoadBalancerIdNetworkItemId(Integer aid, Integer lid, Integer nid) throws EntityNotFoundException { List<AccessList> al = null; String qStr = "SELECT a from AccessList a " + " WHERE a.loadbalancer.id = :lid " + " and a.loadbalancer.accountId = :aid " + " and a.id = :nid"; // Don't put up with the possibility of bogus querys if (lid == null || aid == null || nid == null) { throw new EntityNotFoundException("Null parameter Query rejected"); } Query q = entityManager.createQuery(qStr); q.setParameter("aid", aid); q.setParameter("lid", lid); q.setParameter("nid", nid); q.setMaxResults(1); al = q.getResultList(); if (al.size() != 1) { throw new EntityNotFoundException("Node not nound"); } return al.get(0); } public Integer getNumNonDeletedLoadBalancersForAccount(Integer accountId) { Query query = entityManager.createNativeQuery( "select count(account_id) from loadbalancer where status != 'DELETED' and account_id = :accountId").setParameter("accountId", accountId); return ((BigInteger) query.getSingleResult()).intValue(); } public List<LoadBalancerProtocolObject> getAllProtocols() { List<LoadBalancerProtocolObject> protocolObjects; protocolObjects = entityManager.createQuery( "from LoadBalancerProtocolObject where enabled = True").getResultList(); if (protocolObjects.isEmpty()) { protocolObjects = new ArrayList<LoadBalancerProtocolObject>(); } return protocolObjects; } public List<LoadBalancerAlgorithmObject> getAllAlgorithms() { List<LoadBalancerAlgorithmObject> algorithmObjects; algorithmObjects = entityManager.createQuery( "from LoadBalancerAlgorithmObject lba where lba.enabled = True").getResultList(); if (algorithmObjects.isEmpty()) { algorithmObjects = new ArrayList<LoadBalancerAlgorithmObject>(); } return algorithmObjects; } public ConnectionLimit getConnectionLimitsbyAccountIdLoadBalancerId(Integer accountId, Integer loadbalancerId) throws EntityNotFoundException, DeletedStatusException { LoadBalancer lb = getByIdAndAccountId(loadbalancerId, accountId); if (lb.getStatus().equals(LoadBalancerStatus.DELETED)) { throw new DeletedStatusException("The loadbalancer is marked as deleted."); } if (lb.getConnectionLimit() == null) { return new ConnectionLimit(); } return lb.getConnectionLimit(); } public RateLimit getRateLimitByLoadBalancerId( Integer loadbalancerId) throws EntityNotFoundException, DeletedStatusException { LoadBalancer lb = getById(loadbalancerId); if (lb.getStatus().equals(LoadBalancerStatus.DELETED)) { throw new DeletedStatusException("The loadbalancer is marked as deleted."); } if (lb.getRateLimit() == null) { throw new EntityNotFoundException("No rate limit exists"); } return lb.getRateLimit(); } public SessionPersistence getSessionPersistenceByAccountIdLoadBalancerId(Integer accountId, Integer loadbalancerId) throws EntityNotFoundException, DeletedStatusException, BadRequestException { LoadBalancer lb = getByIdAndAccountId(loadbalancerId, accountId); if (lb.getStatus().equals(LoadBalancerStatus.DELETED)) { throw new DeletedStatusException("The loadbalancer is marked as deleted."); } if (lb.getSessionPersistence() == null) { throw new EntityNotFoundException("No session persistence exists"); } return lb.getSessionPersistence(); } public LoadBalancer enableSessionPersistenceByIdAndAccountId(Integer id, Integer accountId) throws EntityNotFoundException, BadRequestException { LoadBalancer lb; lb = getById(id); if (!lb.getAccountId().equals(accountId)) { throw new EntityNotFoundException(String.format("Load balancer not found")); } if (!lb.getProtocol().equals(LoadBalancerProtocol.HTTP)) { throw new BadRequestException( "Bad Request: The requirements were not met for this request, please verify with spec and try again."); } return lb; } public boolean testAndSetStatus(Integer accountId, Integer loadbalancerId, LoadBalancerStatus statusToChangeTo, boolean allowConcurrentModifications) throws EntityNotFoundException, UnprocessableEntityException { String qStr = "from LoadBalancer lb where lb.accountId=:aid and lb.id=:lid"; List<LoadBalancer> lbList; Query q = entityManager.createQuery(qStr).setLockMode(LockModeType.PESSIMISTIC_READ). setParameter("aid", accountId). setParameter("lid", loadbalancerId); lbList = q.getResultList(); if (lbList.size() < 1) { throw new EntityNotFoundException(); } LoadBalancer lb = lbList.get(0); if (lb.getStatus().equals(DELETED)) { throw new UnprocessableEntityException(Constants.LoadBalancerDeleted); } final boolean isActive = lb.getStatus().equals(LoadBalancerStatus.ACTIVE); final boolean isPendingOrActive = lb.getStatus().equals(LoadBalancerStatus.PENDING_UPDATE) || isActive; if (allowConcurrentModifications ? isPendingOrActive : isActive) { // SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); // Date now = new Date(); // String strDate = sdfDate.format(now); // LOG.debug("SET STATUS: " + strDate); lb.setStatus(statusToChangeTo); lb.setUpdated(Calendar.getInstance()); entityManager.merge(lb); entityManager.flush(); return true; } return false; } public List<Usage> getUsageByAccountIdandLbId(Integer accountId, Integer loadBalancerId, Calendar startTime, Calendar endTime) throws EntityNotFoundException, DeletedStatusException { // TODO: Find more efficient way of making sure loadbalancer exists getByIdAndAccountId(loadBalancerId, accountId); // Make sure loadbalancer exists return getUsageByLbId(loadBalancerId, startTime, endTime); } public List<Usage> getUsageByAccountIdandLbIdNeedsPushed(Integer accountId, Integer loadBalancerId, Calendar startTime, Calendar endTime) throws EntityNotFoundException, DeletedStatusException { // TODO: Find more efficient way of making sure loadbalancer exists getByIdAndAccountId(loadBalancerId, accountId); // Make sure loadbalancer exists return getUsageByLbIdNeedsPushed(loadBalancerId, startTime, endTime); } public void setStatus(Integer accountId, Integer loadbalancerId, LoadBalancerStatus status) throws EntityNotFoundException { String qStr = "from LoadBalancer lb where lb.accountId=:aid and lb.id=:lid"; List<LoadBalancer> lbList; Query q = entityManager.createQuery(qStr).setLockMode(LockModeType.PESSIMISTIC_WRITE). setParameter("aid", accountId). setParameter("lid", loadbalancerId); lbList = q.getResultList(); if (lbList.size() < 1) { throw new EntityNotFoundException(); } lbList.get(0).setStatus(status); entityManager.merge(lbList.get(0)); } public boolean setStatusForOp(Integer accountId, Integer loadbalancerId, LoadBalancerStatus status) throws EntityNotFoundException { String qStr = "from LoadBalancer lb where lb.accountId=:aid and lb.id=:lid"; List<LoadBalancer> lbList; Query q = entityManager.createQuery(qStr).setLockMode(LockModeType.PESSIMISTIC_WRITE). setParameter("aid", accountId). setParameter("lid", loadbalancerId); lbList = q.getResultList(); if (lbList.size() < 1) { throw new EntityNotFoundException(); } // // if (!lbList.get(0).getStatus().equals(LoadBalancerStatus.ACTIVE)) { // return false; // } lbList.get(0).setStatus(status); entityManager.merge(lbList.get(0)); return true; } public boolean testAndSetStatusPending(Integer accountId, Integer loadbalancerId) throws EntityNotFoundException { String qStr = "from LoadBalancer lb where lb.accountId=:aid and lb.id=:lid"; List<LoadBalancer> lbList; Query q = entityManager.createQuery(qStr).setLockMode(LockModeType.PESSIMISTIC_WRITE). setParameter("aid", accountId). setParameter("lid", loadbalancerId); lbList = q.getResultList(); if (lbList.size() < 1) { throw new EntityNotFoundException(); } if (!lbList.get(0).getStatus().equals(LoadBalancerStatus.ACTIVE)) { return false; } lbList.get(0).setStatus(LoadBalancerStatus.PENDING_UPDATE); lbList.get(0).setUpdated(Calendar.getInstance()); entityManager.merge(lbList.get(0)); return true; } public List<LoadBalancer> getNonDeletedByAccountId(Integer accountId) { List<LoadBalancer> lbs = new ArrayList<LoadBalancer>(); String qStr = "select lb from LoadBalancer lb where status !='DELETED' and lb.accountId = :accountId"; Query q = entityManager.createQuery(qStr).setParameter("accountId", accountId); lbs = q.getResultList(); return lbs; } /** * This method is optimized performance and only pulls the information that is required for displaying the loadbalancers list, instead * of eager-loading the childrens. */ public List<LoadBalancer> getNonDeletedByAccountId(Integer accountId, Integer... p) { List<LoadBalancer> lbs = new ArrayList<LoadBalancer>(); LoadBalancerStatus lbStatus = LoadBalancerStatus.DELETED; Query query; String qStr = "SELECT lb.id, lb.accountId, lb.name, lb.algorithm, lb.protocol, lb.port, lb.status, lb.created, lb.updated FROM LoadBalancer lb WHERE lb.accountId = :accountId and lb.status != :status"; query = entityManager.createQuery(qStr).setParameter("accountId", accountId).setParameter("status", lbStatus); if (p.length >= 2) { Integer offset = p[0]; Integer limit = p[1]; Integer changesSince = p[2]; Integer marker = p[3]; if (offset == null) { offset = 0; } if (limit == null) { limit = 100; } if (marker != null) { if (lbStatus != null) { query = entityManager.createQuery( "SELECT lb.id, lb.accountId, lb.name, lb.algorithm, lb.protocol, lb.port, lb.status, lb.created, lb.updated FROM LoadBalancer lb WHERE lb.accountId = :accountId and lb.id >= :lbId and lb.status != :status").setParameter("accountId", accountId).setParameter("lbId", marker).setParameter("status", lbStatus); } } query = query.setFirstResult(offset).setMaxResults(limit); } List<Object[]> rows = query.getResultList(); for (Object[] obj : rows) { LoadBalancer loadBalancer = new LoadBalancer(); loadBalancer.setId((Integer) obj[0]); loadBalancer.setAccountId((Integer) obj[1]); loadBalancer.setName((String) obj[2]); loadBalancer.setAlgorithm((LoadBalancerAlgorithm) obj[3]); loadBalancer.setProtocol((LoadBalancerProtocol) obj[4]); loadBalancer.setPort((Integer) obj[5]); loadBalancer.setStatus((LoadBalancerStatus) obj[6]); loadBalancer.setCreated((Calendar) obj[7]); loadBalancer.setUpdated((Calendar) obj[8]); List<LoadBalancerJoinVip> vips = getVipsByLoadBalancerId(loadBalancer.getId()); loadBalancer.setLoadBalancerJoinVipSet(new HashSet(vips)); lbs.add(loadBalancer); } return lbs; } public List<LoadBalancerJoinVip> getVipsByLoadBalancerId(Integer loadBalancerId) { List<LoadBalancerJoinVip> vips; String query = "select j from LoadBalancerJoinVip j where j.loadBalancer.id = :loadBalancerId"; //String query = "select l.virtualIps from LoadBalancer l where l.id = :loadBalancerId"; vips = entityManager.createQuery(query).setParameter("loadBalancerId", loadBalancerId).getResultList(); return vips; } public List<LoadBalancerJoinVip6> getVips6ByLoadBalancerId(Integer loadBalancerId) { List<LoadBalancerJoinVip6> vips; String query = "select j from LoadBalancerJoinVip6 j where j.loadBalancer.id = :loadBalancerId"; //String query = "select l.virtualIps from LoadBalancer l where l.id = :loadBalancerId"; vips = entityManager.createQuery(query).setParameter("loadBalancerId", loadBalancerId).getResultList(); return vips; } public boolean isServicenetLoadBalancer(Integer loadBalancerId) { List<LoadBalancerJoinVip> vips; for (LoadBalancerJoinVip vip : getVipsByLoadBalancerId(loadBalancerId)) { if (VirtualIpType.SERVICENET == vip.getVirtualIp().getVipType()) return true; } return false; } public List<LoadBalancer> getLoadbalancersGeneric(Integer accountId, String status, LbQueryStatus queryStatus, Calendar changedSince, Integer offset, Integer limit, Integer marker) throws BadRequestException { List<LoadBalancer> lbs = new ArrayList<LoadBalancer>(); LoadBalancerStatus lbStatus; String selectClause; String format; CustomQuery cq; String msg; selectClause = "SELECT lb FROM LoadBalancer lb"; String op; String qStr; Query q; cq = new CustomQuery(selectClause); if (accountId != null) { cq.addParam("lb.accountId", "=", "accountId", accountId); } if (queryStatus != null && status != null) { try { lbStatus = LoadBalancerStatus.valueOf(status); } catch (IllegalArgumentException e) { msg = String.format("%s is not a valid LoadBalancer status", status); throw new BadRequestException(msg); } switch (queryStatus) { case EXCLUDE: op = "!="; break; case INCLUDE: op = "="; break; default: format = "QueryStatus %s must be INCLUDE or EXCLUDE or null"; msg = String.format(format, queryStatus.name()); throw new BadRequestException(msg); } cq.addParam("lb.status", op, "status", lbStatus); } if (changedSince != null) { cq.addParam("lb.updated", ">=", "updated", changedSince); } if (marker != null) { cq.addParam("lb.id", ">=", "marker", marker); } qStr = cq.getQueryString(); q = entityManager.createQuery(qStr); for (QueryParameter param : cq.getQueryParameters()) { q.setParameter(param.getPname(), param.getValue()); } if (limit != null) { cq.setLimit(limit); q.setMaxResults(cq.getLimit()); } if (offset != null) { cq.setOffset(offset); q.setFirstResult(cq.getOffset()); } lbs = q.getResultList(); return lbs; } public List<LoadBalancer> getByAccountId(Integer accountId, String status, Integer... p) { List<LoadBalancer> loadbalancers = new ArrayList<LoadBalancer>(); LoadBalancerStatus lbStatus = null; if (status != null) { try { lbStatus = LoadBalancerStatus.valueOf(status); } catch (IllegalArgumentException e) { lbStatus = null; } } Query query; query = entityManager.createQuery("SELECT lb FROM LoadBalancer lb WHERE lb.accountId = :accountId").setParameter("accountId", accountId); if (lbStatus != null) { query = entityManager.createQuery("SELECT lb FROM LoadBalancer lb WHERE lb.accountId = :accountId and lb.status = :status").setParameter("accountId", accountId).setParameter("status", lbStatus); } if (p.length >= 2) { Integer offset = p[0]; Integer limit = p[1]; Integer changesSince = p[2]; Integer marker = p[3]; if (offset == null) { offset = 0; } if (limit == null) { limit = 100; } if (changesSince != null) { List<LoadBalancer> changesLb = getChangesSince(accountId, status, changesSince, offset, limit); return changesLb; } if (marker != null) { query = entityManager.createQuery( "SELECT lb FROM LoadBalancer lb WHERE lb.accountId = :accountId and lb.id >= :lbId").setParameter("accountId", accountId).setParameter("lbId", marker); if (lbStatus != null) { query = entityManager.createQuery( "SELECT lb FROM LoadBalancer lb WHERE lb.accountId = :accountId and lb.id >= :lbId and lb.status = :status").setParameter("accountId", accountId).setParameter("lbId", marker).setParameter("status", lbStatus); } } query = query.setFirstResult(offset).setMaxResults(limit); } loadbalancers = query.getResultList(); return loadbalancers; } // For Jira https://jira.mosso.com/browse/SITESLB-220 public List<AccountLoadBalancer> getAccountLoadBalancers(int accountId) { // Jira: https://jira.mosso.com/browse/SITESLB-220 List<AccountLoadBalancer> accountLoadBalancers = new ArrayList<AccountLoadBalancer>(); List<Object> hResults; String queryStr = "select l.id, " + "l.name, " + "c.id, " + "c.name, " + "l.status, " + "l.protocol " + "from LoadBalancer l join l.host h join h.cluster c " + "where l.accountId=:accountId"; hResults = entityManager.createQuery(queryStr).setParameter("accountId", accountId).getResultList(); for (Object row : hResults) { Object[] t = (Object[]) row; LoadBalancerStatus status; LoadBalancerProtocol protocol; AccountLoadBalancer accountLoadBalancer = new AccountLoadBalancer(); accountLoadBalancer.setLoadBalancerId((Integer) t[0]); accountLoadBalancer.setLoadBalancerName((String) t[1]); accountLoadBalancer.setClusterId((Integer) t[2]); accountLoadBalancer.setClusterName((String) t[3]); status = (LoadBalancerStatus) t[4]; accountLoadBalancer.setStatus(status.toString()); protocol = (LoadBalancerProtocol) t[5]; accountLoadBalancer.setProtocol(protocol.toString()); accountLoadBalancers.add(accountLoadBalancer); } return accountLoadBalancers; } //For V1-B-34873 public ArrayList<ExtendedAccountLoadBalancer> getExtendedAccountLoadBalancers(int accountId) { // CriteriaBuilder builder = entityManager.getCriteriaBuilder(); // CriteriaQuery<LoadBalancer> criteria = builder.createQuery(LoadBalancer.class); // Root<LoadBalancer> lbRoot = criteria.from(LoadBalancer.class); // // Join<LoadBalancer, Set<LoadBalancerJoinVip>> loadBalancerJoinVip = lbRoot.join("loadBalancerJoinVipSet", JoinType.LEFT); // Join<LoadBalancer, Set<LoadBalancerJoinVip6>> loadBalancerJoinVip6 = lbRoot.join("loadBalancerJoinVip6Set", JoinType.LEFT); // Join<LoadBalancer, Host> host = lbRoot.join("host", JoinType.LEFT); // Join<LoadBalancer, Cluster> cluster = host.join("cluster", JoinType.LEFT); // Predicate isAccount = builder.equal(lbRoot.get(LoadBalancer_.accountId), accountId); // criteria.select(lbRoot); // criteria.where(isAccount); List<ExtendedAccountLoadBalancer> extendedAccountLoadBalancers = new ArrayList<ExtendedAccountLoadBalancer>(); List<Object> hResults; String queryStr = "select l.id, " + "l.name, " + "l.status, " + "l.protocol, " + "v4, " + "v6, " + "c.id, " + "c.name, " + "c.dataCenter " + "from LoadBalancer l " + "left join l.loadBalancerJoinVipSet v4 " + "left join l.loadBalancerJoinVip6Set v6 " + "join l.host h " + "join h.cluster c " + "where l.accountId=:accountId"; hResults = entityManager.createQuery(queryStr).setParameter("accountId", accountId).getResultList(); for (Object row : hResults) { Object[] t = (Object[]) row; ExtendedAccountLoadBalancer extendedAccountLoadBalancer = new ExtendedAccountLoadBalancer(); extendedAccountLoadBalancer.setLoadBalancerId((Integer) t[0]); extendedAccountLoadBalancer.setLoadBalancerName((String) t[1]); extendedAccountLoadBalancer.setStatus(t[2].toString()); extendedAccountLoadBalancer.setProtocol(t[3].toString()); LoadBalancerJoinVip v4 = (LoadBalancerJoinVip) t[4]; LoadBalancerJoinVip6 v6 = (LoadBalancerJoinVip6) t[5]; extendedAccountLoadBalancer.setClusterId((Integer) t[6]); extendedAccountLoadBalancer.setClusterName((String) t[7]); extendedAccountLoadBalancer.setRegion((DataCenter) t[8]); Set<LoadBalancerJoinVip> v4Set; if (v4 == null || v4.getLoadBalancer().getLoadBalancerJoinVipSet().isEmpty() || v4.getLoadBalancer().getLoadBalancerJoinVipSet() == null) { v4Set = new HashSet<LoadBalancerJoinVip>(); } else { v4Set = v4.getLoadBalancer().getLoadBalancerJoinVipSet(); } Set<LoadBalancerJoinVip6> v6Set; if (v6 == null || v6.getLoadBalancer().getLoadBalancerJoinVip6Set().isEmpty() || v6.getLoadBalancer().getLoadBalancerJoinVip6Set() == null) { v6Set = new HashSet<LoadBalancerJoinVip6>(); } else { v6Set = v6.getLoadBalancer().getLoadBalancerJoinVip6Set(); } extendedAccountLoadBalancer.setVirtualIpDozerWrapper(new VirtualIpDozerWrapper(v4Set, v6Set)); extendedAccountLoadBalancers.add(extendedAccountLoadBalancer); } return new ArrayList<ExtendedAccountLoadBalancer>(extendedAccountLoadBalancers); } private VirtualIpDozerWrapper getVipWrapperByLbId(int lbId) { return new VirtualIpDozerWrapper(new HashSet<LoadBalancerJoinVip>(getVipsByLoadBalancerId(lbId)), new HashSet<LoadBalancerJoinVip6>(getVips6ByLoadBalancerId(lbId))); } // For Jira https://jira.mosso.com/browse/SITESLB-220 public List<AccountLoadBalancer> getAccountNonDeleteLoadBalancers( int accountId) { // Jira: https://jira.mosso.com/browse/SITESLB-220 List<AccountLoadBalancer> accountLoadBalancers = new ArrayList<AccountLoadBalancer>(); List<Object> hResults; String queryStr = "select l.id, " + "l.name, " + "c.id, " + "c.name, " + "l.status, " + "l.protocol " + "from LoadBalancer l join l.host h join h.cluster c " + "where l.accountId=:accountId and l.status != 'DELETED'"; hResults = entityManager.createQuery(queryStr).setParameter("accountId", accountId).getResultList(); for (Object row : hResults) { Object[] t = (Object[]) row; LoadBalancerStatus status; LoadBalancerProtocol protocol; AccountLoadBalancer accountLoadBalancer = new AccountLoadBalancer(); accountLoadBalancer.setLoadBalancerId((Integer) t[0]); accountLoadBalancer.setLoadBalancerName((String) t[1]); accountLoadBalancer.setClusterId((Integer) t[2]); accountLoadBalancer.setClusterName((String) t[3]); status = (LoadBalancerStatus) t[4]; accountLoadBalancer.setStatus(status.toString()); protocol = (LoadBalancerProtocol) t[5]; accountLoadBalancer.setProtocol(protocol.toString()); accountLoadBalancers.add(accountLoadBalancer); } return accountLoadBalancers; } public List<AccessList> getAccessListByAccountIdLoadBalancerId(int accountId, int loadbalancerId, Integer... p) throws EntityNotFoundException, DeletedStatusException { LoadBalancer lb = getByIdAndAccountId(loadbalancerId, accountId); // Puke if the LoadBalancer is not found presumebly Account LoadBalancer mismatch List<AccessList> accessList = new ArrayList<AccessList>(); if (lb.getStatus().equals(LoadBalancerStatus.DELETED)) { throw new DeletedStatusException("The loadbalancer is marked as deleted."); } Query query = entityManager.createQuery( "from AccessList a where a.loadbalancer.id = :lid and a.loadbalancer.accountId = :aid").setParameter( "lid", loadbalancerId).setParameter("aid", accountId); if (p.length >= 3) { Integer offset = p[0]; Integer limit = p[1]; Integer marker = p[2]; if (offset == null) { offset = 0; } if (limit == null || limit > 100) { limit = 100; } if (marker != null) { query = entityManager.createQuery( "from AccessList a where a.loadbalancer.id = :lid and a.loadbalancer.accountId = :aid and a.id >= :accessId").setParameter( "lid", loadbalancerId).setParameter("aid", accountId).setParameter("accessId", marker); } query = query.setFirstResult(offset).setMaxResults(limit); } accessList = query.getResultList(); return accessList; } // A simple Question shoulden't fetch an entire loadbalancer object. public boolean accountOwnsLoadBalancer(Integer aid, Integer lid) { String qStr = "SELECT lb.id from LoadBalancer lb " + "where lb.accountId=:aid and lb.id = :lid"; Query query = entityManager.createQuery(qStr). setParameter("aid", aid).setParameter("lid", lid); List<Integer> ids = query.getResultList(); if (ids.size() <= 0) { return false; } return true; } public boolean loadBalancerHasHealthMonitor(Integer lid) { String qStr = "SELECT lb.healthMonitor.id from LoadBalancer lb " + " where lb.id = :lid"; Query query = entityManager.createQuery(qStr).setParameter("lid", lid); List<Integer> ids = query.getResultList(); if (ids.size() <= 0) { return false; } return true; } public HealthMonitor getHealthMonitor(Integer accountId, Integer loadbalancerId) throws EntityNotFoundException, DeletedStatusException { LoadBalancer lb = getByIdAndAccountId(loadbalancerId, accountId); if (lb.getStatus().equals(LoadBalancerStatus.DELETED)) { throw new DeletedStatusException("The loadbalancer is marked as deleted."); } if (lb.getHealthMonitor() == null) { return new HealthMonitor(); } return lb.getHealthMonitor(); } public Set<VirtualIp> getVipsByLbId(Integer loadBalancerId, Integer... p) throws EntityNotFoundException, DeletedStatusException { LoadBalancer lb = getById(loadBalancerId); if (lb.getStatus().equals(LoadBalancerStatus.DELETED)) { throw new DeletedStatusException("The loadbalancer is marked as deleted."); } if (lb.getLoadBalancerJoinVipSet() == null || lb.getLoadBalancerJoinVipSet().isEmpty()) { throw new EntityNotFoundException("No virtual ips associated with the loadbalancer"); } Set<LoadBalancerJoinVip> loadBalancerJoinVipSet = lb.getLoadBalancerJoinVipSet(); Set<VirtualIp> vips_out = new LinkedHashSet<VirtualIp>(); if (p.length >= 2) { Integer offset = p[0]; Integer limit = p[1]; Integer marker = p[2]; int i = 0; if (offset == null) { offset = 0; } if (limit == null || limit > 100) { limit = 100; } if (marker == null) { marker = 0; } for (LoadBalancerJoinVip loadBalancerJoinVip : loadBalancerJoinVipSet) { i++; if (loadBalancerJoinVip.getVirtualIp().getId() >= marker) { if (i >= offset) { vips_out.add(loadBalancerJoinVip.getVirtualIp()); } if (i >= offset + limit) { break; } } } } else { for (LoadBalancerJoinVip loadBalancerJoinVip : loadBalancerJoinVipSet) { vips_out.add(loadBalancerJoinVip.getVirtualIp()); } } return vips_out; } private void paginateLists(Object obj, Integer marker, Integer limit) { if (obj instanceof LoadBalancer) { ((LoadBalancer) obj).getId(); } } private void setLbIdOnChildObjects(LoadBalancer loadBalancer) { if (loadBalancer.getNodes() != null) { for (Node node : loadBalancer.getNodes()) { node.setLoadbalancer(loadBalancer); } } if (loadBalancer.getLoadbalancerMetadata() != null) { for (LoadbalancerMeta loadbalancerMeta : loadBalancer.getLoadbalancerMetadata()) { loadbalancerMeta.setLoadbalancer(loadBalancer); } } if (loadBalancer.getAccessLists() != null) { for (AccessList accessList : loadBalancer.getAccessLists()) { accessList.setLoadbalancer(loadBalancer); } } if (loadBalancer.getConnectionLimit() != null) { loadBalancer.getConnectionLimit().setLoadBalancer(loadBalancer); } if (loadBalancer.getHealthMonitor() != null) { loadBalancer.getHealthMonitor().setLoadbalancer(loadBalancer); } } public LoadBalancer update(LoadBalancer loadBalancer) { final Set<LoadBalancerJoinVip> lbJoinVipsToLink = loadBalancer.getLoadBalancerJoinVipSet(); loadBalancer.setLoadBalancerJoinVipSet(null); loadBalancer.setUpdated(Calendar.getInstance()); loadBalancer = entityManager.merge(loadBalancer); // Now attach loadbalancer to vips for (LoadBalancerJoinVip lbJoinVipToLink : lbJoinVipsToLink) { VirtualIp virtualIp = entityManager.find(VirtualIp.class, lbJoinVipToLink.getVirtualIp().getId()); LoadBalancerJoinVip loadBalancerJoinVip = new LoadBalancerJoinVip(loadBalancer.getPort(), loadBalancer, virtualIp); entityManager.merge(loadBalancerJoinVip); entityManager.merge(lbJoinVipToLink.getVirtualIp()); } entityManager.flush(); return loadBalancer; } public LoadBalancer setStatus(LoadBalancer loadBalancer, LoadBalancerStatus status) throws EntityNotFoundException { loadBalancer = getById(loadBalancer.getId()); loadBalancer.setStatus(status); loadBalancer.setUpdated(Calendar.getInstance()); loadBalancer = entityManager.merge(loadBalancer); entityManager.flush(); return loadBalancer; } public LoadBalancer create(LoadBalancer loadBalancer) { Calendar formattedCal = dateFormatter(); final Set<LoadBalancerJoinVip> lbJoinVipsToLink = loadBalancer.getLoadBalancerJoinVipSet(); loadBalancer.setLoadBalancerJoinVipSet(null); final Set<LoadBalancerJoinVip6> lbJoinVip6sToLink = loadBalancer.getLoadBalancerJoinVip6Set(); loadBalancer.setLoadBalancerJoinVip6Set(null); setLbIdOnChildObjects(loadBalancer); loadBalancer.setCreated(Calendar.getInstance()); loadBalancer.setUpdated(Calendar.getInstance()); loadBalancer = entityManager.merge(loadBalancer); // Now attach loadbalancer to vips for (LoadBalancerJoinVip lbJoinVipToLink : lbJoinVipsToLink) { entityManager.merge(lbJoinVipToLink.getVirtualIp()); LoadBalancerJoinVip loadBalancerJoinVip = new LoadBalancerJoinVip(loadBalancer.getPort(), loadBalancer, lbJoinVipToLink.getVirtualIp()); entityManager.merge(loadBalancerJoinVip); } loadBalancer.setLoadBalancerJoinVip6Set(lbJoinVip6sToLink); entityManager.flush(); return loadBalancer; } public void persist(Object obj) { entityManager.persist(obj); } public Calendar dateFormatter() { SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd'T'HH:mm:ssZ"); Calendar cal = Calendar.getInstance(); Date now = cal.getTime(); String formattedDate = formatter.format(now); Date dateProc = null; try { dateProc = formatter.parse(formattedDate); } catch (ParseException e) { e.printStackTrace(); } cal.setTime(dateProc); return cal; } public LoadBalancerProtocolObject getDefaultProtocol() { //TODO: Add enable/disable logic return (LoadBalancerProtocolObject) entityManager.createQuery( "SELECT p FROM LoadBalancerProtocolObject p WHERE name = 'HTTP'").getSingleResult(); } public LoadBalancerProtocolObject getProtocol(LoadBalancerProtocol protocol) { CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery<LoadBalancerProtocolObject> criteria = builder.createQuery(LoadBalancerProtocolObject.class); Root<LoadBalancerProtocolObject> protocolObjectRoot = criteria.from(LoadBalancerProtocolObject.class); Predicate hasName = builder.equal(protocolObjectRoot.get(LoadBalancerProtocolObject_.name), protocol); criteria.select(protocolObjectRoot); criteria.where(hasName); return entityManager.createQuery(criteria).getSingleResult(); } public void delete(Object o) { try { LoadBalancer lb = getById(((LoadBalancer) o).getId()); entityManager.remove(lb); entityManager.flush(); } catch (EntityNotFoundException ignored) { } } public Object save(Object o) { entityManager.persist(o); entityManager.flush(); return o; } public ConnectionLimit createConnectionLimit(LoadBalancer loadBalancer, ConnectionLimit connectionLimit) { connectionLimit.setLoadBalancer(loadBalancer); connectionLimit = entityManager.merge(connectionLimit); return connectionLimit; } public ConnectionLimit updateConnectionLimit(LoadBalancer loadBalancer, ConnectionLimit connectionLimit) { connectionLimit.setId(loadBalancer.getConnectionLimit().getId()); connectionLimit.setLoadBalancer(loadBalancer); connectionLimit = entityManager.merge(connectionLimit); return connectionLimit; } public RateLimit createRateLimit(LoadBalancer loadBalancer, RateLimit rateLimit) { createTicket(loadBalancer, rateLimit.getTicket()); rateLimit.setLoadbalancer(loadBalancer); rateLimit = entityManager.merge(rateLimit); return rateLimit; } public RateLimit updateRateLimit(LoadBalancer loadBalancer, RateLimit rateLimit) { rateLimit.setId(loadBalancer.getRateLimit().getId()); rateLimit.setLoadbalancer(loadBalancer); rateLimit = entityManager.merge(rateLimit); return rateLimit; } public Ticket createTicket(LoadBalancer loadBalancer, Ticket ticket) { ticket.setLoadbalancer(loadBalancer); ticket = entityManager.merge(ticket); return ticket; } public void removeRateLimit(LoadBalancer loadBalancer) { RateLimit rateLimit = loadBalancer.getRateLimit(); rateLimit = entityManager.merge(rateLimit); entityManager.remove(rateLimit); } public HealthMonitor createHealthMonitor(LoadBalancer loadBalancer, HealthMonitor healthMonitor) { healthMonitor.setLoadbalancer(loadBalancer); healthMonitor = entityManager.merge(healthMonitor); return healthMonitor; } public HealthMonitor updateHealthMonitor(LoadBalancer loadBalancer, HealthMonitor healthMonitor) { healthMonitor.setId(loadBalancer.getHealthMonitor().getId()); healthMonitor.setLoadbalancer(loadBalancer); healthMonitor = entityManager.merge(healthMonitor); return healthMonitor; } public void removeHealthMonitor(LoadBalancer loadBalancer) { HealthMonitor monitor = loadBalancer.getHealthMonitor(); monitor = entityManager.merge(monitor); entityManager.remove(monitor); } public void removeConnectionThrottle(LoadBalancer loadBalancer) { ConnectionLimit throttle = loadBalancer.getConnectionLimit(); throttle = entityManager.merge(throttle); entityManager.remove(throttle); } // TODO: Delete me before prod public EntityManager getEntityManager() { return this.entityManager; } public Suspension getSuspensionByLbIdAndAccountId(int loadbalancerId) throws EntityNotFoundException { List<Suspension> sList; sList = entityManager.createQuery("from Suspension s where s.loadbalancer.id = :lid").setParameter("lid", loadbalancerId).getResultList(); //we want to return an empty list element if this list is empty... if (sList.isEmpty()) { return new Suspension(); } else { return sList.get(0); } } public Suspension createSuspension(LoadBalancer loadBalancer, Suspension suspension) { createTicket(loadBalancer, suspension.getTicket()); suspension.setLoadbalancer(loadBalancer); suspension = entityManager.merge(suspension); return suspension; } public void removeSuspension(int loadbalancerId) { entityManager.createQuery("delete from Suspension s where s.loadbalancer.id = :lid").setParameter("lid", loadbalancerId).executeUpdate(); } public List<Usage> getUsageByLbId(Integer loadBalancerId, Calendar startTime, Calendar endTime) throws EntityNotFoundException, DeletedStatusException { List<Usage> usageList; Query query = entityManager.createQuery( "from Usage u where u.loadbalancer.id = :loadBalancerId and u.startTime >= :startTime and u.startTime <= :endTime order by u.startTime asc").setParameter("loadBalancerId", loadBalancerId).setParameter("startTime", startTime).setParameter("endTime", endTime); usageList = query.getResultList(); if (usageList.isEmpty()) { return new ArrayList<Usage>(); } return usageList; } public List<Usage> getUsageByLbIdNeedsPushed(Integer loadBalancerId, Calendar startTime, Calendar endTime) throws EntityNotFoundException, DeletedStatusException { List<Usage> usageList; Query query = entityManager.createQuery( "from Usage u where u.loadbalancer.id = :loadBalancerId and u.startTime >= :startTime and u.startTime <= :endTime and u.needsPushed = 1 order by u.startTime asc").setParameter("loadBalancerId", loadBalancerId).setParameter("startTime", startTime).setParameter("endTime", endTime); usageList = query.getResultList(); if (usageList.isEmpty()) { return new ArrayList<Usage>(); } return usageList; } public List<Usage> getUsageByAccountIdNeedsPushed(Integer accountId, Calendar startTime, Calendar endTime) throws EntityNotFoundException, DeletedStatusException { List<Usage> usageList; Query query = entityManager.createQuery( "from Usage u where u.accountId = :accountId and u.startTime >= :startTime and u.startTime <= :endTime and u.needsPushed = 1 order by u.startTime asc").setParameter("accountId", accountId).setParameter("startTime", startTime).setParameter("endTime", endTime); usageList = query.getResultList(); if (usageList.isEmpty()) { return new ArrayList<Usage>(); } return usageList; } public List<Usage> getAllUsageNeedsPushed(Calendar startTime, Calendar endTime) throws EntityNotFoundException, DeletedStatusException { List<Usage> usageList; Query query = entityManager.createQuery( "from Usage u where u.startTime >= :startTime and u.startTime <= :endTime and u.needsPushed = 1 order by u.startTime asc").setParameter("startTime", startTime).setParameter("endTime", endTime); usageList = query.getResultList(); if (usageList.isEmpty()) { return new ArrayList<Usage>(); } return usageList; } public List<Usage> getUsageNeedsPushed(Calendar startTime, Calendar endTime, int numAttempts) throws EntityNotFoundException, DeletedStatusException { List<Usage> usageList; Query query = entityManager.createQuery( "from Usage u where u.startTime >= :startTime and u.startTime <= :endTime and u.needsPushed = 1 " + "and u.numAttempts <= :numAttempts order by u.id asc").setParameter("startTime", startTime).setParameter("endTime", endTime).setParameter("numAttempts", numAttempts); usageList = query.getResultList(); if (usageList.isEmpty()) { return new ArrayList<Usage>(); } return usageList; } public List<Usage> getUsageRetryNeedsPushed(Calendar startTime, Calendar endTime, int numAttempts) throws EntityNotFoundException, DeletedStatusException { List<Usage> usageList; Query query = entityManager.createQuery( "from Usage u where u.startTime >= :startTime and u.startTime <= :endTime and u.needsPushed = 1 " + "and u.numAttempts >= :numAttempts order by u.startTime asc").setParameter("startTime", startTime).setParameter("endTime", endTime).setParameter("numAttempts", numAttempts); usageList = query.getResultList(); if (usageList.isEmpty()) { return new ArrayList<Usage>(); } return usageList; } public Collection<AccountBilling> getAccountBillingForAllAccounts(Calendar startTime, Calendar endTime) { Query query; List<AccountUsage> accountUsageResults; List<Usage> lbUsageResults; String accountsUsageQuery = "select u from AccountUsage u where " + " u.startTime >= :startTime and " + " u.startTime <= :endTime " + " order by u.accountId asc, u.startTime asc"; query = entityManager.createQuery(accountsUsageQuery); query.setParameter("startTime", startTime); query.setParameter("endTime", endTime); accountUsageResults = query.getResultList(); String lbUsageQuery = "select u from Usage u where " + " u.startTime >= :startTime and " + " u.endTime <= :endTime " + " order by u.loadbalancer.accountId asc, u.loadbalancer.id asc, u.startTime asc"; query = entityManager.createQuery(lbUsageQuery); query.setParameter("startTime", startTime); query.setParameter("endTime", endTime); lbUsageResults = query.getResultList(); return createAccountBillings(accountUsageResults, lbUsageResults); } private Collection<AccountBilling> createAccountBillings(List<AccountUsage> accountUsageResults, List<Usage> lbUsageResults) { Map<Integer, AccountBilling> accountBillings = new HashMap<Integer, AccountBilling>(); Map<Integer, LoadBalancerBilling> loadBalancerBillings = new HashMap<Integer, LoadBalancerBilling>(); for (AccountUsage accountUsageResult : accountUsageResults) { Integer accountId = accountUsageResult.getAccountId(); AccountBilling accountBilling = getNewOrExistingAccountBilling(accountBillings, accountId); accountBilling.getAccountUsageRecords().add(accountUsageResult); } // TODO: Need to add a record for lb's that don't have usage but are non-deleted for (Usage lbUsageResult : lbUsageResults) { Integer accountId = lbUsageResult.getLoadbalancer().getAccountId(); Integer lbId = lbUsageResult.getLoadbalancer().getId(); String lbName = lbUsageResult.getLoadbalancer().getName(); AccountBilling accountBilling = getNewOrExistingAccountBilling(accountBillings, accountId); LoadBalancerBilling loadBalancerBilling = getNewOrExistingLoadBalancerbilling(loadBalancerBillings, lbId, lbName); loadBalancerBilling.getUsageRecords().add(lbUsageResult); if (!accountBilling.getLoadBalancerBillings().contains(loadBalancerBilling)) { accountBilling.getLoadBalancerBillings().add(loadBalancerBilling); } } return accountBillings.values(); } private AccountBilling getNewOrExistingAccountBilling(Map<Integer, AccountBilling> accountBillings, Integer accountId) { AccountBilling accountBilling; if (accountBillings.containsKey(accountId)) { accountBilling = accountBillings.get(accountId); } else { accountBilling = new AccountBilling(); accountBilling.setAccountId(accountId); accountBillings.put(accountId, accountBilling); } return accountBilling; } private LoadBalancerBilling getNewOrExistingLoadBalancerbilling( Map<Integer, LoadBalancerBilling> loadBalancerBillings, Integer lbId, String lbName) { LoadBalancerBilling loadBalancerBilling; if (loadBalancerBillings.containsKey(lbId)) { loadBalancerBilling = loadBalancerBillings.get(lbId); } else { loadBalancerBilling = new LoadBalancerBilling(); loadBalancerBilling.setLoadBalancerId(lbId); loadBalancerBilling.setLoadBalancerName(lbName); loadBalancerBillings.put(lbId, loadBalancerBilling); } return loadBalancerBilling; } public List<AccountUsage> getAccountUsages(Integer accountId, Calendar startTime, Calendar endTime) { Query query; String accountUsageQuery = "select u from AccountUsage u where u.accountId = :accountId and " + " u.startTime >= :startTime and " + " u.startTime <= :endTime " + " and u.needsPushed = 1 " + " order by u.startTime asc"; query = entityManager.createQuery(accountUsageQuery); query.setParameter("accountId", accountId); query.setParameter("startTime", startTime); query.setParameter("endTime", endTime); return query.getResultList(); } public List<AccountUsage> getAllAccountUsagesNeedsPushed(Calendar startTime, Calendar endTime) { Query query; String accountUsageQuery = "select u from AccountUsage u where " + " u.startTime >= :startTime and " + " u.startTime <= :endTime " + " and u.needsPushed = 1 " + " order by u.startTime asc"; query = entityManager.createQuery(accountUsageQuery); query.setParameter("startTime", startTime); query.setParameter("endTime", endTime); return query.getResultList(); } public AccountBilling getAccountBilling(Integer accountId, Calendar startTime, Calendar endTime) throws EntityNotFoundException { AccountBilling accountBilling = new AccountBilling(); accountBilling.setAccountId(accountId); Query query; List<AccountUsage> accountUsageResults; List<Usage> lbUsageResults; String accountUsageQuery = "select u from AccountUsage u where u.accountId = :accountId and " + " u.startTime >= :startTime and " + " u.startTime <= :endTime " + " order by u.startTime asc"; query = entityManager.createQuery(accountUsageQuery); query.setParameter("accountId", accountId); query.setParameter("startTime", startTime); query.setParameter("endTime", endTime); accountUsageResults = query.getResultList(); String lbUsageQuery = "select u from Usage u where u.loadbalancer.accountId = :accountId and " + " u.startTime >= :startTime and " + " u.endTime <= :endTime " + " order by u.loadbalancer.id asc, u.startTime asc"; query = entityManager.createQuery(lbUsageQuery); query.setParameter("accountId", accountId); query.setParameter("startTime", startTime); query.setParameter("endTime", endTime); lbUsageResults = query.getResultList(); accountBilling.setAccountUsageRecords(accountUsageResults); Integer currLbId = null; LoadBalancerBilling loadbalancerBilling = new LoadBalancerBilling(); for (Usage usageRecord : lbUsageResults) { Integer lbId = usageRecord.getLoadbalancer().getId(); String lbName = usageRecord.getLoadbalancer().getName(); if (currLbId == null || !currLbId.equals(lbId)) { loadbalancerBilling = new LoadBalancerBilling(); loadbalancerBilling.setLoadBalancerId(lbId); loadbalancerBilling.setLoadBalancerName(lbName); accountBilling.getLoadBalancerBillings().add(loadbalancerBilling); currLbId = lbId; } loadbalancerBilling.getUsageRecords().add(usageRecord); } return accountBilling; } public AccountUsage getLatestAccountUsage(Integer accountId, Calendar startTime, Calendar endTime) throws EntityNotFoundException { AccountBilling accountBilling = new AccountBilling(); accountBilling.setAccountId(accountId); Query query; List<AccountUsage> accountUsageResults; String accountUsageQuery = "select u from AccountUsage u where u.accountId = :accountId and " + " u.startTime >= :startTime and " + " u.startTime <= :endTime " + " order by u.startTime asc"; query = entityManager.createQuery(accountUsageQuery); query.setParameter("accountId", accountId); query.setParameter("startTime", startTime); query.setParameter("endTime", endTime); accountUsageResults = query.getResultList(); return accountUsageResults.get(0); } public HostUsageRecord getHostUsage(Integer hostId, Calendar startTime, Calendar endTime) throws EntityNotFoundException { Query query; List<Object> hostUsageResults; List<HostUsage> tst = new ArrayList(); HostUsageRecord lst = new HostUsageRecord(); lst.setHostId(hostId); String hostUsageQuery = "select sum(bandwidth_in), sum(bandwidth_out), date(start_time) from lb_usage b, loadbalancer a " + " where a.id = b.loadbalancer_id " + " and a.host_id = :hostId " + " and b.start_time >= :startTime " + " and b.end_time <= :endTime " + " group by date(start_time) desc "; query = entityManager.createNativeQuery(hostUsageQuery); query.setParameter("hostId", hostId); query.setParameter("startTime", startTime); query.setParameter("endTime", endTime); hostUsageResults = query.getResultList(); for (Object r : hostUsageResults) { Object[] row = (Object[]) r; HostUsage lb = new HostUsage(); lb.setBandwidthIn(((BigDecimal) row[0]).longValue()); lb.setBandwidthOut(((BigDecimal) row[1]).longValue()); Date d = (Date) row[2]; Calendar l = Calendar.getInstance(); l.setTime(d); lb.setDay(l); tst.add(lb); } lst.setHostUsages(tst); return lst; } public LoadBalancer setLoadBalancerAttrs(LoadBalancer lbIn) throws EntityNotFoundException { LoadBalancer lbOut = getById(lbIn.getId()); if (lbIn.getAccountId() != null) { lbOut.setAccountId(lbIn.getAccountId()); } if (lbIn.getAlgorithm() != null) { lbOut.setAlgorithm(lbIn.getAlgorithm()); } if (lbIn.getName() != null) { lbOut.setName(lbIn.getName()); } if (lbIn.getStatus() != null) { lbOut.setStatus(lbIn.getStatus()); } if (lbIn.getProtocol() != null) { lbIn.setProtocol(lbIn.getProtocol()); } entityManager.merge(lbOut); return lbOut; } public List<LoadBalancer> getLoadBalancerStatusByTime(int minutesago) { Calendar now = Calendar.getInstance(); Calendar earlier = (Calendar) now.clone(); earlier.add(Calendar.MINUTE, -minutesago); String queryStr = "select lb " + "from LoadBalancer lb where lb.status in ('" + LoadBalancerStatus.PENDING_UPDATE + "', '" + LoadBalancerStatus.BUILD + "')" + " and lb.updated <= :now and lb.updated > :earlier " + "order by lb.updated desc"; Query query = entityManager.createQuery(queryStr); query.setParameter("now", now); query.setParameter("earlier", earlier); List results = query.getResultList(); return results; } public List<LoadBalancer> getChangesSince(Integer accountId, String status, Integer sinceUnixTime, Integer offset, Integer limit) { Calendar now = Calendar.getInstance(); Calendar changesSince = null; Date date = null; LoadBalancerStatus lbStatus = null; if (status != null) { try { lbStatus = LoadBalancerStatus.valueOf(status); } catch (IllegalArgumentException e) { lbStatus = null; } } long unixDate = (long) sinceUnixTime; String unixFormatted = new SimpleDateFormat("dd/MM/yyyy'T'HH:mm:ssZ").format(new Date(unixDate * 1000)); try { DateFormat formatter; formatter = new SimpleDateFormat("dd/MM/yyyy'T'HH:mm:ssZ"); date = formatter.parse(unixFormatted); changesSince = Calendar.getInstance(); changesSince.setTime(date); } catch (ParseException e) { System.out.println("Exception :" + e); } String queryStr = "select lb from LoadBalancer lb where lb.accountId = :accountId" + " and lb.updated > :changesSince order by lb.updated desc"; if (lbStatus != null) { queryStr = "select lb from LoadBalancer lb where lb.accountId = :accountId" + " and lb.updated > :changesSince and status = :status order by lb.updated desc"; } Query query = entityManager.createQuery(queryStr); query.setParameter("accountId", accountId); query.setParameter("changesSince", changesSince); if (lbStatus != null) { query.setParameter("status", lbStatus); } query.setFirstResult(offset).setMaxResults(limit); List results = query.getResultList(); return results; } public List<LoadBalancer> getLoadBalancersStatusAndDate(LoadBalancerStatus error, LoadBalancerStatus build, LoadBalancerStatus pending_update, LoadBalancerStatus pending_delete, Calendar changedSince) throws Exception { CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery<LoadBalancer> criteria = builder.createQuery(LoadBalancer.class); Root<LoadBalancer> lbRoot = criteria.from(LoadBalancer.class); if (changedSince == null) { changedSince = Calendar.getInstance(); } Predicate errorStatus = builder.equal(lbRoot.get(LoadBalancer_.status), error); Predicate buildStatus = builder.equal(lbRoot.get(LoadBalancer_.status), build); Predicate pendingUpdateStatus = builder.equal(lbRoot.get(LoadBalancer_.status), pending_update); Predicate pendingDeleteStatus = builder.equal(lbRoot.get(LoadBalancer_.status), pending_delete); Predicate isBeforeLastUpdated = builder.lessThan(lbRoot.get(LoadBalancer_.updated), changedSince); criteria.select(lbRoot); criteria.where(builder.and(isBeforeLastUpdated, builder.or(errorStatus, buildStatus, pendingUpdateStatus, pendingDeleteStatus))); try { List<LoadBalancer> loadBalancers = entityManager.createQuery(criteria).getResultList(); if (loadBalancers == null) { return new ArrayList<LoadBalancer>(); } return loadBalancers; } catch (Exception e) { LOG.error(e); throw new Exception("debug: getLoadBalancerStatusAndDate in LoadbalancerRepository, somthing went wrong..."); } } public Boolean getConnectionLoggingbyAccountIdLoadBalancerId(int accId, int lbId) throws EntityNotFoundException { String queryStr = "select connectionLogging from LoadBalancer lb where lb.accountId = :accId" + " and lb.id = :lbId"; Query query = entityManager.createQuery(queryStr); query.setParameter("accId", accId); query.setParameter("lbId", lbId); List results = query.getResultList(); if (results.isEmpty()) { throw new EntityNotFoundException("Load balancer not found"); } return (Boolean) results.get(0); } public Boolean getContentCachingByAccountIdLoadBalancerId(int accId, int lbId) throws EntityNotFoundException { String queryStr = "select contentCaching from LoadBalancer lb where lb.accountId = :accId" + " and lb.id = :lbId"; Query query = entityManager.createQuery(queryStr); query.setParameter("accId", accId); query.setParameter("lbId", lbId); List results = query.getResultList(); if (results.isEmpty()) { throw new EntityNotFoundException("Load balancer not found"); } return (Boolean) results.get(0); } public void removeRateLimitByExpiration(int id) { String queryStr = "delete from RateLimit rl where :now >= rl.expirationTime"; entityManager.createQuery("delete from RateLimit rl where rl.id = :id").setParameter("id", id).executeUpdate(); } public List<RateLimit> getRateLimitByExpiration() { Calendar now = Calendar.getInstance(); String queryStr = "select rl from RateLimit rl where rl.expirationTime <= :now"; Query query = entityManager.createQuery(queryStr); query.setParameter("now", now); List results = query.getResultList(); return results; } public void updatePortInJoinTable(LoadBalancer lb) { try { String queryString = "from LoadBalancerJoinVip where loadBalancer.id = :lbId"; Query query = entityManager.createQuery(queryString).setParameter("lbId", lb.getId()); LoadBalancerJoinVip loadBalancerJoinVip = (LoadBalancerJoinVip) query.getSingleResult(); loadBalancerJoinVip.setPort(lb.getPort()); entityManager.merge(loadBalancerJoinVip); } catch (NoResultException nre) { LOG.info(String.format("No ipv4 vips found to update, ignoring...")); } try { String queryString6 = "from LoadBalancerJoinVip6 where loadBalancer.id = :lbId"; Query query6 = entityManager.createQuery(queryString6).setParameter("lbId", lb.getId()); LoadBalancerJoinVip6 loadBalancerJoinVip6 = (LoadBalancerJoinVip6) query6.getSingleResult(); loadBalancerJoinVip6.setPort(lb.getPort()); entityManager.merge(loadBalancerJoinVip6); } catch (NoResultException nre6) { LOG.info(String.format("No ipv6 vips found to update, ignoring...")); } } public boolean canUpdateToNewPort(Integer newPort, LoadBalancer loadBalancer) { Set<VirtualIp> vipsToCheckAgainst = new HashSet<VirtualIp>(); Set<VirtualIpv6> vips6ToCheckAgainst = new HashSet<VirtualIpv6>(); for (LoadBalancerJoinVip loadBalancerJoinVip : loadBalancer.getLoadBalancerJoinVipSet()) { vipsToCheckAgainst.add(loadBalancerJoinVip.getVirtualIp()); } for (LoadBalancerJoinVip6 loadBalancerJoinVip : loadBalancer.getLoadBalancerJoinVip6Set()) { vips6ToCheckAgainst.add(loadBalancerJoinVip.getVirtualIp()); } boolean isValidPort = true; if (!vipsToCheckAgainst.isEmpty()) { String queryString = "select j from LoadBalancerJoinVip j where j.virtualIp in (:vips)"; Query query = entityManager.createQuery(queryString).setParameter("vips", vipsToCheckAgainst); List<LoadBalancerJoinVip> entriesWithPortsToCheckAgainst = query.getResultList(); for (LoadBalancerJoinVip entryWithPortToCheckAgainst : entriesWithPortsToCheckAgainst) { if (entryWithPortToCheckAgainst.getPort().equals(newPort)) { if (!checkLBProtocol(loadBalancer)) { isValidPort = false; } else { if (!verifyProtoGroups(entryWithPortToCheckAgainst.getLoadBalancer(), loadBalancer)) { isValidPort = false; } } } } } if (!vips6ToCheckAgainst.isEmpty()) { String queryString6 = "select j from LoadBalancerJoinVip6 j where j.virtualIp in (:vips)"; Query query6 = entityManager.createQuery(queryString6).setParameter("vips", vips6ToCheckAgainst); List<LoadBalancerJoinVip6> entriesWithPortsToCheckAgainst6 = query6.getResultList(); for (LoadBalancerJoinVip6 entryWithPortToCheckAgainst6 : entriesWithPortsToCheckAgainst6) { if (entryWithPortToCheckAgainst6.getPort().equals(newPort)) { if (!checkLBProtocol(loadBalancer)) { isValidPort = false; } else { if (!verifyProtoGroups(entryWithPortToCheckAgainst6.getLoadBalancer(), loadBalancer)) { isValidPort = false; } } } } } return isValidPort; } public List<Ticket> getTickets(Integer loadBalancerId, Integer... p) { Query query; String qStr = "SELECT lb.tickets FROM LoadBalancer lb WHERE lb.id = :loadBalancerId"; query = entityManager.createQuery(qStr).setParameter("loadBalancerId", loadBalancerId); if (p.length >= 1) { Integer offset = p[0]; Integer limit = p[1]; if (offset == null) { offset = 0; } if (limit == null) { limit = 100; } query = query.setFirstResult(offset).setMaxResults(limit); } return query.getResultList(); } public List<Integer> getAllAccountIds() { Query query = entityManager.createQuery("SELECT distinct l.accountId FROM LoadBalancer l"); return query.getResultList(); } public List<Integer> getAllAccountIdsFromUsage() { Query query = entityManager.createQuery("SELECT distinct l.accountId FROM Usage l"); return query.getResultList(); } public List<Integer> getAllAccountIdsFromAccountUsage() { Query query = entityManager.createQuery("SELECT distinct l.accountId FROM AccountUsage l"); return query.getResultList(); } public List<LoadBalancer> getAllWithNode(String nodeAddress, Integer accountId) { List<Object> retLoadbalancers = entityManager.createQuery("SELECT l FROM LoadBalancer l, Node n WHERE l.id = n.loadbalancer.id AND l.accountId = :accountId AND n.ipAddress = :address AND l.status <> 'DELETED' AND l.status <> 'PENDING_DELETE'").setParameter("accountId", accountId).setParameter("address", nodeAddress).getResultList(); List<LoadBalancer> loadbalancers = new ArrayList<LoadBalancer>(); for (Object o : retLoadbalancers) { loadbalancers.add((LoadBalancer) o); } return loadbalancers; } public List<LoadBalancer> getLoadBalancersActiveInRange(Integer accountId, Calendar startTime, Calendar endTime, Integer offset, Integer limit) { CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery<LoadBalancer> criteria = builder.createQuery(LoadBalancer.class); Root<LoadBalancer> lbRoot = criteria.from(LoadBalancer.class); Predicate hasAccountId = builder.equal(lbRoot.get(LoadBalancer_.accountId), accountId); Predicate createdBetweenDates = builder.between(lbRoot.get(LoadBalancer_.created), startTime, endTime); Predicate updatedBetweenDates = builder.between(lbRoot.get(LoadBalancer_.updated), startTime, endTime); criteria.select(lbRoot); criteria.where(builder.and(hasAccountId, builder.or(createdBetweenDates, updatedBetweenDates))); return entityManager.createQuery(criteria).setFirstResult(offset).setMaxResults(limit + 1).getResultList(); } public Set<LbIdAccountId> getLoadBalancersActiveDuringPeriod(Calendar startTime, Calendar endTime) { Set<LbIdAccountId> lbIds = new HashSet<LbIdAccountId>(); Query query = entityManager.createQuery("SELECT l.id, l.accountId FROM LoadBalancer l where (l.status != 'DELETED' or l.updated >= :startTime) and l.provisioned < :endTime and l.status not in ('BUILD', 'PENDING_DELETE')") .setParameter("startTime", startTime) .setParameter("endTime", endTime); final List<Object[]> resultList = query.getResultList(); for (Object[] row : resultList) { Integer loadBalancerId = (Integer) row[0]; Integer accountId = (Integer) row[1]; LbIdAccountId lbIdAccountId = new LbIdAccountId(loadBalancerId, accountId); lbIds.add(lbIdAccountId); } return lbIds; } public Map<Integer, Integer> getAccountIdMapForUsageRecords(List<Usage> rawLoadBalancerUsageList) { Map<Integer, Integer> map = new HashMap<Integer, Integer>(); Set<Integer> loadBalancerIds = new HashSet<Integer>(); for (Usage usage : rawLoadBalancerUsageList) { loadBalancerIds.add(usage.getLoadbalancer().getId()); } Query query = entityManager.createQuery("SELECT l.accountId, l.id FROM LoadBalancer l where l.id in (:idList)").setParameter("idList", loadBalancerIds); final List<Object[]> resultList = query.getResultList(); for (Object[] row : resultList) { Integer accountId = (Integer) row[0]; Integer loadBalancerId = (Integer) row[1]; map.put(loadBalancerId, accountId); } return map; } public List<LoadBalancer> getLoadBalancersWithStatus(LoadBalancerStatus loadBalancerStatus) { CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery<LoadBalancer> criteria = builder.createQuery(LoadBalancer.class); Root<LoadBalancer> lbRoot = criteria.from(LoadBalancer.class); Predicate hasStatus = builder.equal(lbRoot.get(LoadBalancer_.status), loadBalancerStatus); criteria.select(lbRoot); criteria.where(hasStatus); List<LoadBalancer> loadBalancersWithStatus = entityManager.createQuery(criteria).getResultList(); return (loadBalancersWithStatus == null) ? new ArrayList<LoadBalancer>() : loadBalancersWithStatus; } public UserPages getUserPages(Integer lid, Integer aid) { List<UserPages> userPagesList = new ArrayList<UserPages>(); UserPages up; String qStr = "FROM UserPages u where u.loadbalancer.id = :lid and u.loadbalancer.accountId = :aid"; Query q = entityManager.createQuery(qStr).setParameter("lid", lid).setParameter("aid", aid); userPagesList = q.setMaxResults(1).getResultList(); if (userPagesList.size() <= 0) { up = null; } else { up = userPagesList.get(0); } return up; } public Defaults getDefaultErrorPage() { List<Defaults> defaultsList = new ArrayList<Defaults>(); Defaults up; String qStr = "FROM Defaults d WHERE d.name = :globalError"; Query q = entityManager.createQuery(qStr).setParameter("globalError", Constants.DEFAULT_ERRORFILE); defaultsList = q.setMaxResults(1).getResultList(); if (defaultsList.size() <= 0) { up = null; } else { up = defaultsList.get(0); } return up; } public String getErrorPage(Integer lid, Integer aid) throws EntityNotFoundException { UserPages up; up = getUserPages(lid, aid); if (up == null) { return null; } return up.getErrorpage(); } public boolean setErrorPage(Integer lid, Integer aid, String errorpage) throws EntityNotFoundException { boolean out = false; LoadBalancer lb = getByIdAndAccountId(lid, aid); UserPages up = getUserPages(lid, aid); if (up == null) { up = new UserPages(); up.setLoadbalancer(lb); up.setErrorpage(errorpage); entityManager.merge(up); return true; } else { up.setErrorpage(errorpage); entityManager.merge(up); return false; } } public boolean setDefaultErrorPage(String errorpage) throws EntityNotFoundException { boolean out = false; Defaults up = getDefaultErrorPage(); if (up == null) { up = new Defaults(); up.setName(Constants.DEFAULT_ERRORFILE); up.setValue(errorpage); entityManager.merge(up); return true; } else { up.setValue(errorpage); entityManager.merge(up); return false; } } public boolean removeErrorPage(Integer lid, Integer aid) { UserPages up = getUserPages(lid, aid); if (up == null) { return false; } else if (up.getErrorpage() == null) { return false; } up.setErrorpage(null); entityManager.merge(up); entityManager.remove(up); return true; } public boolean removeSslTermination(Integer lid, Integer aid) { SslTermination up = getSslTermination(lid, aid); if (up == null) { return false; } else { entityManager.remove(up); return true; } } public SslTermination getSslTermination(Integer lid, Integer aid) { SslTermination sslTermination = new SslTermination(); String qStr = "FROM SslTermination u where u.loadbalancer.id = :lid"; Query q = entityManager.createQuery(qStr).setParameter("lid", lid); try { if (!q.getResultList().isEmpty()) { sslTermination = (SslTermination) q.getResultList().get(0); } } catch (IndexOutOfBoundsException iex) { return new SslTermination(); } return sslTermination; } public SslTermination setSslTermination(Integer lid, Integer aid, SslTermination sslTermination) throws EntityNotFoundException { LoadBalancer lb = getByIdAndAccountId(lid, aid); sslTermination.setLoadbalancer(lb); entityManager.merge(sslTermination); entityManager.flush(); return sslTermination; } //TODO: put this somewhre else private boolean checkLBProtocol(LoadBalancer loadBalancer) { return loadBalancer.getProtocol() == LoadBalancerProtocol.TCP || loadBalancer.getProtocol() == LoadBalancerProtocol.DNS_TCP || loadBalancer.getProtocol() == LoadBalancerProtocol.DNS_UDP || loadBalancer.getProtocol() == LoadBalancerProtocol.UDP || loadBalancer.getProtocol() == LoadBalancerProtocol.UDP_STREAM || loadBalancer.getProtocol() == LoadBalancerProtocol.TCP_CLIENT_FIRST; } // // public boolean verifySharedVipProtocols(VirtualIp vip, LoadBalancer loadBalancer) { // return verifySharedVipProtocols(virtualIpRepository.getLoadBalancersByVipId(vip.getId()), loadBalancer); // } // // public boolean verifySharedVip6Protocols(VirtualIpv6 vip6, LoadBalancer loadBalancer) { // return verifySharedVipProtocols(virtualIpv6Repository.getLoadBalancersByVipId(vip6.getId()), loadBalancer); // } // public boolean verifySharedVipProtocols(List<LoadBalancer> sharedLbs, LoadBalancer loadBalancer) { // int invalidProtos = 0; // // for (LoadBalancer lb : sharedLbs) { // if (!checkLBProtocol(lb)) { // invalidProtos++; // } else { // if (!verifyProtoGroups(lb, loadBalancer)) { // invalidProtos++; // } // } // } // return invalidProtos < 1; // } public boolean verifyProtoGroups(LoadBalancer lbToCheck, LoadBalancer lbBeingShared) { if ((lbBeingShared.getProtocol() == DNS_TCP && lbToCheck.getProtocol() == DNS_UDP) || (lbBeingShared.getProtocol() == DNS_UDP && lbToCheck.getProtocol() == DNS_TCP)) { return true; } else if (lbBeingShared.getProtocol() == UDP_STREAM && (lbToCheck.getProtocol() == LoadBalancerProtocol.TCP || lbToCheck.getProtocol() == LoadBalancerProtocol.TCP_CLIENT_FIRST)) { return true; } else if (lbBeingShared.getProtocol() == LoadBalancerProtocol.UDP && (lbToCheck.getProtocol() == LoadBalancerProtocol.TCP || lbToCheck.getProtocol() == LoadBalancerProtocol.TCP_CLIENT_FIRST)) { return true; } else if (lbToCheck.getProtocol() == UDP_STREAM && (lbBeingShared.getProtocol() == LoadBalancerProtocol.TCP || lbBeingShared.getProtocol() == LoadBalancerProtocol.TCP_CLIENT_FIRST)) { return true; } else if (lbToCheck.getProtocol() == LoadBalancerProtocol.UDP && (lbBeingShared.getProtocol() == LoadBalancerProtocol.TCP || lbBeingShared.getProtocol() == LoadBalancerProtocol.TCP_CLIENT_FIRST)) { return true; } return false; } }