com.abiquo.abiserver.abicloudws.RemoteServiceUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.abiquo.abiserver.abicloudws.RemoteServiceUtils.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.abiserver.abicloudws;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.Set;

import org.hibernate.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.abiquo.abiserver.business.hibernate.pojohb.infrastructure.DatacenterHB;
import com.abiquo.abiserver.business.hibernate.pojohb.service.RemoteServiceHB;
import com.abiquo.abiserver.business.hibernate.pojohb.service.RemoteServiceType;
import com.abiquo.abiserver.business.hibernate.pojohb.virtualappliance.VirtualDataCenterHB;
import com.abiquo.abiserver.exception.PersistenceException;
import com.abiquo.abiserver.exception.RemoteServiceException;
import com.abiquo.abiserver.persistence.DAOFactory;
import com.abiquo.abiserver.persistence.dao.infrastructure.DataCenterDAO;
import com.abiquo.abiserver.persistence.hibernate.HibernateDAOFactory;
import com.abiquo.abiserver.pojo.infrastructure.PhysicalMachine;
import com.abiquo.abiserver.pojo.infrastructure.Rack;
import com.abiquo.abiserver.pojo.virtualappliance.VirtualAppliance;

/**
 * This class agluttinate basic functionalities to interact with RemoteService
 * 
 * @author abiquo
 */
public class RemoteServiceUtils {

    /** The logger object */
    private final static Logger logger = LoggerFactory.getLogger(RemoteServiceUtils.class);

    /**
     * Private helper to get the virtual factory destination address from the virtual appliance
     * object. Requires a nested session.
     * 
     * @param virtualAppliance the virtual appliance associated with a virtual datacenter
     * @return the address destination
     * @throws PersistenceException
     * @throws RemoteServiceException
     */
    public static String getVirtualFactoryFromVA(final VirtualAppliance virtualAppliance)
            throws PersistenceException, RemoteServiceException {
        String destination = null;
        DAOFactory factory = HibernateDAOFactory.instance();
        DataCenterDAO datacenterDAO = factory.getDataCenterDAO();

        factory.beginConnection();
        DatacenterHB myDatacenter = datacenterDAO
                .findById(virtualAppliance.getVirtualDataCenter().getIdDataCenter());
        factory.endConnection();

        Set<RemoteServiceHB> remoteServices = myDatacenter.getRemoteServicesHB();
        for (RemoteServiceHB remoteServiceHB : remoteServices) {
            if (remoteServiceHB
                    .getRemoteServiceType() == com.abiquo.abiserver.business.hibernate.pojohb.service.RemoteServiceType.VIRTUAL_FACTORY) {
                destination = remoteServiceHB.getUri();
                break;
            }
        }

        if (destination == null) {
            throw new RemoteServiceException(
                    "There is no Virtual Factory remote service configured for this datacenter. "
                            + "Check datacenter configuration in Infrastructure view.");
        }

        return destination;
    }

    /**
     * Private helper to get the VirtualSystemMonitorAddress address from the virtual appliance
     * object
     * 
     * @param virtualAppliance the virtual appliance associated with a virtual datacenter
     * @return the address destination
     * @throws PersistenceException
     * @throws RemoteServiceException
     */
    public static String getVirtualSystemMonitorFromVA(final VirtualAppliance virtualAppliance)
            throws RemoteServiceException {
        return getVirtualSystemMonitor(virtualAppliance.getVirtualDataCenter().getIdDataCenter());
    }

    public static String getVirtualSystemMonitor(final int datacenterId) throws RemoteServiceException {
        DAOFactory factory = HibernateDAOFactory.instance();
        DataCenterDAO datacenterDAO = factory.getDataCenterDAO();
        String destination = null;

        factory.beginConnection();
        DatacenterHB myDatacenter = datacenterDAO.findById(datacenterId);
        factory.endConnection();

        Set<RemoteServiceHB> remoteServices = myDatacenter.getRemoteServicesHB();
        for (RemoteServiceHB remoteServiceHB : remoteServices) {
            if (remoteServiceHB
                    .getRemoteServiceType() == com.abiquo.abiserver.business.hibernate.pojohb.service.RemoteServiceType.VIRTUAL_SYSTEM_MONITOR) {
                destination = remoteServiceHB.getUri();
                break;
            }
        }

        if (destination == null) {
            throw new RemoteServiceException(
                    "There is no VirtualSystemMonitor remote service configured for this datacenter. "
                            + "Check datacenter configuration in Infrastructure view.");
        }

        return destination;
    }

    /**
     * Private helper to get the VirtualSystemMonitorAddress address from a physical machine object
     * 
     * @param physicalMachine the physical machine
     * @return the address destination
     * @throws PersistenceException
     * @throws RemoteServiceException
     */
    public static String getVirtualSystemMonitorFromPhysicalMachine(final PhysicalMachine physicalMachine)
            throws PersistenceException, RemoteServiceException {
        String destination = null;
        DAOFactory factory = HibernateDAOFactory.instance();
        DataCenterDAO datacenterDAO = factory.getDataCenterDAO();

        Rack rack = (Rack) physicalMachine.getAssignedTo();

        factory.beginConnection();
        DatacenterHB myDatacenter = datacenterDAO.findById(rack.getDataCenter().getId());
        factory.endConnection();

        Set<RemoteServiceHB> remoteServices = myDatacenter.getRemoteServicesHB();
        for (RemoteServiceHB remoteServiceHB : remoteServices) {
            if (remoteServiceHB
                    .getRemoteServiceType() == com.abiquo.abiserver.business.hibernate.pojohb.service.RemoteServiceType.VIRTUAL_SYSTEM_MONITOR) {
                destination = remoteServiceHB.getUri();
                break;
            }
        }

        if (destination == null) {
            throw new RemoteServiceException(
                    "There is no VirtualSystemMonitor remote service configured for this datacenter. "
                            + "Check datacenter configuration in Infrastructure view.");
        }

        return destination;
    }

    /**
     * Private helper to get the NodeCollecto address from the datacenter id. Requires a nested
     * transaction
     * 
     * @param datacenterId the datacenter ID
     * @return the address destination
     * @throws PersistenceException
     * @throws RemoteServiceException
     */
    public static String getNodeCollectorFromDatacenter(final Integer datacenterId)
            throws PersistenceException, RemoteServiceException {
        String destination = null;
        DAOFactory factory = HibernateDAOFactory.instance();
        DataCenterDAO datacenterDAO = factory.getDataCenterDAO();
        DatacenterHB myDatacenter = datacenterDAO.findById(datacenterId);

        Set<RemoteServiceHB> remoteServices = myDatacenter.getRemoteServicesHB();
        for (RemoteServiceHB remoteServiceHB : remoteServices) {
            if (remoteServiceHB
                    .getRemoteServiceType() == com.abiquo.abiserver.business.hibernate.pojohb.service.RemoteServiceType.NODE_COLLECTOR) {
                destination = remoteServiceHB.getUri();
                break;
            }
        }

        if (destination == null) {
            throw new RemoteServiceException(
                    "There is no NodeCollector remote service configured for this datacenter."
                            + "Check datacenter configuration in Infrastructure view.");
        }

        return destination;
    }

    /**
     * Private helper to get the Virtual system monitor address from the datacenter id. Requires a
     * nested transaction
     * 
     * @param datacenterId the datacenter ID
     * @return the address destination
     * @throws PersistenceException
     * @throws RemoteServiceException
     */
    public static String getVirtualSystemMonitorFromDatacenter(final Integer datacenterId)
            throws PersistenceException, RemoteServiceException {
        String destination = null;
        DAOFactory factory = HibernateDAOFactory.instance();
        DataCenterDAO datacenterDAO = factory.getDataCenterDAO();
        DatacenterHB myDatacenter = datacenterDAO.findById(datacenterId);

        Set<RemoteServiceHB> remoteServices = myDatacenter.getRemoteServicesHB();
        for (RemoteServiceHB remoteServiceHB : remoteServices) {
            if (remoteServiceHB
                    .getRemoteServiceType() == com.abiquo.abiserver.business.hibernate.pojohb.service.RemoteServiceType.VIRTUAL_SYSTEM_MONITOR) {
                destination = remoteServiceHB.getUri();
                break;
            }
        }

        if (destination == null) {
            throw new RemoteServiceException(
                    "There is no Virtual system monitor remote service configured for this datacenter."
                            + " Check datacenter configuration in Infrastructure view.");
        }

        return destination;
    }

    /**
     * Private helper to get the NodeCollecto address from the datacenter id. Requires a nested
     * transaction
     * 
     * @param datacenterId the datacenter ID
     * @param the hibernate session
     * @return the address destination
     * @throws PersistenceException
     * @throws RemoteServiceException
     */
    @Deprecated
    // use RemoteServiceDAO
    public static String getNodeCollectorFromDatacenter(final Integer datacenterId, final Session session)
            throws PersistenceException, RemoteServiceException {
        String destination = null;
        DatacenterHB myDatacenter = (DatacenterHB) session.get(DatacenterHB.class, datacenterId);

        Set<RemoteServiceHB> remoteServices = myDatacenter.getRemoteServicesHB();
        for (RemoteServiceHB remoteServiceHB : remoteServices) {
            if (remoteServiceHB
                    .getRemoteServiceType() == com.abiquo.abiserver.business.hibernate.pojohb.service.RemoteServiceType.NODE_COLLECTOR) {
                destination = remoteServiceHB.getUri();
                break;
            }
        }

        if (destination == null) {
            throw new RemoteServiceException(
                    "There is no NodeCollector remote service configured for this datacenter."
                            + " Check datacenter configuration in Infrastructure view.");
        }

        return destination;
    }

    /**
     * Private helper to get the DHCP address. Requires a nested trabsaction
     * 
     * @param idDataCenter the datacenter id
     * @return the address destination
     * @throws RemoteServiceException
     * @throws PersistenceException
     */
    public static String getDhcpFromDatacenter(final Integer idDataCenter)
            throws PersistenceException, RemoteServiceException {
        String dhcpComplexAddress = getRemoteServiceByType(idDataCenter,
                com.abiquo.abiserver.business.hibernate.pojohb.service.RemoteServiceType.DHCP_SERVICE.name());
        URI addressAddressURL = null;
        try {
            addressAddressURL = new URI(dhcpComplexAddress);
        } catch (URISyntaxException e) {
            logger.error("The DHCP server address has a malformed URI:" + dhcpComplexAddress);
        }

        return addressAddressURL.getHost() + ":" + addressAddressURL.getPort();
    }

    /**
     * Private helper to get the remote service type from the idDatacenter and remote service type
     * 
     * @param idDataCenter the id datacenter
     * @param remoteServiceType the remote service type
     * @return the address
     * @throws PersistenceException
     * @throws RemoteServiceException
     */
    private static String getRemoteServiceByType(final Integer idDataCenter, final String remoteServiceType)
            throws PersistenceException, RemoteServiceException {
        String destination = null;
        DAOFactory factory = HibernateDAOFactory.instance();
        DataCenterDAO datacenterDAO = factory.getDataCenterDAO();
        DatacenterHB myDatacenter = datacenterDAO.findById(idDataCenter);

        Set<RemoteServiceHB> remoteServices = myDatacenter.getRemoteServicesHB();
        for (RemoteServiceHB remoteServiceHB : remoteServices) {
            if (remoteServiceHB.getRemoteServiceType() == RemoteServiceType.valueOf(remoteServiceType)) {
                destination = remoteServiceHB.getUri();
                break;
            }
        }

        if (destination == null) {
            throw new RemoteServiceException(
                    "There is no remote service of type: " + remoteServiceType + "configured for this datacenter.");
        }

        return destination;
    }

    /**
     * Checks the remote services from the virtual appliance
     * 
     * @param virtualAppliance the virtual appliance to check its remote services
     * @throws RemoteServiceException, if a remote service check fails
     */
    public static void checkRemoteServicesFromVA(final VirtualAppliance virtualAppliance)
            throws RemoteServiceException {
        DAOFactory factory = HibernateDAOFactory.instance();
        DataCenterDAO datacenterDAO = factory.getDataCenterDAO();

        factory.beginConnection();
        DatacenterHB myDatacenter = datacenterDAO
                .findById(virtualAppliance.getVirtualDataCenter().getIdDataCenter());
        factory.endConnection();

        Set<RemoteServiceHB> remoteServices = myDatacenter.getRemoteServicesHB();
        for (RemoteServiceHB remoteServiceHB : remoteServices) {
            // For DHCP service and SSM the check is not done
            if (!remoteServiceHB.getRemoteServiceType().canBeChecked()
                    || remoteServiceHB.getRemoteServiceType() == RemoteServiceType.STORAGE_SYSTEM_MONITOR) {
                continue;
            }

            RemoteServiceClient remoteServiceClient = new RemoteServiceClient(remoteServiceHB.getUri());
            remoteServiceClient.ping();
        }
    }

    /**
     * Checks the remote service SSM
     * 
     * @param virtualDatacenter
     * @throws RemoteServiceException
     */
    public static void checkRemoteServiceSSM(final VirtualDataCenterHB virtualDatacenter)
            throws RemoteServiceException {
        DAOFactory factory = HibernateDAOFactory.instance();
        DataCenterDAO datacenterDAO = factory.getDataCenterDAO();

        factory.beginConnection();
        DatacenterHB myDatacenter = datacenterDAO.findById(virtualDatacenter.getIdDataCenter());

        factory.endConnection();

        Set<RemoteServiceHB> remoteServices = myDatacenter.getRemoteServicesHB();
        for (RemoteServiceHB remoteServiceHB : remoteServices) {
            // Check SSM
            if (remoteServiceHB.getRemoteServiceType().canBeChecked()
                    && remoteServiceHB.getRemoteServiceType() == RemoteServiceType.STORAGE_SYSTEM_MONITOR) {
                RemoteServiceClient remoteServiceClient = new RemoteServiceClient(remoteServiceHB.getUri());
                remoteServiceClient.ping();
            }
        }

    }

}