Skip to content

Commit

Permalink
Merge pull request #2470 from opencb/TASK-6413
Browse files Browse the repository at this point in the history
TASK-6413 - Allow migrations from 3.0.0.1 to 3.2.x
  • Loading branch information
pfurio authored Jul 1, 2024
2 parents de0568c + 31c5886 commit f7f19a0
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,34 +6,23 @@
import com.mongodb.client.model.RenameCollectionOptions;
import com.mongodb.client.model.Updates;
import com.mongodb.client.result.UpdateResult;
import org.apache.commons.lang3.StringUtils;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.opencb.commons.datastore.mongodb.MongoDataStore;
import org.opencb.opencga.catalog.db.api.NoteDBAdaptor;
import org.opencb.opencga.catalog.db.mongodb.MongoDBAdaptorFactory;
import org.opencb.opencga.catalog.db.mongodb.OrganizationMongoDBAdaptorFactory;
import org.opencb.opencga.catalog.exceptions.CatalogDBException;
import org.opencb.opencga.catalog.io.IOManagerFactory;
import org.opencb.opencga.catalog.managers.CatalogManager;
import org.opencb.opencga.catalog.migration.Migration;
import org.opencb.opencga.catalog.migration.MigrationTool;
import org.opencb.opencga.core.api.ParamConstants;
import org.opencb.opencga.core.models.notes.Note;

import java.util.Collections;
import java.util.List;

@Migration(id = "migrate_notes", description = "Migrate notes #TASK-5836", version = "3.1.0",
language = Migration.MigrationLanguage.JAVA, domain = Migration.MigrationDomain.CATALOG, date = 20240315)
public class NoteMigration extends MigrationTool {

@Override
protected void run() throws Exception {
IOManagerFactory ioManagerFactory = new IOManagerFactory();
dbAdaptorFactory = new MongoDBAdaptorFactory(configuration, ioManagerFactory);
// First migrate to add the new values
MongoCollection<Document> collection = getMongoCollection(ParamConstants.ADMIN_ORGANIZATION, "notes");
MongoCollection<Document> collection = getMongoCollection(organizationId, "notes");
Bson query = Filters.exists(NoteDBAdaptor.QueryParams.STUDY_UID.key(), false);
Bson update = Updates.combine(
Updates.set(NoteDBAdaptor.QueryParams.STUDY_UID.key(), -1L),
Expand All @@ -43,41 +32,20 @@ protected void run() throws Exception {
);
UpdateResult updateResult = collection.updateMany(query, update);
if (updateResult.getModifiedCount() == 0) {
// Check there are at least 2 organizations present
logger.info("Note data model could not be updated. Detected organizations are: {}", StringUtils.join(dbAdaptorFactory.getOrganizationIds(), ","));
if (dbAdaptorFactory.getOrganizationIds().size() == 2) {
logger.info("Nothing to migrate");
return;
} else {
throw new CatalogDBException("Notes could not be found to migrate.");
}
logger.info("Note data model could not be updated. Notes found in organization '{}': {}", organizationId, updateResult.getMatchedCount());
}
renameNoteCollection(Collections.singletonList(ParamConstants.ADMIN_ORGANIZATION));

dbAdaptorFactory.close();
dbAdaptorFactory = new MongoDBAdaptorFactory(configuration, ioManagerFactory);
// We run it a second time because the first time it will only rename the "opencga" org as OpenCGA will not be able to know
// which other organizations are present in the installation (trying to fetch the information from "note" instead of old "notes")
List<String> organizationIds = dbAdaptorFactory.getOrganizationIds();
organizationIds.remove(ParamConstants.ADMIN_ORGANIZATION);
renameNoteCollection(organizationIds);

// Reload catalog manager to install missing indexes
catalogManager = new CatalogManager(configuration);
catalogManager.installIndexes(token);
}

private void renameNoteCollection(List<String> organizationIds) throws CatalogDBException {
// Rename Note collection
RenameCollectionOptions options = new RenameCollectionOptions().dropTarget(true);
// Rename collection
for (String organizationId : organizationIds) {
String databaseName = dbAdaptorFactory.getMongoDataStore(organizationId).getDatabaseName();
logger.info("Renaming notes collection for organization '{}' -> Database: '{}'", organizationId, databaseName);
MongoDataStore mongoDataStore = dbAdaptorFactory.getMongoDataStore(organizationId);
mongoDataStore.getDb().getCollection("notes").renameCollection(new MongoNamespace(databaseName, OrganizationMongoDBAdaptorFactory.NOTE_COLLECTION), options);
mongoDataStore.getDb().getCollection("notes_archive").renameCollection(new MongoNamespace(databaseName, OrganizationMongoDBAdaptorFactory.NOTE_ARCHIVE_COLLECTION), options);
mongoDataStore.getDb().getCollection("notes_deleted").renameCollection(new MongoNamespace(databaseName, OrganizationMongoDBAdaptorFactory.DELETED_NOTE_COLLECTION), options);
}
String databaseName = dbAdaptorFactory.getMongoDataStore(organizationId).getDatabaseName();
logger.info("Renaming notes collection for organization '{}' -> Database: '{}'", organizationId, databaseName);
MongoDataStore mongoDataStore = dbAdaptorFactory.getMongoDataStore(organizationId);
mongoDataStore.getDb().getCollection("notes").renameCollection(new MongoNamespace(databaseName, OrganizationMongoDBAdaptorFactory.NOTE_COLLECTION), options);
mongoDataStore.getDb().getCollection("notes_archive").renameCollection(new MongoNamespace(databaseName, OrganizationMongoDBAdaptorFactory.NOTE_ARCHIVE_COLLECTION), options);
mongoDataStore.getDb().getCollection("notes_deleted").renameCollection(new MongoNamespace(databaseName, OrganizationMongoDBAdaptorFactory.DELETED_NOTE_COLLECTION), options);

catalogManager.installIndexes(organizationId, token);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ public void installIndexes(String token) throws CatalogException {

public void installIndexes(String organizationId, String token) throws CatalogException {
JwtPayload payload = userManager.validateToken(token);
String userId = payload.getUserId();
String userId = payload.getUserId(organizationId);
if (!authorizationManager.isAtLeastOrganizationOwnerOrAdmin(organizationId, userId)) {
throw CatalogAuthorizationException.notOrganizationOwnerOrAdmin();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,14 +125,20 @@ public void runMigration(String version, Collection<Migration.MigrationDomain> d
public void runMigration(String version, Collection<Migration.MigrationDomain> domains,
Collection<Migration.MigrationLanguage> languages, boolean offline, String appHome, ObjectMap params,
String token) throws CatalogException, IOException {
// Migrate all organizations
for (String organizationId : dbAdaptorFactory.getOrganizationIds()) {
if (!ParamConstants.ADMIN_ORGANIZATION.equals(organizationId)) {
runMigration(organizationId, version, domains, languages, offline, appHome, params, token);
runMigration(ParamConstants.ADMIN_ORGANIZATION, version, domains, languages, offline, appHome, params, token);

// ***** Starts code to remove in future versions. Reload MongoDBAdaptorFactory to avoid Notes migration issue. *****/
try (MongoDBAdaptorFactory mongoDBAdaptorFactory = new MongoDBAdaptorFactory(configuration, catalogManager.getIoManagerFactory())) {
for (String organizationId : mongoDBAdaptorFactory.getOrganizationIds()) {
// ***** Finish code to remove in future versions. Reload MongoDBAdaptorFactory to avoid Notes migration issue. *****/

// Migrate all organizations
// for (String organizationId : dbAdaptorFactory.getOrganizationIds()) {
if (!ParamConstants.ADMIN_ORGANIZATION.equals(organizationId)) {
runMigration(organizationId, version, domains, languages, offline, appHome, params, token);
}
}
}
// Lastly, migrate the admin organization
runMigration(ParamConstants.ADMIN_ORGANIZATION, version, domains, languages, offline, appHome, params, token);
}

public void runMigration(String organizationId, String version, Collection<Migration.MigrationDomain> domains,
Expand Down

0 comments on commit f7f19a0

Please sign in to comment.