Package com.abiquo.server.core.cloud

Source Code of com.abiquo.server.core.cloud.VirtualDatacenterDAO

/**
* 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.cloud;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import javax.persistence.EntityManager;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Transformer;
import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import com.abiquo.server.core.cloud.VirtualDatacenter.OrderByEnum;
import com.abiquo.server.core.common.DefaultEntityCurrentUsed;
import com.abiquo.server.core.common.persistence.DefaultDAOBase;
import com.abiquo.server.core.enterprise.Enterprise;
import com.abiquo.server.core.enterprise.User;
import com.abiquo.server.core.infrastructure.Datacenter;
import com.abiquo.server.core.infrastructure.network.VLANNetwork;
import com.abiquo.server.core.util.FilterOptions;
import com.abiquo.server.core.util.PagedList;
import com.softwarementors.bzngine.entities.PersistentEntity;

@Repository("jpaVirtualDatacenterDAO")
@SuppressWarnings("unchecked")
public class VirtualDatacenterDAO extends DefaultDAOBase<Integer, VirtualDatacenter>
{
    public VirtualDatacenterDAO()
    {
        super(VirtualDatacenter.class);
    }

    public VirtualDatacenterDAO(final EntityManager entityManager)
    {
        super(VirtualDatacenter.class, entityManager);
    }

    private static Criterion sameEnterprise(final Enterprise enterprise)
    {
        return Restrictions.eq(VirtualDatacenter.ENTERPRISE_PROPERTY, enterprise);
    }

    private static Criterion sameDatacenter(final Datacenter datacenter)
    {
        return Restrictions.eq(VirtualDatacenter.DATACENTER_PROPERTY, datacenter);
    }

    private static Criterion availableToUser(final User user)
    {
        Collection<String> idsStrings =
            Arrays.asList(user.getAvailableVirtualDatacenters().split(","));

        Collection<Integer> ids = CollectionUtils.collect(idsStrings, new Transformer()
        {
            @Override
            public Object transform(final Object input)
            {
                return Integer.valueOf(input.toString());
            }
        });

        return Restrictions.in(PersistentEntity.ID_PROPERTY, ids);
    }

    public Collection<VirtualDatacenter> findByEnterpriseAndDatacenter(final Enterprise enterprise,
        final Datacenter datacenter, final User user, final Integer startwith, final Integer limit,
        final String filter, final OrderByEnum orderByEnum, final Boolean asc)
    {
        Collection<Criterion> restrictions = new ArrayList<Criterion>();
        if (enterprise != null)
        {
            restrictions.add(sameEnterprise(enterprise));
        }
        if (datacenter != null)
        {
            restrictions.add(sameDatacenter(datacenter));
        }
        if (user != null)
        {
            restrictions.add(availableToUser(user));
        }

        return findVirtualDatacentersByCriterions(restrictions, null);
    }

    public Collection<VirtualDatacenter> findByDatacenter(final Datacenter datacenter,
        final Integer startwith, final Integer limit, final String filter,
        final OrderByEnum orderByEnum, final Boolean asc)
    {
        Collection<Criterion> restrictions = new ArrayList<Criterion>();
        if (datacenter != null)
        {
            restrictions.add(sameDatacenter(datacenter));
        }

        return findVirtualDatacentersByCriterions(restrictions, null);
    }

    public Collection<VirtualDatacenter> findByEnterpriseAndDatacenter(final Enterprise enterprise,
        final Datacenter datacenter, final Integer startwith, final Integer limit,
        final String filter, final OrderByEnum orderByEnum, final Boolean asc)
    {
        return findByEnterpriseAndDatacenter(enterprise, datacenter, null, startwith, limit,
            filter, orderByEnum, asc);
    }

    public Collection<VirtualDatacenter> findByEnterpriseAndDatacenterFilter(
        final Enterprise enterprise, final Datacenter datacenter, final FilterOptions filterOptions)
    {
        return findByEnterpriseAndDatacenterFilter(enterprise, datacenter, null, filterOptions);
    }

    public Collection<VirtualDatacenter> findByEnterpriseAndDatacenterFilter(
        final Enterprise enterprise, final Datacenter datacenter, final User user,
        final FilterOptions filterOptions)
    {
        Collection<Criterion> restrictions = new ArrayList<Criterion>();
        if (enterprise != null)
        {
            restrictions.add(sameEnterprise(enterprise));
        }
        if (datacenter != null)
        {
            restrictions.add(sameDatacenter(datacenter));
        }
        if (user != null)
        {
            restrictions.add(availableToUser(user));
        }

        if (filterOptions != null)
        {
            restrictions.add(Restrictions.like(VirtualDatacenter.NAME_PROPERTY,
                filterOptions.getFilter(), MatchMode.ANYWHERE));
        }

        return findVirtualDatacentersByCriterions(restrictions, filterOptions);
    }

    private Collection<VirtualDatacenter> findVirtualDatacentersByCriterions(
        final Collection<Criterion> criterions, final FilterOptions filterOptions)
    {
        Criteria criteria = getSession().createCriteria(VirtualDatacenter.class);

        for (Criterion criterion : criterions)
        {
            criteria.add(criterion);
        }

        criteria.addOrder(Order.asc(VirtualDatacenter.NAME_PROPERTY));

        if (filterOptions != null)
        {
            Integer size = count(criteria).intValue();

            // Recreate the criteria
            criteria = getSession().createCriteria(VirtualDatacenter.class);
            for (Criterion criterion : criterions)
            {
                criteria.add(criterion);
            }
            criteria.addOrder(Order.asc(VirtualDatacenter.NAME_PROPERTY));

            criteria.setFirstResult(filterOptions.getStartwith());
            criteria.setMaxResults(filterOptions.getLimit());

            PagedList<VirtualDatacenter> vdcList =
                new PagedList<VirtualDatacenter>(criteria.list());
            vdcList.setTotalResults(size);
            vdcList.setPageSize(filterOptions.getLimit() > size ? size : filterOptions.getLimit());
            vdcList.setCurrentElement(filterOptions.getStartwith());

            return vdcList;
        }
        else
        {
            return getResultList(criteria);
        }
    }

    private Criteria createCriteria(final Collection<Criterion> criterions, final String filter,
        final OrderByEnum orderByEnum, final boolean asc)
    {
        Criteria criteria = getSession().createCriteria(VirtualDatacenter.class);

        for (Criterion criterion : criterions)
        {
            criteria.add(criterion);
        }

        if (!StringUtils.isEmpty(filter))
        {
            criteria.add(filterBy(filter));
        }

        if (!StringUtils.isEmpty(orderByEnum.getColumnSQL()))
        {
            Order order = Order.desc(orderByEnum.getColumnSQL());
            if (asc)
            {
                order = Order.asc(orderByEnum.getColumnSQL());
            }
            criteria.addOrder(order);
        }
        return criteria;
    }

    private Criterion filterBy(final String filter)
    {
        Disjunction filterDisjunction = Restrictions.disjunction();

        filterDisjunction.add(Restrictions
            .like(VirtualDatacenter.NAME_PROPERTY, '%' + filter + '%'));

        return filterDisjunction;
    }

    public Collection<VirtualDatacenter> findByEnterprise(final Enterprise enterprise)
    {
        assert enterprise != null;
        assert isManaged2(enterprise);

        Criteria criteria = createCriteria(sameEnterprise(enterprise));
        criteria.addOrder(Order.asc(VirtualDatacenter.NAME_PROPERTY));
        List<VirtualDatacenter> result = getResultList(criteria);
        return result;
    }

    private static final String SUM_VM_RESOURCES =
        "select sum(vm.cpu), sum(vm.ram), sum(vm.hd) from virtualmachine vm, nodevirtualimage vi, node n, virtualapp a "
            + "where vi.idVM = vm.idVM and vi.idNode = n.idNode and n.idVirtualApp = a.idVirtualApp "
            + "and a.idVirtualDataCenter = :virtualDatacenterId and vm.state != 'NOT_ALLOCATED' and vm.idHypervisor is not null";

    // +
    // "and hy.id = vm.idHypervisor and pm.idPhysicalMachine = hy.idPhysicalMachine and pm.idState != 7";
    // // not HA_DISABLED

    private static final String SUM_VOLUMES_RESOURCES =
        "select sum(r.limitResource) from rasd r, rasd_management rm where r.instanceID = rm.idResource "
            + "and rm.idResourceType = '8' and rm.idVirtualDatacenter = :virtualDatacenterId";

    private static final String SUM_EXTRA_HD_RESOURCES =
        "select sum(r.limitResource) from rasd r, rasd_management rm, virtualmachine vm where r.instanceID = rm.idResource "
            + "and rm.idResourceType = '17' and rm.idVirtualDatacenter = :virtualDatacenterId "
            + "and  rm.idVM = vm.idVM and vm.state != 'NOT_ALLOCATED' and vm.idHypervisor is not null";

    private static final String COUNT_PUBLIC_IP_RESOURCES =
        "select count(*) from ip_pool_management ipm, rasd_management rm, vlan_network vn, virtualdatacenter vdc "
            + " where ipm.vlan_network_id = vn.vlan_network_id "
            + " and rm.idManagement = ipm.idManagement "
            + " and rm.idVirtualDataCenter = vdc.idVirtualDataCenter "
            + " and vdc.idVirtualDataCenter = :virtualDatacenterId "
            + " and vn.networktype = 'PUBLIC' ";

    private static final String COUNT_PRIVATE_VLANS_RESOURCES = " 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.id = :virtualDatacenterId";

    private static final String GET_VDC_FROM_DEFAULT_VLAN = " SELECT vdc "//
        + "FROM VirtualDatacenter vdc "//
        + "WHERE vdc.defaultVlan.id = :vlanId "//
        + "and vdc.defaultVlan.type = 'EXTERNAL'";

    public DefaultEntityCurrentUsed getCurrentResourcesAllocated(final int virtualDatacenterId)
    {
        Object[] vmResources =
            (Object[]) getSession().createSQLQuery(SUM_VM_RESOURCES)
                .setParameter("virtualDatacenterId", virtualDatacenterId).uniqueResult();

        Long cpu = vmResources[0] == null ? 0 : ((BigDecimal) vmResources[0]).longValue();
        Long ram = vmResources[1] == null ? 0 : ((BigDecimal) vmResources[1]).longValue();
        Long hd = vmResources[2] == null ? 0 : ((BigDecimal) vmResources[2]).longValue();

        BigDecimal extraHd =
            (BigDecimal) getSession().createSQLQuery(SUM_EXTRA_HD_RESOURCES)
                .setParameter("virtualDatacenterId", virtualDatacenterId).uniqueResult();
        Long hdTot = extraHd == null ? hd : hd + extraHd.longValue() * 1024 * 1024;

        BigDecimal storage =
            (BigDecimal) getSession().createSQLQuery(SUM_VOLUMES_RESOURCES)
                .setParameter("virtualDatacenterId", virtualDatacenterId).uniqueResult();

        BigInteger publicIps =
            (BigInteger) getSession().createSQLQuery(COUNT_PUBLIC_IP_RESOURCES)
                .setParameter("virtualDatacenterId", virtualDatacenterId).uniqueResult();

        DefaultEntityCurrentUsed used = new DefaultEntityCurrentUsed(cpu.intValue(), ram, hdTot);

        // Storage usage is stored in MB
        used.setStorage(storage == null ? 0 : storage.longValue() * 1024 * 1024);
        used.setPublicIp(publicIps == null ? 0 : publicIps.longValue());
        used.setVlanCount(getVLANUsage(virtualDatacenterId).size());

        return used;
    }

    private List<VLANNetwork> getVLANUsage(final Integer virtualdatacenterId)
    {
        Query query = getSession().createQuery(COUNT_PRIVATE_VLANS_RESOURCES);
        query.setParameter("virtualDatacenterId", virtualdatacenterId);

        return query.list();
    }

    public List<VirtualDatacenter> getVirualDatacenterFromDefaultVlan(final Integer defaultVlanId)
    {
        Query query = getSession().createQuery(GET_VDC_FROM_DEFAULT_VLAN);
        query.setParameter("vlanId", defaultVlanId);

        return query.list();
    }

    public VirtualDatacenter get(final Integer id)
    {
        return getEntityManager().find(VirtualDatacenter.class, id);
    }
}
TOP

Related Classes of com.abiquo.server.core.cloud.VirtualDatacenterDAO

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.