Skip to content
Snippets Groups Projects
Commit 21e8cb05 authored by kohleman's avatar kohleman
Browse files

- using v3 for new features

- add "data transferred" timestamp to lane
- If rsync fails (data copy), then send a mail to the admin

SVN: 38068
parent 16e15aeb
No related branches found
No related tags found
No related merge requests found
...@@ -17,6 +17,8 @@ ...@@ -17,6 +17,8 @@
package ch.ethz.bsse.cisd.dsu.tracking.main; package ch.ethz.bsse.cisd.dsu.tracking.main;
import java.io.File; import java.io.File;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
...@@ -35,11 +37,14 @@ import ch.ethz.bsse.cisd.dsu.tracking.email.EmailWithSummary; ...@@ -35,11 +37,14 @@ import ch.ethz.bsse.cisd.dsu.tracking.email.EmailWithSummary;
import ch.ethz.bsse.cisd.dsu.tracking.email.IEntityTrackingEmailGenerator; import ch.ethz.bsse.cisd.dsu.tracking.email.IEntityTrackingEmailGenerator;
import ch.ethz.bsse.cisd.dsu.tracking.utils.LogUtils; import ch.ethz.bsse.cisd.dsu.tracking.utils.LogUtils;
import ch.systemsx.cisd.common.collection.CollectionUtils; import ch.systemsx.cisd.common.collection.CollectionUtils;
import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
import ch.systemsx.cisd.common.exceptions.ExceptionWithStatus; import ch.systemsx.cisd.common.exceptions.ExceptionWithStatus;
import ch.systemsx.cisd.common.exceptions.Status; import ch.systemsx.cisd.common.exceptions.Status;
import ch.systemsx.cisd.common.filesystem.rsync.RsyncCopier; import ch.systemsx.cisd.common.filesystem.rsync.RsyncCopier;
import ch.systemsx.cisd.common.mail.EMailAddress; import ch.systemsx.cisd.common.mail.EMailAddress;
import ch.systemsx.cisd.common.mail.IMailClient; import ch.systemsx.cisd.common.mail.IMailClient;
import ch.systemsx.cisd.common.shared.basic.string.StringUtils;
import ch.systemsx.cisd.common.spring.HttpInvokerUtils;
import ch.systemsx.cisd.openbis.dss.generic.shared.utils.RSyncConfig; import ch.systemsx.cisd.openbis.dss.generic.shared.utils.RSyncConfig;
import ch.systemsx.cisd.openbis.generic.shared.ITrackingServer; import ch.systemsx.cisd.openbis.generic.shared.ITrackingServer;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
...@@ -50,6 +55,13 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria ...@@ -50,6 +55,13 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingSampleCriteria; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingSampleCriteria;
import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO; import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO;
import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchResult;
// v3
import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.create.SampleCreation;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.fetchoptions.SampleFetchOptions;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.SampleSearchCriteria;
import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.update.SampleUpdate;
/** /**
* @author Tomasz Pylak * @author Tomasz Pylak
...@@ -70,6 +82,11 @@ public class TrackingBO ...@@ -70,6 +82,11 @@ public class TrackingBO
private static final String PROCESSING_SUCCESSFUL_PROPERTY_CODE = private static final String PROCESSING_SUCCESSFUL_PROPERTY_CODE =
"LIBRARY_PROCESSING_SUCCESSFUL"; "LIBRARY_PROCESSING_SUCCESSFUL";
private static final String PROPERTY_DATA_TRANSFERRED = "DATA_TRANSFERRED";
/** The default date format pattern. */
public static final String DATE_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss";
private static final String TRUE = "true"; private static final String TRUE = "true";
...@@ -78,7 +95,7 @@ public class TrackingBO ...@@ -78,7 +95,7 @@ public class TrackingBO
private final IEntityTrackingEmailGenerator emailGenerator; private final IEntityTrackingEmailGenerator emailGenerator;
private final IMailClient mailClient; private final IMailClient mailClient;
public TrackingBO(ITrackingServer trackingServer, IEntityTrackingEmailGenerator emailGenerator, public TrackingBO(ITrackingServer trackingServer, IEntityTrackingEmailGenerator emailGenerator,
IMailClient mailClient) IMailClient mailClient)
{ {
...@@ -88,7 +105,7 @@ public class TrackingBO ...@@ -88,7 +105,7 @@ public class TrackingBO
} }
public void trackAndNotify(ITrackingDAO trackingDAO, final HashMap<String, String[]> commandLineMap, public void trackAndNotify(ITrackingDAO trackingDAO, final HashMap<String, String[]> commandLineMap,
Parameters params, SessionContextDTO session) Parameters params, SessionContextDTO session, IApplicationServerApi v3, String v3SessionToken)
{ {
Boolean sendEmails = true; Boolean sendEmails = true;
TrackingStateDTO prevTrackingState = trackingDAO.getTrackingState(); TrackingStateDTO prevTrackingState = trackingDAO.getTrackingState();
...@@ -103,7 +120,7 @@ public class TrackingBO ...@@ -103,7 +120,7 @@ public class TrackingBO
{ {
String[] laneCodeList = commandLineMap.get(TrackingClient.CL_PARAMETER_LANES); String[] laneCodeList = commandLineMap.get(TrackingClient.CL_PARAMETER_LANES);
changedEntities = fetchChangedDataSets(prevTrackingState, trackingServer, params, changedEntities = fetchChangedDataSets(prevTrackingState, trackingServer, params,
commandLineMap, laneCodeList, session); commandLineMap, laneCodeList, session, v3, v3SessionToken);
} }
else if (commandLineMap.get(TrackingClient.CL_PARAMETER_REMOVE_LANES) != null) else if (commandLineMap.get(TrackingClient.CL_PARAMETER_REMOVE_LANES) != null)
...@@ -111,7 +128,7 @@ public class TrackingBO ...@@ -111,7 +128,7 @@ public class TrackingBO
sendEmails = false; sendEmails = false;
String[] laneCodeList = commandLineMap.get(TrackingClient.CL_PARAMETER_REMOVE_LANES); String[] laneCodeList = commandLineMap.get(TrackingClient.CL_PARAMETER_REMOVE_LANES);
changedEntities = fetchChangedDataSets(prevTrackingState, trackingServer, params, changedEntities = fetchChangedDataSets(prevTrackingState, trackingServer, params,
commandLineMap, laneCodeList, session); commandLineMap, laneCodeList, session, v3, v3SessionToken);
} }
else if (commandLineMap.containsKey(TrackingClient.CL_PARAMETER_ALL)) else if (commandLineMap.containsKey(TrackingClient.CL_PARAMETER_ALL))
...@@ -352,7 +369,7 @@ public class TrackingBO ...@@ -352,7 +369,7 @@ public class TrackingBO
private static TrackedEntities fetchChangedDataSets(TrackingStateDTO trackingState, private static TrackedEntities fetchChangedDataSets(TrackingStateDTO trackingState,
ITrackingServer trackingServer, Parameters params, final HashMap<String, String[]> commandLineMap, ITrackingServer trackingServer, Parameters params, final HashMap<String, String[]> commandLineMap,
String[] laneCodeList, SessionContextDTO session) String[] laneCodeList, SessionContextDTO session, IApplicationServerApi v3, String v3SessionToken)
{ {
long usableDataSetId = getUsableDataSetId(trackingState, params); long usableDataSetId = getUsableDataSetId(trackingState, params);
...@@ -420,11 +437,53 @@ public class TrackingBO ...@@ -420,11 +437,53 @@ public class TrackingBO
extraDataSetCopy(params, toTransferDataSets); extraDataSetCopy(params, toTransferDataSets);
} }
LogUtils.info("Found " + filteredDataSets.size() + " data sets which are connected to samples in " + filterList.toString()); LogUtils.info("Found " + filteredDataSets.size() + " data sets which are connected to samples in " + filterList.toString());
setLaneProperties(changedTrackingMap, v3, v3SessionToken);
return gatherTrackedEntities(trackingState, trackingServer, session, filteredDataSets, changedTrackingMap); return gatherTrackedEntities(trackingState, trackingServer, session, filteredDataSets, changedTrackingMap);
} }
private static SearchResult<ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample> searchForSamples(String permId, String v3sessionToken, IApplicationServerApi v3)
{
SampleSearchCriteria criterion = new SampleSearchCriteria();
criterion.withPermId().thatEquals(permId);
SampleFetchOptions fetchOptions = new SampleFetchOptions();
fetchOptions.withProperties();
return v3.searchSamples(v3sessionToken, criterion, fetchOptions);
}
private static void extraDataSetCopy(Parameters params, List<AbstractExternalData> dataSets)
private static void setLaneProperties(HashMap<String, ArrayList<Long>> changedTrackingMap, IApplicationServerApi v3, String v3sessionToken) {
for (String lanePermId : changedTrackingMap.keySet()) {
SearchResult<ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample> samples = searchForSamples(lanePermId, v3sessionToken, v3);
for (ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample sample : samples.getObjects())
{
SampleUpdate sampleToUpdate = new SampleUpdate();
sampleToUpdate.setSampleId(sample.getPermId());
sampleToUpdate.setProperty(PROPERTY_DATA_TRANSFERRED, getCurrentDateTime());
v3.updateSamples(v3sessionToken, Arrays.asList(sampleToUpdate));
}
}
}
private static String getCurrentDateTime() {
final DateTimeFormatter dtf = DateTimeFormatter.ofPattern(DATE_FORMAT_PATTERN);
LocalDateTime now = LocalDateTime.now();
return dtf.format(now);
}
private static void extraDataSetCopy(Parameters params, List<AbstractExternalData> dataSets)
{ {
RsyncCopier copier = null; RsyncCopier copier = null;
...@@ -465,7 +524,26 @@ public class TrackingBO ...@@ -465,7 +524,26 @@ public class TrackingBO
if (status.isError()) if (status.isError())
{ {
throw new ExceptionWithStatus(status); String exceptionMsg =
(status == null) ? "" : " Unexpected exception has occured: "
+ status.toString();
List<EMailAddress> adminEmails = new ArrayList<EMailAddress>();
for (String adminEmail : params.getAdminEmail().split(","))
{
adminEmails.add(new EMailAddress(adminEmail.trim()));
}
EnvironmentFailureException ret =
LogUtils.environmentError(
"Data trasnfer failed for %s. %s",
ds.getCode(), exceptionMsg);
IMailClient emailClient = params.getMailClient();
emailClient.sendEmailMessage("GFB Tracker: Data transfer problem",
ret.getLocalizedMessage(), null,
new EMailAddress(params.getNotificationEmail()),
adminEmails.toArray(new EMailAddress[0]));
} }
LogUtils.info(String.format("Got status: " + status + " for " + ds.getCode() + ", finished after %.2f s", LogUtils.info(String.format("Got status: " + status + " for " + ds.getCode() + ", finished after %.2f s",
......
...@@ -39,6 +39,7 @@ import org.apache.commons.lang.time.DateUtils; ...@@ -39,6 +39,7 @@ import org.apache.commons.lang.time.DateUtils;
import ch.ethz.bsse.cisd.dsu.tracking.email.EntityTrackingEmailGenerator; import ch.ethz.bsse.cisd.dsu.tracking.email.EntityTrackingEmailGenerator;
import ch.ethz.bsse.cisd.dsu.tracking.email.IEntityTrackingEmailGenerator; import ch.ethz.bsse.cisd.dsu.tracking.email.IEntityTrackingEmailGenerator;
import ch.ethz.bsse.cisd.dsu.tracking.utils.LogUtils; import ch.ethz.bsse.cisd.dsu.tracking.utils.LogUtils;
import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
import ch.systemsx.cisd.common.io.PropertyIOUtils; import ch.systemsx.cisd.common.io.PropertyIOUtils;
import ch.systemsx.cisd.common.logging.LogInitializer; import ch.systemsx.cisd.common.logging.LogInitializer;
...@@ -49,6 +50,9 @@ import ch.systemsx.cisd.common.spring.HttpInvokerUtils; ...@@ -49,6 +50,9 @@ import ch.systemsx.cisd.common.spring.HttpInvokerUtils;
import ch.systemsx.cisd.openbis.generic.shared.ITrackingServer; import ch.systemsx.cisd.openbis.generic.shared.ITrackingServer;
import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO; import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO;
// v3
import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
/** /**
* @author Tomasz Pylak * @author Tomasz Pylak
* @author Manuel Kohler * @author Manuel Kohler
...@@ -77,6 +81,10 @@ public class TrackingClient ...@@ -77,6 +81,10 @@ public class TrackingClient
public static final String CL_PARAMETER_LIST_SPACES = "list_spaces"; public static final String CL_PARAMETER_LIST_SPACES = "list_spaces";
private static IApplicationServerApi v3;
private static String v3SessionToken;
public static void main(String[] args) public static void main(String[] args)
{ {
try try
...@@ -180,6 +188,10 @@ public class TrackingClient ...@@ -180,6 +188,10 @@ public class TrackingClient
ITrackingServer trackingServer = createOpenBISTrackingServer(params); ITrackingServer trackingServer = createOpenBISTrackingServer(params);
SessionContextDTO session = authentificateInOpenBIS(params, trackingServer); SessionContextDTO session = authentificateInOpenBIS(params, trackingServer);
// also login to the v3 API
IApplicationServerApi v3 = initV3(params);
v3SessionToken = v3.login(params.getOpenbisUser(), params.getOpenbisPassword());
IEntityTrackingEmailGenerator emailGenerator = IEntityTrackingEmailGenerator emailGenerator =
new EntityTrackingEmailGenerator(props, retrieveEmailTemplate(), session); new EntityTrackingEmailGenerator(props, retrieveEmailTemplate(), session);
...@@ -188,7 +200,7 @@ public class TrackingClient ...@@ -188,7 +200,7 @@ public class TrackingClient
ITrackingDAO trackingDAO = new FileBasedTrackingDAO(LOCAL_SAMPLE_DB, LOCAL_DATASET_DB); ITrackingDAO trackingDAO = new FileBasedTrackingDAO(LOCAL_SAMPLE_DB, LOCAL_DATASET_DB);
trackingBO.trackAndNotify(trackingDAO, commandLineMap, params, session); trackingBO.trackAndNotify(trackingDAO, commandLineMap, params, session, v3, v3SessionToken);
} }
private static ITrackingServer createOpenBISTrackingServer(Parameters params) private static ITrackingServer createOpenBISTrackingServer(Parameters params)
...@@ -263,4 +275,11 @@ public class TrackingClient ...@@ -263,4 +275,11 @@ public class TrackingClient
} }
return ret; return ret;
} }
private static IApplicationServerApi initV3(Parameters params) {
v3 = HttpInvokerUtils
.createServiceStub(IApplicationServerApi.class, params.getOpenbisServerURL()
+ IApplicationServerApi.SERVICE_URL, 10000);
return v3;
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment