/**
* 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.tracerprocessor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.abiquo.abiserver.persistence.hibernate.HibernateDAOFactory;
import com.abiquo.tracer.Datacenter;
import com.abiquo.tracer.Enterprise;
import com.abiquo.tracer.Machine;
import com.abiquo.tracer.Platform;
import com.abiquo.tracer.Rack;
import com.abiquo.tracer.StoragePool;
import com.abiquo.tracer.TracerTo;
import com.abiquo.tracer.User;
import com.abiquo.tracer.VirtualDatacenter;
import com.abiquo.tracer.VirtualStorage;
import com.abiquo.tracer.server.TracerCollectorException;
import com.abiquo.tracer.server.TracerProcessor;
/**
* This class writes metering data to the database, using JDBC in a low level.
*
* @author eros
*/
public class DBTracerProcessor implements TracerProcessor
{
private final static Logger log = LoggerFactory.getLogger(DBTracerProcessor.class);
@Override
public void process(final TracerTo object) throws TracerCollectorException
{
try
{
Platform platform = object.getPlatform();
if (platform == null)
{
// Default platform.
platform = Platform.SYSTEM_PLATFORM;
}
// Object set to be inserted
String datacenter = null;
String rack = null;
String physicalMachine = null;
String storageSystem = null;
String storagePool = null;
String volume = null;
String network = null;
String subnet = null;
String enterprise = null;
String user = null;
Integer userId = null;
String performedBy = User.SYSTEM_USER.getName();
String virtualDataCenter = null;
String virtualApp = null;
String virtualMachine = null;
String severity = object.getSeverity().name(); // | We suppose this objects
String actionPerformed = object.getEvent().name(); // | they are filled
// directly
String component = object.getComponent().name(); // |
String stacktrace = null;
if (object.getUser() != null)
{
enterprise = object.getUser().getEnterprise();
user = object.getUser().getUsername();
userId = new Long(object.getUser().getId()).intValue();
performedBy = object.getUser().getUsername();
}
// We will insert a description in the
// 'stacktrace' column (if not null)
if (object.getDescription() != null)
{
stacktrace = object.getDescription();
}
// In case we have a null datacenter we insert null in the DB,
// for every datacenter related row
// This operation is repeated over and over again through the
// datacenter hierarchy
if (platform.getDatacenter() != null)
{
Datacenter dc = platform.getDatacenter();
datacenter = dc.getName();
if (dc.getRack() != null)
{
Rack r = dc.getRack();
rack = r.getName();
if (r.getMachine() != null)
{
Machine m = r.getMachine();
physicalMachine = m.getName();
if (m.getVirtualMachine() != null)
{
virtualMachine = m.getVirtualMachine().getName();
}
}
}
if (dc.getVirtualStorage() != null)
{
VirtualStorage vs = dc.getVirtualStorage();
storageSystem = dc.getVirtualStorage().getName();
if (vs.getStoragePool() != null)
{
StoragePool sp = vs.getStoragePool();
storagePool = dc.getVirtualStorage().getStoragePool().getName();
if (sp.getVolume() != null)
{
volume = dc.getVirtualStorage().getStoragePool().getVolume().getName();
}
}
}
if (dc.getNetwork() != null)
{
network = dc.getNetwork().getName();
}
}
// In case we have a null enterprise we insert "NULL" in the DB,
// for every enterprise related row
// This operation is repeated over and over again through the
// enterprise hierarchy
if (platform.getEnterprise() != null)
{
Enterprise en = platform.getEnterprise();
enterprise = en.getName();
if (en.getUser() != null)
{
User u = en.getUser();
user = u.getName();
}
if (en.getVirtualDatacenter() != null)
{
VirtualDatacenter vdc = en.getVirtualDatacenter();
virtualDataCenter = vdc.getName();
if (vdc.getVirtualAppliance() != null)
{
virtualApp = vdc.getVirtualAppliance().getName();
}
}
} // TODO what happens with the rest of the hierarchy?
// The MySQL query
String insert =
"insert delayed into metering(datacenter, rack, physicalMachine, storageSystem,"
+ " storagePool, volume, network, subnet, enterprise, idUser, user, virtualDatacenter,"
+ " virtualApp, virtualmachine, severity, performedby, actionperformed, component, stacktrace)"
+ " values (:datacenter, :rack, :machine, :storage, :storagePool, :volume, :network, :subnet,"
+ " :enterprise, :userId, :user, :virtualDatacenter, :virtualApp, :virtualMachine, :severity,"
+ " :performedBy, :actionPerformed, :component, :stacktrace)";
HibernateDAOFactory.instance().beginConnection();
log.debug("Query to write: " + insert);
HibernateDAOFactory.getSessionFactory().getCurrentSession().createSQLQuery(insert)
.setParameter("datacenter", datacenter).setParameter("rack", rack)
.setParameter("machine", physicalMachine).setParameter("storage", storageSystem)
.setParameter("storagePool", storagePool).setParameter("volume", volume)
.setParameter("network", network).setParameter("subnet", subnet)
.setParameter("enterprise", enterprise).setParameter("userId", userId)
.setParameter("user", user).setParameter("virtualDatacenter", virtualDataCenter)
.setParameter("virtualApp", virtualApp)
.setParameter("virtualMachine", virtualMachine).setParameter("severity", severity)
.setParameter("performedBy", performedBy)
.setParameter("actionPerformed", actionPerformed)
.setParameter("component", component).setParameter("stacktrace", stacktrace)
.executeUpdate();
}
finally
{
HibernateDAOFactory.instance().endConnection();
}
}
@Override
public void destroy() throws TracerCollectorException
{
}
}