/**
* Abiquo community edition
* cloud management application for hybrid clouds
* Copyright (C) 2008-2010 - Abiquo Holdings S.L.
*
* This application is free software; you can redistribute it and/or
* modify it under the terms of the GNU LESSER GENERAL PUBLIC
* LICENSE as published by the Free Software Foundation under
* version 3 of the License
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* LESSER GENERAL PUBLIC LICENSE v.3 for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
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 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";
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)
{
return findUniqueByCriterions(Restrictions.eq(VLANNetwork.ENTERPRISE_PROPERTY, ent),
sameNetwork(datacenter.getNetwork()),
Restrictions.eq(PersistentEntity.ID_PROPERTY, vlanId));
}
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 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 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)
{
return findUniqueByCriterions(
Restrictions.eq(VLANNetwork.NETWORK_PROPERTY, virtualDatacenter.getNetwork()),
Restrictions.eq(PersistentEntity.ID_PROPERTY, vlanId));
}
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<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);
}
}