diff --git a/src/main/java/org/gcube/vremanagement/executor/pluginmanager/RunnablePlugin.java b/src/main/java/org/gcube/vremanagement/executor/pluginmanager/RunnablePlugin.java index 940fa8e..0909a45 100644 --- a/src/main/java/org/gcube/vremanagement/executor/pluginmanager/RunnablePlugin.java +++ b/src/main/java/org/gcube/vremanagement/executor/pluginmanager/RunnablePlugin.java @@ -3,11 +3,19 @@ */ package org.gcube.vremanagement.executor.pluginmanager; +import java.io.Serializable; import java.util.Calendar; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; +import org.gcube.accounting.datamodel.UsageRecord.OperationResult; +import org.gcube.accounting.datamodel.usagerecords.TaskUsageRecord; +import org.gcube.accounting.persistence.AccountingPersistence; +import org.gcube.accounting.persistence.AccountingPersistenceFactory; +import org.gcube.documentstore.exception.InvalidValueException; +import org.gcube.vremanagement.executor.SmartExecutorInitializator; import org.gcube.vremanagement.executor.exception.AlreadyInFinalStateException; import org.gcube.vremanagement.executor.exception.InvalidPluginStateEvolutionException; import org.gcube.vremanagement.executor.plugin.Plugin; @@ -15,6 +23,9 @@ import org.gcube.vremanagement.executor.plugin.PluginDeclaration; import org.gcube.vremanagement.executor.plugin.PluginState; import org.gcube.vremanagement.executor.plugin.PluginStateEvolution; import org.gcube.vremanagement.executor.plugin.PluginStateNotification; +import org.gcube.vremanagement.executor.plugin.Ref; +import org.gcube.vremanagement.executor.plugin.RunOn; +import org.gcube.vremanagement.executor.scheduledtask.ScheduledTask; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,6 +43,9 @@ public class RunnablePlugin> imple public static final String MAX_LAUNCH_TIMES = "___max_launch_times___"; protected static final String SEPARATOR = "---"; + + private static final String ITERATION_NUMBER = "iterationNumber"; + private static final String FINAL_STATE = "finalState"; protected final T plugin; @@ -64,8 +78,36 @@ public class RunnablePlugin> imple @Override public void run(){ + TaskUsageRecord taskUsageRecord = new TaskUsageRecord(); + try { setState(PluginState.RUNNING); + + Calendar taskStartTime = Calendar.getInstance(); + taskStartTime.setTimeInMillis(actualStateEvolution.getTimestamp()); + taskUsageRecord.setTaskStartTime(taskStartTime); + + taskUsageRecord.setTaskId(uuid.toString()); + taskUsageRecord.setResourceProperty(ITERATION_NUMBER, iterationNumber); + + taskUsageRecord.setConsumerId(SmartExecutorInitializator.getClientInfo().getId()); + + RunOn runOn = ScheduledTask.generateRunOn(); + Ref hnRef = runOn.getHostingNode(); + taskUsageRecord.setRefHostingNodeId(hnRef.getId()); + taskUsageRecord.setHost(hnRef.getAddress()); + + + HashMap map = + new HashMap(); + for(String key : inputs.keySet()){ + if(inputs.get(key) instanceof Serializable){ + map.put(key, (Serializable) inputs.get(key)); + } + } + taskUsageRecord.setInputParameters(map); + + this.plugin.setUUID(uuid); this.plugin.setIterationNumber(iterationNumber); this.plugin.launch(inputs); @@ -80,6 +122,31 @@ public class RunnablePlugin> imple return; } throw new RuntimeException(e); + }finally { + AccountingPersistence accountingPersistence = + AccountingPersistenceFactory.getPersistence(); + try { + Calendar taskEndTime = Calendar.getInstance(); + taskEndTime.setTimeInMillis(actualStateEvolution.getTimestamp()); + taskUsageRecord.setTaskStartTime(taskEndTime); + + PluginState pluginState = actualStateEvolution.getPluginState(); + switch (pluginState) { + case DONE: + taskUsageRecord.setOperationResult(OperationResult.SUCCESS); + break; + + default: + taskUsageRecord.setOperationResult(OperationResult.FAILED); + break; + } + taskUsageRecord.setResourceProperty(FINAL_STATE, pluginState.toString()); + + accountingPersistence.account(taskUsageRecord); + + } catch (InvalidValueException e) { + logger.error("Unable to account {}", taskUsageRecord, e); + } } }