/*
* Copyright (c) 2013 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.db.client.upgrade.callbacks;
import java.net.URI;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.model.BlockMirror;
import com.emc.storageos.db.client.model.BlockObject;
import com.emc.storageos.db.client.model.BlockSnapshot;
import com.emc.storageos.db.client.model.Volume;
import com.emc.storageos.db.client.upgrade.BaseCustomMigrationCallback;
import com.emc.storageos.db.client.util.NullColumnValueGetter;
import com.emc.storageos.svcs.errorhandling.resources.MigrationCallbackException;
/**
* Migration handler to migrate BlockObject consistencyGroup to the new
* consistencyGroups list field.
*
*/
public class BlockObjectConsistencyGroupMigration extends BaseCustomMigrationCallback {
private static final Logger log = LoggerFactory.getLogger(BlockObjectConsistencyGroupMigration.class);
@Override
public void process() throws MigrationCallbackException {
updateVolumeConsistencyGroup();
updateBlockMirrorConsistencyGroup();
updateBlockSnapshotConsistencyGroup();
}
/**
* Update the Volume object to migrate the old consistencyGroup field
* into the new consistencyGroup list field.
*/
private void updateVolumeConsistencyGroup() {
log.info("Migrating Volume consistencyGroup to consistencyGroups.");
DbClient dbClient = getDbClient();
List<URI> volumeURIs = dbClient.queryByType(Volume.class, false);
Iterator<Volume> volumes = dbClient.queryIterativeObjects(Volume.class, volumeURIs);
List<BlockObject> blockObjects = new ArrayList<BlockObject>();
while (volumes.hasNext()) {
blockObjects.add(volumes.next());
}
migrate(blockObjects);
}
/**
* Update the BlockMirror object to migrate the old consistencyGroup field
* into the new consistencyGroup list field.
*/
private void updateBlockMirrorConsistencyGroup() {
log.info("Migrating BlockMirror consistencyGroup to consistencyGroups.");
DbClient dbClient = getDbClient();
List<URI> blockMirrorURIs = dbClient.queryByType(BlockMirror.class, false);
Iterator<BlockMirror> blockMirrors = dbClient.queryIterativeObjects(BlockMirror.class, blockMirrorURIs);
List<BlockObject> blockObjects = new ArrayList<BlockObject>();
while (blockMirrors.hasNext()) {
blockObjects.add(blockMirrors.next());
}
migrate(blockObjects);
}
/**
* Update the BlockSnapshot object to migrate the old consistencyGroup field
* into the new consistencyGroup list field.
*/
private void updateBlockSnapshotConsistencyGroup() {
log.info("Migrating BlockSnapshot consistencyGroup to consistencyGroups.");
DbClient dbClient = getDbClient();
List<URI> blockSnapshotURIs = dbClient.queryByType(BlockSnapshot.class, false);
Iterator<BlockSnapshot> blockSnapshots = dbClient.queryIterativeObjects(BlockSnapshot.class, blockSnapshotURIs);
List<BlockObject> blockObjects = new ArrayList<BlockObject>();
while (blockSnapshots.hasNext()) {
blockObjects.add(blockSnapshots.next());
}
migrate(blockObjects);
}
private void migrate(List<BlockObject> blockObjects) {
for (BlockObject blockObject : blockObjects) {
if (blockObject.getConsistencyGroup() != null) {
blockObject.addConsistencyGroup(blockObject.getConsistencyGroup().toString());
blockObject.setConsistencyGroup(NullColumnValueGetter.getNullURI());
dbClient.persistObject(blockObject);
log.info("Migrated BlockConsistencyGroup (id={}) on BlockObject (id={}).",
blockObject.getConsistencyGroup().toString(), blockObject.getId().toString());
}
}
}
}