/*
* Copyright (c) 2013 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.db.client.upgrade.callbacks;
import java.net.URI;
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.Volume;
import com.emc.storageos.db.client.upgrade.BaseCustomMigrationCallback;
import com.emc.storageos.svcs.errorhandling.resources.MigrationCallbackException;
/**
* Migration handler to initialize access_state and link_status. These fields will likely be
* overwritten during discovery, however it's a good idea to put a base in there just in case.
*
*/
public class VolumeAccessStateLinkStatusMigration extends BaseCustomMigrationCallback {
private static final Logger log = LoggerFactory.getLogger(VolumeAccessStateLinkStatusMigration.class);
@Override
public void process() throws MigrationCallbackException {
initializeVolumeFields();
}
/**
* For all volumes, fill in the right access states and link status
*/
private void initializeVolumeFields() {
log.info("Updating volume access state and link status.");
DbClient dbClient = this.getDbClient();
List<URI> volumeURIs = dbClient.queryByType(Volume.class, false);
Iterator<Volume> volumes =
dbClient.queryIterativeObjects(Volume.class, volumeURIs);
while (volumes.hasNext()) {
Volume volume = volumes.next();
log.info("Examining Volume (id={}) for upgrade", volume.getId().toString());
if (volume.checkForRp() || volume.checkForSRDF()) {
// If this volume is a source and exported to a host, the volume is write-disabled. Otherwise it is readwrite.
volume.setLinkStatus(Volume.LinkStatus.IN_SYNC.toString());
if (volume.getPersonality().equals(Volume.PersonalityTypes.SOURCE.toString())) {
volume.setAccessState(Volume.VolumeAccessState.READWRITE.toString());
} else if (volume.getPersonality().equals(Volume.PersonalityTypes.TARGET.toString())) {
volume.setAccessState(Volume.VolumeAccessState.NOT_READY.toString());
} else if (volume.getPersonality().equals(Volume.PersonalityTypes.METADATA.toString())) {
volume.setAccessState(Volume.VolumeAccessState.NOT_READY.toString());
}
} else {
// No need to set link status for a non-protected volume.
volume.setAccessState(Volume.VolumeAccessState.READWRITE.toString());
}
dbClient.persistObject(volume);
}
}
}