package com.telefonica.claudia.driver_mon;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import com.telefonica.claudia.slm.common.DbManager;
import com.telefonica.claudia.slm.deployment.VDC;
import com.telefonica.claudia.slm.deployment.NIC;
import com.telefonica.claudia.slm.deployment.ServiceApplication;
import com.telefonica.claudia.slm.monitoring.monitoringsample;
import com.telefonica.claudia.slm.monitoring.nodedirectory;
import com.telefonica.claudia.smi.DataTypesUtils;
import com.telefonica.claudia.smi.URICreation;
import com.telefonica.claudia.smi.monitoring.bean.MeasureDescriptor;
import com.telefonica.claudia.smi.monitoring.bean.MeasuredValue;
public class DriverClothoDbManager extends DbManager {
public DriverClothoDbManager(String DBUrl, boolean recreate, String user, String password) {
super(DBUrl, recreate, user, password);
}
public static DriverClothoDbManager createDbManager(String DBUrl, boolean recreate, String user, String password) {
if (instance==null) {
instance = new DriverClothoDbManager(DBUrl, recreate, user, password);
}
return getInstance();
}
public static DriverClothoDbManager getInstance() {
return (DriverClothoDbManager) instance;
}
public synchronized VDC getVdc(String fqn) {
EntityManager em = emf.createEntityManager();
EntityTransaction t = em.getTransaction();
VDC result = null;
t.begin();
try {
Query queryResult = em.createQuery("from " + VDC.class.getName() + " as vdctable "
+ " left join fetch vdctable.services service"
+ " where vdctable.fqn='" + fqn + "'"
);
@SuppressWarnings("unchecked")
List<VDC> resultList = (List<VDC>) queryResult.getResultList();
for (VDC resultCandidate: resultList) {
result = resultCandidate;
}
t.commit();
return result;
} catch (Error e) {
t.rollback();
throw e;
} finally {
em.clear();
em.close();
}
}
public synchronized MeasureDescriptor getMeasureDescriptors(nodedirectory subject, String measure) {
EntityManager em= emf.createEntityManager();
EntityTransaction t =em.getTransaction();
t.begin();
try {
Query queryResult = em.createQuery("select mon.measure_type, mon.unit from "+monitoringsample.class.getName()+" mon " +
"where mon.associatedObject.fqn IN (:fqns) " +
"and mon.measure_type= :measure_type ");
System.out.println ("select measurType, unit from "+monitoringsample.class.getName() +
" where associatedObject_internalId = " +subject.getInternalNodeId()+
" and measure_type='"+measure+"'");
/* Query queryResult = em.createQuery("select measure_type, unit from "+monitoringsample.class.getName() +
" where associatedObject_internalId = " +111 + " and measure_type='"+measure+"'");*/
Set <String> fqns = new HashSet<String>();
fqns.add(subject.getFqnString());
/* for (Object de: subject.getAllDescendants()) {
nodedirectory nd = (nodedirectory) de;
fqns.add(nd.getFqnString());
}*/
queryResult.setParameter("measure_type", measure);
queryResult.setParameter("fqns", fqns);
List<?> result = queryResult.getResultList();
MeasureDescriptor md=null;
if (result.size()>0) {
md = new MeasureDescriptor((String) ((Object[])result.get(0))[0], subject.getFqnString() + "." + URICreation.FQN_SEPARATOR_MEASURE + "." + (String)((Object[])result.get(0))[0], "", (String)((Object[])result.get(0))[1], "0", "0", "");
}
t.commit();
return md;
} catch (Error e) {
t.rollback();
throw e;
} finally {
em.clear();
em.close();
}
}
public ServiceApplication getServiceApplication(String fqn) {
EntityManager em= emf.createEntityManager();
EntityTransaction t =em.getTransaction();
ServiceApplication result=null;
t.begin();
try {
Query queryResult = em.createQuery("from ServiceApplication sap left join fetch sap.networks where sap.fqn='" + fqn + "'");
List<ServiceApplication> resultList = queryResult.getResultList();
for (ServiceApplication resultCandidate: resultList) {
result = resultCandidate;
}
t.commit();
return result;
} catch (Error e) {
t.rollback();
throw e;
} finally {
em.clear();
em.close();
}
}
@SuppressWarnings("unchecked")
public synchronized List<MeasureDescriptor> getMeasureDescriptorsList(nodedirectory subject) {
EntityManager em= emf.createEntityManager();
EntityTransaction t =em.getTransaction();
t.begin();
try {
Query queryResult = em.createQuery("select distinct(ms.measure_type), max(ms.unit) " +
"from "+monitoringsample.class.getName()+ " ms " +
"where associatedObject.fqn IN (:fqns) " +
"group by ms.measure_type");
System.out.println ("select distinct(ms.measure_type), max(ms.unit) " +
"from "+monitoringsample.class.getName()+ " ms " +
"where associatedObject.fqn="+subject.getInternalNodeId()+
" group by ms.measure_type");
/* Query queryResult = em.createQuery("select distinct(ms.measure_type), max(ms.unit) " +
"from "+monitoringsample.class.getName()+ " ms " +
"where associatedObject.fqn="+subject.getInternalNodeId() +
" group by ms.measure_type");*/
Set <String> fqns = new HashSet<String>();
fqns.add(subject.getFqnString());
/* for (Object de: subject.getAllDescendants()) {
nodedirectory nd = (nodedirectory) de;
fqns.add(nd.getFqnString());
}*/
queryResult.setParameter("fqns", fqns);
List<?> result = queryResult.getResultList();
List<MeasureDescriptor> mdList = new ArrayList<MeasureDescriptor>();
for (Object o: result) {
Object[] fields = (Object[]) o;
mdList.add(new MeasureDescriptor((String)fields[0], subject.getFqnString() + "." + URICreation.FQN_SEPARATOR_MEASURE + "." + (String)fields[0], "", (String)fields[1], "0", "0", ""));
}
t.commit();
return mdList;
} catch (Error e) {
t.rollback();
throw e;
} finally {
em.clear();
em.close();
}
}
@SuppressWarnings("unchecked")
public synchronized List<MeasuredValue> getMeasureValues(nodedirectory subject, Date from, Date to, int samples, long interval, String measureName, String type) {
EntityManager em= emf.createEntityManager();
EntityTransaction t =em.getTransaction();
t.begin();
try {
Query queryResult;
if (interval==86400) {
queryResult = em.createQuery("select new com.telefonica.claudia.smi.monitoring.bean.MeasuredValue(avg(ms.value), min(ms.datetime), max(ms.unit), '1d') from "+monitoringsample.class.getName()+" ms " +
" where ms.associatedObject.fqn IN (:subject)" +
" and ms.measure_type= :type " +
" and ms.datetime between :from and :to group by ms.year, ms.month, ms.day, ms.associatedObject.internalId" +
" order by ms.datetime desc");
} else if (interval==3600) {
queryResult = em.createQuery("select new com.telefonica.claudia.smi.monitoring.bean.MeasuredValue(avg(ms.value), min(ms.datetime), max(ms.unit), '1h') from "+monitoringsample.class.getName()+" ms " +
" where ms.associatedObject.fqn IN (:subject)" +
" and ms.measure_type= :type " +
" and ms.datetime between :from and :to group by ms.year, ms.month, ms.day, ms.hour, ms.associatedObject.internalId" +
" order by ms.datetime desc");
} else {
queryResult = em.createQuery("select new com.telefonica.claudia.smi.monitoring.bean.MeasuredValue(ms.value, ms.datetime, ms.unit) from "+monitoringsample.class.getName()+" ms " +
" where ms.associatedObject.fqn IN (:subject)" +
" and ms.measure_type= :type " +
" and ms.datetime between :from and :to " +
" order by ms.datetime desc");
}
System.out.println ("select new com.telefonica.claudia.smi.monitoring.bean.MeasuredValue(ms.value, ms.datetime, ms.unit) from "+monitoringsample.class.getName()+" ms " +
" where ms.associatedObject.fqn IN (:subject)" +
" and ms.measure_type= :type " +
" and ms.datetime between :from and :to " +
" order by ms.datetime desc");
Set <String> internalIds = new HashSet<String>();
internalIds.add(subject.getFqnString());
/*for (Object de: subject.getAllDescendants()) {
nodedirectory nd = (nodedirectory) de;
internalIds.add(nd.getFqnString());
}*/
queryResult.setParameter("subject", internalIds);
queryResult.setParameter("type", measureName);
if (from==null)
queryResult.setParameter("from", new Date(0l));
else
queryResult.setParameter("from", from);
if (to==null)
queryResult.setParameter("to", Calendar.getInstance().getTime());
else
queryResult.setParameter("to", to);
List<MeasuredValue> result = queryResult.getResultList();
List<MeasuredValue> mvList = new ArrayList<MeasuredValue>();
HashMap<Date, MeasuredValue> calculatedValues= new HashMap<Date, MeasuredValue>();
for (MeasuredValue o: result) {
System.out.println (o.getRegisterDate());
if (calculatedValues.containsKey(o.getRegisterDate())) {
MeasuredValue value=calculatedValues.get(o.getRegisterDate());
value.setValue(String.valueOf(Double.parseDouble(value.getValue())+ Double.parseDouble(o.getValue())));
if (type.equalsIgnoreCase("percent")) {
value.setValue(String.valueOf(Double.parseDouble(value.getValue())/2));
}
} else {
System.out.println (calculatedValues.size() + " " + samples);
if (calculatedValues.isEmpty()||calculatedValues.size()< samples||interval!=0)
{
mvList.add(o);
System.out.println ("adding " +o.getValue());
}
calculatedValues.put(o.getRegisterDate(), o);
System.out.println ("adding " +o.getRegisterDate()+ " " + o.getValue());
}
}
t.commit();
return mvList;
} catch (Error e) {
t.rollback();
throw e;
} finally {
em.clear();
em.close();
}
}
public List<MeasuredValue> getNetworkValues(nodedirectory nd, Date from,
Date to, int samples, long interval, String name, String valueType) {
EntityManager em= emf.createEntityManager();
EntityTransaction t =em.getTransaction();
t.begin();
try {
Query queryResult;
if (interval==86400) {
queryResult = em.createQuery("select new com.telefonica.claudia.smi.monitoring.bean.MeasuredValue(avg(ms.value), min(ms.datetime), max(ms.unit), '1d') from "+monitoringsample.class.getName()+" ms " +
" where ms.associatedObject.fqn IN (:subject)" +
" and ms.measure_type= :type " +
" and ms.datetime between :from and :to group by ms.year, ms.month, ms.day, ms.associatedObject.internalId" +
" order by ms.datetime desc");
} else if (interval==3600) {
queryResult = em.createQuery("select new com.telefonica.claudia.smi.monitoring.bean.MeasuredValue(avg(ms.value), min(ms.datetime), max(ms.unit), '1h') from "+monitoringsample.class.getName()+" ms " +
" where ms.associatedObject.fqn IN (:subject)" +
" and ms.measure_type= :type " +
" and ms.datetime between :from and :to group by ms.year, ms.month, ms.day, ms.hour, ms.associatedObject.internalId" +
" order by ms.datetime desc");
} else {
queryResult = em.createQuery("select new com.telefonica.claudia.smi.monitoring.bean.MeasuredValue(ms.value, ms.datetime, ms.unit) from "+monitoringsample.class.getName()+" ms " +
" where ms.associatedObject.fqn IN (:subject)" +
" and ms.measure_type= :type " +
" and ms.datetime between :from and :to " +
" order by ms.datetime desc");
}
Set <String> internalIds = new HashSet<String>();
String networkName = name.substring(name.indexOf("_")+1);
for (Object de: nd.getAllDescendants()) {
nodedirectory descendant = (nodedirectory) de;
if (descendant.getType()!=nodedirectory.TYPE_NIC) continue;
NIC nic = em.find(NIC.class, descendant.getInternalNodeId());
if (nic==null||!nic.getNicConf().getNetwork().getName().equals(networkName)) continue;
internalIds.add(descendant.getFqnString());
}
name = name.substring(0, name.indexOf("_"));
queryResult.setParameter("subject", internalIds);
queryResult.setParameter("type", name);
if (from==null)
queryResult.setParameter("from", new Date(0l));
else
queryResult.setParameter("from", from);
if (to==null)
queryResult.setParameter("to", Calendar.getInstance().getTime());
else
queryResult.setParameter("to", to);
List<MeasuredValue> result = queryResult.getResultList();
List<MeasuredValue> mvList = new ArrayList<MeasuredValue>();
HashMap<Date, MeasuredValue> calculatedValues= new HashMap<Date, MeasuredValue>();
for (MeasuredValue o: result) {
if (calculatedValues.containsKey(o.getRegisterDate())) {
MeasuredValue value=calculatedValues.get(o.getRegisterDate());
value.setValue(String.valueOf(Double.parseDouble(value.getValue())+ Double.parseDouble(o.getValue())));
} else {
if (calculatedValues.isEmpty()||calculatedValues.size()<= samples||interval!=0)
mvList.add(o);
calculatedValues.put(o.getRegisterDate(), o);
}
}
t.commit();
return mvList;
} catch (Error e) {
t.rollback();
throw e;
} finally {
em.clear();
em.close();
}
}
public MeasureDescriptor getDiskMeasureDescriptor(nodedirectory subject) {
EntityManager em= emf.createEntityManager();
EntityTransaction t =em.getTransaction();
t.begin();
try {
Query queryResult = em.createQuery("select sum(diskTable.capacity) " +
"from VEE as veeTable left join veeTable.disksConf diskTable " +
"where veeTable.fqn IN (:fqns)");
Set <String> fqns = new HashSet<String>();
if (subject.getType()==nodedirectory.TYPE_REPLICA) {
fqns.add(subject.getParent().getFqnString());
} else if (subject.getType()==nodedirectory.TYPE_VEE) {
fqns.add(subject.getFqnString());
} else {
for (Object de: subject.getAllDescendants()) {
nodedirectory nd = (nodedirectory) de;
if (nd.getType()==nodedirectory.TYPE_VEE)
fqns.add(nd.getFqnString());
}
}
queryResult.setParameter("fqns", fqns);
Double fields = (Double) queryResult.getSingleResult();
MeasureDescriptor result = new MeasureDescriptor("diskUsage",
subject.getFqnString() + "." + URICreation.FQN_SEPARATOR_MEASURE + ".diskUsage",
"", DataTypesUtils.STANDARD_STORAGE_UNIT_DEFAULT, "0", String.valueOf(fields), "");
t.commit();
return result;
} catch (Error e) {
t.rollback();
throw e;
} finally {
em.clear();
em.close();
}
}
}