/* * Copyright (c) 2013 EMC Corporation * All Rights Reserved */ package com.emc.storageos.db.server.upgrade.util.callbacks2; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.server.upgrade.util.BaseTestCustomMigrationCallback; import com.emc.storageos.db.server.upgrade.util.models.updated2.Resource3; import com.emc.storageos.db.server.upgrade.util.models.updated2.Resource6; import com.emc.storageos.db.exceptions.DatabaseException; import com.netflix.astyanax.connectionpool.exceptions.OperationException; import java.net.URI; import java.util.Iterator; import java.util.List; import org.junit.Assert; /** * initialize flags on Resource 3 and all its subclasses */ public class Resource3NewFlagsInitializer extends BaseTestCustomMigrationCallback { public static boolean injectFault = false; // set true to inject a retryable exception public static boolean injectFatalFault = false; // set true to inject fatal exception public static boolean faultInjected = false; // will be set to true after we inject the false @Override public void process() { DbClient dbClient = getDbClient(); // check if we need to inject if (injectFault) { faultInjected = true; throw DatabaseException.retryables.operationFailed(new OperationException("Custom callback execuction error. Injected fault")); } // check if we need to inject if (injectFatalFault) { faultInjected = true; throw DatabaseException.fatals.failedDuringUpgrade("Injected fatal exception during upgrade", null); } // Check Resource3 List<URI> res3Keys = dbClient.queryByType(Resource3.class, false); Iterator<Resource3> res3Objs = dbClient.queryIterativeObjects(Resource3.class, res3Keys); while (res3Objs.hasNext()) { Resource3 res3 = res3Objs.next(); // Resource3FlagsInitializer should be executed first so extraFlags has value Long extraFlags = res3.getExtraFlags(); if (extraFlags == null) { throw new IllegalStateException( "Custom callback order error. Resource3FlagsInitializer should be executed first for Resource3."); } // Current value for new flag - should be zero always // Custom callback should be executed only once even referenced by many fields Long currentValue = res3.getNewFlags(); if (currentValue != null) { throw new IllegalStateException("Custom callback order error. Resource3NewFlagsInitializer should not be executed twice."); } res3.setNewFlags(extraFlags); dbClient.persistObject(res3); } // Check Resource6 List<URI> res6Keys = dbClient.queryByType(Resource6.class, false); Iterator<Resource6> res6Objs = dbClient.queryIterativeObjects(Resource6.class, res6Keys); while (res6Objs.hasNext()) { Resource6 res6 = res6Objs.next(); // Resource3FlagsInitializer should be executed first so extraFlags has value Long extraFlags = res6.getExtraFlags(); if (extraFlags == null) { throw new IllegalStateException( "Custom callback order error. Resource3FlagsInitializer should be executed first for Resource6."); } // Current value for new flag - should be zero always // Custom callback should be executed only once even referenced by many fields Long currentValue = res6.getNewFlags(); if (currentValue != null) { throw new IllegalStateException("Custom callback order error. Resource3NewFlagsInitializer should not be executed twice."); } res6.setNewFlags(extraFlags); res6.setDupTestFlags(extraFlags); dbClient.persistObject(res6); } } @Override public void verify() { // Check Resource3 List<URI> res3Keys = dbClient.queryByType(Resource3.class, false); Iterator<Resource3> res3Objs = dbClient.queryIterativeObjects(Resource3.class, res3Keys); Assert.assertTrue(res3Objs.hasNext()); while (res3Objs.hasNext()) { Resource3 res3 = res3Objs.next(); Assert.assertEquals(res3.getExtraFlags(), res3.getNewFlags()); } // Check Resource6 List<URI> res6Keys = dbClient.queryByType(Resource6.class, false); Iterator<Resource6> res6Objs = dbClient.queryIterativeObjects(Resource6.class, res6Keys); while (res6Objs.hasNext()) { Resource6 res6 = res6Objs.next(); Assert.assertEquals(res6.getExtraFlags(), res6.getNewFlags()); Assert.assertEquals(res6.getExtraFlags(), res6.getDupTestFlags()); } } }