package io.eguan.vold; /* * #%L * Project eguan * %% * Copyright (C) 2012 - 2017 Oodrive * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ import io.eguan.vold.model.DeviceMXBean; import io.eguan.vold.model.DummyMBeanServer; import io.eguan.vold.model.SnapshotMXBean; import io.eguan.vold.model.VoldTestHelper; import io.eguan.vold.model.VvrMXBean; import io.eguan.vold.model.VvrManagementException; import io.eguan.vold.model.VvrManagerMXBean; import io.eguan.vold.model.VvrManagerTestUtils; import java.io.FileNotFoundException; import java.io.IOException; import java.util.UUID; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import junit.framework.AssertionFailedError; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; /** * All multi-vold unit tests are composed of two remote VOLDs. * * @author oodrive * @author ebredzinski * @author llambert * */ public class TestMultiVoldL extends TestMultiVoldAbstract { private final static String DEVICE_NAME_TEST = "device name test"; private VvrManagerMXBean vvrManager1; private DummyMBeanServer server1; private DummyMBeanServer server2; private VoldTestHelper voldTestHelper1; private VoldTestHelper voldTestHelper2; @BeforeClass public static void init() throws Exception { // Two nodes, vvr started automatically setUpVolds(2, 2, true); } @Before public void initialize() throws Exception { server1 = getDummyMBeanServer(0); Assert.assertNotNull(server1); server2 = getDummyMBeanServer(1); Assert.assertNotNull(server2); voldTestHelper1 = getVoldTestHelper(0); Assert.assertNotNull(voldTestHelper1); voldTestHelper2 = getVoldTestHelper(1); Assert.assertNotNull(voldTestHelper2); vvrManager1 = VvrManagerTestUtils.getVvrManagerMXBean(server1, VOLD_OWNER); Assert.assertNotNull(vvrManager1); } @Test public void testCreateAndSetVvr() throws InterruptedException, VvrManagementException, MalformedObjectNameException { // Create a VVR into the first VVR manager createVvrStarted(); Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 2, server1.getNbMXBeans()); // Check if that VVR is created into the second VVR manager Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 2, server2.getNbMXBeans()); final ObjectName on1 = VvrManagerTestUtils.getVvrObjectName(VOLD_OWNER, vvrUuid); final VvrMXBean vvr1 = (VvrMXBean) server1.waitMXBean(on1); final ObjectName on2 = VvrManagerTestUtils.getVvrObjectName(VOLD_OWNER, vvrUuid); final VvrMXBean vvr2 = (VvrMXBean) server2.waitMXBean(on2); compareVvrs(vvr1, vvr2); vvr1.setDescription("new desc1"); vvr2.setName("new name1"); // Wait some time for the new name to be set int i = 0; while ("name".equals(vvr1.getName()) && i < 30) { Thread.sleep(1000); i++; } compareVvrs(vvr1, vvr2); } @Test public void testCreateAndSetDevice() throws InterruptedException, VvrManagementException, MalformedObjectNameException, FileNotFoundException, IOException { // Create a Device into the first VVR manager final SnapshotMXBean snapshotRoot = createVvrStarted(); final DeviceMXBean d1 = VvrManagerTestUtils.createDevice(server1, voldTestHelper1, snapshotRoot, vvrUuid, DEVICE_NAME_TEST, 409600); Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 3, server1.getNbMXBeans()); Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 3, server2.getNbMXBeans()); final ObjectName on2 = VvrManagerTestUtils.getDeviceObjectName(VOLD_OWNER, vvrUuid, UUID.fromString(d1.getUuid())); final DeviceMXBean d2 = (DeviceMXBean) server2.getMXBean(on2); compareDevices(d1, d2); d1.setDescription("new desc1"); d1.setIqn("iqn.2000-06.com.oodrive:test1"); d1.setIscsiAlias("new iscsi alias"); d1.setName("new name"); d1.setSize(409600); Thread.sleep(1000); compareDevices(d1, d2); } @Test public void testActivationRWDevice() throws VvrManagementException, InterruptedException, MalformedObjectNameException { // Create a Device into the first VVR manager final SnapshotMXBean snapshotRoot = createVvrStarted(); final DeviceMXBean d1 = VvrManagerTestUtils.createDevice(server1, voldTestHelper1, snapshotRoot, vvrUuid, DEVICE_NAME_TEST, 409600); Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 3, server1.getNbMXBeans()); // Check if that device is created into the second VVR manager Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 3, server2.getNbMXBeans()); final ObjectName on2 = VvrManagerTestUtils.getDeviceObjectName(VOLD_OWNER, vvrUuid, UUID.fromString(d1.getUuid())); final DeviceMXBean d2 = (DeviceMXBean) server2.getMXBean(on2); compareDevices(d1, d2); // Activate the first device in RO mode voldTestHelper1.waitTaskEnd(vvrUuid, d1.activateRO(), server1); Assert.assertTrue(d1.isActive()); // It cannot be activated in RW mode into the second peer try { d2.activateRW(); throw new AssertionFailedError("Should not be reached"); } catch (final IllegalStateException e) { // OK } // It can be activated in RO mode into the second peer voldTestHelper2.waitTaskEnd(vvrUuid, d2.activateRO(), server2); Assert.assertTrue(d2.isActive()); } @Test public void testActivationRODevice() throws VvrManagementException, InterruptedException, MalformedObjectNameException { // Create a Device into the first VVR manager final SnapshotMXBean snapshotRoot = createVvrStarted(); final DeviceMXBean d1 = VvrManagerTestUtils.createDevice(server1, voldTestHelper1, snapshotRoot, vvrUuid, DEVICE_NAME_TEST, 409600); Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 3, server1.getNbMXBeans()); Thread.sleep(1000); // Check if that device is created into the second VVR manager Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 3, server2.getNbMXBeans()); final ObjectName on2 = VvrManagerTestUtils.getDeviceObjectName(VOLD_OWNER, vvrUuid, UUID.fromString(d1.getUuid())); final DeviceMXBean d2 = (DeviceMXBean) server2.getMXBean(on2); compareDevices(d1, d2); // Activate the first device in RW mode voldTestHelper1.waitTaskEnd(vvrUuid, d1.activateRW(), server1); Assert.assertTrue(d1.isActive()); // It cannot be activated in RO mode into the second peer try { d2.activateRO(); throw new AssertionFailedError("Should not be reached"); } catch (final IllegalStateException e) { // OK } // It cannot be activated in RW mode into the second peer try { d2.activateRW(); throw new AssertionFailedError("Should not be reached"); } catch (final IllegalStateException e) { // OK } } @Test public void testDeleteDevice() throws VvrManagementException, InterruptedException, MalformedObjectNameException { // Create a Device into the first VVR manager final SnapshotMXBean snapshotRoot = createVvrStarted(); final DeviceMXBean d1 = VvrManagerTestUtils.createDevice(server1, voldTestHelper1, snapshotRoot, vvrUuid, DEVICE_NAME_TEST, 409600); Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 3, server1.getNbMXBeans()); // Check if that device is created into the second VVR manager Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 3, server2.getNbMXBeans()); // Delete that device Assert.assertFalse(d1.isActive()); voldTestHelper1.waitTaskEnd(vvrUuid, d1.delete(), server1); Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 2, server2.getNbMXBeans()); } @Test public void testDeleteDeviceActivated() throws VvrManagementException, InterruptedException, MalformedObjectNameException { // Create a Device into the first VVR manager final SnapshotMXBean snapshotRoot = createVvrStarted(); final DeviceMXBean d1 = VvrManagerTestUtils.createDevice(server1, voldTestHelper1, snapshotRoot, vvrUuid, DEVICE_NAME_TEST, 409600); Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 3, server1.getNbMXBeans()); // Check if that device is created into the second VVR manager Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 3, server2.getNbMXBeans()); // Activate the device into the second peer final ObjectName on2 = VvrManagerTestUtils.getDeviceObjectName(VOLD_OWNER, vvrUuid, UUID.fromString(d1.getUuid())); final DeviceMXBean d2 = (DeviceMXBean) server2.getMXBean(on2); voldTestHelper2.waitTaskEnd(vvrUuid, d2.activateRO(), server2); Assert.assertTrue(d2.isActive()); // Delete the device from the first peer, should raise an exception try { voldTestHelper1.waitTaskEnd(vvrUuid, d1.delete(), server1); throw new AssertionFailedError("Should not be reached"); } catch (final IllegalStateException e) { // OK } } @Test public void testSetSizeDevice() throws InterruptedException, VvrManagementException, MalformedObjectNameException { // Create a Device final SnapshotMXBean snapshotRoot = createVvrStarted(); final DeviceMXBean device = VvrManagerTestUtils.createDevice(server1, voldTestHelper1, snapshotRoot, vvrUuid, DEVICE_NAME_TEST, 409600); // Check the second peer final ObjectName on2 = VvrManagerTestUtils.getDeviceObjectName(VOLD_OWNER, vvrUuid, UUID.fromString(device.getUuid())); final DeviceMXBean d2 = (DeviceMXBean) server2.getMXBean(on2); Assert.assertEquals(409600, device.getSize()); Assert.assertEquals(409600, d2.getSize()); device.setSize(4096); Assert.assertEquals(4096, device.getSize()); Assert.assertEquals(4096, d2.getSize()); device.setSize(40960); Assert.assertEquals(40960, device.getSize()); Assert.assertEquals(40960, d2.getSize()); voldTestHelper1.waitTaskEnd(vvrUuid, device.activateRO(), server1); Assert.assertTrue(device.isActive()); boolean exceptionOnSetSize = false; try { device.setSize(4096); } catch (final IllegalStateException e) { exceptionOnSetSize = true; } Assert.assertTrue(exceptionOnSetSize); voldTestHelper1.waitTaskEnd(vvrUuid, device.deActivate(), server1); Assert.assertFalse(device.isActive()); voldTestHelper1.waitTaskEnd(vvrUuid, device.activateRW(), server1); exceptionOnSetSize = false; try { device.setSize(4096); } catch (final IllegalStateException e) { exceptionOnSetSize = true; } Assert.assertFalse(exceptionOnSetSize); Assert.assertEquals(4096, device.getSize()); Assert.assertEquals(4096, d2.getSize()); } @Test public void testCreateSnapshot() throws InterruptedException, VvrManagementException, MalformedObjectNameException { // Create a Device final SnapshotMXBean snapshotRoot = createVvrStarted(); final DeviceMXBean device = VvrManagerTestUtils.createDevice(server1, voldTestHelper1, snapshotRoot, vvrUuid, DEVICE_NAME_TEST, 409600); // Take a snapshot into the first VVR manager voldTestHelper1.waitTaskEnd(vvrUuid, device.takeSnapshot("name"), server1); Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 4, server1.getNbMXBeans()); // Check if that snapshot is created into the second VVR manager Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 4, server2.getNbMXBeans()); voldTestHelper1.waitTaskEnd(vvrUuid, device.activateRO(), server1); Assert.assertTrue(device.isActive()); boolean exceptionOnTakeSnap = false; try { voldTestHelper1.waitTaskEnd(vvrUuid, device.takeSnapshot("name2"), server1); } catch (final IllegalStateException e) { exceptionOnTakeSnap = true; } Assert.assertTrue(exceptionOnTakeSnap); voldTestHelper1.waitTaskEnd(vvrUuid, device.deActivate(), server1); Assert.assertFalse(device.isActive()); voldTestHelper1.waitTaskEnd(vvrUuid, device.activateRW(), server1); Assert.assertTrue(device.isActive()); exceptionOnTakeSnap = false; try { voldTestHelper1.waitTaskEnd(vvrUuid, device.takeSnapshot("name 3"), server1); } catch (final IllegalStateException e) { exceptionOnTakeSnap = true; } Assert.assertFalse(exceptionOnTakeSnap); Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 5, server1.getNbMXBeans()); // Check if that snapshot is created into the second VVR manager Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 5, server2.getNbMXBeans()); } @Test public void testDeleteSnapshot() throws InterruptedException, VvrManagementException, MalformedObjectNameException { // Create a Device final SnapshotMXBean snapshotRoot = createVvrStarted(); final DeviceMXBean device = VvrManagerTestUtils.createDevice(server1, voldTestHelper1, snapshotRoot, vvrUuid, DEVICE_NAME_TEST, 409600); // Take a snapshot into the first VVR manager final String uuidStrTaskSnap = device.takeSnapshot("name"); final SnapshotMXBean snapshot1 = voldTestHelper1.getSnapshot(server1, vvrUuid, uuidStrTaskSnap); Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 4, server1.getNbMXBeans()); // Check if that snapshot is created into the second VVR manager Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 4, server2.getNbMXBeans()); final ObjectName os1 = VvrManagerTestUtils.getSnapshotObjectName(VOLD_OWNER, vvrUuid, UUID.fromString(snapshot1.getUuid())); final SnapshotMXBean snapshot2 = (SnapshotMXBean) server2.getMXBean(os1); voldTestHelper2.waitTaskEnd(vvrUuid, snapshot2.delete(), server2); Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 3, server1.getNbMXBeans()); // Check if that snapshot is created into the second VVR manager Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 3, server2.getNbMXBeans()); } @Test public void testMultiVoldReadTask() throws Exception { // Create a VVR into the first VVR manager final String vvrTaskIdStr = vvrManager1.createVvrNoWait("name", "description"); final String vvrUuidStr = voldTestHelper1.waitVvrManagerTaskEnd(vvrTaskIdStr, server1); vvrUuid = UUID.fromString(vvrUuidStr); // check the task on node 1 VvrManagerTestUtils.checkVvrCreationTask(vvrTaskIdStr, vvrUuidStr, ((VvrManagerMXBean) server1 .getMXBean(voldTestHelper1.newVvrManagerObjectName())).getVvrManagerTask(vvrTaskIdStr)); // check the task on node 2 VvrManagerTestUtils.checkVvrCreationTask(vvrTaskIdStr, vvrUuidStr, ((VvrManagerMXBean) server2 .getMXBean(voldTestHelper2.newVvrManagerObjectName())).getVvrManagerTask(vvrTaskIdStr)); final long size0 = (long) (1024.0 * 1024.0 * 1024.0); final SnapshotMXBean snapshotRoot = VvrManagerTestUtils.getSnapshotRoot(server1, voldTestHelper1, vvrUuid); rootUuid = UUID.fromString(snapshotRoot.getUuid()); // Create a device final String deviceTaskUuidStr = snapshotRoot.createDevice("name", size0); // Wait task is committed final String deviceUuidStr = voldTestHelper1.waitTaskEnd(vvrUuid, deviceTaskUuidStr, server1); // check it on node 1 VvrManagerTestUtils.checkDeviceCreationTask(deviceTaskUuidStr, deviceUuidStr, ((VvrMXBean) server1 .getMXBean(voldTestHelper1.newVvrObjectName(vvrUuid))).getVvrTask(deviceTaskUuidStr)); // check it on node 2 VvrManagerTestUtils.checkDeviceCreationTask(deviceTaskUuidStr, deviceUuidStr, ((VvrMXBean) server2 .getMXBean(voldTestHelper2.newVvrObjectName(vvrUuid))).getVvrTask(deviceTaskUuidStr)); } /** * Compare the attributes of two devices. * * @param d1 * @param d2 */ private final void compareDevices(final DeviceMXBean d1, final DeviceMXBean d2) { Assert.assertEquals(d1.getDescription(), d2.getDescription()); Assert.assertEquals(d1.getIqn(), d2.getIqn()); Assert.assertEquals(d1.getIscsiAlias(), d2.getIscsiAlias()); Assert.assertEquals(d1.getName(), d2.getName()); Assert.assertEquals(d1.getParent(), d2.getParent()); Assert.assertEquals(d1.getSize(), d2.getSize()); Assert.assertEquals(d1.getUuid(), d2.getUuid()); Assert.assertEquals(d1.getIscsiBlockSize(), d2.getIscsiBlockSize()); } /** * Compare the attributes of two VVRs. * * @param vvr1 * @param vvr2 */ private final void compareVvrs(final VvrMXBean vvr1, final VvrMXBean vvr2) { Assert.assertEquals(vvr1.getName(), vvr2.getName()); Assert.assertEquals(vvr1.getDescription(), vvr2.getDescription()); Assert.assertEquals(vvr1.getOwnerUuid(), vvr2.getOwnerUuid()); Assert.assertEquals(vvr1.getUuid(), vvr2.getUuid()); } }