package org.gcube.phd; import static org.gcube.common.authorization.client.Constants.authorizationService; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.TreeSet; import java.util.concurrent.TimeUnit; import org.apache.commons.math3.stat.descriptive.SummaryStatistics; import org.gcube.accounting.aggregator.utility.Utility; import org.gcube.accounting.analytics.Filter; import org.gcube.accounting.analytics.Info; import org.gcube.accounting.analytics.TemporalConstraint; import org.gcube.accounting.analytics.TemporalConstraint.AggregationMode; import org.gcube.accounting.analytics.persistence.AccountingPersistenceQuery; import org.gcube.accounting.analytics.persistence.AccountingPersistenceQueryFactory; import org.gcube.accounting.datamodel.aggregation.AggregatedServiceUsageRecord; import org.gcube.common.authorization.client.Constants; import org.gcube.common.authorization.library.AuthorizationEntry; import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.authorization.library.provider.UserInfo; import org.gcube.common.resources.gcore.GCoreEndpoint; import org.gcube.common.resources.gcore.GenericResource; import org.gcube.common.resources.gcore.HostingNode; import org.gcube.common.resources.gcore.Resource; import org.gcube.common.resources.gcore.ServiceEndpoint; import org.gcube.common.resources.gcore.Software; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.scope.impl.ScopeBean; import org.gcube.documentstore.records.AggregatedRecord; import org.gcube.resources.discovery.client.api.DiscoveryClient; import org.gcube.resources.discovery.client.queries.api.SimpleQuery; import org.gcube.resources.discovery.icclient.ICFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ContextStatistic { protected Logger logger = LoggerFactory.getLogger(ContextStatistic.class); public static Calendar START_TIME; public static Calendar END_TIME; private static AccountingPersistenceQuery apq; static { START_TIME = Utility.getAggregationStartCalendar(2017, Calendar.JANUARY, 1); END_TIME = Utility.getAggregationStartCalendar(2017, Calendar.DECEMBER, 1); apq = AccountingPersistenceQueryFactory.getInstance(); } private ScopeBean scopeBean; public ScopeBean getScopeBean() { return scopeBean; } private Map,Set>> resourceMap; private Map,SummaryStatistics> statisticsMap; private SortedMap accountingData; public ContextStatistic(ScopeBean scopeBean) { this.scopeBean = scopeBean; } public void analizeInstances(Class clz) throws Exception { Set> resources = resourceMap.get(clz); if(resources==null) { resources = new TreeSet<>(); resourceMap.put(clz, resources); } DiscoveryClient client = ICFactory.clientFor(clz); SimpleQuery query = ICFactory.queryFor(clz); // logger.debug(query.expression()); List instances = client.submit(query); for(R r : instances) { ResourceInfo resourceInfo = new ResourceInfo(r); if(r instanceof HostingNode) { HostingNode hn = (HostingNode) r; if(hn.profile().description().status().compareTo("certified")!=0) { continue; } Calendar now = Calendar.getInstance(); now.add(Calendar.DAY_OF_MONTH, -1); if(hn.profile().description().lastUpdate().before(now)) { continue; } } if(r instanceof GCoreEndpoint) { GCoreEndpoint gce = (GCoreEndpoint) r; if(gce.profile().deploymentData().status().compareTo("ready")!=0) { continue; } } resources.add(resourceInfo); } } @SuppressWarnings("unused") private String generateUserToken(String context) throws Exception { AuthorizationEntry authorizationEntry = Constants.authorizationService() .get(SecurityTokenProvider.instance.get()); UserInfo userInfo = (UserInfo) authorizationEntry.getClientInfo(); String userToken = authorizationService().generateUserToken(userInfo, context); logger.trace("Token for Context {} for {} is {}", context, userInfo.getId(), userToken); return userToken; } public Map,Set>> getAllResources() throws Exception { if(resourceMap == null) { resourceMap = new HashMap<>(); List> classes = new ArrayList<>(); classes.add(HostingNode.class); classes.add(GCoreEndpoint.class); classes.add(ServiceEndpoint.class); classes.add(GenericResource.class); classes.add(Software.class); String contextFullName = scopeBean.toString(); /* String token = generateUserToken(contextFullName); ContextTest.setContext(token); */ ScopeProvider.instance.set(contextFullName); for(Class clz : classes) { Thread.sleep(TimeUnit.SECONDS.toMillis(5)); analizeInstances(clz); } } return resourceMap; } public static Map,SummaryStatistics> generateStatistics( Map,Set>> resourceMap) throws UnsupportedEncodingException { Map,SummaryStatistics> statisticsMap = new HashMap<>(); for(Class clz : resourceMap.keySet()) { SummaryStatistics summaryStatistics = new SummaryStatistics(); Set> resources = resourceMap.get(clz); for(ResourceInfo resourceInfo : resources) { summaryStatistics.addValue(resourceInfo.getSize()); } statisticsMap.put(clz, summaryStatistics); } return statisticsMap; } public SortedMap getAccountingData() throws Exception { if(accountingData==null) { TemporalConstraint temporalConstraint = new TemporalConstraint( START_TIME.getTimeInMillis(), END_TIME.getTimeInMillis(), AggregationMode.MONTHLY); List filters = new ArrayList<>(); Filter filter = new Filter("serviceClass", "InformationSystem"); filters.add(filter); Class> clz = AggregatedServiceUsageRecord.class; // AccountingPersistenceQueryFactory.getForcedQueryScope().set(scopeBean.toString()); accountingData = apq.getTimeSeries(clz, temporalConstraint, filters, true); } return accountingData; } public Map,SummaryStatistics> getStatistics() throws Exception { if(statisticsMap == null) { getAllResources(); statisticsMap = generateStatistics(resourceMap); } return statisticsMap; } }