/**
* Copyright (C) 2008 - Abiquo Holdings S.L. All rights reserved.
*
* Please see /opt/abiquo/tomcat/webapps/legal/ on Abiquo server
* or contact contact@abiquo.com for licensing information.
*/
package com.abiquo.server.core.infrastructure.network;
import java.util.List;
import javax.persistence.EntityManager;
import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;
import com.abiquo.model.enumerator.NetworkType;
import com.abiquo.server.core.cloud.VirtualDatacenter;
import com.abiquo.server.core.common.persistence.DefaultDAOBase;
import com.abiquo.server.core.enterprise.Enterprise;
import com.abiquo.server.core.infrastructure.Datacenter;
import com.abiquo.server.core.infrastructure.Rack;
import com.softwarementors.bzngine.entities.PersistentEntity;
@Repository
public class VLANNetworkDAO extends DefaultDAOBase<Integer, VLANNetwork>
{
private static Criterion sameNetwork(final Network network)
{
return Restrictions.eq(VLANNetwork.NETWORK_PROPERTY, network);
}
private static Criterion sameID(final Integer vlanId)
{
return Restrictions.eq(PersistentEntity.ID_PROPERTY, vlanId);
}
private static Criterion sameNetwork(final VirtualDatacenter virtualDatacenter)
{
return sameNetwork(virtualDatacenter.getNetwork());
}
private final String FIND_BY_DATACENTER =
" Select vlan "
+ "FROM com.abiquo.server.core.infrastructure.network.VLANNetwork vlan, "
+ "com.abiquo.server.core.cloud.VirtualDatacenter vdc "
+ "INNER JOIN vdc.network net WHERE vdc.datacenter.id = :datacenterId and vlan.network.id = net.id";
private final String FIND_BY_ENTERPRISE = " SELECT vlan "//
+ "FROM com.abiquo.server.core.infrastructure.network.VLANNetwork vlan, "//
+ "com.abiquo.server.core.cloud.VirtualDatacenter vdc "//
+ "WHERE vlan.network.id = vdc.network.id "//
+ "and vdc.enterprise.id = :enterpriseId";
private final String GET_VLAN_DATACENTER =
"SELECT dc " //
+ "FROM com.abiquo.server.core.infrastructure.Datacenter dc " //
+ "inner join dc.network net, com.abiquo.server.core.infrastructure.network.VLANNetwork vlan " //
+ "WHERE net.id = vlan.network.id AND vlan.id = :id";
private final String GET_PUBLIC_VLANS_VIRTUALDATACENTER = "SELECT vlan "
+ "FROM com.abiquo.server.core.infrastructure.network.VLANNetwork vlan, "
+ " com.abiquo.server.core.cloud.VirtualDatacenter vdc, "
+ " com.abiquo.server.core.infrastructure.Datacenter dc "
+ "WHERE vlan.type = 'PUBLIC' and vlan.network.id = dc.network.id "
+ "AND vdc.datacenter.id = dc.id " + "AND vdc.id = :vdcId ";
private final String GET_PUBLIC_VLAN_VIRTUALDATACENTER = "SELECT vlan "
+ "FROM com.abiquo.server.core.infrastructure.network.VLANNetwork vlan, "
+ " com.abiquo.server.core.cloud.VirtualDatacenter vdc, "
+ " com.abiquo.server.core.infrastructure.Datacenter dc "
+ "WHERE vlan.type = 'PUBLIC' and vlan.network.id = dc.network.id "
+ "AND vdc.datacenter.id = dc.id AND vdc.id = :vdcId AND vlan.id = :vlanId";
public VLANNetworkDAO()
{
super(VLANNetwork.class);
}
public VLANNetworkDAO(final EntityManager em)
{
super(VLANNetwork.class, em);
}
public boolean existsAnyWithName(final Network network, final String name)
{
assert !StringUtils.isEmpty(name);
return existsAnyByCriterions(sameNetwork(network), nameEqual(name));
}
public List<VLANNetwork> findByEnterprise(final int enterpriseId)
{
Query query = getSession().createQuery(FIND_BY_ENTERPRISE);
query.setParameter("enterpriseId", enterpriseId);
return query.list();
}
public VLANNetwork findExternalVlanByEnterprise(final Enterprise ent, final Integer vlanId)
{
return findUniqueByCriterions(Restrictions.eq(VLANNetwork.ENTERPRISE_PROPERTY, ent),
Restrictions.eq(PersistentEntity.ID_PROPERTY, vlanId));
}
public VLANNetwork findExternalVlanByEnterpriseInDatacenter(final Enterprise ent,
final Datacenter datacenter, final Integer vlanId)
{
Criteria criteria = getSession().createCriteria(VLANNetwork.class);
criteria.add(Restrictions.eq(VLANNetwork.ENTERPRISE_PROPERTY, ent));
criteria.add(sameNetwork(datacenter.getNetwork()));
criteria.add(Restrictions.eq(PersistentEntity.ID_PROPERTY, vlanId));
return (VLANNetwork) criteria.uniqueResult();
}
public List<VLANNetwork> findExternalVlansByEnterprise(final Enterprise ent)
{
return findByCriterions(Restrictions.eq(VLANNetwork.ENTERPRISE_PROPERTY, ent));
}
public List<VLANNetwork> findExternalVlansByEnterpriseInDatacenter(final Enterprise ent,
final Datacenter datacenter)
{
return findByCriterions(Restrictions.eq(VLANNetwork.ENTERPRISE_PROPERTY, ent),
sameNetwork(datacenter.getNetwork()));
}
public List<VLANNetwork> findPrivateVLANNetworksByDatacenter(final Datacenter datacenter)
{
Query query = getSession().createQuery(FIND_BY_DATACENTER);
query.setParameter("datacenterId", datacenter.getId());
return query.list();
}
public VLANNetwork findPublicVlanByDatacenter(final Datacenter dc, final Integer vlanId)
{
return findUniqueByCriterions(sameNetwork(dc.getNetwork()),
Restrictions.eq(PersistentEntity.ID_PROPERTY, vlanId));
}
public VLANNetwork findVlanById(final Integer vlanId)
{
Criteria criteria = createCriteria(sameID(vlanId));
return (VLANNetwork) criteria.uniqueResult();
}
public List<VLANNetwork> findPublicVLANNetworksByDatacenter(final Datacenter datacenter,
final NetworkType netType)
{
Criterion inNetwork =
Restrictions.eq(VLANNetwork.NETWORK_PROPERTY, datacenter.getNetwork());
Criteria criteria = getSession().createCriteria(VLANNetwork.class).add(inNetwork);
if (netType != null)
{
if (netType.equals(NetworkType.PUBLIC))
{
criteria.add(Restrictions.eq(VLANNetwork.TYPE_PROPERTY, NetworkType.PUBLIC));
// criteria.add(Restrictions.isNull(VLANNetwork.ENTERPRISE_PROPERTY));
}
else if (netType.equals(NetworkType.EXTERNAL_UNMANAGED))
{
criteria.add(Restrictions.or(
Restrictions.eq(VLANNetwork.TYPE_PROPERTY, NetworkType.EXTERNAL),
Restrictions.eq(VLANNetwork.TYPE_PROPERTY, NetworkType.UNMANAGED)));
// criteria.add(Restrictions.isNotNull(VLANNetwork.ENTERPRISE_PROPERTY));
}
else if (netType.equals(NetworkType.EXTERNAL))
{
criteria.add(Restrictions.eq(VLANNetwork.TYPE_PROPERTY, NetworkType.EXTERNAL));
// criteria.add(Restrictions.isNotNull(VLANNetwork.ENTERPRISE_PROPERTY));
}
else if (netType.equals(NetworkType.UNMANAGED))
{
criteria.add(Restrictions.eq(VLANNetwork.TYPE_PROPERTY, NetworkType.UNMANAGED));
}
else if (netType.equals(NetworkType.INTERNAL))
{
criteria.add(Restrictions.eq(VLANNetwork.TYPE_PROPERTY, NetworkType.INTERNAL));
// criteria.add(Restrictions.isNotNull(VLANNetwork.ENTERPRISE_PROPERTY));
}
}
return criteria.list();
}
public List<VLANNetwork> findVLANNetworksByDatacenterAndEnterprise(final Datacenter datacenter,
final Enterprise enterprise)
{
Criterion inNetwork =
Restrictions.eq(VLANNetwork.NETWORK_PROPERTY, datacenter.getNetwork());
Criteria criteria = getSession().createCriteria(VLANNetwork.class).add(inNetwork);
criteria.add(Restrictions.or(
Restrictions.eq(VLANNetwork.TYPE_PROPERTY, NetworkType.EXTERNAL),
Restrictions.eq(VLANNetwork.TYPE_PROPERTY, NetworkType.UNMANAGED)));
criteria.add(Restrictions.eq(VLANNetwork.ENTERPRISE_PROPERTY, enterprise));
return criteria.list();
}
public VLANNetwork findVlanByNameInNetwork(final Network network, final String name)
{
return findUniqueByCriterions(sameNetwork(network),
Restrictions.eq(VLANNetwork.NAME_PROPERTY, name));
}
public VLANNetwork findVlanByVirtualDatacenterId(final VirtualDatacenter virtualDatacenter,
final Integer vlanId)
{
Criteria criteria = getSession().createCriteria(VLANNetwork.class);
criteria.add(Restrictions.eq(VLANNetwork.NETWORK_PROPERTY, virtualDatacenter.getNetwork()));
criteria.add(Restrictions.eq(PersistentEntity.ID_PROPERTY, vlanId));
return (VLANNetwork) criteria.uniqueResult();
}
public List<VLANNetwork> findVlanNetworks(final VirtualDatacenter virtualDatacenter)
{
assert virtualDatacenter != null;
Criteria criteria = createCriteria(sameNetwork(virtualDatacenter));
criteria.addOrder(Order.asc(VLANNetwork.NAME_PROPERTY));
List<VLANNetwork> result = getResultList(criteria);
return result;
}
public List<VLANNetwork> findVlanNetworksByNetworkServiceTypes(final NetworkServiceType nst)
{
Criteria criteria = getSession().createCriteria(VLANNetwork.class);
criteria.add(Restrictions.eq(VLANNetwork.NETWORK_SERVICE_TYPE_PROPERTY, nst));
return criteria.list();
}
public List<Integer> getVLANTagsUsedInRack(final Rack rack)
{
String idRack = String.valueOf(rack.getId());
Query query = getSession().createQuery("SELECT vn.tag FROM " //
+ "com.abiquo.server.core.infrastructure.network.VLANNetwork vn, " //
+ "com.abiquo.server.core.infrastructure.network.NetworkAssignment vna " //
+ "WHERE vn.id = vna.vlanNetwork.id " + //
"AND vna.rack.id = " + idRack + " AND vn.tag IS NOT NULL");
// FIXME
// Query query = getSession().createQuery(VLAN_ID_TAG_USED);
// query.setInteger("idRack", rack.getId());
return query.list();
}
public boolean isPublic(final VLANNetwork vlan)
{
Query query = getSession().createQuery(GET_VLAN_DATACENTER);
query.setParameter("id", vlan.getId());
return query.uniqueResult() != null;
}
private Criterion nameEqual(final String name)
{
assert name != null;
return Restrictions.eq(VLANNetwork.NAME_PROPERTY, name);
}
public List<VLANNetwork> getPublicVLANsByVirtualDatacenter(final Integer vdcId)
{
Query query = getSession().createQuery(GET_PUBLIC_VLANS_VIRTUALDATACENTER);
query.setParameter("vdcId", vdcId);
return query.list();
}
public VLANNetwork getPublicVLANByVirtualDatacenter(final VirtualDatacenter vdc,
final Integer vlanId)
{
Query query = getSession().createQuery(GET_PUBLIC_VLAN_VIRTUALDATACENTER);
query.setParameter("vdcId", vdc.getId());
query.setParameter("vlanId", vlanId);
return (VLANNetwork) query.uniqueResult();
}
}