/**
* 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.appslibrary;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.persistence.EntityManager;
import org.hibernate.Criteria;
import org.hibernate.NonUniqueObjectException;
import org.hibernate.Query;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;
import com.abiquo.model.enumerator.DiskFormatType;
import com.abiquo.model.enumerator.HypervisorType;
import com.abiquo.server.core.cloud.Hypervisor;
import com.abiquo.server.core.cloud.NodeVirtualImage;
import com.abiquo.server.core.common.persistence.DefaultDAOBase;
@Repository("jpaVirtualImageConversionDAO")
public class VirtualImageConversionDAO extends DefaultDAOBase<Integer, VirtualImageConversion>
{
public VirtualImageConversionDAO()
{
super(VirtualImageConversion.class);
}
public VirtualImageConversionDAO(final EntityManager entityManager)
{
super(VirtualImageConversion.class, entityManager);
}
private static Criterion sameImage(final VirtualMachineTemplate image)
{
return Restrictions.eq(VirtualImageConversion.VIRTUAL_MACHINE_TEMPLATE_PROPERTY, image);
}
private static Criterion sameImage(final VirtualImageConversion conversion)
{
return Restrictions.eq(VirtualImageConversion.VIRTUAL_MACHINE_TEMPLATE_PROPERTY,
conversion.getVirtualMachineTemplate());
}
private static Criterion sameSourceFormat(final VirtualImageConversion image)
{
return Restrictions.eq(VirtualImageConversion.SOURCE_TYPE_PROPERTY, image.getSourceType());
}
private static Criterion sameTargetFormat(final VirtualImageConversion image)
{
return Restrictions.eq(VirtualImageConversion.TARGET_TYPE_PROPERTY, image.getTargetType());
}
private static Criterion targetFormatIn(final Collection<DiskFormatType> formats)
{
return Restrictions.in(VirtualImageConversion.TARGET_TYPE_PROPERTY, formats);
}
private static Criterion targetFormatIn(final DiskFormatType format)
{
return Restrictions.in(VirtualImageConversion.TARGET_TYPE_PROPERTY,
Collections.singletonList(format));
}
private static Criterion sourceFormatNull()
{
return Restrictions.isNull(VirtualImageConversion.SOURCE_TYPE_PROPERTY);
}
/**
* Get all the provided hypervisor compatible {@link VirtualImageConversion} for a given
* {@link HypervisorType}
* <p>
* Before calling this method assure the virtualImage format IS NOT the hypervisorType base
* format or compatible (conversion not needed). @see
* {@link VirtualMachineServicePremium#shouldFindConversion}
*
* @return the list of all compatible {@link VirtualImageConversion} in <b>ANY state</b>.
* {@link VirtualMachineServicePremium#selectConversion} will check the state and pick
* the most suitable format.
*/
@SuppressWarnings("unchecked")
public List<VirtualImageConversion> compatilbeConversions(
final VirtualMachineTemplate virtualImage, final HypervisorType hypervisorType)
{
final Criterion compat =
Restrictions.and(sameImage(virtualImage),
targetFormatIn(hypervisorType.compatibleFormats));
return createCriteria(compat).list();
}
/**
* Returns a list of {@link HypervisorType} from all hypervisors in a datacenter.
*/
private final String QUERY_IMAGE_CONVERTED = "SELECT count(vic) " + //
"FROM com.abiquo.server.core.appslibrary.VirtualImageConversion vic " + //
"WHERE vic.virtualImage.id = :idVirtualImage";
/**
* List of {@link HypervisorType} from all hypervisors in a datacenter.
*
* @param datacenterId {@link Hypervisor} machines datacenter.
* @return list of {@link HypervisorType} from all hypervisors in a datacenter.
*/
public boolean isVirtualImageConverted(final Integer vImageId, final DiskFormatType format)
{
Query query = getSession().createQuery(QUERY_IMAGE_CONVERTED);
query.setParameter("idVirtualImage", vImageId);
return (Long) query.uniqueResult() > 0;
}
@Deprecated
// use selectConversion TODO delthis
@SuppressWarnings("unchecked")
public VirtualImageConversion getUnbundledConversion(final VirtualMachineTemplate image,
final DiskFormatType format)
{
// There can be no images
List<VirtualImageConversion> conversions =
createCriteria(sameImage(image)).add(targetFormatIn(format)).add(sourceFormatNull())
.list();
// Are there any?
if (conversions != null && !conversions.isEmpty())
{
// This function should be returning the only object
if (conversions.size() > 1)
{
throw new NonUniqueObjectException("There is more than one conversion!",
image.getId(),
VirtualImageConversion.class.getSimpleName());
}
return conversions.get(0);
}
return null;
}
public boolean isConverted(final VirtualMachineTemplate image, final DiskFormatType targetType)
{
final Criterion compat = Restrictions.and(sameImage(image), targetFormatIn(targetType));
return !createCriteria(compat).list().isEmpty();
}
public Collection<VirtualImageConversion> findByVirtualImage(
final VirtualMachineTemplate virtualImage)
{
final Criteria criteria = createCriteria().add(sameImage(virtualImage));
return criteria.list();
}
private final String VIRTUALIMAGECONVERSION_BY_NODEVIRTUALIMAGE = "SELECT "
+ "vic FROM com.abiquo.server.core.appslibrary.VirtualImageConversion vic, "
+ "com.abiquo.server.core.cloud.NodeVirtualImage nvi "
+ "WHERE nvi.id = :idVirtualImageConversion AND nvi.virtualImage.id = vic.virtualImage.id";
public Collection<VirtualImageConversion> findByVirtualImageConversionByNodeVirtualImage(
final NodeVirtualImage nodeVirtualImage)
{
Query query = getSession().createQuery(VIRTUALIMAGECONVERSION_BY_NODEVIRTUALIMAGE);
query.setParameter("idVirtualImageConversion", nodeVirtualImage.getId());
return query.list();
}
private final String DATACENTERUUID_BY_VIRTUALIMAGECONVERSION =
"select distinct(dc.uuid) from virtualimage_conversions vic left outer join virtualimage vi on vic.idImage = vi.idImage left outer join repository rep on vi.idRepository = rep.idRepository left outer join datacenter dc on rep.idDataCenter = dc.idDatacenter where vic.id = :idVirtualImageConversion";
public String getDatacenterUUIDByVirtualImageConversionID(final Integer idVirtualImageConversion)
{
Query query = getSession().createSQLQuery(DATACENTERUUID_BY_VIRTUALIMAGECONVERSION);
query.setParameter("idVirtualImageConversion", idVirtualImageConversion);
return (String) query.uniqueResult();
}
public boolean existDuplicatedConversion(final VirtualImageConversion conversion)
{
Criterion cri = Restrictions.and(sameImage(conversion), sameSourceFormat(conversion));
cri = Restrictions.and(cri, sameTargetFormat(conversion));
return existsAnyByCriterions(cri);
}
}