Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TASK-4913 - Unable to update cellbase-token #2329

Merged
merged 4 commits into from
Sep 1, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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());
}

}
Loading