/*
* Copyright (c) 2014 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.DataObject.Flag;
import com.emc.storageos.db.client.model.ExportGroup;
import com.emc.storageos.db.client.model.Initiator;
import com.emc.storageos.db.client.model.StringSet;
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 update the internal flags of Export Group
* and Initiator objects for RecoverPoint.
*/
public class RpExportGroupInternalFlagMigration extends BaseCustomMigrationCallback {
private static final Logger log = LoggerFactory.getLogger(RpExportGroupInternalFlagMigration.class);
@Override
public void process() throws MigrationCallbackException {
updateFlagsForInitiators();
updateFlagsForExportGroups();
}
/**
* Update initiators that need to have the internal flags set.
*/
private void updateFlagsForInitiators() {
DbClient dbClient = getDbClient();
List<URI> initiatorURIs = dbClient.queryByType(Initiator.class, false);
Iterator<Initiator> initiators = dbClient.queryIterativeObjects(Initiator.class, initiatorURIs);
while (initiators.hasNext()) {
Initiator initiator = initiators.next();
log.debug("Examining initiator (id={}) for upgrade", initiator.getId().toString());
// Check to see if this is a RP Initiator
if (checkIfInitiatorForRPBeforeMigration(initiator)) {
log.info("Initiator (id={}) must be upgraded", initiator.getId().toString());
initiator.addInternalFlags(Flag.RECOVERPOINT);
dbClient.persistObject(initiator);
log.info("Marked initiator (id={}) as RecoverPoint", initiator.getId().toString());
}
}
}
/**
* Update export groups that need to have the internal flags set.
*/
private void updateFlagsForExportGroups() {
DbClient dbClient = getDbClient();
List<URI> exportGroupURIs = dbClient.queryByType(ExportGroup.class, false);
Iterator<ExportGroup> exportGroups = dbClient.queryIterativeObjects(ExportGroup.class, exportGroupURIs);
while (exportGroups.hasNext()) {
ExportGroup exportGroup = exportGroups.next();
log.debug("Examining export group (id={}) for upgrade", exportGroup.getId().toString());
// Check to see if this export group has RP Initiators
if (checkIfInitiatorsForRPAfterMigration(exportGroup.getInitiators())) {
log.info("Export group (id={}) must be upgraded", exportGroup.getId().toString());
exportGroup.addInternalFlags(Flag.RECOVERPOINT);
dbClient.persistObject(exportGroup);
log.info("Marked export group (id={}) as RecoverPoint", exportGroup.getId().toString());
}
}
}
/**
* Check if the passed in initiator is for RP
*
* @param initiator
* -- initiator to check
* @return true if the initiators are for RP, false otherwise
*/
private boolean checkIfInitiatorForRPBeforeMigration(Initiator initiator) {
if (initiator == null) {
return false;
}
boolean isRP = true;
if (NullColumnValueGetter.isNullValue(initiator.getHostName())
|| !NullColumnValueGetter.isNullURI(initiator.getHost())) {
isRP = false;
}
log.debug("RP initiator? " + (isRP ? "Yes!" : "No!"));
return isRP;
}
/**
* Check if the passed in initiators are for RP
*
* @param initiators
* -- initiators to check
* @return true if the initiators are for RP, false otherwise
*/
private boolean checkIfInitiatorsForRPAfterMigration(StringSet initiators) {
if (initiators == null) {
return false;
}
boolean isRP = false;
for (String initiatorId : initiators) {
Initiator initiator = dbClient.queryObject(Initiator.class, URI.create(initiatorId));
if (initiator != null) {
isRP = initiator.checkInternalFlags(Flag.RECOVERPOINT);
if (isRP) {
break;
}
}
}
log.debug("RP initiators? " + (isRP ? "Yes!" : "No!"));
return isRP;
}
}