From 09054d10324eb28e9de856734489429b1baeb569 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 20 Nov 2023 16:26:58 +0100 Subject: [PATCH] analysis: fix several analysis, #TASK-4389 --- .../opencga/analysis/ResourceUtils.java | 7 + .../AlignmentGeneCoverageStatsAnalysis.java | 2 +- .../alignment/qc/AlignmentQcAnalysis.java | 2 +- .../annotations/TsvAnnotationLoader.java | 6 +- .../ClinicalInterpretationManager.java | 18 +- .../clinical/InterpretationAnalysis.java | 2 +- .../ExomiserInterpretationAnalysis.java | 2 +- .../analysis/cohort/CohortIndexTask.java | 1 + .../family/PedigreeGraphInitAnalysis.java | 2 +- .../analysis/family/qc/FamilyQcAnalysis.java | 10 +- .../analysis/file/FetchAndRegisterTask.java | 12 +- .../opencga/analysis/file/FileDeleteTask.java | 6 +- .../file/FileTsvAnnotationLoader.java | 2 +- .../opencga/analysis/file/FileUnlinkTask.java | 9 +- .../file/PostLinkSampleAssociation.java | 4 +- .../individual/qc/IndividualQcAnalysis.java | 10 +- .../opencga/analysis/rga/RgaManager.java | 84 ++++++-- .../analysis/sample/qc/SampleQcAnalysis.java | 14 +- .../genomePlot/GenomePlotAnalysis.java | 2 +- .../variant/hrdetect/HRDetectAnalysis.java | 2 +- .../analysis/variant/julie/JulieTool.java | 1 + .../MutationalSignatureAnalysis.java | 2 +- .../stats/SampleVariantStatsAnalysis.java | 2 + .../executors/MigrationCommandExecutor.java | 96 +++++---- .../options/MigrationCommandOptions.java | 3 + .../executors/InternalCommandExecutor.java | 14 -- .../authorization/AuthorizationManager.java | 2 +- .../CatalogAuthorizationManager.java | 4 +- .../opencga/catalog/db/DBAdaptorFactory.java | 2 +- .../db/mongodb/MongoDBAdaptorFactory.java | 21 +- .../catalog/managers/AdminManager.java | 58 ++++-- .../opencga/catalog/managers/JobManager.java | 6 + .../catalog/managers/StudyManager.java | 2 +- .../opencga/catalog/managers/UserManager.java | 8 +- .../catalog/migration/MigrationManager.java | 46 +++-- .../opencga/core/models/common/Enums.java | 1 + .../monitor/daemons/ExecutionDaemon.java | 183 +++++++++--------- .../opencga/server/rest/OpenCGAWSServer.java | 27 +-- 38 files changed, 421 insertions(+), 254 deletions(-) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/ResourceUtils.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/ResourceUtils.java index 21bfb6030ba..161c07890df 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/ResourceUtils.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/ResourceUtils.java @@ -24,6 +24,8 @@ import org.opencb.opencga.catalog.db.api.ProjectDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; +import org.opencb.opencga.catalog.utils.CatalogFqn; +import org.opencb.opencga.core.models.JwtPayload; import org.opencb.opencga.core.models.project.Project; import org.opencb.opencga.core.response.OpenCGAResult; @@ -116,6 +118,11 @@ public static DownloadedRefGenome downloadRefGenome(String assembly, Path outDir public static String getAssembly(CatalogManager catalogManager, String studyId, String sessionId) throws CatalogException { String assembly = ""; OpenCGAResult projectQueryResult; + + JwtPayload jwtPayload = catalogManager.getUserManager().validateToken(sessionId); + CatalogFqn studyFqn = CatalogFqn.extractFqnFromStudy(studyId, jwtPayload); + String organizationId = studyFqn.getOrganizationId(); + projectQueryResult = catalogManager.getProjectManager().search(organizationId, new Query(ProjectDBAdaptor.QueryParams.STUDY.key(), studyId), new QueryOptions(QueryOptions.INCLUDE, ProjectDBAdaptor.QueryParams.ORGANISM.key()), sessionId); if (CollectionUtils.isNotEmpty(projectQueryResult.getResults()) diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java index fe9947d0ea9..68f594c08c8 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentGeneCoverageStatsAnalysis.java @@ -117,7 +117,7 @@ protected void run() throws ToolException { } qc.getCoverage().setGeneCoverageStats(geneCoverageStats); - catalogManager.getFileManager().update(organizationId, getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), + catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); } }); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentQcAnalysis.java index a7d0cdd6755..6b541da0037 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/alignment/qc/AlignmentQcAnalysis.java @@ -230,7 +230,7 @@ protected void run() throws ToolException { } if (saveQc) { - catalogManager.getFileManager().update(organizationId, getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), + catalogManager.getFileManager().update(getStudy(), catalogBamFile.getId(), new FileUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); } }); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/annotations/TsvAnnotationLoader.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/annotations/TsvAnnotationLoader.java index 65f1c7156dd..8e912fdaaf9 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/annotations/TsvAnnotationLoader.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/annotations/TsvAnnotationLoader.java @@ -26,9 +26,11 @@ import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.FileManager; import org.opencb.opencga.catalog.utils.AnnotationUtils; +import org.opencb.opencga.catalog.utils.CatalogFqn; import org.opencb.opencga.catalog.utils.Constants; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.JwtPayload; import org.opencb.opencga.core.models.common.AnnotationSet; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.sample.SamplePermissions; @@ -71,7 +73,9 @@ public void setStudy(String study) { @Override protected void check() throws Exception { - String userId = catalogManager.getUserManager().getUserId(organizationId, token); + JwtPayload jwtPayload = catalogManager.getUserManager().validateToken(token); + CatalogFqn studyFqn = CatalogFqn.extractFqnFromStudy(study, jwtPayload); + String userId = jwtPayload.getUserId(studyFqn.getOrganizationId()); OpenCGAResult fileResult = catalogManager.getFileManager().get(study, path, FileManager.INCLUDE_FILE_URI_PATH, token); if (fileResult.getNumResults() == 0) { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationManager.java index 1a3a823e36f..15be09eaf0b 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/ClinicalInterpretationManager.java @@ -50,9 +50,11 @@ import org.opencb.opencga.catalog.managers.ClinicalAnalysisManager; import org.opencb.opencga.catalog.managers.FamilyManager; import org.opencb.opencga.catalog.managers.StudyManager; +import org.opencb.opencga.catalog.utils.CatalogFqn; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.JwtPayload; import org.opencb.opencga.core.models.clinical.ClinicalAnalysis; import org.opencb.opencga.core.models.clinical.Interpretation; import org.opencb.opencga.core.models.individual.Individual; @@ -818,9 +820,13 @@ public List getPrimaryFindings(String clinicalAnalysisId, Query return clinicalVariants; } - public ClinicalAnalyst getAnalyst(String token) throws ToolException { + public ClinicalAnalyst getAnalyst(String studyId, String token) throws ToolException { try { - String userId = catalogManager.getUserManager().getUserId(organizationId, token); + JwtPayload jwtPayload = catalogManager.getUserManager().validateToken(token); + CatalogFqn studyFqn = CatalogFqn.extractFqnFromStudy(studyId, jwtPayload); + String organizationId = studyFqn.getOrganizationId(); + String userId = jwtPayload.getUserId(studyFqn.getOrganizationId()); + OpenCGAResult userQueryResult = catalogManager.getUserManager().get(organizationId, userId, new QueryOptions(QueryOptions.INCLUDE, Arrays.asList(UserDBAdaptor.QueryParams.EMAIL.key(), UserDBAdaptor.QueryParams.ORGANIZATION.key())), token); User user = userQueryResult.first(); @@ -831,6 +837,10 @@ public ClinicalAnalyst getAnalyst(String token) throws ToolException { } public String getAssembly(String studyId, String sessionId) throws CatalogException { + JwtPayload jwtPayload = catalogManager.getUserManager().validateToken(sessionId); + CatalogFqn studyFqn = CatalogFqn.extractFqnFromStudy(studyId, jwtPayload); + String organizationId = studyFqn.getOrganizationId(); + String assembly = ""; OpenCGAResult projectQueryResult; projectQueryResult = catalogManager.getProjectManager().search(organizationId, new Query(ProjectDBAdaptor.QueryParams.STUDY.key(), studyId), @@ -877,7 +887,9 @@ private Query checkQueryPermissions(Query query, String token) throws ClinicalVa } // Get userId from token and Study numeric IDs from the query - String userId = catalogManager.getUserManager().getUserId(organizationId, token); + JwtPayload jwtPayload = catalogManager.getUserManager().validateToken(token); + String organizationId = jwtPayload.getOrganization(); + String userId = jwtPayload.getUserId(); List studyIds = getStudyIds(userId, query); // If one specific clinical analysis, sample or individual is provided we expect a single valid study as well diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/InterpretationAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/InterpretationAnalysis.java index 4fe57ad701b..81e4502625f 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/InterpretationAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/InterpretationAnalysis.java @@ -118,7 +118,7 @@ protected void saveInterpretation(String studyId, ClinicalAnalysis clinicalAnaly .setCommit(GitRepositoryState.getInstance().getCommitId()))); // Analyst - ClinicalAnalyst analyst = clinicalInterpretationManager.getAnalyst(token); + ClinicalAnalyst analyst = clinicalInterpretationManager.getAnalyst(studyId, token); List primaryFindings = readClinicalVariants(Paths.get(getOutDir().toString() + "/" + PRIMARY_FINDINGS_FILENAME)); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/exomiser/ExomiserInterpretationAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/exomiser/ExomiserInterpretationAnalysis.java index 39fa4fd581c..39de4806eb0 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/exomiser/ExomiserInterpretationAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/clinical/exomiser/ExomiserInterpretationAnalysis.java @@ -145,7 +145,7 @@ protected void saveInterpretation(String studyId, ClinicalAnalysis clinicalAnaly .setVersion(ExomiserWrapperAnalysisExecutor.DOCKER_IMAGE_VERSION))); // Analyst - ClinicalAnalyst analyst = clinicalInterpretationManager.getAnalyst(token); + ClinicalAnalyst analyst = clinicalInterpretationManager.getAnalyst(studyId, token); List primaryFindings = getPrimaryFindings(); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/cohort/CohortIndexTask.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/cohort/CohortIndexTask.java index 689873edae2..e752f952167 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/cohort/CohortIndexTask.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/cohort/CohortIndexTask.java @@ -27,6 +27,7 @@ import org.opencb.opencga.catalog.stats.solr.converters.CatalogCohortToSolrCohortConverter; import org.opencb.opencga.catalog.stats.solr.converters.SolrConverterUtil; import org.opencb.opencga.core.api.ParamConstants; +import org.opencb.opencga.core.models.JwtPayload; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.response.OpenCGAResult; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/PedigreeGraphInitAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/PedigreeGraphInitAnalysis.java index 6cb8d9f9ec9..619c7f3490e 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/PedigreeGraphInitAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/PedigreeGraphInitAnalysis.java @@ -80,7 +80,7 @@ protected void run() throws ToolException { for (Family family: familiesToUpdate) { try { logger.info("Updating pedigree graph for family '{}'", family.getId()); - catalogManager.getFamilyManager().update(organizationId, study, family.getId(), null, + catalogManager.getFamilyManager().update(study, family.getId(), null, new QueryOptions(ParamConstants.FAMILY_UPDATE_PEDIGREEE_GRAPH_PARAM, true), token); String msg = "Updated pedigree graph for family '" + family.getId() + "'"; logger.info(msg); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/qc/FamilyQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/qc/FamilyQcAnalysis.java index 2de78e56141..1fc2f5bfb5e 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/qc/FamilyQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/family/qc/FamilyQcAnalysis.java @@ -23,7 +23,9 @@ import org.opencb.opencga.analysis.tools.OpenCgaTool; import org.opencb.opencga.analysis.variant.relatedness.RelatednessAnalysis; import org.opencb.opencga.catalog.exceptions.CatalogException; +import org.opencb.opencga.catalog.utils.CatalogFqn; import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.JwtPayload; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.family.Family; import org.opencb.opencga.core.models.family.FamilyQualityControl; @@ -67,8 +69,12 @@ protected void check() throws Exception { // Check permissions try { + JwtPayload jwtPayload = catalogManager.getUserManager().validateToken(token); + CatalogFqn studyFqn = CatalogFqn.extractFqnFromStudy(studyId, jwtPayload); + String organizationId = studyFqn.getOrganizationId(); + String userId = jwtPayload.getUserId(organizationId); + Study study = catalogManager.getStudyManager().get(studyId, QueryOptions.empty(), token).first(); - String userId = catalogManager.getUserManager().getUserId(organizationId, token); catalogManager.getAuthorizationManager().checkStudyPermission(organizationId, study.getUid(), userId, WRITE_FAMILIES); } catch (CatalogException e) { throw new ToolException(e); @@ -128,7 +134,7 @@ protected void run() throws ToolException { try { qualityControl = executor.getQualityControl(); if (qualityControl != null) { - catalogManager.getFamilyManager().update(organizationId, getStudyId(), familyId, new FamilyUpdateParams().setQualityControl(qualityControl), + catalogManager.getFamilyManager().update(getStudyId(), familyId, new FamilyUpdateParams().setQualityControl(qualityControl), QueryOptions.empty(), token); } } catch (CatalogException e) { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/FetchAndRegisterTask.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/FetchAndRegisterTask.java index 19349380207..c242582b528 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/FetchAndRegisterTask.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/FetchAndRegisterTask.java @@ -22,8 +22,10 @@ import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.exceptions.CatalogIOException; import org.opencb.opencga.catalog.managers.StudyManager; +import org.opencb.opencga.catalog.utils.CatalogFqn; import org.opencb.opencga.core.common.UriUtils; import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.JwtPayload; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.file.FileFetch; @@ -73,9 +75,11 @@ protected void check() throws Exception { } try { + JwtPayload jwtPayload = catalogManager.getUserManager().validateToken(token); + CatalogFqn catalogFqn= CatalogFqn.extractFqnFromStudy(studyFqn, jwtPayload); Study study = catalogManager.getStudyManager().get(studyFqn, StudyManager.INCLUDE_STUDY_IDS, token).first(); - OpenCGAResult parents = catalogManager.getFileManager().getParents(studyFqn, toolParams.getPath(), false, + OpenCGAResult parents = catalogManager.getFileManager().getParents(study.getFqn(), toolParams.getPath(), false, QueryOptions.empty(), token); if (parents.getNumResults() == 0) { throw new ToolException("No parent folders found for " + toolParams.getPath()); @@ -85,10 +89,10 @@ protected void check() throws Exception { throw new CatalogException("Parent path " + parents.first().getPath() + " is external. Cannot download to mounted folders"); } - String userId = catalogManager.getUserManager().getUserId(organizationId, token); + String userId = jwtPayload.getUserId(catalogFqn.getOrganizationId()); // Check write permissions over the path - catalogManager.getAuthorizationManager() - .checkFilePermission(organizationId, study.getUid(), parents.first().getUid(), userId, FilePermissions.WRITE); + catalogManager.getAuthorizationManager().checkFilePermission(catalogFqn.getOrganizationId(), study.getUid(), + parents.first().getUid(), userId, FilePermissions.WRITE); } catch (CatalogException e) { throw new ToolException(e); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/FileDeleteTask.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/FileDeleteTask.java index 79ec430557a..89edaa6e683 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/FileDeleteTask.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/FileDeleteTask.java @@ -112,13 +112,13 @@ protected void run() throws Exception { try { // Update file status to PENDING_DELETE and add tags mark if (catalogFile.getType() == File.Type.FILE) { - fileManager.update(organizationId, studyFqn, file, updateParams, options, token); + fileManager.update(studyFqn, file, updateParams, options, token); } else { // We mark for deletion all the Query query = new Query() .append(FileDBAdaptor.QueryParams.INTERNAL_STATUS_ID.key(), FileStatus.READY) .append(FileDBAdaptor.QueryParams.PATH.key(), "~^" + catalogFile.getPath() + "*"); - fileManager.update(organizationId, studyFqn, query, updateParams, options, token); + fileManager.update(studyFqn, query, updateParams, options, token); } } catch (Exception e) { logger.error("Error updating status of file '{}' to PENDING_DELETE: {}", file, e.getMessage(), e); @@ -236,7 +236,7 @@ private void setToMissingFile(File file) { private void restore(Query query, FileUpdateParams updateParams, QueryOptions options) { try { - catalogManager.getFileManager().update(organizationId, studyFqn, query, updateParams, options, token); + catalogManager.getFileManager().update(studyFqn, query, updateParams, options, token); } catch (CatalogException e) { addCriticalError(e); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/FileTsvAnnotationLoader.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/FileTsvAnnotationLoader.java index a8c7f9a14dc..ddd77ca22af 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/FileTsvAnnotationLoader.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/FileTsvAnnotationLoader.java @@ -45,6 +45,6 @@ public int count(Query query) throws CatalogException { public void addAnnotationSet(String entryId, AnnotationSet annotationSet, QueryOptions options) throws CatalogException { FileUpdateParams fileUpdateParams = new FileUpdateParams().setAnnotationSets(Collections.singletonList(annotationSet)); options.put(Constants.ACTIONS, new ObjectMap(AnnotationSetManager.ANNOTATION_SETS, ParamUtils.BasicUpdateAction.ADD)); - catalogManager.getFileManager().update(organizationId, study, entryId, fileUpdateParams, options, token); + catalogManager.getFileManager().update(study, entryId, fileUpdateParams, options, token); } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/FileUnlinkTask.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/FileUnlinkTask.java index fe2ca5d39d5..e333d7b3813 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/FileUnlinkTask.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/FileUnlinkTask.java @@ -101,13 +101,13 @@ protected void run() throws Exception { try { // Update file status to PENDING_DELETE and add tags mark if (catalogFile.getType() == File.Type.FILE) { - fileManager.update(organizationId, studyFqn, file, updateParams, options, token); + fileManager.update(studyFqn, file, updateParams, options, token); } else { // We mark for deletion all the Query query = new Query() .append(FileDBAdaptor.QueryParams.INTERNAL_STATUS_ID.key(), FileStatus.READY) .append(FileDBAdaptor.QueryParams.PATH.key(), "~^" + catalogFile.getPath() + "*"); - fileManager.update(organizationId, studyFqn, query, updateParams, options, token); + fileManager.update(studyFqn, query, updateParams, options, token); } } catch (Exception e) { logger.error("Error updating status of file '{}' to PENDING_DELETE: {}", file, e.getMessage(), e); @@ -176,15 +176,14 @@ private void restoreFiles(Query query) { private void restore(Query query, FileUpdateParams updateParams, QueryOptions options) { try { - catalogManager.getFileManager().update(organizationId, studyFqn, query, updateParams, options, token); + catalogManager.getFileManager().update(studyFqn, query, updateParams, options, token); } catch (CatalogException e) { addCriticalError(e); } } private void addCriticalError(CatalogException e) { - CatalogException exception = new CatalogException("Critical: Could not restore status of pending files to " - + FileStatus.READY, e); + CatalogException exception = new CatalogException("Critical: Could not restore status of pending files to " + FileStatus.READY, e); logger.error("{}", e.getMessage(), e); try { addError(exception); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/PostLinkSampleAssociation.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/PostLinkSampleAssociation.java index 7ba855c232f..60d67f05996 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/PostLinkSampleAssociation.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/file/PostLinkSampleAssociation.java @@ -195,7 +195,7 @@ protected void run() throws Exception { QueryOptions queryOptions = new QueryOptions(Constants.ACTIONS, actionMap); - OpenCGAResult fileUpdateResult = catalogManager.getFileManager().update(organizationId, study, file.getUuid(), + OpenCGAResult fileUpdateResult = catalogManager.getFileManager().update(study, file.getUuid(), fileUpdateParams, queryOptions, token); if (fileUpdateResult.getNumUpdated() != 1) { throw new CatalogException("Could not update sample list of file '" + file.getPath() + "'."); @@ -206,7 +206,7 @@ protected void run() throws Exception { FileUpdateParams fileUpdateParams = new FileUpdateParams() .setInternal(new SmallFileInternal(new FileStatus(FileStatus.READY), MissingSamples.initialize())); - OpenCGAResult fileUpdateResult = catalogManager.getFileManager().update(organizationId, study, file.getUuid(), fileUpdateParams, + OpenCGAResult fileUpdateResult = catalogManager.getFileManager().update(study, file.getUuid(), fileUpdateParams, QueryOptions.empty(), token); if (fileUpdateResult.getNumUpdated() != 1) { throw new CatalogException("Could not update internal status of file '" + file.getPath() + "'."); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcAnalysis.java index 3dfdbc29aa3..e6c20fba373 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/individual/qc/IndividualQcAnalysis.java @@ -23,8 +23,10 @@ import org.opencb.opencga.analysis.AnalysisUtils; import org.opencb.opencga.analysis.tools.OpenCgaTool; import org.opencb.opencga.catalog.exceptions.CatalogException; +import org.opencb.opencga.catalog.utils.CatalogFqn; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.JwtPayload; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.individual.Individual; @@ -83,7 +85,11 @@ protected void check() throws Exception { // Check permissions try { Study study = catalogManager.getStudyManager().get(studyId, QueryOptions.empty(), token).first(); - String userId = catalogManager.getUserManager().getUserId(organizationId, token); + + JwtPayload jwtPayload = catalogManager.getUserManager().validateToken(token); + CatalogFqn studyFqn = CatalogFqn.extractFqnFromStudy(studyId, jwtPayload); + String organizationId = studyFqn.getOrganizationId(); + String userId = jwtPayload.getUserId(organizationId); catalogManager.getAuthorizationManager().checkStudyPermission(organizationId, study.getUid(), userId, WRITE_INDIVIDUALS); } catch (CatalogException e) { throw new ToolException(e); @@ -183,7 +189,7 @@ protected void run() throws ToolException { qualityControl = executor.getQualityControl(); if (qualityControl != null) { IndividualUpdateParams individualUpdateParams = new IndividualUpdateParams().setQualityControl(qualityControl); - catalogManager.getIndividualManager().update(organizationId, getStudyId(), individualId, individualUpdateParams, QueryOptions.empty(), + catalogManager.getIndividualManager().update(getStudyId(), individualId, individualUpdateParams, QueryOptions.empty(), token); } } catch (CatalogException e) { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java index a77648484b5..d633e0261db 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/rga/RgaManager.java @@ -234,8 +234,13 @@ private void load(String study, Path file, String token) throws RgaException { public void generateAuxiliarCollection(String studyStr, String token) throws CatalogException, RgaException, IOException { checkStorageReadMode(); - String userId = catalogManager.getUserManager().getUserId(organizationId, token); + + JwtPayload tokenPayload = catalogManager.getUserManager().validateToken(token); + CatalogFqn studyFqn = CatalogFqn.extractFqnFromStudy(studyStr, tokenPayload); + String organizationId = studyFqn.getOrganizationId(); + String userId = tokenPayload.getUserId(organizationId); Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + try { AuthorizationManager authorizationManager = catalogManager.getAuthorizationManager(); long studyId = study.getUid(); @@ -443,8 +448,12 @@ private AuxiliarRgaDataModel getAuxiliarRgaDataModel(String mainCollection, Stri private OpenCGAResult updateRgaInternalIndexStatus(String studyStr, List sampleIds, RgaIndex.Status status, String token) throws CatalogException, RgaException { + JwtPayload tokenPayload = catalogManager.getUserManager().validateToken(token); + CatalogFqn studyFqn = CatalogFqn.extractFqnFromStudy(studyStr, tokenPayload); + String organizationId = studyFqn.getOrganizationId(); + String userId = tokenPayload.getUserId(organizationId); Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); - String userId = catalogManager.getUserManager().getUserId(organizationId, token); + String collection = getMainCollectionName(study.getFqn()); catalogManager.getAuthorizationManager().checkIsOwnerOrAdmin(organizationId, study.getUid(), userId); @@ -486,8 +495,12 @@ private OpenCGAResult updateRgaInternalIndexStatus(String studyStr, List updateRgaInternalIndexStatus(String studyStr, String token) throws CatalogException, IOException, RgaException { + JwtPayload tokenPayload = catalogManager.getUserManager().validateToken(token); + CatalogFqn studyFqn = CatalogFqn.extractFqnFromStudy(studyStr, tokenPayload); + String organizationId = studyFqn.getOrganizationId(); + String userId = tokenPayload.getUserId(organizationId); Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); - String userId = catalogManager.getUserManager().getUserId(organizationId, token); + String collection = getMainCollectionName(study.getFqn()); catalogManager.getAuthorizationManager().checkIsOwnerOrAdmin(organizationId, study.getUid(), userId); @@ -546,12 +559,17 @@ public OpenCGAResult individualQuery(String studyStr, Quer return cacheResults; } + JwtPayload tokenPayload = catalogManager.getUserManager().validateToken(token); + CatalogFqn studyFqn = CatalogFqn.extractFqnFromStudy(studyStr, tokenPayload); + String organizationId = studyFqn.getOrganizationId(); + String userId = tokenPayload.getUserId(organizationId); Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + String collection = getMainCollectionName(study.getFqn()); Preprocess preprocess; try { - preprocess = individualQueryPreprocess(study, query, options, token); + preprocess = individualQueryPreprocess(organizationId, study, query, options, userId, token); } catch (RgaException e) { if (RgaException.NO_RESULTS_FOUND.equals(e.getMessage())) { stopWatch.stop(); @@ -588,7 +606,8 @@ public OpenCGAResult individualQuery(String studyStr, Quer } } // Check parent permissions... - Set authorisedSamples = getAuthorisedSamples(study.getFqn(), parentSampleIds, null, preprocess.getUserId(), token); + Set authorisedSamples = getAuthorisedSamples(organizationId, study.getFqn(), parentSampleIds, null, + preprocess.getUserId(), token); if (authorisedSamples.size() < parentSampleIds.size()) { // Filter out parent sample ids for (KnockoutByIndividual knockoutByIndividual : knockoutByIndividuals) { @@ -629,8 +648,12 @@ public OpenCGAResult geneQuery(String studyStr, Query query, return cacheResults; } + JwtPayload tokenPayload = catalogManager.getUserManager().validateToken(token); + CatalogFqn studyFqn = CatalogFqn.extractFqnFromStudy(studyStr, tokenPayload); + String organizationId = studyFqn.getOrganizationId(); + String userId = tokenPayload.getUserId(organizationId); Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); - String userId = catalogManager.getUserManager().getUserId(organizationId, token); + String collection = getMainCollectionName(study.getFqn()); if (!rgaEngine.isAlive(collection)) { throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); @@ -765,8 +788,12 @@ public OpenCGAResult variantQuery(String studyStr, Query quer return cacheResults; } + JwtPayload tokenPayload = catalogManager.getUserManager().validateToken(token); + CatalogFqn studyFqn = CatalogFqn.extractFqnFromStudy(studyStr, tokenPayload); + String organizationId = studyFqn.getOrganizationId(); + String userId = tokenPayload.getUserId(organizationId); Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); - String userId = catalogManager.getUserManager().getUserId(organizationId, token); + String collection = getMainCollectionName(study.getFqn()); String auxCollection = getAuxCollectionName(study.getFqn()); if (!rgaEngine.isAlive(collection)) { @@ -935,7 +962,12 @@ public OpenCGAResult individualSummary(String study return cacheResults; } + JwtPayload tokenPayload = catalogManager.getUserManager().validateToken(token); + CatalogFqn studyFqn = CatalogFqn.extractFqnFromStudy(studyStr, tokenPayload); + String organizationId = studyFqn.getOrganizationId(); + String userId = tokenPayload.getUserId(organizationId); Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); + String collection = getMainCollectionName(study.getFqn()); ExecutorService executor = Executors.newFixedThreadPool(4); @@ -958,7 +990,7 @@ public OpenCGAResult individualSummary(String study Preprocess preprocess; try { - preprocess = individualQueryPreprocess(study, query, options, token); + preprocess = individualQueryPreprocess(organizationId, study, query, options, userId, token); } catch (RgaException e) { if (RgaException.NO_RESULTS_FOUND.equals(e.getMessage())) { stopWatch.stop(); @@ -1010,7 +1042,8 @@ public OpenCGAResult individualSummary(String study if (!parentSampleIds.isEmpty()) { // Check parent permissions... - Set authorisedSamples = getAuthorisedSamples(study.getFqn(), parentSampleIds, null, preprocess.getUserId(), token); + Set authorisedSamples = getAuthorisedSamples(organizationId, study.getFqn(), parentSampleIds, null, + preprocess.getUserId(), token); // Filter out parent sample ids if (authorisedSamples.size() < parentSampleIds.size()) { for (KnockoutByIndividualSummary knockoutByIndividualSummary : knockoutByIndividualSummaryList) { @@ -1062,8 +1095,12 @@ public OpenCGAResult geneSummary(String studyStr, Query q return cacheResults; } + JwtPayload tokenPayload = catalogManager.getUserManager().validateToken(token); + CatalogFqn studyFqn = CatalogFqn.extractFqnFromStudy(studyStr, tokenPayload); + String organizationId = studyFqn.getOrganizationId(); + String userId = tokenPayload.getUserId(organizationId); Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); - String userId = catalogManager.getUserManager().getUserId(organizationId, token); + String collection = getMainCollectionName(study.getFqn()); if (!rgaEngine.isAlive(collection)) { throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); @@ -1146,8 +1183,12 @@ public OpenCGAResult variantSummary(String studyStr, Q return cacheResults; } + JwtPayload tokenPayload = catalogManager.getUserManager().validateToken(token); + CatalogFqn studyFqn = CatalogFqn.extractFqnFromStudy(studyStr, tokenPayload); + String organizationId = studyFqn.getOrganizationId(); + String userId = tokenPayload.getUserId(organizationId); Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); - String userId = catalogManager.getUserManager().getUserId(organizationId, token); + String collection = getMainCollectionName(study.getFqn()); String auxCollection = getAuxCollectionName(study.getFqn()); if (!rgaEngine.isAlive(collection)) { @@ -1252,8 +1293,11 @@ public OpenCGAResult variantSummary(String studyStr, Q public OpenCGAResult aggregationStats(String studyStr, Query query, QueryOptions options, String fields, String token) throws CatalogException, IOException, RgaException { + JwtPayload tokenPayload = catalogManager.getUserManager().validateToken(token); + CatalogFqn studyFqn = CatalogFqn.extractFqnFromStudy(studyStr, tokenPayload); + String organizationId = studyFqn.getOrganizationId(); + String userId = tokenPayload.getUserId(organizationId); Study study = catalogManager.getStudyManager().get(studyStr, QueryOptions.empty(), token).first(); - String userId = catalogManager.getUserManager().getUserId(organizationId, token); catalogManager.getAuthorizationManager().checkCanViewStudy(organizationId, study.getUid(), userId); @@ -1721,21 +1765,21 @@ private KnockoutByIndividualSummary calculateIndividualSummary(String collection return knockoutByIndividualSummary; } - private Set getAuthorisedSamples(String study, Set sampleIds, List otherPermissions, - String userId, String token) throws CatalogException { + private Set getAuthorisedSamples(String organizationId, String study, Set sampleIds, + List otherPermissions, String userId, String token) + throws CatalogException { Query query = new Query(SampleDBAdaptor.QueryParams.ID.key(), sampleIds); if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(otherPermissions)) { query.put(ACL_PARAM, userId + ":" + StringUtils.join(otherPermissions, ",")); } - OpenCGAResult distinct = catalogManager.getSampleManager().distinct(organizationId, study, SampleDBAdaptor.QueryParams.ID.key(), query, token); + OpenCGAResult distinct = catalogManager.getSampleManager().distinct(organizationId, study, SampleDBAdaptor.QueryParams.ID.key(), + query, token); return distinct.getResults().stream().map(String::valueOf).collect(Collectors.toSet()); } - private Preprocess individualQueryPreprocess(Study study, Query query, QueryOptions options, String token) - throws RgaException, CatalogException, IOException { - - String userId = catalogManager.getUserManager().getUserId(organizationId, token); + private Preprocess individualQueryPreprocess(String organizationId, Study study, Query query, QueryOptions options, String userId, + String token) throws RgaException, CatalogException, IOException { String collection = getMainCollectionName(study.getFqn()); if (!rgaEngine.isAlive(collection)) { throw new RgaException("Missing RGA indexes for study '" + study.getFqn() + "' or solr server not alive"); @@ -1743,7 +1787,7 @@ private Preprocess individualQueryPreprocess(Study study, Query query, QueryOpti AuthorizationManager authorizationManager = catalogManager.getAuthorizationManager(); long studyId = study.getUid(); - Boolean isOwnerOrAdmin = authorizationManager.isStudyAdministrator(organizationId, studyId, userId); + boolean isOwnerOrAdmin = authorizationManager.isStudyAdministrator(organizationId, studyId, userId); Preprocess preprocessResult = new Preprocess(); preprocessResult.setUserId(userId); diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java index 7b99f77608c..54f22745057 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/sample/qc/SampleQcAnalysis.java @@ -18,7 +18,9 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.opencb.biodata.models.clinical.qc.*; +import org.opencb.biodata.models.clinical.qc.GenomePlot; +import org.opencb.biodata.models.clinical.qc.GenomePlotConfig; +import org.opencb.biodata.models.clinical.qc.SampleQcVariantStats; import org.opencb.commons.datastore.core.Event; import org.opencb.commons.datastore.core.ObjectMap; import org.opencb.commons.datastore.core.QueryOptions; @@ -29,9 +31,11 @@ import org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureAnalysis; import org.opencb.opencga.analysis.variant.stats.SampleVariantStatsAnalysis; import org.opencb.opencga.catalog.exceptions.CatalogException; +import org.opencb.opencga.catalog.utils.CatalogFqn; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.JwtPayload; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.file.File; import org.opencb.opencga.core.models.job.Job; @@ -80,8 +84,12 @@ protected void check() throws Exception { // Check permissions try { + JwtPayload jwtPayload = catalogManager.getUserManager().validateToken(token); + CatalogFqn studyFqn = CatalogFqn.extractFqnFromStudy(study, jwtPayload); + String organizationId = studyFqn.getOrganizationId(); + String userId = jwtPayload.getUserId(organizationId); + long studyUid = catalogManager.getStudyManager().get(getStudy(), QueryOptions.empty(), token).first().getUid(); - String userId = catalogManager.getUserManager().getUserId(organizationId, token); catalogManager.getAuthorizationManager().checkStudyPermission(organizationId, studyUid, userId, WRITE_SAMPLES); } catch (CatalogException e) { throw new ToolException(e); @@ -350,7 +358,7 @@ protected void run() throws ToolException { if (genomePlot != null) { qc.getVariant().setGenomePlot(genomePlot); - catalogManager.getSampleManager().update(organizationId, getStudy(), sample.getId(), new SampleUpdateParams().setQualityControl(qc), + catalogManager.getSampleManager().update(getStudy(), sample.getId(), new SampleUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); logger.info("Quality control saved for sample {}", sample.getId()); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java index c5496aa470d..f7f63f37706 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/genomePlot/GenomePlotAnalysis.java @@ -107,7 +107,7 @@ protected void run() throws ToolException { } qc.getVariant().setGenomePlot(genomePlot); - catalogManager.getSampleManager().update(organizationId, getStudy(), sample.getId(), new SampleUpdateParams().setQualityControl(qc), + catalogManager.getSampleManager().update(getStudy(), sample.getId(), new SampleUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); } } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/hrdetect/HRDetectAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/hrdetect/HRDetectAnalysis.java index 27cb875e93c..e808c33cd36 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/hrdetect/HRDetectAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/hrdetect/HRDetectAnalysis.java @@ -239,7 +239,7 @@ protected void run() throws ToolException { qc.getVariant().setHrDetects(new ArrayList<>()); } qc.getVariant().getHrDetects().add(hrDetect); - catalogManager.getSampleManager().update(organizationId, getStudy(), sample.getId(), new SampleUpdateParams().setQualityControl(qc), + catalogManager.getSampleManager().update(getStudy(), sample.getId(), new SampleUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); }); } diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/julie/JulieTool.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/julie/JulieTool.java index 9ee6353af5c..d3f3759627e 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/julie/JulieTool.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/julie/JulieTool.java @@ -7,6 +7,7 @@ import org.opencb.opencga.catalog.db.api.StudyDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.core.api.ParamConstants; +import org.opencb.opencga.core.models.JwtPayload; import org.opencb.opencga.core.models.cohort.Cohort; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.user.User; diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java index 8768a0d933e..56a95cfa92e 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/mutationalSignature/MutationalSignatureAnalysis.java @@ -296,7 +296,7 @@ protected void run() throws ToolException { } // Update sample quality control try { - catalogManager.getSampleManager().update(organizationId, getStudy(), sample.getId(), new SampleUpdateParams().setQualityControl(qc), + catalogManager.getSampleManager().update(getStudy(), sample.getId(), new SampleUpdateParams().setQualityControl(qc), QueryOptions.empty(), getToken()); logger.info("Quality control saved for sample {}", sample.getId()); } catch (CatalogException e) { diff --git a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/stats/SampleVariantStatsAnalysis.java b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/stats/SampleVariantStatsAnalysis.java index 8b6ba69b7dd..e31b4e48e1b 100644 --- a/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/stats/SampleVariantStatsAnalysis.java +++ b/opencga-analysis/src/main/java/org/opencb/opencga/analysis/variant/stats/SampleVariantStatsAnalysis.java @@ -27,10 +27,12 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.tools.OpenCgaToolScopeStudy; import org.opencb.opencga.catalog.db.api.SampleDBAdaptor; +import org.opencb.opencga.catalog.utils.CatalogFqn; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.common.BatchUtils; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.exceptions.ToolException; +import org.opencb.opencga.core.models.JwtPayload; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.sample.Sample; import org.opencb.opencga.core.models.sample.SampleQualityControl; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/MigrationCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/MigrationCommandExecutor.java index d8887cd71d1..2cebed2eada 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/MigrationCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/executors/MigrationCommandExecutor.java @@ -10,16 +10,18 @@ import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.catalog.migration.Migration; import org.opencb.opencga.catalog.migration.MigrationManager; -import org.opencb.opencga.core.models.migration.MigrationRun; import org.opencb.opencga.catalog.migration.MigrationSummary; import org.opencb.opencga.core.common.GitRepositoryState; import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.common.TimeUtils; +import org.opencb.opencga.core.models.migration.MigrationRun; import java.io.IOException; import java.nio.file.Paths; import java.time.temporal.ChronoUnit; +import java.util.Collections; import java.util.List; +import java.util.Map; /** * Created on 08/09/17. @@ -65,11 +67,11 @@ private void summary() throws Exception { try (CatalogManager catalogManager = new CatalogManager(configuration)) { String token = catalogManager.getUserManager().loginAsAdmin(options.commonOptions.adminPassword).getToken(); - catalogManager.getMigrationManager().updateMigrationRuns(organizationId, token); - MigrationSummary migrationSummary = catalogManager.getMigrationManager().getMigrationSummary(organizationId); - System.out.println(JacksonUtils.getDefaultObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(migrationSummary)); + catalogManager.getMigrationManager().updateMigrationRuns(token); + Map migrationSummaryMap = catalogManager.getMigrationManager().getMigrationSummary(); + System.out.println(JacksonUtils.getDefaultObjectMapper().writerWithDefaultPrettyPrinter() + .writeValueAsString(migrationSummaryMap)); } - } private void search() throws Exception { @@ -79,44 +81,54 @@ private void search() throws Exception { try (CatalogManager catalogManager = new CatalogManager(configuration)) { String token = catalogManager.getUserManager().loginAsAdmin(options.commonOptions.adminPassword).getToken(); - List> rows = catalogManager.getMigrationManager() - .getMigrationRuns(organizationId, options.version, options.domain, options.status, token); - - if (options.commonOptions.commonOptions.outputFormat.toLowerCase().contains("json")) { - for (Pair pair : rows) { - System.out.println(JacksonUtils.getDefaultObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(pair)); - } + List organizationIds; + if (StringUtils.isNotEmpty(options.organizationId)) { + organizationIds = Collections.singletonList(options.organizationId); } else { - Table> table = new Table>(Table.PrinterType.JANSI) - .addColumn("ID", p -> p.getKey().id(), 50) - .addColumn("Description", p -> p.getKey().description(), 50) - .addColumnEnum("Domain", p -> p.getKey().domain()) - .addColumn("Version", p -> p.getKey().version()) - .addColumnEnum("Language", p -> p.getKey().language()) - .addColumn("Manual", p -> Boolean.toString(p.getKey().manual())) - .addColumn("Offline", p -> Boolean.toString(p.getKey().offline())) - .addColumnNumber("Patch", p -> p.getKey().patch()) - .addColumn("Status", MigrationCommandExecutor::getMigrationStatus) - .addColumnNumber("RunPatch", p -> p.getValue().getPatch()) - .addColumn("ExecutionTime", p -> p.getValue().getStart() + " " + TimeUtils.durationToString(ChronoUnit.MILLIS.between( - p.getValue().getStart().toInstant(), - p.getValue().getEnd().toInstant()))) - .addColumn("Events", p -> { - StringBuilder v = new StringBuilder(); - if (StringUtils.isNotEmpty(p.getValue().getException())) { - v.append("Exception: ").append(p.getValue().getException()); - } - if (p.getValue().getEvents() != null) { - for (Event event : p.getValue().getEvents()) { - if (v.length() > 0) { - v.append("\n"); + organizationIds = catalogManager.getAdminManager().getOrganizationIds(token); + } + + for (String organizationId : organizationIds) { + System.out.println("Organization '" + organizationId + "'"); + List> rows = catalogManager.getMigrationManager() + .getMigrationRuns(organizationId, options.version, options.domain, options.status, token); + + if (options.commonOptions.commonOptions.outputFormat.toLowerCase().contains("json")) { + for (Pair pair : rows) { + System.out.println(JacksonUtils.getDefaultObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(pair)); + } + } else { + Table> table = new Table>(Table.PrinterType.JANSI) + .addColumn("ID", p -> p.getKey().id(), 50) + .addColumn("Description", p -> p.getKey().description(), 50) + .addColumnEnum("Domain", p -> p.getKey().domain()) + .addColumn("Version", p -> p.getKey().version()) + .addColumnEnum("Language", p -> p.getKey().language()) + .addColumn("Manual", p -> Boolean.toString(p.getKey().manual())) + .addColumn("Offline", p -> Boolean.toString(p.getKey().offline())) + .addColumnNumber("Patch", p -> p.getKey().patch()) + .addColumn("Status", MigrationCommandExecutor::getMigrationStatus) + .addColumnNumber("RunPatch", p -> p.getValue().getPatch()) + .addColumn("ExecutionTime", p -> p.getValue().getStart() + " " + TimeUtils.durationToString(ChronoUnit.MILLIS.between( + p.getValue().getStart().toInstant(), + p.getValue().getEnd().toInstant()))) + .addColumn("Events", p -> { + StringBuilder v = new StringBuilder(); + if (StringUtils.isNotEmpty(p.getValue().getException())) { + v.append("Exception: ").append(p.getValue().getException()); + } + if (p.getValue().getEvents() != null) { + for (Event event : p.getValue().getEvents()) { + if (v.length() > 0) { + v.append("\n"); + } + v.append(event.getType()).append(": ").append(event.getMessage()); } - v.append(event.getType()).append(": ").append(event.getMessage()); } - } - return v.toString(); - }); - table.printTable(rows); + return v.toString(); + }); + table.printTable(rows); + } } } } @@ -139,7 +151,7 @@ private void run() throws CatalogException, IOException { String version = parseVersion(options.version); MigrationManager migrationManager = catalogManager.getMigrationManager(); - migrationManager.runMigration(organizationId, version, options.domain, options.language, options.offline, appHome, token); + migrationManager.runMigration(version, options.domain, options.language, options.offline, appHome, token); } } @@ -150,7 +162,7 @@ private void runManual() throws Exception { try (CatalogManager catalogManager = new CatalogManager(configuration)) { String token = catalogManager.getUserManager().loginAsAdmin(options.commonOptions.adminPassword).getToken(); - catalogManager.getMigrationManager().runManualMigration(organizationId, parseVersion(options.version), options.id, Paths.get(appHome), + catalogManager.getMigrationManager().runManualMigration(parseVersion(options.version), options.id, Paths.get(appHome), options.force, options.offline, new ObjectMap(options.commonOptions.commonOptions.params), token); } } diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/options/MigrationCommandOptions.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/options/MigrationCommandOptions.java index 074a104cc00..4fb87f7368c 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/options/MigrationCommandOptions.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/admin/options/MigrationCommandOptions.java @@ -58,6 +58,9 @@ public class SearchCommandOptions extends AdminCliOptionsParser.CatalogDatabaseC @ParametersDelegate public AdminCliOptionsParser.AdminCommonCommandOptions commonOptions = MigrationCommandOptions.this.commonOptions; + @Parameter(names = {"--organization"}, description = "Organization id") + public String organizationId; + @Parameter(names = {"--status"}, description = "Filter migrations by status. PENDING, ERROR, DONE") public List status; diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/InternalCommandExecutor.java b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/InternalCommandExecutor.java index 98c4d086388..c454850b130 100644 --- a/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/InternalCommandExecutor.java +++ b/opencga-app/src/main/java/org/opencb/opencga/app/cli/internal/executors/InternalCommandExecutor.java @@ -16,19 +16,13 @@ package org.opencb.opencga.app.cli.internal.executors; -import org.opencb.commons.datastore.core.Query; -import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.opencga.analysis.tools.ToolRunner; import org.opencb.opencga.app.cli.CommandExecutor; import org.opencb.opencga.app.cli.GeneralCliOptions; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.managers.CatalogManager; -import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.storage.core.StorageEngineFactory; -import java.util.Map; -import java.util.stream.Collectors; - /** * Created on 03/05/16 * @@ -55,12 +49,4 @@ protected void configure() throws IllegalAccessException, ClassNotFoundException toolRunner = new ToolRunner(appHome, catalogManager, storageEngineFactory); } - protected Map getStudyIds(String sessionId) throws CatalogException { - return catalogManager.getStudyManager().searchInOrganization(organizationId, new Query(), new QueryOptions("include", "projects.studies.id,projects.studies" + - ".alias"), sessionId) - .getResults() - .stream() - .collect(Collectors.toMap(Study::getUid, Study::getId)); - } - } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/AuthorizationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/AuthorizationManager.java index 99a635d5450..cb07b18ec6d 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/AuthorizationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/AuthorizationManager.java @@ -126,7 +126,7 @@ default boolean isOpencga(String userId) { boolean isInstallationAdministrator(JwtPayload payload) throws CatalogException; - void checkIsInstallationAdministrator(String organizationId, String user) throws CatalogException; + void checkIsInstallationAdministrator(JwtPayload payload) throws CatalogException; void checkIsOwnerOrAdmin(String organizationId, long studyId, String userId) throws CatalogException; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/CatalogAuthorizationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/CatalogAuthorizationManager.java index 7c535f2e968..c300379a7f7 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/CatalogAuthorizationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/auth/authorization/CatalogAuthorizationManager.java @@ -217,8 +217,8 @@ public boolean isInstallationAdministrator(JwtPayload payload) throws CatalogExc } @Override - public void checkIsInstallationAdministrator(String organizationId, String user) throws CatalogException { - if (!isOpencga(user) && !isOrganizationOwnerOrAdmin(organizationId, user)) { + public void checkIsInstallationAdministrator(JwtPayload payload) throws CatalogException { + if (!isInstallationAdministrator(payload)) { throw new CatalogAuthorizationException("Only ADMINISTRATOR users are allowed to perform this action"); } } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/DBAdaptorFactory.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/DBAdaptorFactory.java index d1e2a611baa..9d91728e0b5 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/DBAdaptorFactory.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/DBAdaptorFactory.java @@ -79,7 +79,7 @@ default String getCatalogDatabase(String prefix, String organization) { void createIndexes(String organization) throws CatalogDBException; - List getOrganizationIds(); + List getOrganizationIds() throws CatalogDBException; MigrationDBAdaptor getMigrationDBAdaptor(String organization) throws CatalogDBException; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptorFactory.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptorFactory.java index 4597bd8ab75..5c2bd33421c 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptorFactory.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/MongoDBAdaptorFactory.java @@ -153,7 +153,9 @@ public void createIndexes(String organization) throws CatalogDBException { } @Override - public List getOrganizationIds() { + public List getOrganizationIds() throws CatalogDBException { + // Recheck in case there are new organizations + initOrganizations(configuration); return new ArrayList<>(organizationDBAdaptorMap.keySet()); } @@ -164,20 +166,27 @@ public MongoDataStore getMongoDataStore(String organization) throws CatalogDBExc private void connect(Configuration catalogConfiguration) throws CatalogDBException { // Init map of organization db adaptor factories organizationDBAdaptorMap = new HashMap<>(); + initOrganizations(catalogConfiguration); + } + private void initOrganizations(Configuration catalogConfiguration) throws CatalogDBException { // Configure admin organization first - OrganizationMongoDBAdaptorFactory adminFactory = configureOrganizationMongoDBAdaptorFactory(ParamConstants.ADMIN_ORGANIZATION, - catalogConfiguration); + OrganizationMongoDBAdaptorFactory adminFactory; + if (organizationDBAdaptorMap.containsKey(ParamConstants.ADMIN_ORGANIZATION)) { + adminFactory = organizationDBAdaptorMap.get(ParamConstants.ADMIN_ORGANIZATION); + } else { + adminFactory = configureOrganizationMongoDBAdaptorFactory(ParamConstants.ADMIN_ORGANIZATION, catalogConfiguration); + organizationDBAdaptorMap.put(ParamConstants.ADMIN_ORGANIZATION, adminFactory); + } if (adminFactory.isCatalogDBReady()) { - organizationDBAdaptorMap.put(ParamConstants.ADMIN_ORGANIZATION.toLowerCase(), adminFactory); - // Read organizations present in the installation Query query = new Query(SettingsDBAdaptor.QueryParams.TAGS.key(), OrganizationTag.ACTIVE.name()); OpenCGAResult results = adminFactory.getCatalogSettingsDBAdaptor().get(query, new QueryOptions()); for (Settings organizationSettings : results.getResults()) { OrganizationSummary organizationSummary = getOrganizationSummary(organizationSettings); - if (!ParamConstants.ADMIN_ORGANIZATION.equals(organizationSummary.getId())) { + if (!ParamConstants.ADMIN_ORGANIZATION.equals(organizationSummary.getId()) + && (!organizationDBAdaptorMap.containsKey(organizationSummary.getId()))) { OrganizationMongoDBAdaptorFactory orgFactory = configureOrganizationMongoDBAdaptorFactory(organizationSummary.getId(), catalogConfiguration); organizationDBAdaptorMap.put(organizationSummary.getId(), orgFactory); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java index 66bcafefb1e..25709ee1cda 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/AdminManager.java @@ -12,6 +12,7 @@ import org.opencb.opencga.catalog.utils.ParamUtils; import org.opencb.opencga.core.api.ParamConstants; import org.opencb.opencga.core.config.Configuration; +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.study.Group; @@ -42,12 +43,13 @@ public OpenCGAResult userSearch(String organizationId, Query query, QueryO options = ParamUtils.defaultObject(options, QueryOptions::new); ObjectMap auditParams = new ObjectMap() + .append("organizationId", organizationId) .append("query", query) .append("options", options) .append("token", token); - String userId = catalogManager.getUserManager().getUserId(organizationId, token); + JwtPayload jwtPayload = catalogManager.getUserManager().validateToken(token); try { - authorizationManager.checkIsInstallationAdministrator(organizationId, userId); + authorizationManager.checkIsInstallationAdministrator(jwtPayload); // Fix query object if (query.containsKey(ParamConstants.USER)) { @@ -68,11 +70,11 @@ public OpenCGAResult userSearch(String organizationId, Query query, QueryO } OpenCGAResult userDataResult = getUserDBAdaptor(organizationId).get(query, options); - auditManager.auditSearch(organizationId, userId, Enums.Resource.USER, "", "", auditParams, + auditManager.auditSearch(organizationId, jwtPayload.getUserId(organizationId), Enums.Resource.USER, "", "", auditParams, new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); return userDataResult; } catch (CatalogException e) { - auditManager.auditSearch(organizationId, userId, Enums.Resource.USER, "", "", auditParams, + auditManager.auditSearch(organizationId, jwtPayload.getUserId(organizationId), Enums.Resource.USER, "", "", auditParams, new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); throw e; } @@ -87,9 +89,9 @@ public OpenCGAResult updateGroups(String organizationId, String userId, L .append("groupIds", groupIds) .append("action", action) .append("token", token); - String authenticatedUser = catalogManager.getUserManager().getUserId(organizationId, token); + JwtPayload jwtPayload = catalogManager.getUserManager().validateToken(token); try { - authorizationManager.checkIsInstallationAdministrator(organizationId, authenticatedUser); + authorizationManager.checkIsInstallationAdministrator(jwtPayload); // Check userId exists Query query = new Query(UserDBAdaptor.QueryParams.ID.key(), userId); @@ -107,7 +109,8 @@ public OpenCGAResult updateGroups(String organizationId, String userId, L } // Check studyIds exist - List studies = catalogManager.getStudyManager().resolveIds(studyIds, authenticatedUser, organizationId); + List studies = catalogManager.getStudyManager().resolveIds(studyIds, jwtPayload.getUserId(organizationId), + organizationId); List studyUids = new ArrayList<>(studies.size()); for (Study study : studies) { if (ParamConstants.ADMIN_STUDY_FQN.equals(study.getFqn())) { @@ -122,16 +125,35 @@ public OpenCGAResult updateGroups(String organizationId, String userId, L OpenCGAResult result = getStudyDBAdaptor(organizationId).updateUserFromGroups(userId, studyUids, groupIds, action); - auditManager.audit(organizationId, userId, Enums.Action.UPDATE_USERS_FROM_STUDY_GROUP, Enums.Resource.STUDY, "", "", "", "", - auditParams, new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); + auditManager.audit(organizationId, jwtPayload.getUserId(organizationId), Enums.Action.UPDATE_USERS_FROM_STUDY_GROUP, + Enums.Resource.STUDY, "", "", "", "", auditParams, new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); return result; } catch (CatalogException e) { - auditManager.audit(organizationId, userId, Enums.Action.UPDATE_USERS_FROM_STUDY_GROUP, Enums.Resource.STUDY, "", "", "", "", - auditParams, new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); + auditManager.audit(organizationId, jwtPayload.getUserId(organizationId), Enums.Action.UPDATE_USERS_FROM_STUDY_GROUP, + Enums.Resource.STUDY, "", "", "", "", auditParams, + new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); throw e; } } + public List getOrganizationIds(String token) throws CatalogException { + JwtPayload payload = catalogManager.getUserManager().validateToken(token); + try { + authorizationManager.checkIsInstallationAdministrator(payload); + List organizationIds = catalogDBAdaptorFactory.getOrganizationIds(); + + auditManager.audit(ParamConstants.ADMIN_ORGANIZATION, payload.getUserId(), Enums.Action.FETCH_ORGANIZATION_IDS, + Enums.Resource.STUDY, "", "", "", "", new ObjectMap(), new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); + return organizationIds; + } catch (CatalogException e) { + auditManager.audit(ParamConstants.ADMIN_ORGANIZATION, payload.getUserId(), Enums.Action.FETCH_ORGANIZATION_IDS, + Enums.Resource.STUDY, "", "", "", "", new ObjectMap(), + new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); + throw e; + } + + } + /** * Add a user to all the remote groups he/she may belong for a particular authentication origin. * Also remove the user from other groups he/she may have been associated in the past for the same authentication origin. @@ -147,13 +169,14 @@ public OpenCGAResult updateGroups(String organizationId, String userId, L public OpenCGAResult syncRemoteGroups(String organizationId, String userId, List remoteGroupIds, String authenticationOriginId, String token) throws CatalogException { ObjectMap auditParams = new ObjectMap() + .append("organizationId", organizationId) .append("userId", userId) .append("remoteGroupIds", remoteGroupIds) .append("authenticationOriginId", authenticationOriginId) .append("token", token); - String authenticatedUser = catalogManager.getUserManager().getUserId(organizationId, token); + JwtPayload jwtPayload = catalogManager.getUserManager().validateToken(token); try { - authorizationManager.checkIsInstallationAdministrator(organizationId, authenticatedUser); + authorizationManager.checkIsInstallationAdministrator(jwtPayload); // Check userId exists Query query = new Query(UserDBAdaptor.QueryParams.ID.key(), userId); @@ -164,12 +187,13 @@ public OpenCGAResult syncRemoteGroups(String organizationId, String userI OpenCGAResult result = getStudyDBAdaptor(organizationId).resyncUserWithSyncedGroups(userId, remoteGroupIds, authenticationOriginId); - auditManager.audit(organizationId, userId, Enums.Action.UPDATE_USERS_FROM_STUDY_GROUP, Enums.Resource.STUDY, "", "", "", "", - auditParams, new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); + auditManager.audit(organizationId, jwtPayload.getUserId(organizationId), Enums.Action.UPDATE_USERS_FROM_STUDY_GROUP, + Enums.Resource.STUDY, "", "", "", "", auditParams, new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); return result; } catch (CatalogException e) { - auditManager.audit(organizationId, userId, Enums.Action.UPDATE_USERS_FROM_STUDY_GROUP, Enums.Resource.STUDY, "", "", "", "", - auditParams, new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); + auditManager.audit(organizationId, jwtPayload.getUserId(organizationId), Enums.Action.UPDATE_USERS_FROM_STUDY_GROUP, + Enums.Resource.STUDY, "", "", "", "", auditParams, + new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); throw e; } } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java index e50f1367090..b4f53d8a28f 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/JobManager.java @@ -746,6 +746,12 @@ public DBIterator iterator(String studyId, Query query, QueryOptions option return getJobDBAdaptor(organizationId).iterator(study.getUid(), query, options, userId); } + public OpenCGAResult countInOrganization(String organizationId, Query query, String token) throws CatalogException { + JwtPayload jwtPayload = userManager.validateToken(token); + authorizationManager.checkIsInstallationAdministrator(jwtPayload); + return catalogDBAdaptorFactory.getCatalogJobDBAdaptor(organizationId).count(query); + } + @Override public OpenCGAResult count(String studyId, Query query, String token) throws CatalogException { query = ParamUtils.defaultObject(query, Query::new); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java index 5b264ba0405..1b88fc94046 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/StudyManager.java @@ -226,7 +226,7 @@ private OpenCGAResult smartResolutor(CatalogFqn catalogFqn, QueryOptions OpenCGAResult studyDataResult; if (!payload.getOrganization().equals(catalogFqn.getOrganizationId())) { // If it is the administrator, we allow it without checking the user anymore - authorizationManager.checkIsInstallationAdministrator(payload.getOrganization(), payload.getUserId()); + authorizationManager.checkIsInstallationAdministrator(payload); studyDataResult = getStudyDBAdaptor(catalogFqn.getOrganizationId()).get(query, queryOptions); } else { studyDataResult = getStudyDBAdaptor(catalogFqn.getOrganizationId()).get(query, queryOptions, userId); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java index 9ba9a1793a8..96fc64ae984 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/UserManager.java @@ -700,17 +700,17 @@ public OpenCGAResult restore(String ids, QueryOptions options, String sess public OpenCGAResult resetPassword(String organizationId, String userId, String token) throws CatalogException { ParamUtils.checkParameter(userId, "userId"); ParamUtils.checkParameter(token, "token"); + JwtPayload jwtPayload = validateToken(token); try { - String authenticatedUserId = getUserId(organizationId, token); - authorizationManager.checkIsInstallationAdministrator(organizationId, authenticatedUserId); + authorizationManager.checkIsInstallationAdministrator(jwtPayload); String authOrigin = getAuthenticationOriginId(organizationId, userId); OpenCGAResult writeResult = AuthenticationFactory.resetPassword(organizationId, authOrigin, userId); - auditManager.auditUser(organizationId, userId, Enums.Action.RESET_USER_PASSWORD, userId, + auditManager.auditUser(organizationId, jwtPayload.getUserId(organizationId), Enums.Action.RESET_USER_PASSWORD, userId, new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); return writeResult; } catch (CatalogException e) { - auditManager.auditUser(organizationId, userId, Enums.Action.RESET_USER_PASSWORD, userId, + auditManager.auditUser(organizationId, jwtPayload.getUserId(organizationId), Enums.Action.RESET_USER_PASSWORD, userId, new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); throw e; } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java index 4f956443e11..aa2711e7e1d 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/migration/MigrationManager.java @@ -58,8 +58,6 @@ public class MigrationManager { private final CatalogManager catalogManager; private final Configuration configuration; -// private final StorageConfiguration storageConfiguration; -// private final MigrationDBAdaptor migrationDBAdaptor; private final Logger logger; private final MongoDBAdaptorFactory dbAdaptorFactory; @@ -67,7 +65,6 @@ public class MigrationManager { public MigrationManager(CatalogManager catalogManager, DBAdaptorFactory dbAdaptorFactory, Configuration configuration) { this.catalogManager = catalogManager; this.configuration = configuration; -// this.migrationDBAdaptor = dbAdaptorFactory.getMigrationDBAdaptor(); this.dbAdaptorFactory = (MongoDBAdaptorFactory) dbAdaptorFactory; this.logger = LoggerFactory.getLogger(MigrationManager.class); } @@ -79,7 +76,7 @@ public List runManualMigration(String version, String id, Path app public MigrationRun runManualMigration(String organizationId, String version, String id, Path appHome, boolean force, boolean offline, ObjectMap params, String token) throws CatalogException { - token = validateAdmin(organizationId, token); + token = validateAdmin(token); for (Class c : getAvailableMigrations()) { Migration migration = getMigrationAnnotation(c); if (migration.id().equals(id) && migration.version().equals(version)) { @@ -156,7 +153,7 @@ public void runMigration(String organizationId, String version, Collection> getPendingMigrations(String organizationId, String version, String token) throws CatalogException { - validateAdmin(organizationId, token); + token = validateAdmin(token); updateMigrationRuns(organizationId, token); Set> availableMigrations = getAvailableMigrations(); return filterPendingMigrations(organizationId, version, availableMigrations); } - public MigrationSummary getMigrationSummary(String organizationId) throws CatalogException { + public Map getMigrationSummary() throws CatalogException { + Map migrationSummaryMap = new HashMap<>(); + // Loop over organizations + for (String organizationId : dbAdaptorFactory.getOrganizationIds()) { + MigrationSummary migrationSummary = getMigrationSummary(organizationId); + migrationSummaryMap.put(organizationId, migrationSummary); + } + return migrationSummaryMap; + } + + private MigrationSummary getMigrationSummary(String organizationId) throws CatalogException { + logger.info("Fetching migration summary for organization '{}'", organizationId); List> runs = getMigrationRuns(organizationId, null, null, null); MigrationSummary migrationSummary = new MigrationSummary() @@ -246,7 +254,7 @@ public List> getMigrationRuns(String organizationI public List> getMigrationRuns(String organizationId, String version, List domain, List status, String token) throws CatalogException { - validateAdmin(organizationId, token); + token = validateAdmin(token); // 0. Update migration runs updateMigrationRuns(organizationId, token); @@ -256,7 +264,7 @@ public List> getMigrationRuns(String organizationI // This method should only be called when installing OpenCGA for the first time so it skips all available (and old) migrations. public void skipPendingMigrations(String organizationId, String token) throws CatalogException { - validateAdmin(organizationId, token); + validateAdmin(token); // 0. Fetch all migrations Set> availableMigrations = getAvailableMigrations(); @@ -275,17 +283,28 @@ public void skipPendingMigrations(String organizationId, String token) throws Ca } } + public void updateMigrationRuns(String token) throws CatalogException { + // Loop over all organizations + for (String organizationId : dbAdaptorFactory.getOrganizationIds()) { + if (!ParamConstants.ADMIN_ORGANIZATION.equals(organizationId)) { + updateMigrationRuns(organizationId, token); + } + } + // Lastly, migrate the admin organization + updateMigrationRuns(ParamConstants.ADMIN_ORGANIZATION, token); + } + public void updateMigrationRuns(String organizationId, String token) throws CatalogException { - validateAdmin(organizationId, token); + token = validateAdmin(token); // 0. Fetch all migrations Set> availableMigrations = getAvailableMigrations(); + logger.info("Updating migration runs for organization '{}'", organizationId); // 1. Update migration run status for (Class runnableMigration : availableMigrations) { updateMigrationRun(organizationId, getMigrationAnnotation(runnableMigration), token); } - } private List getMigrations() { @@ -456,10 +475,9 @@ private List> filterPendingMigrations(String orga return migrations; } - private String validateAdmin(String organizationId, String token) throws CatalogException { + private String validateAdmin(String token) throws CatalogException { JwtPayload jwtPayload = catalogManager.getUserManager().validateToken(token); - String userId = jwtPayload.getUserId(organizationId); - catalogManager.getAuthorizationManager().checkIsInstallationAdministrator(organizationId, userId); + catalogManager.getAuthorizationManager().checkIsInstallationAdministrator(jwtPayload); // Extend token life return catalogManager.getUserManager().getNonExpiringToken(jwtPayload.getOrganization(), jwtPayload.getUserId(), Collections.emptyMap(), token); diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/common/Enums.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/common/Enums.java index 5ad6d48c29f..46a096e9374 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/common/Enums.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/common/Enums.java @@ -175,6 +175,7 @@ public enum Action { IMPORT, + FETCH_ORGANIZATION_IDS, IMPORT_EXTERNAL_USERS, IMPORT_EXTERNAL_GROUP_OF_USERS, SYNC_EXTERNAL_GROUP_OF_USERS, diff --git a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java index 4cae7a7ede3..3306847fe2b 100644 --- a/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java +++ b/opencga-master/src/main/java/org/opencb/opencga/master/monitor/daemons/ExecutionDaemon.java @@ -250,9 +250,8 @@ public class ExecutionDaemon extends MonitorParentDaemon { }}; } - public ExecutionDaemon(int interval, String token, - CatalogManager catalogManager, StorageConfiguration storageConfiguration, String appHome) - throws CatalogDBException { + public ExecutionDaemon(int interval, String token, CatalogManager catalogManager, StorageConfiguration storageConfiguration, + String appHome) throws CatalogDBException { super(interval, token, catalogManager); this.jobManager = catalogManager.getJobManager(); @@ -305,48 +304,54 @@ public void run() { } } - protected void checkJobs() { - long pendingJobs = -1; - long queuedJobs = -1; - long runningJobs = -1; - try { - pendingJobs = jobManager.count(organizationId, pendingJobsQuery, token).getNumMatches(); - queuedJobs = jobManager.count(organizationId, queuedJobsQuery, token).getNumMatches(); - runningJobs = jobManager.count(organizationId, runningJobsQuery, token).getNumMatches(); - } catch (CatalogException e) { - logger.error("{}", e.getMessage(), e); + protected void checkJobs() throws CatalogException { + List organizationIds = catalogManager.getAdminManager().getOrganizationIds(token); + for (String organizationId : organizationIds) { + long pendingJobs = -1; + long queuedJobs = -1; + long runningJobs = -1; + try { + pendingJobs = jobManager.count(organizationId, pendingJobsQuery, token).getNumMatches(); + queuedJobs = jobManager.count(organizationId, queuedJobsQuery, token).getNumMatches(); + runningJobs = jobManager.count(organizationId, runningJobsQuery, token).getNumMatches(); + } catch (CatalogException e) { + logger.error("{}", e.getMessage(), e); + } + logger.info("----- EXECUTION DAEMON ----- Organization={} --> pending={}, queued={}, running={}", organizationId, pendingJobs, + queuedJobs, runningJobs); } - logger.info("----- EXECUTION DAEMON ----- pending={}, queued={}, running={}", pendingJobs, queuedJobs, runningJobs); - - /* - PENDING JOBS - */ - checkPendingJobs(); - - /* - QUEUED JOBS - */ - checkQueuedJobs(); - - /* - RUNNING JOBS - */ - checkRunningJobs(); + + /* + PENDING JOBS + */ + checkPendingJobs(organizationIds); + + /* + QUEUED JOBS + */ + checkQueuedJobs(organizationIds); + + /* + RUNNING JOBS + */ + checkRunningJobs(organizationIds); } - protected void checkRunningJobs() { - int handledRunningJobs = 0; - try (DBIterator iterator = jobManager.iterator(organizationId, runningJobsQuery, queryOptions, token)) { - while (handledRunningJobs < NUM_JOBS_HANDLED && iterator.hasNext()) { - try { - Job job = iterator.next(); - handledRunningJobs += checkRunningJob(job); - } catch (Exception e) { - logger.error("{}", e.getMessage(), e); + protected void checkRunningJobs(List organizationIds) { + for (String organizationId : organizationIds) { + int handledRunningJobs = 0; + try (DBIterator iterator = jobManager.iterator(organizationId, runningJobsQuery, queryOptions, token)) { + while (handledRunningJobs < NUM_JOBS_HANDLED && iterator.hasNext()) { + try { + Job job = iterator.next(); + handledRunningJobs += checkRunningJob(job); + } catch (Exception e) { + logger.error("{}", e.getMessage(), e); + } } + } catch (Exception e) { + logger.error("{}", e.getMessage(), e); } - } catch (Exception e) { - logger.error("{}", e.getMessage(), e); } } @@ -365,7 +370,7 @@ protected int checkRunningJob(Job job) { // Update the result of the job PrivateJobUpdateParams updateParams = new PrivateJobUpdateParams().setExecution(result); try { - jobManager.update(organizationId, job.getStudy().getId(), job.getId(), updateParams, QueryOptions.empty(), token); + jobManager.update(job.getStudy().getId(), job.getId(), updateParams, QueryOptions.empty(), token); } catch (CatalogException e) { logger.error("[{}] - Could not update result information: {}", job.getId(), e.getMessage(), e); return 0; @@ -391,19 +396,21 @@ protected int checkRunningJob(Job job) { } } - protected void checkQueuedJobs() { - int handledQueuedJobs = 0; - try (DBIterator iterator = jobManager.iterator(organizationId, queuedJobsQuery, queryOptions, token)) { - while (handledQueuedJobs < NUM_JOBS_HANDLED && iterator.hasNext()) { - try { - Job job = iterator.next(); - handledQueuedJobs += checkQueuedJob(job); - } catch (Exception e) { - logger.error("{}", e.getMessage(), e); + protected void checkQueuedJobs(List organizationIds) { + for (String organizationId : organizationIds) { + int handledQueuedJobs = 0; + try (DBIterator iterator = jobManager.iterator(organizationId, queuedJobsQuery, queryOptions, token)) { + while (handledQueuedJobs < NUM_JOBS_HANDLED && iterator.hasNext()) { + try { + Job job = iterator.next(); + handledQueuedJobs += checkQueuedJob(job); + } catch (Exception e) { + logger.error("{}", e.getMessage(), e); + } } + } catch (Exception e) { + logger.error("{}", e.getMessage(), e); } - } catch (Exception e) { - logger.error("{}", e.getMessage(), e); } } @@ -443,22 +450,24 @@ protected int checkQueuedJob(Job job) { } } - protected void checkPendingJobs() { + protected void checkPendingJobs(List organizationIds) { // Clear job counts each cycle jobsCountByType.clear(); - int handledPendingJobs = 0; - try (DBIterator iterator = jobManager.iterator(organizationId, pendingJobsQuery, queryOptions, token)) { - while (handledPendingJobs < NUM_JOBS_HANDLED && iterator.hasNext()) { - try { - Job job = iterator.next(); - handledPendingJobs += checkPendingJob(job); - } catch (Exception e) { - logger.error("{}", e.getMessage(), e); + for (String organizationId : organizationIds) { + int handledPendingJobs = 0; + try (DBIterator iterator = jobManager.iterator(organizationId, pendingJobsQuery, queryOptions, token)) { + while (handledPendingJobs < NUM_JOBS_HANDLED && iterator.hasNext()) { + try { + Job job = iterator.next(); + handledPendingJobs += checkPendingJob(organizationId, job); + } catch (Exception e) { + logger.error("{}", e.getMessage(), e); + } } + } catch (Exception e) { + logger.error("{}", e.getMessage(), e); } - } catch (Exception e) { - logger.error("{}", e.getMessage(), e); } } @@ -468,7 +477,7 @@ protected void checkPendingJobs() { * @param job Job object. * @return 1 if the job has changed the status, 0 otherwise. */ - protected int checkPendingJob(Job job) { + protected int checkPendingJob(String organizationId, Job job) { if (StringUtils.isEmpty(job.getStudy().getId())) { return abortJob(job, "Missing mandatory 'studyUuid' field"); } @@ -477,7 +486,7 @@ protected int checkPendingJob(Job job) { return abortJob(job, "Tool id '" + job.getTool().getId() + "' not found."); } - if (!canBeQueued(job)) { + if (!canBeQueued(organizationId, job)) { return 0; } @@ -490,7 +499,7 @@ protected int checkPendingJob(Job job) { } try { - checkToolExecutionPermission(job); + checkToolExecutionPermission(organizationId, job); } catch (Exception e) { return abortJob(job, e); } @@ -534,7 +543,6 @@ protected int checkPendingJob(Job job) { } } - Map params = job.getParams(); String outDirPathParam = (String) params.get(OUTDIR_PARAM); if (!StringUtils.isEmpty(outDirPathParam)) { @@ -547,8 +555,8 @@ protected int checkPendingJob(Job job) { } } else { try { - // JOBS/user/job_id/ - updateParams.setOutDir(getValidDefaultOutDir(job)); + // JOBS/organizationId/user/job_id/ + updateParams.setOutDir(getValidDefaultOutDir(organizationId, job)); } catch (CatalogException e) { return abortJob(job, "Cannot create output directory.", e); } @@ -572,7 +580,7 @@ protected int checkPendingJob(Job job) { logger.info("Updating job {} from {} to {}", job.getId(), Enums.ExecutionStatus.PENDING, Enums.ExecutionStatus.QUEUED); updateParams.setInternal(new JobInternal(new Enums.ExecutionStatus(Enums.ExecutionStatus.QUEUED))); try { - jobManager.update(organizationId, job.getStudy().getId(), job.getId(), updateParams, QueryOptions.empty(), token); + jobManager.update(job.getStudy().getId(), job.getId(), updateParams, QueryOptions.empty(), token); } catch (CatalogException e) { logger.error("Could not update job {}. {}", job.getId(), e.getMessage(), e); return 0; @@ -592,7 +600,7 @@ protected int checkPendingJob(Job job) { return 1; } - protected void checkToolExecutionPermission(Job job) throws Exception { + protected void checkToolExecutionPermission(String organizationId, Job job) throws Exception { Tool tool = new ToolFactory().getTool(job.getTool().getId()); AuthorizationManager authorizationManager = catalogManager.getAuthorizationManager(); @@ -721,9 +729,10 @@ private File getValidInternalOutDir(String study, Job job, String outDirPath, St return outDir; } - private File getValidDefaultOutDir(Job job) throws CatalogException { - File folder = fileManager.createFolder(job.getStudy().getId(), "JOBS/" + job.getUserId() + "/" + TimeUtils.getDay() + "/" - + job.getId(), true, "Job " + job.getTool().getId(), job.getId(), QueryOptions.empty(), token).first(); + private File getValidDefaultOutDir(String organizationId, Job job) throws CatalogException { + File folder = fileManager.createFolder(job.getStudy().getId(), "JOBS/" + organizationId + "/" + job.getUserId() + "/" + + TimeUtils.getDay() + "/" + job.getId(), true, "Job " + job.getTool().getId(), job.getId(), QueryOptions.empty(), token) + .first(); // By default, OpenCGA will not create the physical folders until there is a file, so we need to create it manually try { @@ -740,7 +749,7 @@ private File getValidDefaultOutDir(Job job) throws CatalogException { // Check if the user already has permissions set in his folder OpenCGAResult> result = fileManager.getAcls(job.getStudy().getId(), - Collections.singletonList("JOBS/" + job.getUserId() + "/"), job.getUserId(), true, token); + Collections.singletonList("JOBS/" + organizationId + "/" + job.getUserId() + "/"), job.getUserId(), true, token); if (result.getNumResults() == 0 || result.first().getAcl().isEmpty() || CollectionUtils.isEmpty(result.first().getAcl().get(0).getPermissions())) { // Add permissions to do anything under that path to the user launching the job @@ -748,10 +757,10 @@ private File getValidDefaultOutDir(Job job) throws CatalogException { .stream() .map(FilePermissions::toString) .collect(Collectors.joining(",")); - fileManager.updateAcl(job.getStudy().getId(), Collections.singletonList("JOBS/" + job.getUserId() + "/"), job.getUserId(), - new FileAclParams(null, allFilePermissions), SET, token); + fileManager.updateAcl(job.getStudy().getId(), Collections.singletonList("JOBS/" + organizationId + "/" + job.getUserId() + "/"), + job.getUserId(), new FileAclParams(null, allFilePermissions), SET, token); // Remove permissions to the @members group - fileManager.updateAcl(job.getStudy().getId(), Collections.singletonList("JOBS/" + job.getUserId() + "/"), + fileManager.updateAcl(job.getStudy().getId(), Collections.singletonList("JOBS/" + organizationId + "/" + job.getUserId() + "/"), StudyManager.MEMBERS, new FileAclParams(null, ""), SET, token); } @@ -831,7 +840,7 @@ public static void escapeCliArg(StringBuilder cliBuilder, String value) { } } - private boolean canBeQueued(Job job) { + private boolean canBeQueued(String organizationId, Job job) { if (job.getDependsOn() != null && !job.getDependsOn().isEmpty()) { for (Job tmpJob : job.getDependsOn()) { if (!Enums.ExecutionStatus.DONE.equals(tmpJob.getInternal().getStatus().getId())) { @@ -853,18 +862,18 @@ private boolean canBeQueued(Job job) { // No limit for this tool return true; } else { - return canBeQueued(job.getTool().getId(), maxJobs); + return canBeQueued(organizationId, job.getTool().getId(), maxJobs); } } - private boolean canBeQueued(String toolId, int maxJobs) { + private boolean canBeQueued(String organizationId, String toolId, int maxJobs) { Query query = new Query() .append(JobDBAdaptor.QueryParams.INTERNAL_STATUS_ID.key(), Enums.ExecutionStatus.QUEUED + "," + Enums.ExecutionStatus.RUNNING) .append(JobDBAdaptor.QueryParams.TOOL_ID.key(), toolId); long currentJobs = jobsCountByType.computeIfAbsent(toolId, k -> { try { - return catalogManager.getJobManager().count(organizationId, query, token).getNumMatches(); + return catalogManager.getJobManager().countInOrganization(organizationId, query, token).getNumMatches(); } catch (CatalogException e) { logger.error("Error counting the current number of running and queued \"" + toolId + "\" jobs", e); return 0L; @@ -908,7 +917,7 @@ private int setStatus(Job job, Enums.ExecutionStatus status) { PrivateJobUpdateParams updateParams = new PrivateJobUpdateParams().setInternal(new JobInternal(status)); try { - jobManager.update(organizationId, job.getStudy().getId(), job.getId(), updateParams, QueryOptions.empty(), token); + jobManager.update(job.getStudy().getId(), job.getId(), updateParams, QueryOptions.empty(), token); } catch (CatalogException e) { logger.error("Unexpected error. Cannot update job '{}' to status '{}'. {}", job.getId(), updateParams.getInternal().getStatus().getId(), e.getMessage(), e); @@ -973,7 +982,7 @@ private int processFinishedJob(Job job, Enums.ExecutionStatus status) { } PrivateJobUpdateParams updateParams = new PrivateJobUpdateParams().setExecution(execution); try { - jobManager.update(organizationId, job.getStudy().getId(), job.getId(), updateParams, QueryOptions.empty(), token); + jobManager.update(job.getStudy().getId(), job.getId(), updateParams, QueryOptions.empty(), token); } catch (CatalogException e) { logger.error("[{}] - Catastrophic error. Could not update job information with final result {}: {}", job.getId(), updateParams.toString(), e.getMessage(), e); @@ -1058,7 +1067,7 @@ private int processFinishedJob(Job job, Enums.ExecutionStatus status) { logger.info("[{}] - Updating job information", job.getId()); // We update the job information try { - jobManager.update(organizationId, job.getStudy().getId(), job.getId(), updateParams, QueryOptions.empty(), token); + jobManager.update(job.getStudy().getId(), job.getId(), updateParams, QueryOptions.empty(), token); } catch (CatalogException e) { logger.error("[{}] - Catastrophic error. Could not update job information with final result {}: {}", job.getId(), updateParams.toString(), e.getMessage(), e); @@ -1131,7 +1140,7 @@ private void sendWebhookNotification(Job job, URL url) throws URISyntaxException jobInternal.setEvents(Collections.singletonList(new Event(Event.Type.ERROR, "Could not notify through webhook. " + e.getMessage()))); - jobManager.update(organizationId, job.getStudy().getId(), job.getId(), updateParams, options, token); + jobManager.update(job.getStudy().getId(), job.getId(), updateParams, options, token); return; } @@ -1143,7 +1152,7 @@ private void sendWebhookNotification(Job job, URL url) throws URISyntaxException + "code: " + post.getStatus()))); } - jobManager.update(organizationId, job.getStudy().getId(), job.getId(), updateParams, options, token); + jobManager.update(job.getStudy().getId(), job.getId(), updateParams, options, token); } private String getErrorLogFileName(Job job) { diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java index 1ab7a5e3f70..cb98bae143d 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/OpenCGAWSServer.java @@ -36,7 +36,6 @@ import org.opencb.opencga.catalog.exceptions.CatalogParameterException; import org.opencb.opencga.catalog.managers.AbstractManager; import org.opencb.opencga.catalog.managers.CatalogManager; -import org.opencb.opencga.core.models.migration.MigrationRun; import org.opencb.opencga.catalog.migration.MigrationSummary; import org.opencb.opencga.catalog.utils.Constants; import org.opencb.opencga.catalog.utils.ParamUtils; @@ -45,8 +44,10 @@ import org.opencb.opencga.core.config.Configuration; import org.opencb.opencga.core.config.storage.StorageConfiguration; import org.opencb.opencga.core.exceptions.VersionException; +import org.opencb.opencga.core.models.JwtPayload; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.job.Job; +import org.opencb.opencga.core.models.migration.MigrationRun; import org.opencb.opencga.core.models.study.Study; import org.opencb.opencga.core.response.FederationNode; import org.opencb.opencga.core.response.OpenCGAResult; @@ -263,8 +264,8 @@ static void init(String opencgaHomeStr) { } logger.info("| OpenCGA REST successfully started!"); - logger.info("| - Version " + GitRepositoryState.getInstance().getBuildVersion()); - logger.info("| - Git version: " + GitRepositoryState.getInstance().getBranch() + " " + GitRepositoryState.getInstance().getCommitId()); + logger.info("| - Version {}", GitRepositoryState.getInstance().getBuildVersion()); + logger.info("| - Git version: {} {}", GitRepositoryState.getInstance().getBranch(), GitRepositoryState.getInstance().getCommitId()); logger.info("========================================================================\n"); } @@ -300,12 +301,15 @@ private static void initOpenCGAObjects() { healthCheckMonitor = new OpenCGAHealthCheckMonitor(configuration, catalogManager, storageEngineFactory, variantManager); healthCheckMonitor.asyncUpdate(); - MigrationSummary migrationSummary = catalogManager.getMigrationManager().getMigrationSummary(organizationId); - if (migrationSummary.getMigrationsToBeApplied() > 0) { - logger.info("| * Pending migrations: {}", migrationSummary.getMigrationsToBeApplied()); - for (Map.Entry entry : migrationSummary.getStatusCount().entrySet()) { - if (entry.getKey().toBeApplied() && entry.getValue() > 0) { - logger.info("| * {}: {}", entry.getKey(), entry.getValue()); + Map migrationSummaryMap = catalogManager.getMigrationManager().getMigrationSummary(); + for (Map.Entry entry : migrationSummaryMap.entrySet()) { + if (entry.getValue().getMigrationsToBeApplied() > 0) { + logger.info("| * Pending migrations for organization {}: {}", entry.getKey(), + entry.getValue().getMigrationsToBeApplied()); + for (Map.Entry entry2 : entry.getValue().getStatusCount().entrySet()) { + if (entry2.getKey().toBeApplied() && entry2.getValue() > 0) { + logger.info("| * {}: {}", entry2.getKey(), entry2.getValue()); + } } } } @@ -861,8 +865,9 @@ public Response submitJob(String toolId, String study, ToolParams bodyParams, St public Response submitJobAdmin(String toolId, ToolParams bodyParams, String jobId, String jobDescription, String jobDependsOnStr, String jobTagsStr) { return run(() -> { - if (!catalogManager.getUserManager().getUserId(organizationId, token).equals(ParamConstants.OPENCGA_USER_ID)) { - throw new CatalogAuthenticationException("Only user '" + ParamConstants.OPENCGA_USER_ID + "' can run this operation!"); + JwtPayload jwtPayload = catalogManager.getUserManager().validateToken(token); + if (!catalogManager.getAuthorizationManager().isInstallationAdministrator(jwtPayload)) { + throw new CatalogAuthorizationException("Only organization administrators can run this operation!"); } return submitJobRaw(toolId, null, ADMIN_STUDY_FQN, bodyParams, jobId, jobDescription, jobDependsOnStr, jobTagsStr); });