/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.api.service.impl.resource.utils;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.emc.storageos.db.client.URIUtil;
import com.emc.storageos.db.client.impl.DbClientContext;
import com.emc.storageos.db.client.model.BlockMirror;
import com.emc.storageos.db.client.model.BlockObject;
import com.emc.storageos.db.client.model.DataObject;
import com.emc.storageos.db.client.model.ExportGroup;
import com.emc.storageos.db.client.model.ExportMask;
import com.emc.storageos.db.client.model.Initiator;
import com.emc.storageos.db.client.model.Network;
import com.emc.storageos.db.client.model.StoragePool;
import com.emc.storageos.db.client.model.StoragePort;
import com.emc.storageos.db.client.model.StorageSystem;
import com.emc.storageos.db.client.model.VirtualArray;
import com.emc.storageos.db.client.model.Volume;
import com.emc.storageos.db.client.model.VplexMirror;
import com.emc.storageos.db.common.VdcUtil;
import com.emc.storageos.db.server.DbClientTest.DbClientImplUnitTester;
import com.emc.storageos.db.server.DbsvcTestBase;
import com.emc.storageos.model.block.export.ITLBulkRep;
import junit.framework.Assert;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "ExportUtilsTests.xml" })
// This test is currently failing with file IO issues with Cassandra. COP-18538.
@Ignore
public class ExportUtilsTests extends DbsvcTestBase {
private static final Logger _log = LoggerFactory.getLogger(ExportUtilsTests.class);
// test numbers
final int NUM_STORAGE_PORTS = 4;
final int NUM_EXPORT_GROUPS = 13;
final int NUM_EXPORT_MASKS = 1;
final int NUM_VOLUMES = 81;
final int NUM_INITIATORS = 64;
// Volume IDs
List<URI> _volumeIds = new ArrayList<URI>();
@Autowired
private ApplicationContext _context;
@Before
public void setupTest() {
DbClientImplUnitTester dbClient = new DbClientImplUnitTester();
dbClient.setCoordinatorClient(_coordinator);
dbClient.setDbVersionInfo(sourceVersion);
dbClient.setBypassMigrationLock(true);
_encryptionProvider.setCoordinator(_coordinator);
dbClient.setEncryptionProvider(_encryptionProvider);
DbClientContext localCtx = new DbClientContext();
localCtx.setClusterName("Test");
localCtx.setKeyspaceName("Test");
dbClient.setLocalContext(localCtx);
VdcUtil.setDbClient(dbClient);
dbClient.setBypassMigrationLock(false);
dbClient.start();
_dbClient = dbClient;
}
@After
public void teardown() {
if (_dbClient instanceof DbClientImplUnitTester) {
((DbClientImplUnitTester) _dbClient).removeAll();
}
}
@Test
public void testDbClientSanity() {
StoragePool pool1 = new StoragePool();
pool1.setId(URI.create("pool1"));
pool1.setLabel("Pool1");
_dbClient.createObject(pool1);
StoragePool tempPool = _dbClient.queryObject(StoragePool.class, URI.create("pool1"));
assertNotNull(tempPool);
}
/**
* Populate the database with ITL components
*/
public void populateDb() {
String[] vmaxFE = { "50:FE:FE:FE:FE:FE:FE:00", "50:FE:FE:FE:FE:FE:FE:01", "50:FE:FE:FE:FE:FE:FE:02",
"50:FE:FE:FE:FE:FE:FE:03" };
// Create a Network
Network network = ExportUtilsTestUtils.createNetwork(_dbClient, vmaxFE, "VSANFE", "FC+BROCADE+FE", null);
// Create a Virtual Array
VirtualArray varray = ExportUtilsTestUtils.createVirtualArray(_dbClient, "varray1");
// Create a storage system
StorageSystem storageSystem = ExportUtilsTestUtils.createStorageSystem(_dbClient, "vmax", "vmax1");
// Create two front-end storage ports VMAX
List<StoragePort> vmaxPorts = new ArrayList<StoragePort>();
for (int i = 0; i < vmaxFE.length; i++) {
vmaxPorts.add(ExportUtilsTestUtils.createStoragePort(_dbClient, storageSystem, network, vmaxFE[i], varray,
StoragePort.PortType.frontend.name(), "portGroupvmax" + i, "C0+FC0" + i));
}
// Create initiators
List<Initiator> initiators = new ArrayList<Initiator>();
for (int i = 0; i < NUM_INITIATORS; i++) {
initiators.add(ExportUtilsTestUtils.createInitiator(_dbClient, network, i));
}
// Create Volumes
List<Volume> volumes = new ArrayList<Volume>();
for (int i = 0; i < NUM_VOLUMES; i++) {
Volume volume = ExportUtilsTestUtils.createVolume(_dbClient, varray, i);
volumes.add(volume);
_volumeIds.add(volume.getId());
}
// Create export groups
List<ExportGroup> egs = new ArrayList<ExportGroup>();
for (int i = 0; i < NUM_EXPORT_GROUPS; i++) {
egs.add(ExportUtilsTestUtils.createExportGroup(_dbClient, initiators, volumes, varray, i));
}
// Create export masks
List<ExportMask> ems = new ArrayList<ExportMask>();
for (int i = 0; i < NUM_EXPORT_MASKS; i++) {
ems.add(ExportUtilsTestUtils.createExportMask(_dbClient, egs, initiators, volumes, vmaxPorts, i));
}
}
/**
* Performance test for ITL retrieval for bulk api
*/
@Test
public void testITLPerformance() {
// Populate the database
populateDb();
// Start a timer
long startTime = System.currentTimeMillis();
ITLBulkRep list = new ITLBulkRep();
for (URI volumeId : _volumeIds) {
queryResource(volumeId);
list.getExportList().addAll(
ExportUtils.getBlockObjectInitiatorTargets(volumeId, _dbClient, false).getExportList());
}
// End a timer
long endTime = System.currentTimeMillis();
System.out.println("Time elapsed: " + (endTime - startTime) + "ms");
// Assert the ITL entries
int numItlsExpected = this.NUM_EXPORT_GROUPS * this.NUM_EXPORT_MASKS * this.NUM_INITIATORS * this.NUM_STORAGE_PORTS * this.NUM_VOLUMES;
assertEquals("Number of ITLs returned", numItlsExpected, list.getExportList().size());
}
protected DataObject queryResource(URI id) {
Class<? extends DataObject> blockClazz = Volume.class;
if (URIUtil.isType(id, BlockMirror.class)) {
blockClazz = BlockMirror.class;
}
if (URIUtil.isType(id, VplexMirror.class)) {
blockClazz = VplexMirror.class;
}
BlockObject object = Volume.fetch(_dbClient, id);
return object;
}
}