/** * 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.nodecollector.aim.impl; import java.util.LinkedList; import java.util.List; import org.apache.commons.io.FilenameUtils; import org.apache.thrift.TException; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TTransportException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.abiquo.aimstub.Aim.Iface; import com.abiquo.aimstub.Datastore; import com.abiquo.aimstub.NetInterface; import com.abiquo.aimstub.RimpException; import com.abiquo.aimstub.TTransportProxy; import com.abiquo.nodecollector.aim.AimCollector; import com.abiquo.nodecollector.constants.MessageValues; import com.abiquo.nodecollector.exception.libvirt.AimException; import com.abiquo.server.core.infrastructure.nodecollector.ResourceEnumType; import com.abiquo.server.core.infrastructure.nodecollector.ResourceType; /** * {@link AimCollector} implementation. */ public class AimCollectorImpl implements AimCollector { /** The constant logger object. */ private static final Logger LOG = LoggerFactory.getLogger(AimCollectorImpl.class); String host; Integer aimport; Iface aimclient; final int KBYTE = 1024; public AimCollectorImpl(final String host, final Integer aimport) throws AimException { aimclient = TTransportProxy.getInstance(host, aimport); this.host = host; this.aimport = aimport; pingAIM(); } @Override public void pingAIM() throws AimException { TTransport transport = new TSocket(host, aimport); try { transport.open(); if (transport.isOpen()) { transport.close(); LOG.debug("AIM service running at [{}:{}]", host, aimport); } else { LOG.error(MessageValues.AIM_NO_PING); throw new AimException(MessageValues.AIM_NO_PING); } } catch (TTransportException e) { LOG.error(MessageValues.AIM_NO_PING, e); throw new AimException(MessageValues.AIM_NO_PING, e); } } @Override public void checkAIM() throws AimException { /** * TODO VAGENT and VLAN plugins should be checked ??? */ try { aimclient.checkRimpConfiguration(); } catch (RimpException e) { final String cause = String.format(MessageValues.AIM_CHECK, "RIMP", host); LOG.error(cause, e); throw new AimException(cause, e); } catch (TException e) { LOG.error(MessageValues.AIM_NO_COMM, e); throw new AimException(MessageValues.AIM_NO_COMM, e); } } @Override public List<ResourceType> getDatastores() throws AimException { List<Datastore> datastores; try { datastores = aimclient.getDatastores(); } catch (RimpException e) { final String cause = String.format("Can not obtain the datastores on [%s]", host); LOG.error(cause, e); throw new AimException(cause, e); } catch (TException e) { LOG.error(MessageValues.AIM_NO_COMM, e); throw new AimException(MessageValues.AIM_NO_COMM, e); } if (datastores == null || datastores.size() == 0) { final String cause = String.format(MessageValues.AIM_ANY_DATASTORE, host); LOG.error(cause); throw new AimException(cause); } List<ResourceType> resources = new LinkedList<ResourceType>(); for (Datastore ds : datastores) { // removing final slash '/' ds.setPath(FilenameUtils.getFullPathNoEndSeparator(ds.getPath())); resources.add(datastoreToResource(ds)); } return resources; } @Override public Long getDiskFileSize(final String diskFilePath) throws AimException { try { long diskSize = aimclient.getDiskFileSize(diskFilePath); return diskSize * KBYTE; } catch (RimpException e) { final String cause = String.format(MessageValues.AIM_GET_DISK_SIZE, diskFilePath, host); LOG.error(cause, e); throw new AimException(cause, e); } catch (TException e) { LOG.error(MessageValues.AIM_NO_COMM, e); throw new AimException(MessageValues.AIM_NO_COMM, e); } } @Override public List<ResourceType> getNetInterfaces() throws AimException { List<NetInterface> netifaces; try { netifaces = aimclient.getNetInterfaces(); } catch (RimpException e) { final String cause = String.format("Can not obtain the network interfaces on [%s]", host); LOG.error(cause, e); throw new AimException(cause, e); } catch (TException e) { LOG.error(MessageValues.AIM_NO_COMM, e); throw new AimException(MessageValues.AIM_NO_COMM, e); } if (netifaces == null || netifaces.size() == 0) { final String cause = String.format(MessageValues.AIM_ANY_NETIFACE, host); LOG.error(cause); throw new AimException(cause); } List<ResourceType> resources = new LinkedList<ResourceType>(); for (NetInterface ni : netifaces) { resources.add(netInterfaceToResource(ni)); } return resources; } /** * @return <UL> * <li>"resourceType" as STORAGE_DISK constant.</li> * <li>"connection" as the Datastore UUID mark.</li> * <li>XXX"resourceSubType" as the Datastore kind (nfs, ext3 ...).</li> * <li>"elementName" as the Datastore device (/dev/sd1, nfs:/opt/export ...).</li> * <li>"address" as the Datastore moutn point path (/, /opt/nfs-testing ...).</li> * <li>"units" as the total size (used plus available) of the datastore expresed on * Bytes (298696808, 1548152 ...).</li> * </UL> */ protected ResourceType datastoreToResource(final Datastore ds) { ResourceType rt = new ResourceType(); rt.setResourceType(ResourceEnumType.HARD_DISK); rt.setConnection(ds.getType()); // datastore uuid rt.setElementName(ds.getDevice()); rt.setAddress(ds.getPath()); rt.setUnits(ds.getTotalSize() * KBYTE); rt.setAvailableUnits(ds.getUsableSize() * KBYTE); return rt; } /** * @return <UL> * <li>"resourceType" as NETWORK_INTERFACE constant.</li> * <li>"elementName" as the network interface device (lo, eth0, wlan0...).</li> * <li>"address" as the network interface hardware address (MAC).</li> * </UL> */ protected ResourceType netInterfaceToResource(final NetInterface net) { ResourceType rt = new ResourceType(); rt.setResourceType(ResourceEnumType.NETWORK_INTERFACE); rt.setAddress(net.getPhysicalAddress()); rt.setElementName(net.getName()); return rt; } @Override public String getInitiatorIQN() throws AimException { String iqn; try { iqn = aimclient.getInitiatorIQN(); } catch (TException e) { LOG.error(MessageValues.AIM_NO_COMM, e); throw new AimException(MessageValues.AIM_NO_COMM, e); } return iqn.length() == 0 ? null : iqn; } }