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.URIUtil;
import com.emc.storageos.db.client.model.DiscoveredDataObject;
import com.emc.storageos.db.client.model.StorageProvider;
import com.emc.storageos.db.client.model.StorageSystem;
import com.emc.storageos.db.client.upgrade.BaseCustomMigrationCallback;
import com.emc.storageos.svcs.errorhandling.resources.MigrationCallbackException;
public class XtremioStorageSystemToStorageProviderMigration
extends BaseCustomMigrationCallback {
private static final Logger log = LoggerFactory.getLogger(XtremioStorageSystemToStorageProviderMigration.class);
/**
* 1. Iterate each storage systems.
* a) Create new StorageProvider instance per xtremio storage system instance available in db.
* b) Update the newly created storage provider Id reference with the xtremio storage system using provider.setStorageSystems().
* c) Need to change storageSystem.activeProviderURI and storageSystem.getProviders() with the newly created
* StorageProvider id.
*/
@Override
public void process() throws MigrationCallbackException {
DbClient dbClient = getDbClient();
try {
List<URI> storageSystemURIList = dbClient.queryByType(StorageSystem.class, true);
List<StorageSystem> storageSystemsList = dbClient.queryObject(StorageSystem.class, storageSystemURIList);
Iterator<StorageSystem> systemItr = storageSystemsList.iterator();
List<StorageSystem> systemsToUpdate = new ArrayList<StorageSystem>();
List<StorageProvider> storageProvidersToCreate = new ArrayList<StorageProvider>();
while (systemItr.hasNext()) {
StorageSystem storageSystem = systemItr.next();
// perform storagesystem upgrade only for XtremIO storagesystems.
if (DiscoveredDataObject.Type.xtremio.name().equalsIgnoreCase(storageSystem.getSystemType())) {
storageProvidersToCreate.add(createNewStorageProviderInstance(storageSystem));
}
}
dbClient.createObject(storageProvidersToCreate);
// persist all systems here.
dbClient.persistObject(systemsToUpdate);
} catch (Exception e) {
log.error("Exception occured while updating xtremio storagesystem to storage provider model");
log.error(e.getMessage(), e);
}
}
/**
* Creates new StorageProvider instance for the given storage system while doing db upgrade.
*
* @param smisProvider
* @return {@link StorageProvider} newly created StorageProvider instance
*/
private StorageProvider createNewStorageProviderInstance(StorageSystem xioSystem) {
log.info("Creating a new storage provider for storage system {}", xioSystem.getLabel());
StorageProvider storageProvider = new StorageProvider();
storageProvider.setId(URIUtil.createId(StorageProvider.class));
storageProvider.setCompatibilityStatus(xioSystem.getCompatibilityStatus());
// Set connectionStatus as Connected always, Let scan validate the connection later.
storageProvider.setConnectionStatus(StorageProvider.ConnectionStatus.CONNECTED.name());
storageProvider.setCreationTime(xioSystem.getCreationTime());
storageProvider.setInterfaceType(StorageProvider.InterfaceType.xtremio.name());
storageProvider.setIPAddress(xioSystem.getIpAddress());
storageProvider.setLabel(xioSystem.getLabel());
storageProvider.setLastScanStatusMessage(xioSystem.getLastDiscoveryStatusMessage());
storageProvider.setLastScanTime(xioSystem.getLastDiscoveryRunTime());
storageProvider.setPassword(xioSystem.getPassword());
storageProvider.setPortNumber(xioSystem.getPortNumber());
storageProvider.setRegistrationStatus(xioSystem.getRegistrationStatus());
storageProvider.setScanStatus(xioSystem.getDiscoveryStatus());
storageProvider.setOpStatus(xioSystem.getOpStatus());
storageProvider.setSuccessScanTime(xioSystem.getSuccessDiscoveryTime());
storageProvider.setTag(xioSystem.getTag());
storageProvider.setUserName(xioSystem.getUsername());
storageProvider.setVersionString(xioSystem.getFirmwareVersion());
log.info("Adding the storage system to the storage provider");
storageProvider.addStorageSystem(dbClient, xioSystem, true);
return storageProvider;
}
}