package org.openstack.atlas.service.domain.repository;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openstack.atlas.service.domain.entities.*;
import org.openstack.atlas.service.domain.exceptions.EntityNotFoundException;
import org.openstack.atlas.service.domain.util.Constants;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.*;
@Repository
@Transactional
public class LoadbalancerMetadataRepository {
final Log LOG = LogFactory.getLog(LoadbalancerMetadataRepository.class);
@PersistenceContext(unitName = "loadbalancing")
private EntityManager entityManager;
public Set<LoadbalancerMeta> addLoadbalancerMetas(LoadBalancer loadBalancer, Collection<LoadbalancerMeta> loadbalancerMetas) {
Set<LoadbalancerMeta> newLoadbalancerMetas = new HashSet<LoadbalancerMeta>();
for (LoadbalancerMeta loadbalancerMeta : loadbalancerMetas) {
loadbalancerMeta.setLoadbalancer(loadBalancer);
newLoadbalancerMetas.add(entityManager.merge(loadbalancerMeta));
}
loadBalancer.setUpdated(Calendar.getInstance());
loadBalancer = entityManager.merge(loadBalancer);
entityManager.flush();
return newLoadbalancerMetas;
}
public List<LoadbalancerMeta> getLoadbalancerMetadataByAccountIdLoadBalancerId(Integer accountId, Integer loadBalancerId) {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<LoadbalancerMeta> criteria = builder.createQuery(LoadbalancerMeta.class);
Root<LoadbalancerMeta> metaRoot = criteria.from(LoadbalancerMeta.class);
LoadBalancer lb = new LoadBalancer();
lb.setId(loadBalancerId);
lb.setAccountId(accountId);
Predicate belongsToLoadBalancer = builder.equal(metaRoot.get(LoadbalancerMeta_.loadbalancer), lb);
criteria.select(metaRoot);
criteria.where(belongsToLoadBalancer);
return entityManager.createQuery(criteria).getResultList();
}
public LoadbalancerMeta getLoadbalancerMeta(Integer accountId, Integer loadBalancerId, Integer id) throws EntityNotFoundException {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<LoadbalancerMeta> criteria = builder.createQuery(LoadbalancerMeta.class);
Root<LoadbalancerMeta> metaRoot = criteria.from(LoadbalancerMeta.class);
LoadBalancer lb = new LoadBalancer();
lb.setId(loadBalancerId);
lb.setAccountId(accountId);
Predicate belongsToLoadBalancer = builder.equal(metaRoot.get(LoadbalancerMeta_.loadbalancer), lb);
Predicate hasId = builder.equal(metaRoot.get(LoadbalancerMeta_.id), id);
criteria.select(metaRoot);
criteria.where(builder.and(belongsToLoadBalancer, hasId));
final List<LoadbalancerMeta> resultList = entityManager.createQuery(criteria).getResultList();
if (resultList.isEmpty()) {
String message = Constants.MetaNotFound;
LOG.warn(message);
throw new EntityNotFoundException(message);
}
return resultList.get(0);
}
public void deleteLoadbalancerMeta(LoadBalancer loadBalancer, Integer id) throws EntityNotFoundException {
Set<LoadbalancerMeta> dbMetadata = new HashSet<LoadbalancerMeta>(loadBalancer.getLoadbalancerMetadata());
Boolean removed = false;
for (LoadbalancerMeta loadbalancerMeta : dbMetadata) {
Integer metaId = loadbalancerMeta.getId();
if (metaId.equals(id)) {
loadBalancer.getLoadbalancerMetadata().remove(loadbalancerMeta);
removed = true;
}
}
if (!removed) {
String message = Constants.MetaNotFound;
LOG.warn(message);
throw new EntityNotFoundException(message);
}
loadBalancer.setUpdated(Calendar.getInstance());
loadBalancer = entityManager.merge(loadBalancer);
entityManager.flush();
}
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 deleteLoadbalancerMetadata(LoadBalancer lb, Collection<Integer> ids) {
Set<LoadbalancerMeta> metasCurrentlyOnLb = new HashSet<LoadbalancerMeta>(lb.getLoadbalancerMetadata());
for (LoadbalancerMeta loadbalancerMetaCurrentlyOnLb : metasCurrentlyOnLb) {
for (Integer idOfMetaToDelete : ids) {
if (loadbalancerMetaCurrentlyOnLb.getId().equals(idOfMetaToDelete)) {
lb.getLoadbalancerMetadata().remove(loadbalancerMetaCurrentlyOnLb);
}
}
}
lb.setUpdated(Calendar.getInstance());
lb = entityManager.merge(lb);
entityManager.flush();
return lb;
}
}