com.abiquo.server.core.infrastructure.DatacenterDAO.java Source code

Java tutorial

Introduction

Here is the source code for com.abiquo.server.core.infrastructure.DatacenterDAO.java

Source

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

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;

import javax.persistence.EntityManager;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Query;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

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.util.PagedList;

@Repository("jpaDatacenterDAO")
public class DatacenterDAO extends DefaultDAOBase<Integer, Datacenter> {

    public DatacenterDAO() {
        super(Datacenter.class);
    }

    public DatacenterDAO(final EntityManager entityManager) {
        super(Datacenter.class, entityManager);
    }

    private static Criterion equalName(final String name) {
        assert !StringUtils.isEmpty(name);

        return Restrictions.eq(Datacenter.NAME_PROPERTY, name);
    }

    public boolean existsAnyWithName(final String name) {
        assert !StringUtils.isEmpty(name);

        return this.existsAnyByCriterions(equalName(name));
    }

    public boolean existsAnyOtherWithName(final Datacenter datacenter, final String name) {
        assert datacenter != null;
        assert isManaged(datacenter);
        assert !StringUtils.isEmpty(name);

        return this.existsAnyOtherByCriterions(datacenter, equalName(name));
    }

    /**
     * TODO: create queries
     * 
     * @param datacenterId
     * @param enterpriseId
     * @return
     */
    public DefaultEntityCurrentUsed getCurrentResourcesAllocated(final int datacenterId, final int enterpriseId) {
        Object[] vmResources = (Object[]) getSession().createSQLQuery(SUM_VM_RESOURCES)
                .setParameter("datacenterId", datacenterId).setParameter("enterpriseId", enterpriseId)
                .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("datacenterId", datacenterId).uniqueResult();
        Long hdTot = extraHd == null ? hd : hd + extraHd.longValue() * 1024 * 1024;

        BigDecimal storage = (BigDecimal) getSession().createSQLQuery(SUM_STORAGE_RESOURCES)
                .setParameter("datacenterId", datacenterId).setParameter("enterpriseId", enterpriseId)
                .uniqueResult();

        BigInteger publicIps = (BigInteger) getSession().createSQLQuery(COUNT_IP_RESOURCES)
                .setParameter("datacenterId", datacenterId).setParameter("enterpriseId", enterpriseId)
                .uniqueResult();

        BigInteger vlan = (BigInteger) getSession().createSQLQuery(COUNT_VLAN_RESOURCES)
                .setParameter("datacenterId", datacenterId).setParameter("enterpriseId", enterpriseId)
                .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(vlan == null ? 0 : vlan.longValue());
        return used;
    }

    public List<Enterprise> findEnterprisesByDatacenters(final Datacenter datacenter, final Integer firstElem,
            final Integer numElem, final Boolean network) {

        // Get the query that counts the total results.
        Query finalQuery;
        if (network) {
            finalQuery = getSession().createQuery(BY_ENT_WITH_NETWORK);
        } else {
            finalQuery = getSession().createQuery(BY_ENT);
        }
        finalQuery.setParameter("datacenter_id", datacenter.getId());
        Integer totalResults = finalQuery.list().size();

        Integer Start = firstElem;
        if (totalResults < firstElem) {
            Start = totalResults - numElem;
        }
        // Get the list of elements
        finalQuery.setFirstResult(Start);
        finalQuery.setMaxResults(numElem);

        PagedList<Enterprise> entList = new PagedList<Enterprise>(finalQuery.list());
        entList.setTotalResults(totalResults);
        entList.setPageSize(numElem);
        entList.setCurrentElement(firstElem);

        return entList;
    }

    public static final String BY_ENT_WITH_NETWORK = " select distinct ent from  VirtualDatacenter vdc, "
            + " VLANNetwork vn, " + " DatacenterLimits dcl join dcl.enterprise ent join dcl.datacenter dc"
            + " WHERE vn.network.id = vdc.network.id" + " and vdc.enterprise.id = ent.id"
            + " and vdc.datacenter.id = dc.id " + " and dc.id = :datacenter_id ";

    public static final String BY_ENT = " select distinct ent from DatacenterLimits dcl join dcl.enterprise ent join dcl.datacenter dc"
            + " WHERE dc.id = :datacenter_id ";

    private static final String SUM_VM_RESOURCES = "select sum(vm.cpu), sum(vm.ram), sum(vm.hd) from virtualmachine vm, hypervisor hy, physicalmachine pm "
            + " where hy.id = vm.idHypervisor and pm.idPhysicalMachine = hy.idPhysicalMachine "//
            // and pm.idState != 7" // not HA_DISABLED
            + " and pm.idDatacenter = :datacenterId and vm.idEnterprise = :enterpriseId and vm.state != 'NOT_ALLOCATED' and vm.idHypervisor is not null";

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

    private static final String SUM_STORAGE_RESOURCES = "select sum(r.limitResource) "
            + "from volume_management vm, storage_pool sp, storage_device sd, rasd_management rm, virtualdatacenter vdc, rasd r "
            + "where " + "vm.idManagement = rm.idManagement " + "and rm.idResource = r.instanceID "
            + "and vm.idStorage = sp.idStorage " + "and sp.idStorageDevice = sd.id "
            + "and sd.idDataCenter = :datacenterId " + "and rm.idVirtualDataCenter = vdc.idVirtualDataCenter "
            + "and vdc.idEnterprise = :enterpriseId";

    private static final String COUNT_IP_RESOURCES = "select count(*) from ip_pool_management ipm, rasd_management rm, vlan_network vn, datacenter dc, virtualdatacenter vdc, enterprise_limits_by_datacenter el "
            + " where ipm.vlan_network_id = vn.vlan_network_id " + " and vn.network_id = dc.network_id "
            + " and rm.idManagement = ipm.idManagement " + " and rm.idVirtualDataCenter = vdc.idVirtualDataCenter "
            + " and dc.idDataCenter = :datacenterId and vdc.idEnterprise = :enterpriseId "
            + " and el.idEnterprise = vdc.idEnterprise " + " and el.idDataCenter = dc.idDataCenter "
            + " and vn.networktype = 'PUBLIC' ";

    private static final String COUNT_VLAN_RESOURCES = "select count(*) from vlan_network vn, virtualdatacenter vdc, enterprise_limits_by_datacenter el "
            + "where vn.network_id = vdc.networktypeId and el.idDatacenter = :datacenterId and el.idEnterprise = :enterpriseId "
            + "and vdc.idEnterprise = el.idEnterprise";

}