Skip to content

Commit

Permalink
Merge pull request #2329 from opencb/TASK-4913
Browse files Browse the repository at this point in the history
TASK-4913 - Unable to update cellbase-token
  • Loading branch information
j-coll authored Sep 1, 2023
2 parents a3de4e1 + 483d556 commit abd4e68
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
import org.opencb.opencga.catalog.managers.StudyManager;
import org.opencb.opencga.core.api.ParamConstants;
import org.opencb.opencga.core.cellbase.CellBaseValidator;
import org.opencb.opencga.core.common.ExceptionUtils;
import org.opencb.opencga.core.common.UriUtils;
import org.opencb.opencga.core.config.storage.CellBaseConfiguration;
import org.opencb.opencga.core.config.storage.SampleIndexConfiguration;
Expand Down Expand Up @@ -564,7 +565,10 @@ public OpenCGAResult<Job> setCellbaseConfiguration(String project, CellBaseConfi
String annotationSaveId, String token)
throws CatalogException, StorageEngineException {
StopWatch stopwatch = StopWatch.createStarted();
return secureOperationByProject("configureCellbase", project, new ObjectMap(), token, engine -> {
return secureOperationByProject("configureCellbase", project, new ObjectMap()
.append("cellbaseConfiguration", cellbaseConfiguration)
.append("annotate", annotate)
.append("annotationSaveId", annotationSaveId), token, engine -> {
OpenCGAResult<Job> result = new OpenCGAResult<>();
result.setResultType(Job.class.getCanonicalName());
result.setResults(new ArrayList<>());
Expand Down Expand Up @@ -1225,7 +1229,7 @@ private <R> R secureTool(String toolId, boolean isOperation, ObjectMap params, S
throw e;
} catch (Exception e) {
exception = e;
throw new StorageEngineException("Error executing operation " + toolId, e);
throw new StorageEngineException("Error executing operation '" + toolId + "' : " + e.getMessage(), e);
} finally {
if (result instanceof DataResult) {
auditAttributes.append("dbTime", ((DataResult) result).getTime());
Expand All @@ -1237,6 +1241,8 @@ private <R> R secureTool(String toolId, boolean isOperation, ObjectMap params, S
if (exception != null) {
auditAttributes.append("errorType", exception.getClass());
auditAttributes.append("errorMessage", exception.getMessage());
auditAttributes.append("errorMessageFull", ExceptionUtils.prettyExceptionMessage(exception, false, true));
auditAttributes.append("exceptionStackTrace", ExceptionUtils.prettyExceptionStackTrace(exception));
status = new AuditRecord.Status(AuditRecord.Status.Result.ERROR,
new Error(-1, exception.getClass().getName(), exception.getMessage()));
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
package org.opencb.opencga.core.cellbase;

import io.jsonwebtoken.JwtException;
import org.apache.commons.lang3.StringUtils;
import org.opencb.biodata.models.variant.avro.VariantAnnotation;
import org.opencb.cellbase.client.rest.CellBaseClient;
import org.opencb.cellbase.core.config.SpeciesConfiguration;
import org.opencb.cellbase.core.config.SpeciesProperties;
import org.opencb.cellbase.core.models.DataRelease;
import org.opencb.cellbase.core.result.CellBaseDataResponse;
import org.opencb.cellbase.core.token.DataAccessTokenManager;
import org.opencb.cellbase.core.token.DataAccessTokenSources;
import org.opencb.commons.datastore.core.QueryOptions;
import org.opencb.opencga.core.common.VersionUtils;
import org.opencb.opencga.core.config.storage.CellBaseConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.*;

public class CellBaseValidator {

Expand Down Expand Up @@ -46,6 +46,7 @@ private CellBaseClient newCellBaseClient(CellBaseConfiguration cellBaseConfigura
toCellBaseSpeciesName(species),
assembly,
cellBaseConfiguration.getDataRelease(),
cellBaseConfiguration.getToken(),
cellBaseConfiguration.toClientConfiguration());
}

Expand Down Expand Up @@ -120,7 +121,7 @@ public void validate() throws IOException {
validate(false);
}

public CellBaseConfiguration validate(boolean autoComplete) throws IOException {
private CellBaseConfiguration validate(boolean autoComplete) throws IOException {
CellBaseConfiguration cellBaseConfiguration = getCellBaseConfiguration();
String inputVersion = getVersion();
CellBaseDataResponse<SpeciesProperties> species;
Expand Down Expand Up @@ -173,6 +174,41 @@ public CellBaseConfiguration validate(boolean autoComplete) throws IOException {
}
}
}
String token = getToken();
if (StringUtils.isEmpty(token)) {
cellBaseConfiguration.setToken(null);
} else {
// Check it's supported
if (!supportsToken(serverVersion)) {
throw new IllegalArgumentException("Token not supported for cellbase "
+ "url: '" + getURL() + "'"
+ ", version: '" + inputVersion + "'");
}

// Check it's an actual token
DataAccessTokenManager tokenManager = new DataAccessTokenManager();
try {
tokenManager.decode(token);
} catch (JwtException e) {
throw new IllegalArgumentException("Malformed token for cellbase "
+ "url: '" + getURL() + "'"
+ ", version: '" + inputVersion
+ "', species: '" + getSpecies()
+ "', assembly: '" + getAssembly() + "'");
}

// Check it's a valid token
CellBaseDataResponse<VariantAnnotation> response = cellBaseClient.getVariantClient()
.getAnnotationByVariantIds(Collections.singletonList("1:1:N:C"), new QueryOptions(), true);
if (response.firstResult() == null) {
throw new IllegalArgumentException("Invalid token for cellbase "
+ "url: '" + getURL() + "'"
+ ", version: '" + inputVersion
+ "', species: '" + getSpecies()
+ "', assembly: '" + getAssembly() + "'");
}
}

return cellBaseConfiguration;
}

Expand Down Expand Up @@ -206,6 +242,11 @@ public static boolean supportsDataRelease(String serverVersion) {
return VersionUtils.isMinVersion("5.1.0", serverVersion);
}

public static boolean supportsToken(String serverVersion) {
// Tokens support starts at version 5.4.0
return VersionUtils.isMinVersion("5.4.0", serverVersion);
}

public String getVersionFromServerMajor() throws IOException {
return major(getVersionFromServer());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package org.opencb.opencga.core.cellbase;

import org.apache.commons.lang3.StringUtils;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
Expand Down Expand Up @@ -70,4 +72,45 @@ public void testNoActiveReleases() throws IOException {
thrown.expectMessage("No active data releases found on cellbase");
CellBaseValidator.validate(new CellBaseConfiguration(ParamConstants.CELLBASE_URL, "v5.1", null, null), "mmusculus", "GRCm38", true);
}

@Test
public void testToken() throws IOException {
String token = System.getenv("CELLBASE_HGMD_TOKEN");
Assume.assumeTrue(StringUtils.isNotEmpty(token));
CellBaseConfiguration validated = CellBaseValidator.validate(new CellBaseConfiguration(ParamConstants.CELLBASE_URL, "v5.4", null, token), "hsapiens", "grch38", true);
Assert.assertNotNull(validated.getToken());
}

@Test
public void testTokenNotSupported() throws IOException {
String token = System.getenv("CELLBASE_HGMD_TOKEN");
Assume.assumeTrue(StringUtils.isNotEmpty(token));
thrown.expectMessage("Token not supported");
CellBaseConfiguration validated = CellBaseValidator.validate(new CellBaseConfiguration(ParamConstants.CELLBASE_URL, "v5.1", null, token), "hsapiens", "grch38", true);
Assert.assertNotNull(validated.getToken());
}

@Test
public void testTokenEmpty() throws IOException {
String token = "";
CellBaseConfiguration validated = CellBaseValidator.validate(new CellBaseConfiguration(ParamConstants.CELLBASE_URL, "v5.1", null, token), "hsapiens", "grch38", true);
Assert.assertNull(validated.getToken());
}

@Test
public void testMalformedToken() throws IOException {
thrown.expectMessage("Malformed token for cellbase");
String token = "MALFORMED_TOKEN";
CellBaseConfiguration validated = CellBaseValidator.validate(new CellBaseConfiguration(ParamConstants.CELLBASE_URL, "v5.4", null, token), "hsapiens", "grch38", true);
Assert.assertNotNull(validated.getToken());
}

@Test
public void testUnsignedToken() throws IOException {
thrown.expectMessage("Invalid token for cellbase");
String token = "eyJhbGciOiJIUzI1NiJ9.eyJzb3VyY2VzIjp7ImhnbWQiOjkyMjMzNzIwMzY4NTQ3NzU4MDd9LCJ2ZXJzaW9uIjoiMS4wIiwic3ViIjoiWkVUVEEiLCJpYXQiOjE2OTMyMTY5MDd9.invalidsignature";
CellBaseConfiguration validated = CellBaseValidator.validate(new CellBaseConfiguration(ParamConstants.CELLBASE_URL, "v5.4", null, token), "hsapiens", "grch38", true);
Assert.assertNotNull(validated.getToken());
}

}

0 comments on commit abd4e68

Please sign in to comment.