From d77609256dde01959fbf73e938be21ca20f35dae Mon Sep 17 00:00:00 2001 From: pfurio Date: Wed, 7 Aug 2024 09:38:02 +0200 Subject: [PATCH] catalog: add new update operation, #TASK-6445 --- .../analysis/tools/NextFlowExecutor.java | 4 +- .../analysis/tools/WorkflowExecutorTest.java | 18 ++- .../app/cloud/docker/opencga-base/Dockerfile | 2 +- .../catalog/db/api/WorkflowDBAdaptor.java | 4 +- .../SnapshotVersionedMongoDBAdaptor.java | 4 + .../db/mongodb/WorkflowMongoDBAdaptor.java | 125 +++++++++++++++-- .../mongodb/converters/WorkflowConverter.java | 2 +- .../catalog/managers/WorkflowManager.java | 76 +++++++++- .../src/main/resources/catalog-indexes.txt | 9 +- .../opencga/core/api/FieldConstants.java | 13 ++ .../NextFlowRunParams.java | 2 +- .../{nextflow => workflow}/Workflow.java | 54 +++++++- .../models/workflow/WorkflowCreateParams.java | 130 ++++++++++++++++++ .../models/workflow/WorkflowUpdateParams.java | 108 +++++++++++++++ 14 files changed, 515 insertions(+), 36 deletions(-) rename opencga-core/src/main/java/org/opencb/opencga/core/models/{nextflow => workflow}/NextFlowRunParams.java (95%) rename opencga-core/src/main/java/org/opencb/opencga/core/models/{nextflow => workflow}/Workflow.java (62%) create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/workflow/WorkflowCreateParams.java create mode 100644 opencga-core/src/main/java/org/opencb/opencga/core/models/workflow/WorkflowUpdateParams.java diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/NextFlowExecutor.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/NextFlowExecutor.java index c179242d714..caf4b065117 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/NextFlowExecutor.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/tools/NextFlowExecutor.java @@ -11,8 +11,8 @@ import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.exceptions.ToolException; import org.opencb.opencga.core.models.common.Enums; -import org.opencb.opencga.core.models.nextflow.NextFlowRunParams; -import org.opencb.opencga.core.models.nextflow.Workflow; +import org.opencb.opencga.core.models.workflow.NextFlowRunParams; +import org.opencb.opencga.core.models.workflow.Workflow; import org.opencb.opencga.core.response.OpenCGAResult; import org.opencb.opencga.core.tools.annotations.Tool; import org.opencb.opencga.core.tools.annotations.ToolParams; diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/tools/WorkflowExecutorTest.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/tools/WorkflowExecutorTest.java index c9b42d8c78a..c80d59681fe 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/tools/WorkflowExecutorTest.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/tools/WorkflowExecutorTest.java @@ -8,8 +8,9 @@ import org.opencb.opencga.catalog.managers.AbstractManagerTest; import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.core.exceptions.ToolException; -import org.opencb.opencga.core.models.nextflow.NextFlowRunParams; -import org.opencb.opencga.core.models.nextflow.Workflow; +import org.opencb.opencga.core.models.workflow.NextFlowRunParams; +import org.opencb.opencga.core.models.workflow.Workflow; +import org.opencb.opencga.core.models.workflow.WorkflowCreateParams; import org.opencb.opencga.storage.core.StorageEngineFactory; import java.io.IOException; @@ -26,7 +27,7 @@ public void nextflowScriptTest() throws ToolException, CatalogException, IOExcep InputStream inputStream = StorageManager.class.getClassLoader().getResourceAsStream("storage-configuration.yml"); StorageConfiguration storageConfiguration = StorageConfiguration.load(inputStream, "yml"); - Workflow workflow = getDummyWorkflow(); + WorkflowCreateParams workflow = createDummyWorkflow(); catalogManager.getWorkflowManager().create(workflow, QueryOptions.empty(), ownerToken); Path outDir = Paths.get(catalogManagerResource.createTmpOutdir("_nextflow")); @@ -45,10 +46,9 @@ public void nextflowScriptTest() throws ToolException, CatalogException, IOExcep public void nextflowDockerTest() throws ToolException, CatalogException, IOException { InputStream inputStream = StorageManager.class.getClassLoader().getResourceAsStream("storage-configuration.yml"); StorageConfiguration storageConfiguration = StorageConfiguration.load(inputStream, "yml"); - Workflow workflow = new Workflow() + WorkflowCreateParams workflow = new WorkflowCreateParams() .setId("workflow") - .setCommandLine("run nextflow-io/rnaseq-nf -with-docker") - .setType(Workflow.Type.NEXTFLOW); + .setCommandLine("run nextflow-io/rnaseq-nf -with-docker"); catalogManager.getWorkflowManager().create(workflow, QueryOptions.empty(), ownerToken); Path outDir = Paths.get(catalogManagerResource.createTmpOutdir("_nextflow")); @@ -62,8 +62,7 @@ public void nextflowDockerTest() throws ToolException, CatalogException, IOExcep System.out.println(stopWatch.getTime(TimeUnit.MILLISECONDS)); } - - private Workflow getDummyWorkflow() { + private WorkflowCreateParams createDummyWorkflow() { String scriptContent = "params.str = 'Hello world!'\n" + "\n" + "process splitLetters {\n" + @@ -99,10 +98,9 @@ private Workflow getDummyWorkflow() { "workflow {\n" + " splitLetters | flatten | convertToUpper | view { it.trim() } | sleep\n" + "}"; - return new Workflow() + return new WorkflowCreateParams() .setId("workflow") .setCommandLine("run pipeline.nf") - .setType(Workflow.Type.NEXTFLOW) .setScripts(Collections.singletonList(new Workflow.Script("pipeline.nf", scriptContent))); } } diff --git a/opencga-app/app/cloud/docker/opencga-base/Dockerfile b/opencga-app/app/cloud/docker/opencga-base/Dockerfile index e488f4fb50b..35b25be2b02 100644 --- a/opencga-app/app/cloud/docker/opencga-base/Dockerfile +++ b/opencga-app/app/cloud/docker/opencga-base/Dockerfile @@ -1,6 +1,6 @@ ## Based on Ubuntu 22.04 (jammy) ## We are now using OpenJDK 8u372 to support "cgroup v2", see https://developers.redhat.com/articles/2023/04/19/openjdk-8u372-feature-cgroup-v2-support# -FROM eclipse-temurin:11.0.23_9-jre-jammy +FROM eclipse-temurin:11.0.24_8-jre-noble ARG BUILD_PATH="." diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/WorkflowDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/WorkflowDBAdaptor.java index cc9ebc9e96a..fddf1dd5898 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/WorkflowDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/WorkflowDBAdaptor.java @@ -6,7 +6,7 @@ import org.opencb.opencga.catalog.exceptions.CatalogAuthorizationException; import org.opencb.opencga.catalog.exceptions.CatalogDBException; import org.opencb.opencga.catalog.exceptions.CatalogParameterException; -import org.opencb.opencga.core.models.nextflow.Workflow; +import org.opencb.opencga.core.models.workflow.Workflow; import org.opencb.opencga.core.response.OpenCGAResult; import java.util.Map; @@ -22,6 +22,7 @@ enum QueryParams implements QueryParam { ID("id", TEXT, ""), UID("uid", LONG, ""), UUID("uuid", TEXT, ""), + DESCRIPTION("description", TEXT, ""), TYPE("type", TEXT, ""), COMMAND_LINE("commandLine", TEXT, ""), SCRIPTS("scripts", OBJECT, ""), @@ -30,6 +31,7 @@ enum QueryParams implements QueryParam { VERSION("version", INTEGER, ""), // Version of the sample CREATION_DATE("creationDate", DATE, ""), MODIFICATION_DATE("modificationDate", DATE, ""), + ATTRIBUTES("attributes", OBJECT, ""), STUDY_UID("studyUid", INTEGER_ARRAY, ""), STUDY("study", INTEGER_ARRAY, ""); // Alias to studyId in the database. Only for the webservices. diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/SnapshotVersionedMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/SnapshotVersionedMongoDBAdaptor.java index 1c782686bf7..8a4ac1ed734 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/SnapshotVersionedMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/SnapshotVersionedMongoDBAdaptor.java @@ -218,6 +218,10 @@ protected OpenCGAResult update(ClientSession session, Bson sourceQuery, L } } + if (entryList.isEmpty()) { + throw new CatalogDBException("No documents could be found to be updated"); + } + // 2. Execute main update OpenCGAResult executionResult = update.execute(entryList); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/WorkflowMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/WorkflowMongoDBAdaptor.java index 809550306c0..0b62903cf8f 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/WorkflowMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/WorkflowMongoDBAdaptor.java @@ -6,10 +6,7 @@ import org.apache.commons.lang3.time.StopWatch; import org.bson.Document; import org.bson.conversions.Bson; -import org.opencb.commons.datastore.core.DataResult; -import org.opencb.commons.datastore.core.ObjectMap; -import org.opencb.commons.datastore.core.Query; -import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.commons.datastore.core.*; import org.opencb.commons.datastore.mongodb.MongoDBCollection; import org.opencb.commons.datastore.mongodb.MongoDBIterator; import org.opencb.opencga.catalog.db.api.DBIterator; @@ -20,17 +17,20 @@ import org.opencb.opencga.catalog.exceptions.CatalogDBException; import org.opencb.opencga.catalog.exceptions.CatalogParameterException; import org.opencb.opencga.catalog.utils.Constants; +import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; -import org.opencb.opencga.core.models.nextflow.Workflow; +import org.opencb.opencga.core.models.workflow.Workflow; import org.opencb.opencga.core.response.OpenCGAResult; import org.slf4j.LoggerFactory; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; +import java.util.stream.Collectors; -import static org.opencb.opencga.catalog.db.mongodb.MongoDBUtils.fixAclProjection; +import static org.opencb.opencga.catalog.db.api.ClinicalAnalysisDBAdaptor.QueryParams.MODIFICATION_DATE; +import static org.opencb.opencga.catalog.db.mongodb.MongoDBUtils.*; public class WorkflowMongoDBAdaptor extends CatalogMongoDBAdaptor implements WorkflowDBAdaptor { @@ -231,15 +231,121 @@ public OpenCGAResult stats(Query query) { } @Override - public OpenCGAResult update(long id, ObjectMap parameters, QueryOptions queryOptions) + public OpenCGAResult update(long uid, ObjectMap parameters, QueryOptions queryOptions) throws CatalogDBException, CatalogParameterException, CatalogAuthorizationException { - return null; + Query query = new Query(QueryParams.UID.key(), uid); + return update(query, parameters, queryOptions); } @Override public OpenCGAResult update(Query query, ObjectMap parameters, QueryOptions queryOptions) throws CatalogDBException, CatalogParameterException, CatalogAuthorizationException { - return null; + try { + return runTransaction(clientSession -> privateUpdate(clientSession, query, parameters, queryOptions)); + } catch (CatalogDBException e) { + logger.error("Could not update workflows for query {}", query.toJson(), e); + throw new CatalogDBException("Could not update workflows based on query " + query.toJson(), e); + } + } + + OpenCGAResult privateUpdate(ClientSession clientSession, Query query, ObjectMap parameters, QueryOptions queryOptions) + throws CatalogDBException, CatalogParameterException, CatalogAuthorizationException { + long tmpStartTime = startQuery(); + Bson bsonQuery = parseQuery(query); + return versionedMongoDBAdaptor.update(clientSession, bsonQuery, (entrylist) -> { + String workflowIds = entrylist.stream().map(w -> w.getString(QueryParams.ID.key())).collect(Collectors.joining(", ")); + + UpdateDocument updateParams = parseAndValidateUpdateParams(parameters, queryOptions); + Document workflowUpdate = updateParams.toFinalUpdateDocument(); + + if (workflowUpdate.isEmpty()) { + if (!parameters.isEmpty()) { + logger.error("Non-processed update parameters: {}", parameters.keySet()); + } + throw new CatalogDBException("Nothing to be updated"); + } + + List events = new ArrayList<>(); + + logger.debug("Workflow update: query : {}, update: {}", bsonQuery.toBsonDocument(), workflowUpdate.toBsonDocument()); + DataResult result = workflowCollection.update(clientSession, bsonQuery, workflowUpdate, + new QueryOptions(MongoDBCollection.MULTI, true)); + + if (result.getNumMatches() == 0) { + throw new CatalogDBException("Workflow(s) '" + workflowIds + "' not found"); + } + if (result.getNumUpdated() == 0) { + events.add(new Event(Event.Type.WARNING, workflowIds, "Workflow(s) already updated")); + } + logger.debug("Workflow(s) '{}' successfully updated", workflowIds); + + + return endWrite(tmpStartTime, result.getNumMatches(), result.getNumUpdated(), events); + }, null, null); + } + + private UpdateDocument parseAndValidateUpdateParams(ObjectMap parameters, QueryOptions queryOptions) throws CatalogDBException { + if (parameters.containsKey(QueryParams.ID.key())) { + throw new CatalogDBException("It is not allowed to update the 'id' of a workflow"); + } + + UpdateDocument document = new UpdateDocument(); + + if (StringUtils.isNotEmpty(parameters.getString(QueryParams.CREATION_DATE.key()))) { + String time = parameters.getString(QueryParams.CREATION_DATE.key()); + Date date = TimeUtils.toDate(time); + document.getSet().put(QueryParams.CREATION_DATE.key(), time); + document.getSet().put(PRIVATE_CREATION_DATE, date); + } + if (StringUtils.isNotEmpty(parameters.getString(MODIFICATION_DATE.key()))) { + String time = parameters.getString(QueryParams.MODIFICATION_DATE.key()); + Date date = TimeUtils.toDate(time); + document.getSet().put(QueryParams.MODIFICATION_DATE.key(), time); + document.getSet().put(PRIVATE_MODIFICATION_DATE, date); + } + + final String[] acceptedParams = {QueryParams.DESCRIPTION.key(), QueryParams.COMMAND_LINE.key()}; + filterStringParams(parameters, document.getSet(), acceptedParams); + + final String[] acceptedMapParams = {QueryParams.ATTRIBUTES.key()}; + filterMapParams(parameters, document.getSet(), acceptedMapParams); + + // Check if the tags exist. + if (parameters.containsKey(QueryParams.SCRIPTS.key())) { + List scriptList = parameters.getAsList(QueryParams.SCRIPTS.key(), Workflow.Script.class); + + if (!scriptList.isEmpty()) { + Map actionMap = queryOptions.getMap(Constants.ACTIONS, new HashMap<>()); + ParamUtils.BasicUpdateAction operation = + ParamUtils.BasicUpdateAction.from(actionMap, QueryParams.SCRIPTS.key(), ParamUtils.BasicUpdateAction.ADD); + switch (operation) { + case SET: + document.getSet().put(QueryParams.SCRIPTS.key(), scriptList); + break; + case REMOVE: + document.getPullAll().put(QueryParams.SCRIPTS.key(), scriptList); + break; + case ADD: + document.getAddToSet().put(QueryParams.SCRIPTS.key(), scriptList); + break; + default: + throw new IllegalArgumentException("Unknown update action " + operation); + } + } + } + + if (!document.toFinalUpdateDocument().isEmpty()) { + String time = TimeUtils.getTime(); + if (StringUtils.isEmpty(parameters.getString(QueryParams.MODIFICATION_DATE.key()))) { + // Update modificationDate param + Date date = TimeUtils.toDate(time); + document.getSet().put(QueryParams.MODIFICATION_DATE.key(), time); + document.getSet().put(PRIVATE_MODIFICATION_DATE, date); + } + document.getSet().put(INTERNAL_LAST_MODIFIED, time); + } + + return document; } @Override @@ -355,6 +461,7 @@ private Bson parseQuery(Query query, String user) throws CatalogDBException, Cat case UUID: case RELEASE: case VERSION: + case TYPE: addAutoOrQuery(queryParam.key(), queryParam.key(), queryCopy, queryParam.type(), andBsonList); break; default: diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/WorkflowConverter.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/WorkflowConverter.java index 589220cacaa..5fda14d7e78 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/WorkflowConverter.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/converters/WorkflowConverter.java @@ -1,6 +1,6 @@ package org.opencb.opencga.catalog.db.mongodb.converters; -import org.opencb.opencga.core.models.nextflow.Workflow; +import org.opencb.opencga.core.models.workflow.Workflow; public class WorkflowConverter extends OpenCgaMongoConverter { diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/WorkflowManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/WorkflowManager.java index 81c22b0bde7..2c0886fa80b 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/WorkflowManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/WorkflowManager.java @@ -1,5 +1,6 @@ package org.opencb.opencga.catalog.managers; +import com.fasterxml.jackson.core.JsonProcessingException; import org.opencb.commons.datastore.core.Event; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.Query; @@ -21,20 +22,25 @@ import org.opencb.opencga.core.models.JwtPayload; import org.opencb.opencga.core.models.audit.AuditRecord; import org.opencb.opencga.core.models.common.Enums; -import org.opencb.opencga.core.models.nextflow.Workflow; +import org.opencb.opencga.core.models.workflow.Workflow; +import org.opencb.opencga.core.models.workflow.WorkflowCreateParams; +import org.opencb.opencga.core.models.workflow.WorkflowUpdateParams; import org.opencb.opencga.core.response.OpenCGAResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; +import static org.opencb.opencga.core.common.JacksonUtils.getUpdateObjectMapper; + public class WorkflowManager extends AbstractManager { + public static final QueryOptions INCLUDE_WORKFLOW_IDS = new QueryOptions(QueryOptions.INCLUDE, Arrays.asList( + WorkflowDBAdaptor.QueryParams.ID.key(), WorkflowDBAdaptor.QueryParams.UID.key(), WorkflowDBAdaptor.QueryParams.UUID.key(), + WorkflowDBAdaptor.QueryParams.VERSION.key())); + private final CatalogIOManager catalogIOManager; private final IOManagerFactory ioManagerFactory; @@ -104,17 +110,20 @@ private WorkflowDBAdaptor.QueryParams getFieldFilter(List idList) throws return idQueryParam; } - public OpenCGAResult create(Workflow workflow, QueryOptions options, String token) throws CatalogException { + public OpenCGAResult create(WorkflowCreateParams createParams, QueryOptions options, String token) throws CatalogException { options = ParamUtils.defaultObject(options, QueryOptions::new); JwtPayload tokenPayload = catalogManager.getUserManager().validateToken(token); ObjectMap auditParams = new ObjectMap() - .append("workflow", workflow) + .append("workflow", createParams) .append("options", options) .append("token", token); String organizationId = tokenPayload.getOrganization(); String userId = tokenPayload.getUserId(organizationId); + + // 0. Create the workflow object + Workflow workflow = createParams.toWorkflow(); try { // 1. Check permissions authorizationManager.checkIsAtLeastOrganizationOwnerOrAdmin(organizationId, userId); @@ -158,6 +167,59 @@ private void validateNewWorkflow(Workflow workflow) throws CatalogParameterExcep WorkflowDBAdaptor.QueryParams.MODIFICATION_DATE.key())); } + public OpenCGAResult update(String workflowId, WorkflowUpdateParams updateParams, QueryOptions options, String token) + throws CatalogException { + options = ParamUtils.defaultObject(options, QueryOptions::new); + + JwtPayload tokenPayload = catalogManager.getUserManager().validateToken(token); + ObjectMap updateMap = null; + try { + if (updateParams != null) { + updateMap = new ObjectMap(getUpdateObjectMapper().writeValueAsString(this)); + } + } catch (JsonProcessingException e) { + throw new CatalogException("Could not parse WorkflowUpdateParams object: " + e.getMessage(), e); + } + + ObjectMap auditParams = new ObjectMap() + .append("workflowId", workflowId) + .append("updateParams", updateMap) + .append("options", options) + .append("token", token); + + String organizationId = tokenPayload.getOrganization(); + String userId = tokenPayload.getUserId(organizationId); + + String id = UuidUtils.isOpenCgaUuid(workflowId) ? "" : workflowId; + String uuid = UuidUtils.isOpenCgaUuid(workflowId) ? workflowId : ""; + try { + // 1. Check permissions + authorizationManager.checkIsAtLeastOrganizationOwnerOrAdmin(organizationId, userId); + + Workflow workflow = internalGet(organizationId, Collections.singletonList(workflowId), null, INCLUDE_WORKFLOW_IDS, userId, + false).first(); + id = workflow.getId(); + uuid = workflow.getUuid(); + + // 2. Update workflow object + OpenCGAResult insert = getWorkflowDBAdaptor(organizationId).update(workflow.getUid(), updateMap, options); + if (options.getBoolean(ParamConstants.INCLUDE_RESULT_PARAM)) { + // Fetch updated workflow + Query query = new Query() + .append(WorkflowDBAdaptor.QueryParams.UID.key(), workflow.getUid()); + OpenCGAResult result = getWorkflowDBAdaptor(organizationId).get(query, options); + insert.setResults(result.getResults()); + } + auditManager.auditUpdate(organizationId, userId, Enums.Resource.WORKFLOW, id, uuid, "", "", auditParams, + new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); + return insert; + } catch (CatalogException e) { + auditManager.auditUpdate(organizationId, userId, Enums.Resource.WORKFLOW, id, uuid, "", "", auditParams, + new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); + throw e; + } + } + public OpenCGAResult get(String workflow, QueryOptions queryOptions, String token) throws CatalogException { return get(Collections.singletonList(workflow), queryOptions, false, token); } diff --git a/opencga-catalog/src/main/resources/catalog-indexes.txt b/opencga-catalog/src/main/resources/catalog-indexes.txt index 557a660716a..e27276e6ab8 100644 --- a/opencga-catalog/src/main/resources/catalog-indexes.txt +++ b/opencga-catalog/src/main/resources/catalog-indexes.txt @@ -259,4 +259,11 @@ {"collections": ["audit"], "fields": {"resourceId": 1, "studyUuid": 1}, "options": {}} {"collections": ["audit"], "fields": {"resourceUuid": 1, "studyUuid": 1}, "options": {}} {"collections": ["audit"], "fields": {"status.name": 1, "studyUuid": 1}, "options": {}} -{"collections": ["audit"], "fields": {"date": 1, "studyUuid": 1}, "options": {}} \ No newline at end of file +{"collections": ["audit"], "fields": {"date": 1, "studyUuid": 1}, "options": {}} + +{"collections": ["workflow", "workflow_archive"], "fields": {"uid": 1, "version": 1}, "options": {"unique": true}} +{"collections": ["workflow", "workflow_archive"], "fields": {"id": 1, "version": 1}, "options": {"unique": true}} +{"collections": ["workflow", "workflow_archive"], "fields": {"uuid": 1, "version": 1}, "options": {"unique": true}} +{"collections": ["workflow", "workflow_archive"], "fields": {"type": 1}, "options": {}} +{"collections": ["workflow", "workflow_archive"], "fields": {"_creationDate": 1}, "options": {}} +{"collections": ["workflow", "workflow_archive"], "fields": {"_modificationDate": 1}, "options": {}} \ No newline at end of file diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/api/FieldConstants.java b/opencga-core/src/main/java/org/opencb/opencga/core/api/FieldConstants.java index 835f89a61a6..03e1d83125c 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/api/FieldConstants.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/api/FieldConstants.java @@ -306,6 +306,19 @@ public class FieldConstants { + "STUDY, FILE, SAMPLE, JOB, INDIVIDUAL, COHORT, DISEASE_PANEL, FAMILY, CLINICAL_ANALYSIS, INTERPRETATION, " + "VARIANT, ALIGNMENT, CLINICAL, EXPRESSION, RGA and FUNCTIONAL."; + // Workflow + //Sample + public static final String WORKFLOW_ID_DESCRIPTION = "Workflow ID."; + public static final String WORKFLOW_TYPE_DESCRIPTION = "Workflow type. Valid values: NEXTFLOW."; + public static final String WORKFLOW_COMMAND_LINE_DESCRIPTION = "Workflow command line."; + public static final String WORKFLOW_SCRIPTS_DESCRIPTION = "List of scripts used by the Workflow."; + public static final String WORKFLOW_SOMATIC_DESCRIPTION = "Describes if the sample is somatic or not ."; + public static final String WORKFLOW_INDIVIDUAL_ID_DESCRIPTION = "Individual id of the sample."; + public static final String WORKFLOW_FILE_IDS_DESCRIPTION = "File ids of the sample."; + public static final String WORKFLOW_COHORT_IDS_DESCRIPTION = "Cohort ids of the sample."; + public static final String WORKFLOW_INTERNAL_DESCRIPTION = "Sample internal information."; + public static final String WORKFLOW_EXTERNAL_SOURCE_DESCRIPTION = "The external source from where the example was imported."; + //FileInternal public static final String FILE_INTERNAL_STATUS_DESCRIPTION = "File status can have the values READY, DELETED, " + "TRASHED, STAGE, MISSING, PENDING_DELETE, DELETING, REMOVED and MISSING_SAMPLES."; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/nextflow/NextFlowRunParams.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/workflow/NextFlowRunParams.java similarity index 95% rename from opencga-core/src/main/java/org/opencb/opencga/core/models/nextflow/NextFlowRunParams.java rename to opencga-core/src/main/java/org/opencb/opencga/core/models/workflow/NextFlowRunParams.java index 062863b3916..8d99a80788c 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/nextflow/NextFlowRunParams.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/workflow/NextFlowRunParams.java @@ -1,4 +1,4 @@ -package org.opencb.opencga.core.models.nextflow; +package org.opencb.opencga.core.models.workflow; import org.opencb.opencga.core.tools.ToolParams; diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/nextflow/Workflow.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/workflow/Workflow.java similarity index 62% rename from opencga-core/src/main/java/org/opencb/opencga/core/models/nextflow/Workflow.java rename to opencga-core/src/main/java/org/opencb/opencga/core/models/workflow/Workflow.java index 726cfeebe00..b9d37ac36c7 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/nextflow/Workflow.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/workflow/Workflow.java @@ -1,21 +1,47 @@ -package org.opencb.opencga.core.models.nextflow; +package org.opencb.opencga.core.models.workflow; +import org.opencb.commons.annotations.DataField; +import org.opencb.opencga.core.api.FieldConstants; import org.opencb.opencga.core.models.PrivateFields; import java.util.List; +import java.util.Map; public class Workflow extends PrivateFields { + @DataField(id = "id", required = true, indexed = true, unique = true, immutable = true, + description = FieldConstants.WORKFLOW_ID_DESCRIPTION) private String id; + + @DataField(id = "uuid", managed = true, indexed = true, unique = true, immutable = true, + description = FieldConstants.GENERIC_UUID_DESCRIPTION) private String uuid; + + @DataField(id = "description", description = FieldConstants.GENERIC_DESCRIPTION_DESCRIPTION) + private String description; + + @DataField(id = "version", managed = true, indexed = true, + description = FieldConstants.GENERIC_VERSION_DESCRIPTION) private int version; + + @DataField(id = "type", description = FieldConstants.WORKFLOW_TYPE_DESCRIPTION) private Type type; + + @DataField(id = "commandLine", description = FieldConstants.WORKFLOW_COMMAND_LINE_DESCRIPTION) private String commandLine; + + @DataField(id = "scripts", description = FieldConstants.WORKFLOW_SCRIPTS_DESCRIPTION) private List