/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.db.client.upgrade.callbacks;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
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.StorageHADomain;
import com.emc.storageos.db.client.model.StoragePort;
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;
/**
* DB Migration callback to populate storageHADomain attribute for
* pre-existing storage ports.
*
*/
public class StoragePortHADomainPopulater extends BaseCustomMigrationCallback
{
private static final Logger log = LoggerFactory.getLogger(StoragePortHADomainPopulater.class);
/*
* (non-Javadoc)
*
* @see com.emc.storageos.db.client.upgrade.BaseCustomMigrationCallback#process()
*/
@Override
public void process() throws MigrationCallbackException
{
log.info("START - StoragePortHADomainPopulater migration call back");
DbClient dbClient = getDbClient();
List<URI> storagePortURIs = dbClient.queryByType(StoragePort.class, false);
Iterator<StoragePort> storagePortsIter = dbClient.queryIterativeObjects(StoragePort.class, storagePortURIs);
Map<URI, StorageSystem> uriVsSystem = new HashMap<>();
List<StoragePort> modifiedPorts = new ArrayList<>();
while (storagePortsIter.hasNext())
{
StoragePort storagePort = storagePortsIter.next();
URI deviceURI = storagePort.getStorageDevice();
StorageSystem system = null;
if (uriVsSystem.containsKey(deviceURI))
{
system = uriVsSystem.get(deviceURI);
}
else
{
system = dbClient.queryObject(StorageSystem.class, deviceURI);
if (null != system)
{
uriVsSystem.put(deviceURI, system);
}
else
{
log.warn("No storage system found for the port - {} , it will be skipped from"
+ "migration, storageHADomain will continue to remain empty", storagePort.getId().toString());
continue;
}
}
if (storagePort.getStorageHADomain() == null &&
DiscoveredDataObject.Type.openstack.name().equalsIgnoreCase((system.getSystemType())))
{
StorageHADomain haDomain = createStorageAdapter(system, dbClient);
log.info("Populating the storageHADomian for the port - {} ", storagePort.getId().toString());
storagePort.setStorageHADomain(haDomain.getId());
modifiedPorts.add(storagePort);
}
}
// Persist the change
if (!modifiedPorts.isEmpty())
{
dbClient.persistObject(modifiedPorts);
}
log.info("END - StoragePortHADomainPopulater migration call back");
}
private StorageHADomain createStorageAdapter(StorageSystem storageSystem,
DbClient dbClient) {
String cinderHostName = "";
URI providerUri = storageSystem.getActiveProviderURI();
StorageProvider provider = dbClient.queryObject(StorageProvider.class, providerUri);
if (null != provider && null != provider.getKeys())
{
cinderHostName = provider.getKeyValue("CINDER_HOST_NAME");
}
String adapterNativeGUID = generateNativeGuid(storageSystem, cinderHostName, "ADAPTER");
StorageHADomain adapter = new StorageHADomain();
adapter.setStorageDeviceURI(storageSystem.getId());
adapter.setId(URIUtil.createId(StorageHADomain.class));
adapter.setAdapterName(cinderHostName);
adapter.setLabel(cinderHostName);
adapter.setNativeGuid(adapterNativeGUID);
adapter.setNumberofPorts("1");
adapter.setAdapterType(StorageHADomain.HADomainType.FRONTEND.name());
adapter.setInactive(false);
dbClient.createObject(adapter);
return adapter;
}
private String generateNativeGuid(StorageSystem device, String uniqueId, String type)
{
String typeStr = type;
return String.format("%s+%s+%s+%s", "OPENSTACK", device.getSerialNumber(), typeStr, uniqueId);
}
}