/*
* Copyright (c) 2013-2014 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.db.server.upgrade.impl.callback;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.db.client.URIUtil;
import com.emc.storageos.db.client.model.DiscoveredDataObject;
import com.emc.storageos.db.client.model.ExportMask;
import com.emc.storageos.db.client.model.Initiator;
import com.emc.storageos.db.client.model.StorageSystem;
import com.emc.storageos.db.client.model.StringMap;
import com.emc.storageos.db.client.model.StringSet;
import com.emc.storageos.db.client.model.Volume;
import com.emc.storageos.db.client.upgrade.BaseCustomMigrationCallback;
import com.emc.storageos.db.client.upgrade.callbacks.VplexExportMaskInitiatorsAndVolumesMigration;
import com.emc.storageos.db.client.util.StringSetUtil;
import com.emc.storageos.db.server.DbsvcTestBase;
import com.emc.storageos.db.server.upgrade.DbSimpleMigrationTestBase;
/**
* Unit test for VplexExportMaskInitiatorsAndVolumesMigration procedure
*/
public class VplexExportMaskInitiatorsAndVolumesMigrationTest extends DbSimpleMigrationTestBase {
private static final Logger log = LoggerFactory.getLogger(VplexExportMaskInitiatorsAndVolumesMigrationTest.class);
private final String ExportMaskCase1 = "ExportMaskCase1";
private final String ExportMaskCase2 = "ExportMaskCase2";
private final String ExportMaskCase3 = "ExportMaskCase3";
private final String ExportMaskCase4 = "ExportMaskCase4";
@BeforeClass
public static void setup() throws IOException {
customMigrationCallbacks.put("1.1", new ArrayList<BaseCustomMigrationCallback>() {
private static final long serialVersionUID = 1L;
{
// Add your implementation of migration callback below.
add(new VplexExportMaskInitiatorsAndVolumesMigration());
}
});
DbsvcTestBase.setup();
}
@Override
protected String getSourceVersion() {
return "1.1";
}
@Override
protected String getTargetVersion() {
return "2.0";
}
@Override
protected void prepareData() throws Exception {
prepareExportMaskVolumeAndInitiatorDataCase1();
prepareExportMaskVolumeAndInitiatorDataCase2();
prepareExportMaskInitiatorDataCase3();
prepareExportMaskInitiatorDataCase4();
}
@Override
protected void verifyResults() throws Exception {
verifyExportMasksResults();
}
/*
* Test Case 1:
* Here ExportMask createdBySystem is true
*
* 1.Adds volumes to userAddedVolumes when there are no volumes at
* all in the user added volumes i:e userAddedVolumes == null
*
* 2.Adds initiators to userAddedInitiators when there are no initiators
* at all in the userAddedInitiators i:e userAddedInitiators == null
*/
private void prepareExportMaskVolumeAndInitiatorDataCase1() throws Exception {
StringMap volumes = new StringMap();
try {
Volume volume1 = new Volume();
volume1.setId(URIUtil.createId(Volume.class));
volume1.setLabel("volume1");
volume1.setWWN("60000970000195701505533031343341");
_dbClient.createObject(volume1);
log.info("create VPLEX volume1 with URI: " + volume1.getId());
volumes.put(volume1.getId().toString(), "0");
Volume volume2 = new Volume();
volume2.setId(URIUtil.createId(Volume.class));
volume2.setLabel("volume2");
volume2.setWWN("60000970000195701505533031343342");
_dbClient.createObject(volume2);
log.info("create VPLEX volume2 with URI: " + volume2.getId());
volumes.put(volume2.getId().toString(), "1");
List<URI> initiatorsURIs = new ArrayList<URI>();
Initiator initiator1 = new Initiator();
initiator1.setId(URIUtil.createId(Initiator.class));
initiator1.setInitiatorPort("10:00:00:E0:7E:EE:EE:01");
_dbClient.createObject(initiator1);
log.info("create initiator1 with URI: " + initiator1.getId());
initiatorsURIs.add(initiator1.getId());
Initiator initiator2 = new Initiator();
initiator2.setId(URIUtil.createId(Initiator.class));
initiator2.setInitiatorPort("10:00:00:E0:7E:EE:EE:02");
_dbClient.createObject(initiator2);
log.info("create initiator1 with URI: " + initiator2.getId());
initiatorsURIs.add(initiator2.getId());
StorageSystem storageSystem = new StorageSystem();
storageSystem.setId(URIUtil.createId(StorageSystem.class));
storageSystem.setSystemType(DiscoveredDataObject.Type.vplex.name());
storageSystem.setLabel("VplexStorageSystem");
_dbClient.createObject(storageSystem);
log.info("created VPLEX storageSystem with URI: " + storageSystem.getId());
ExportMask exportMask = new ExportMask();
exportMask.setId(URIUtil.createId(ExportMask.class));
exportMask.setStorageDevice(storageSystem.getId());
exportMask.setVolumes(volumes);
exportMask.setInitiators(StringSetUtil.uriListToStringSet(initiatorsURIs));
exportMask.setCreatedBySystem(true);
exportMask.setMaskName(ExportMaskCase1);
_dbClient.createObject(exportMask);
log.info("created VPLEX exportmask ExportMaskCase1 with URI: " + exportMask.getId());
} catch (Exception e) {
log.error("Error is" + e);
throw (e);
}
}
/*
* Test Case 2:
* Here ExportMask createdBySystem is true
*
* 1.Adds volumes to userAddedVolumes when there are some volumes
* in the user added volumes but not all from the volumes list
* i:e userAddedVolumes != null
*
* 2.Adds initiators to userAddedInitiators when there are some initiators
* in the userAddedInitiators but not all from the initiators list
* i:e userAddedInitiators != null , it adds which are not already in the
* userAddedInitiators
*/
private void prepareExportMaskVolumeAndInitiatorDataCase2() throws Exception {
StringMap volumes = new StringMap();
try {
Volume volume21 = new Volume();
volume21.setId(URIUtil.createId(Volume.class));
volume21.setLabel("volume21");
volume21.setWWN("60000970000195701505533031343321");
_dbClient.createObject(volume21);
log.info("create VPLEX volume21 with URI: " + volume21.getId());
volumes.put(volume21.getId().toString(), "0");
Volume volume22 = new Volume();
volume22.setId(URIUtil.createId(Volume.class));
volume22.setLabel("volume22");
// volume22.setWWN("60000970000195701505533031343322");
_dbClient.createObject(volume22);
log.info("create VPLEX volume22 with URI: " + volume22.getId());
volumes.put(volume22.getId().toString(), "1");
List<URI> initiatorsURIs = new ArrayList<URI>();
Initiator initiator1 = new Initiator();
initiator1.setId(URIUtil.createId(Initiator.class));
initiator1.setInitiatorPort("10:00:00:E0:7E:EE:EE:21");
_dbClient.createObject(initiator1);
log.info("create initiator1 with URI: " + initiator1.getId());
initiatorsURIs.add(initiator1.getId());
Initiator initiator2 = new Initiator();
initiator2.setId(URIUtil.createId(Initiator.class));
initiator2.setInitiatorPort("10:00:00:E0:7E:EE:EE:22");
_dbClient.createObject(initiator2);
log.info("create initiator1 with URI: " + initiator2.getId());
initiatorsURIs.add(initiator2.getId());
StorageSystem storageSystem = new StorageSystem();
storageSystem.setId(URIUtil.createId(StorageSystem.class));
storageSystem.setSystemType(DiscoveredDataObject.Type.vplex.name());
storageSystem.setLabel("VplexStorageSystem");
_dbClient.createObject(storageSystem);
log.info("created VPLEX storageSystem with URI: " + storageSystem.getId());
ExportMask exportMask = new ExportMask();
exportMask.setId(URIUtil.createId(ExportMask.class));
exportMask.setStorageDevice(storageSystem.getId());
exportMask.setVolumes(volumes);
exportMask.setInitiators(StringSetUtil.uriListToStringSet(initiatorsURIs));
exportMask.addToUserCreatedInitiators(initiator1);
exportMask.addToUserCreatedVolumes(volume21);
exportMask.setCreatedBySystem(true);
exportMask.setMaskName(ExportMaskCase2);
_dbClient.createObject(exportMask);
log.info("created VPLEX exportmask ExportMaskCase2 with URI: " + exportMask.getId());
} catch (Exception e) {
log.error("Error is" + e);
throw (e);
}
}
/*
* Test Case 3:
* Here ExportMask createdBySystem is false
*
* 1.First adds initiators to userAddedInitiators when there are no initiators
* at all in the userAddedInitiators from the initiators list
* i:e userAddedInitiators == null
*
* 2.Adds exitingInitiators to the initiators list if we can find Initiator
* object in database by the exitingInitiar wwpn.
*/
private void prepareExportMaskInitiatorDataCase3() throws Exception {
try {
StorageSystem storageSystem = new StorageSystem();
storageSystem.setId(URIUtil.createId(StorageSystem.class));
storageSystem.setSystemType(DiscoveredDataObject.Type.vplex.name());
storageSystem.setLabel("VplexStorageSystem");
_dbClient.createObject(storageSystem);
log.info("created VPLEX storageSystem with URI: " + storageSystem.getId());
List<URI> initiatorsURIs = new ArrayList<URI>();
StringSet existingInitiators = new StringSet();
Initiator initiator1 = new Initiator();
initiator1.setId(URIUtil.createId(Initiator.class));
initiator1.setInitiatorPort("10:00:00:E0:7E:EE:EE:31");
_dbClient.createObject(initiator1);
log.info("create initiator1 with URI: " + initiator1.getId());
initiatorsURIs.add(initiator1.getId());
Initiator initiator2 = new Initiator();
initiator2.setId(URIUtil.createId(Initiator.class));
initiator2.setInitiatorPort("10:00:00:E0:7E:EE:EE:32");
_dbClient.createObject(initiator2);
log.info("create initiator2 with URI: " + initiator2.getId());
initiatorsURIs.add(initiator2.getId());
Initiator initiator3 = new Initiator();
initiator3.setId(URIUtil.createId(Initiator.class));
initiator3.setInitiatorPort("10:00:00:E0:7E:EE:EE:33");
_dbClient.createObject(initiator3);
log.info("create initiator3 with URI: " + initiator3.getId());
existingInitiators.add("100000E07EEEEE33");
;
Initiator initiator4 = new Initiator();
initiator4.setId(URIUtil.createId(Initiator.class));
initiator4.setInitiatorPort("10:00:00:E0:7E:EE:EE:34");
_dbClient.createObject(initiator4);
log.info("create initiator4 with URI: " + initiator4.getId());
existingInitiators.add("100000E07EEEEE34");
existingInitiators.add("100000E07EEEEE35");
ExportMask exportMask = new ExportMask();
exportMask.setId(URIUtil.createId(ExportMask.class));
exportMask.setStorageDevice(storageSystem.getId());
exportMask.setInitiators(StringSetUtil.uriListToStringSet(initiatorsURIs));
exportMask.setExistingInitiators(existingInitiators);
exportMask.setCreatedBySystem(false);
exportMask.setMaskName(ExportMaskCase3);
_dbClient.createObject(exportMask);
log.info("created VPLEX exportmask ExportMaskCase3 with URI: " + exportMask.getId());
} catch (Exception e) {
log.error("Error is" + e);
throw (e);
}
}
/*
* Test Case 4:
* Here ExportMask createdBySystem is false
*
* This is the case all the initiators are existing initiators
* and initiators == null
* Adds exitingInitiators to the initiators list if we can find Initiator
* object in database by the exitingInitiator wwpn.
*/
private void prepareExportMaskInitiatorDataCase4() throws Exception {
try {
StorageSystem storageSystem = new StorageSystem();
storageSystem.setId(URIUtil.createId(StorageSystem.class));
storageSystem.setSystemType(DiscoveredDataObject.Type.vplex.name());
storageSystem.setLabel("VplexStorageSystem");
_dbClient.createObject(storageSystem);
log.info("created VPLEX storageSystem with URI: " + storageSystem.getId());
StringSet existingInitiators = new StringSet();
Initiator initiator3 = new Initiator();
initiator3.setId(URIUtil.createId(Initiator.class));
initiator3.setInitiatorPort("10:00:00:E0:7E:EE:EE:43");
_dbClient.createObject(initiator3);
log.info("created initiator3 with URI: " + initiator3.getId());
existingInitiators.add("100000E07EEEEE43");
;
Initiator initiator4 = new Initiator();
initiator4.setId(URIUtil.createId(Initiator.class));
initiator4.setInitiatorPort("10:00:00:E0:7E:EE:EE:44");
_dbClient.createObject(initiator4);
log.info("created initiator4 with URI: " + initiator4.getId());
existingInitiators.add("100000E07EEEEE44");
existingInitiators.add("100000E07EEEEE45");
ExportMask exportMask = new ExportMask();
exportMask.setId(URIUtil.createId(ExportMask.class));
exportMask.setStorageDevice(storageSystem.getId());
exportMask.setExistingInitiators(existingInitiators);
exportMask.setCreatedBySystem(false);
exportMask.setMaskName(ExportMaskCase4);
_dbClient.createObject(exportMask);
log.info("created VPLEX exportmask ExportMaskCase4 with URI: " + exportMask.getId());
} catch (Exception e) {
log.error("Error is" + e);
throw (e);
}
}
private void verifyExportMasksResults() throws Exception {
log.info("Verifying results of VPLEX exportMask migration test.");
List<URI> exportMaskUris = _dbClient.queryByType(ExportMask.class, true);
log.info("exportMaskUris:" + exportMaskUris);
Iterator<ExportMask> exportMasks = _dbClient.queryIterativeObjects(ExportMask.class, exportMaskUris, true);
while (exportMasks.hasNext()) {
ExportMask exportMask = exportMasks.next();
if (exportMask.getMaskName().equals(ExportMaskCase1)) {
log.info("looking a VPLEX export mask with id: " + exportMask.getId());
Assert.assertEquals("Volumes and userAddedVolumes "
+ "should be equal on VPLEX export mask.",
exportMask.getVolumes().size(), exportMask.getUserAddedVolumes().size());
log.info("Everything looks good for ExportMaskCase1 : Volumes are {} and userAddedVolumes are {}",
exportMask.getVolumes(), exportMask.getUserAddedVolumes());
Assert.assertEquals("Initiators and userAddedInitiators "
+ "should be equal on VPLEX export mask.",
exportMask.getInitiators().size(), exportMask.getUserAddedInitiators().size());
log.info("Everything looks good for ExportMaskCase1 : Initiators are {} and userAddedInitiators are {}",
exportMask.getInitiators(), exportMask.getUserAddedInitiators());
}
if (exportMask.getMaskName().equals(ExportMaskCase2)) {
log.info("looking a VPLEX export mask with id: " + exportMask.getId());
Assert.assertEquals("Volumes and userAddedVolumes "
+ "should be equal on VPLEX export mask.",
exportMask.getVolumes().size(), exportMask.getUserAddedVolumes().size());
log.info("Everything looks good for ExportMaskCase2 : Volumes are {} and userAddedVolumes are {}",
exportMask.getVolumes(), exportMask.getUserAddedVolumes());
Assert.assertEquals("Initiators and userAddedInitiators "
+ "should be equal on VPLEX export mask.",
exportMask.getInitiators().size(), exportMask.getUserAddedInitiators().size());
log.info("Everything looks good for ExportMaskCase2 : Initiators are {} and userAddedInitiators are {}",
exportMask.getInitiators(), exportMask.getUserAddedInitiators());
}
if (exportMask.getMaskName().equals(ExportMaskCase3)) {
log.info("looking a VPLEX export mask ExportMaskCase3 with id: " + exportMask.getId());
Assert.assertEquals("Initiators should be 4",
exportMask.getInitiators().size(), 4);
Assert.assertEquals("UserAddedInitiators should be 2",
exportMask.getUserAddedInitiators().size(), 2);
log.info("Initiators size :" + exportMask.getInitiators().size());
log.info("UserAddedInitiators size :" + exportMask.getUserAddedInitiators().size());
log.info("Everything looks good for ExportMaskCase3 Initiators : Initiators are {} and userAddedInitiators are {}",
exportMask.getInitiators(), exportMask.getUserAddedInitiators());
}
if (exportMask.getMaskName().equals(ExportMaskCase4)) {
log.info("looking a VPLEX export mask ExportMaskCase4 with id: " + exportMask.getId());
Assert.assertEquals("Initiators should be 2",
exportMask.getInitiators().size(), 2);
log.info("Initiators size :" + exportMask.getInitiators().size());
log.info("Everything looks good for ExportMaskCase4 Initiators : Initiators are {} are ",
exportMask.getInitiators());
}
}
}
}