/* * Copyright (c) 2013 EMC Corporation * All Rights Reserved */ package com.emc.storageos.db.server.upgrade.impl.callback; import com.emc.storageos.db.client.URIUtil; import com.emc.storageos.db.client.model.StringMap; import com.emc.storageos.db.client.model.VirtualArray; import com.emc.storageos.db.client.model.VirtualPool; import com.emc.storageos.db.client.model.VpoolProtectionVarraySettings; import com.emc.storageos.db.client.upgrade.BaseCustomMigrationCallback; import com.emc.storageos.db.client.upgrade.callbacks.VirtualPoolMultiVolumeConsistencyMigration; import com.emc.storageos.db.server.DbsvcTestBase; import com.emc.storageos.db.server.upgrade.DbSimpleMigrationTestBase; import org.junit.BeforeClass; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.List; import org.junit.Assert; /** * Test proper population of the new DataObject.internalFlags field * * Here's the basic execution flow for the test case: * - setup() runs, bringing up a "pre-migration" version * of the database, using the DbSchemaScannerInterceptor * you supply to hide your new field or column family * when generating the "before" schema. * - Your implementation of prepareData() is called, allowing * you to use the internal _dbClient reference to create any * needed pre-migration test data. * - The database is then shutdown and restarted (without using * the interceptor this time), so the full "after" schema * is available. * - The dbsvc detects the diffs in the schema and executes the * migration callbacks as part of the startup process. * - Your implementation of verifyResults() is called to * allow you to confirm that the migration of your prepared * data went as expected. * */ public class VirtualPoolMultiVolumeConsistencyMigrationTest extends DbSimpleMigrationTestBase { private static final Logger log = LoggerFactory.getLogger(VirtualPoolMultiVolumeConsistencyMigrationTest.class); // Used for migrations tests related to RP VirtualPools. private static List<URI> rpTestVirtualPoolURIs = new ArrayList<URI>(); @BeforeClass public static void setup() throws IOException { customMigrationCallbacks.put("1.1", new ArrayList<BaseCustomMigrationCallback>() { { add(new VirtualPoolMultiVolumeConsistencyMigration()); } }); DbsvcTestBase.setup(); } @Override protected String getSourceVersion() { return "1.1"; } @Override protected String getTargetVersion() { return "2.0"; } @Override protected void prepareData() throws Exception { prepareVirtualPoolData(); } @Override protected void verifyResults() throws Exception { verifyVirtualPoolResults(); } /** * Prepares the data for RP volume tests. * * @throws Exception When an error occurs preparing the RP volume data. */ private void prepareVirtualPoolData() throws Exception { log.info("Preparing VirtualPool Data for VirtualPoolMultiVolumeConsistencyMigration."); VirtualArray virtualArray = new VirtualArray(); URI virtualArrayURI = URIUtil.createId(VirtualArray.class); virtualArray.setId(virtualArrayURI); virtualArray.setLabel("virtualArray1"); _dbClient.createObject(virtualArray); for (int i = 1; i <= 3; i++) { VpoolProtectionVarraySettings protectionSettings = new VpoolProtectionVarraySettings(); URI protectionSettingsURI = URIUtil.createId(VpoolProtectionVarraySettings.class); protectionSettings.setId(protectionSettingsURI); protectionSettings.setJournalSize("min"); _dbClient.createObject(protectionSettings); VirtualPool virtualPool = new VirtualPool(); URI virtualPoolURI = URIUtil.createId(VirtualPool.class); rpTestVirtualPoolURIs.add(virtualPoolURI); virtualPool.setId(virtualPoolURI); virtualPool.setLabel("rpVirtualPool" + i); StringMap protectionVarraySettings = new StringMap(); protectionVarraySettings.put(virtualArrayURI.toString(), protectionSettingsURI.toString()); virtualPool.setProtectionVarraySettings(protectionVarraySettings); _dbClient.createObject(virtualPool); } } /** * Verifies the migration results for VirtualPool. * * @throws Exception When an error occurs verifying the VirtualPool * migration results. */ private void verifyVirtualPoolResults() throws Exception { log.info("Verifying VirtualPoolMultiVolumeConsistencyMigration."); for (URI virtualPoolURI : rpTestVirtualPoolURIs) { VirtualPool virtualPool = _dbClient.queryObject(VirtualPool.class, virtualPoolURI); // The test VirtualPool should have RP protection specified Assert.assertTrue("VirtualPool %s does not specify RecoverPoint protection", VirtualPool.vPoolSpecifiesProtection(virtualPool)); if (VirtualPool.vPoolSpecifiesProtection(virtualPool)) { Assert.assertTrue("Multi-volume consistency should be set for a RecoverPoint virtual pool", virtualPool.getMultivolumeConsistency()); } } } }