/*
* Copyright (c) 2016 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.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.Host;
import com.emc.storageos.db.client.model.Initiator;
import com.emc.storageos.db.client.model.StorageSystem;
import com.emc.storageos.db.client.upgrade.BaseCustomMigrationCallback;
import com.emc.storageos.db.client.upgrade.callbacks.ExportMaskExistingInitiatorsMigration;
import com.emc.storageos.db.server.DbsvcTestBase;
import com.emc.storageos.db.server.upgrade.DbSimpleMigrationTestBase;
public class ExportMaskExistingInitiatorsMigrationTest extends DbSimpleMigrationTestBase {
private static final Logger log = LoggerFactory.getLogger(ExportMaskExistingInitiatorsMigrationTest.class);
private static final int INITIATOR_PER_HOST_COUNT = 4;
@BeforeClass
public static void setup() throws IOException {
customMigrationCallbacks.put("3.5", new ArrayList<BaseCustomMigrationCallback>() {
private static final long serialVersionUID = 2L;
{
add(new ExportMaskExistingInitiatorsMigration());
}
});
DbsvcTestBase.setup();
}
@Override
protected void prepareData() throws Exception {
List<ExportMask> exportMasksToCreate = new ArrayList<ExportMask>();
// set up a vplex system
StorageSystem vplex = new StorageSystem();
vplex.setId(URIUtil.createId(StorageSystem.class));
vplex.setLabel("TEST_VPLEX");
vplex.setSystemType(DiscoveredDataObject.Type.vplex.name());
_dbClient.createObject(vplex);
// set up a vnx system
StorageSystem vnx = new StorageSystem();
vnx.setId(URIUtil.createId(StorageSystem.class));
vnx.setLabel("TEST_VNX");
vnx.setSystemType(DiscoveredDataObject.Type.vnxblock.name());
_dbClient.createObject(vnx);
// set up a vmax system
StorageSystem vmax = new StorageSystem();
vmax.setId(URIUtil.createId(StorageSystem.class));
vmax.setLabel("TEST_VMAX");
vmax.setSystemType(DiscoveredDataObject.Type.vmax.name());
_dbClient.createObject(vmax);
// Setup 1: 1 ExportMasks per array. One Host with 4 initiators where 2 are User Created and 2 are existing
for (int i = 0; i < 1; i++) {
ExportMask exportMaskVPLEX = new ExportMask();
exportMaskVPLEX.setId(URIUtil.createId(ExportMask.class));
exportMaskVPLEX.setLabel("VplexExportMaskMigrationTestBasic");
exportMaskVPLEX.setStorageDevice(vplex.getId());
exportMasksToCreate.add(exportMaskVPLEX);
ExportMask exportMaskVNX = new ExportMask();
exportMaskVNX.setId(URIUtil.createId(ExportMask.class));
exportMaskVNX.setLabel("VnxExportMaskMigrationTestBasic");
exportMaskVNX.setStorageDevice(vnx.getId());
exportMasksToCreate.add(exportMaskVNX);
ExportMask exportMaskVMAX = new ExportMask();
exportMaskVMAX.setId(URIUtil.createId(ExportMask.class));
exportMaskVMAX.setLabel("VmaxExportMaskMigrationTestBasic");
exportMaskVMAX.setStorageDevice(vmax.getId());
exportMasksToCreate.add(exportMaskVMAX);
Host host = new Host();
host.setId(URIUtil.createId(Host.class));
host.setLabel("hostLabel" + i);
for (int j = 0; j < INITIATOR_PER_HOST_COUNT; j++) {
Initiator initiator = new Initiator();
initiator.setId(URIUtil.createId(Initiator.class));
initiator.setHost(host.getId());
initiator.setInitiatorPort("10:00:DE:AD:BE:EF:00" + i + j);
initiator.setLabel("InitiatorLabel" + i + j);
_dbClient.createObject(initiator);
if (j < 2) {
exportMaskVPLEX.addInitiator(initiator);
exportMaskVPLEX.addToUserCreatedInitiators(initiator);
exportMaskVNX.addInitiator(initiator);
exportMaskVNX.addToUserCreatedInitiators(initiator);
exportMaskVMAX.addInitiator(initiator);
exportMaskVMAX.addToUserCreatedInitiators(initiator);
} else {
exportMaskVPLEX.addToExistingInitiatorsIfAbsent(initiator.getInitiatorPort());
exportMaskVNX.addToExistingInitiatorsIfAbsent(initiator.getInitiatorPort());
exportMaskVMAX.addToExistingInitiatorsIfAbsent(initiator.getInitiatorPort());
}
}
_dbClient.createObject(host);
exportMaskVPLEX.setResource(host.getId().toString());
exportMaskVPLEX.setResource(host.getId().toString());
exportMaskVPLEX.setResource(host.getId().toString());
}
// Setup : 2 ExportMasks per array. One Export Mask with all Existing Initiators and other with all User Created.
for (int i = 1; i < 3; i++) {
ExportMask exportMaskVPLEX = new ExportMask();
exportMaskVPLEX.setId(URIUtil.createId(ExportMask.class));
exportMaskVPLEX.setStorageDevice(vplex.getId());
exportMasksToCreate.add(exportMaskVPLEX);
ExportMask exportMaskVNX = new ExportMask();
exportMaskVNX.setId(URIUtil.createId(ExportMask.class));
exportMaskVNX.setStorageDevice(vnx.getId());
exportMasksToCreate.add(exportMaskVNX);
ExportMask exportMaskVMAX = new ExportMask();
exportMaskVMAX.setId(URIUtil.createId(ExportMask.class));
exportMaskVMAX.setStorageDevice(vmax.getId());
exportMasksToCreate.add(exportMaskVMAX);
if (i == 1) {
exportMaskVPLEX.setLabel("VplexExportMaskMigrationTesterUserCreated");
exportMaskVNX.setLabel("VnxExportMaskMigrationTesterUserCreated");
exportMaskVMAX.setLabel("VmaxExportMaskMigrationTesterUserCreated");
} else {
exportMaskVPLEX.setLabel("VplexExportMaskMigrationTesterExisting");
exportMaskVNX.setLabel("VnxExportMaskMigrationTesterExisting");
exportMaskVMAX.setLabel("VmaxExportMaskMigrationTesterExisting");
}
Host host = new Host();
host.setId(URIUtil.createId(Host.class));
host.setLabel("hostLabel" + i);
for (int j = 0; j < INITIATOR_PER_HOST_COUNT; j++) {
Initiator initiator = new Initiator();
initiator.setId(URIUtil.createId(Initiator.class));
initiator.setHost(host.getId());
initiator.setInitiatorPort("10:00:DE:AD:BE:EF:00:" + i + j);
initiator.setLabel("InitiatorLabel" + i + j);
_dbClient.createObject(initiator);
if (i == 1) {
exportMaskVPLEX.addInitiator(initiator);
exportMaskVPLEX.addToUserCreatedInitiators(initiator);
exportMaskVNX.addInitiator(initiator);
exportMaskVNX.addToUserCreatedInitiators(initiator);
exportMaskVMAX.addInitiator(initiator);
exportMaskVMAX.addToUserCreatedInitiators(initiator);
} else {
exportMaskVPLEX.addToExistingInitiatorsIfAbsent(initiator.getInitiatorPort());
exportMaskVNX.addToExistingInitiatorsIfAbsent(initiator.getInitiatorPort());
exportMaskVMAX.addToExistingInitiatorsIfAbsent(initiator.getInitiatorPort());
}
}
_dbClient.createObject(host);
exportMaskVPLEX.setResource(host.getId().toString());
exportMaskVPLEX.setResource(host.getId().toString());
exportMaskVPLEX.setResource(host.getId().toString());
}
// Set Up 3. ExportMask with Existing initiator belonging to other HOSTS..
for (int i = 5; i < 6; i++) {
ExportMask exportMaskVPLEX = new ExportMask();
exportMaskVPLEX.setId(URIUtil.createId(ExportMask.class));
exportMaskVPLEX.setLabel("VplexExportMaskMigrationTesterMixed");
exportMaskVPLEX.setStorageDevice(vplex.getId());
exportMasksToCreate.add(exportMaskVPLEX);
ExportMask exportMaskVNX = new ExportMask();
exportMaskVNX.setId(URIUtil.createId(ExportMask.class));
exportMaskVNX.setLabel("VnxExportMaskMigrationTesterMixed");
exportMaskVNX.setStorageDevice(vnx.getId());
exportMasksToCreate.add(exportMaskVNX);
ExportMask exportMaskVMAX = new ExportMask();
exportMaskVMAX.setId(URIUtil.createId(ExportMask.class));
exportMaskVMAX.setLabel("VmaxExportMaskMigrationTesterMixed");
exportMaskVMAX.setStorageDevice(vmax.getId());
exportMasksToCreate.add(exportMaskVMAX);
Host host = new Host();
host.setId(URIUtil.createId(Host.class));
host.setLabel("hostLabel" + i);
for (int j = 0; j < INITIATOR_PER_HOST_COUNT; j++) {
Initiator initiator = new Initiator();
initiator.setId(URIUtil.createId(Initiator.class));
initiator.setHost(host.getId());
initiator.setInitiatorPort("10:00:DE:AD:BE:EF:00:" + i + j);
initiator.setLabel("InitiatorLabel" + i + j);
_dbClient.createObject(initiator);
if (j < 2) {
exportMaskVPLEX.addInitiator(initiator);
exportMaskVPLEX.addToUserCreatedInitiators(initiator);
exportMaskVNX.addInitiator(initiator);
exportMaskVNX.addToUserCreatedInitiators(initiator);
exportMaskVMAX.addInitiator(initiator);
exportMaskVMAX.addToUserCreatedInitiators(initiator);
} else {
exportMaskVPLEX.addToExistingInitiatorsIfAbsent(initiator.getInitiatorPort());
exportMaskVNX.addToExistingInitiatorsIfAbsent(initiator.getInitiatorPort());
exportMaskVMAX.addToExistingInitiatorsIfAbsent(initiator.getInitiatorPort());
}
}
_dbClient.createObject(host);
exportMaskVPLEX.setResource(host.getId().toString());
exportMaskVPLEX.setResource(host.getId().toString());
exportMaskVPLEX.setResource(host.getId().toString());
Host hostA = new Host();
hostA.setId(URIUtil.createId(Host.class));
hostA.setLabel("hostLabelA");
for (int j = 0; j < INITIATOR_PER_HOST_COUNT; j++) {
Initiator initiator = new Initiator();
initiator.setId(URIUtil.createId(Initiator.class));
initiator.setHost(host.getId());
initiator.setInitiatorPort("10:00:DE:AD:BE:EF:00:A" + j);
initiator.setLabel("InitiatorLabel" + i + j);
_dbClient.createObject(initiator);
exportMaskVPLEX.addToExistingInitiatorsIfAbsent(initiator.getInitiatorPort());
exportMaskVNX.addToExistingInitiatorsIfAbsent(initiator.getInitiatorPort());
exportMaskVMAX.addToExistingInitiatorsIfAbsent(initiator.getInitiatorPort());
}
_dbClient.createObject(hostA);
}
_dbClient.createObject(exportMasksToCreate);
}
@Override
protected void verifyResults() throws Exception {
log.info("Verifying results of ExportMask ExistingInitiator migration test now.");
List<URI> exportMaskUris = _dbClient.queryByType(ExportMask.class, true);
Iterator<ExportMask> exportMasks = _dbClient.queryIterativeObjects(ExportMask.class, exportMaskUris, true);
while (exportMasks.hasNext()) {
ExportMask exportMask = exportMasks.next();
String exportMaskLabel = exportMask.getLabel();
log.info("Processing exportMask with name {}", exportMaskLabel);
if (exportMaskLabel.contains("Basic")){
if (exportMaskLabel.contains("VMAX") || exportMaskLabel.contains("VPLEX")) {
if ((exportMask.getInitiators() != null) && exportMask.getInitiators().size() != 4) {
log.error("ExportMask with name {} has {} Initiators instead of 4", exportMaskLabel,
exportMask.getInitiators().size());
}
if ((exportMask.getUserAddedInitiators() != null) && exportMask.getUserAddedInitiators().size() != 4) {
log.error("ExportMask with name {} has {} UserAddedInitiators instead of 4", exportMaskLabel,
exportMask.getUserAddedInitiators().size());
}
if ((exportMask.getExistingInitiators() != null) && exportMask.getExistingInitiators().size() != 0) {
log.error("ExportMask with name {} has {} ExistingInitiators instead of 0", exportMaskLabel,
exportMask.getExistingInitiators().size());
}
} else {
if ((exportMask.getExistingInitiators() != null) && exportMask.getExistingInitiators().size() != 2) {
log.error("ExportMask with name {} has {} Initiators instead of 2", exportMaskLabel,
exportMask.getExistingInitiators().size());
}
}
} else if (exportMaskLabel.contains("UserCreated")){
if ((exportMask.getInitiators() != null) && exportMask.getInitiators().size() != 4) {
log.error("ExportMask with name {} has {} Initiators instead of 4", exportMaskLabel,
exportMask.getInitiators().size());
}
if ((exportMask.getUserAddedInitiators() != null) && exportMask.getUserAddedInitiators().size() != 4) {
log.error("ExportMask with name {} has {} UserAddedInitiators instead of 4", exportMaskLabel,
exportMask.getUserAddedInitiators().size());
}
if ((exportMask.getExistingInitiators() != null) && exportMask.getExistingInitiators().size() != 0) {
log.error("ExportMask with name {} has {} ExistingInitiators instead of 0", exportMaskLabel,
exportMask.getExistingInitiators().size());
}
} else if (exportMaskLabel.contains("Existing")) {
if (exportMaskLabel.contains("VMAX") || exportMaskLabel.contains("VPLEX")) {
if ((exportMask.getInitiators() != null) && exportMask.getInitiators().size() != 4) {
log.error("ExportMask with name {} has {} Initiators instead of 4", exportMaskLabel,
exportMask.getInitiators().size());
}
if ((exportMask.getUserAddedInitiators() != null) && exportMask.getUserAddedInitiators().size() != 4) {
log.error("ExportMask with name {} has {} UserAddedInitiators instead of 4", exportMaskLabel,
exportMask.getUserAddedInitiators().size());
}
if ((exportMask.getExistingInitiators() != null) && exportMask.getExistingInitiators().size() != 0) {
log.error("ExportMask with name {} has {} ExistingInitiators instead of 0", exportMaskLabel,
exportMask.getExistingInitiators().size());
}
} else {
if ((exportMask.getExistingInitiators() != null) && exportMask.getExistingInitiators().size() != 4) {
log.error("ExportMask with name {} has {} Initiators instead of 4", exportMaskLabel,
exportMask.getExistingInitiators().size());
}
}
} else if (exportMaskLabel.contains("Mixed")){
if (exportMaskLabel.contains("VMAX") || exportMaskLabel.contains("VPLEX")) {
if ((exportMask.getInitiators() != null) && exportMask.getInitiators().size() != 4) {
log.error("ExportMask with name {} has {} Initiators instead of 4", exportMaskLabel,
exportMask.getInitiators().size());
}
if ((exportMask.getUserAddedInitiators() != null) && exportMask.getUserAddedInitiators().size() != 4) {
log.error("ExportMask with name {} has {} UserAddedInitiators instead of 4", exportMaskLabel,
exportMask.getUserAddedInitiators().size());
}
if ((exportMask.getExistingInitiators() != null) && exportMask.getExistingInitiators().size() != 4) {
log.error("ExportMask with name {} has {} ExistingInitiators instead of 4", exportMaskLabel,
exportMask.getExistingInitiators().size());
}
} else {
if ((exportMask.getExistingInitiators() != null) && exportMask.getExistingInitiators().size() != 6) {
log.error("ExportMask with name {} has {} Initiators instead of 6", exportMaskLabel,
exportMask.getExistingInitiators().size());
}
}
}
else {
log.error("Unknown ExportMask {}", exportMaskLabel);
}
log.info("Processed exportMask with name {}", exportMaskLabel);
}
}
}