package io.eguan.vold.model; /* * #%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.SnapshotMXBean; import io.eguan.vold.model.VvrMXBean; import io.eguan.vold.model.VvrObjectNameFactory; import java.io.IOException; import java.util.UUID; import javax.management.JMException; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; public class TestVvrDeviceL extends TestVvrManagerAbstract { static final String DEVICE_NAME_TEST = "device test name"; static final String DEVICE_DESCRIPTION_TEST = "device test description"; static final String DEVICE_ISCSI_ALIAS_TEST = "iscsi alias"; private VvrMXBean vvr; private SnapshotMXBean snapshotRoot; private DeviceMXBean device; public TestVvrDeviceL(final Boolean vvrStarted) { super(vvrStarted); } @Before public void initTestVvrDevice() throws Exception { vvr = createVvr("", ""); if (!voldTestHelper.isVvrStarted()) { vvr.start(); } final UUID vvrUuid = UUID.fromString(vvr.getUuid()); snapshotRoot = VvrManagerTestUtils.getSnapshotRoot(dummyMbeanServer, voldTestHelper, vvrUuid); device = VvrManagerTestUtils.createDevice(dummyMbeanServer, voldTestHelper, snapshotRoot, vvrUuid, DEVICE_NAME_TEST, 409600); } @After public void finiTestVvrDevice() throws Exception { voldTestHelper.deleteVvr(dummyMbeanServer, UUID.fromString(vvr.getUuid())); device = null; snapshotRoot = null; vvr = null; } @Test public void testCreationOfDevice() { device.setName("name"); device.setDescription("creation description"); device.setIscsiAlias("iscsi alias"); device.setIqn("iqn1"); device.setSize(40960); device.setIscsiBlockSize(512); checkDevice(device, device.getUuid(), "name", "creation description", snapshotRoot.getUuid(), "iscsi alias", "iqn1", 40960, 512); } @Test public void testDeletionOfDevice() { device.setName("name"); device.setDescription("creation description"); device.setIscsiAlias("iscsi alias"); device.setIqn("iqn1"); device.setSize(40960); device.setIscsiBlockSize(512); checkDevice(device, device.getUuid(), "name", "creation description", snapshotRoot.getUuid(), "iscsi alias", "iqn1", 40960, 512); final String taskId = device.delete(); voldTestHelper.waitTaskEnd(UUID.fromString(vvr.getUuid()), taskId, dummyMbeanServer); // add mx beans Vvr and Snapshot root Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 2, dummyMbeanServer.getNbMXBeans()); } @Test public void testCreationOfSnapshot() { // name final UUID vvrUuid = UUID.fromString(vvr.getUuid()); final String snapshotTaskUuid = device.takeSnapshot("new snap"); final SnapshotMXBean snap = voldTestHelper.getSnapshot(dummyMbeanServer, vvrUuid, snapshotTaskUuid); // 6 = dtxManager, vvrManager, Vvr, Snapshot root, Device and new snapshot Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 4, dummyMbeanServer.getNbMXBeans()); Assert.assertEquals(snapshotRoot.getUuid(), snap.getParent()); Assert.assertEquals("new snap", snap.getName()); // name, description final String snap1Task = device.takeSnapshot("snap1", "description1"); final SnapshotMXBean snap1 = voldTestHelper.getSnapshot(dummyMbeanServer, vvrUuid, snap1Task); Assert.assertEquals("snap1", snap1.getName()); Assert.assertEquals("description1", snap1.getDescription()); // name, uuid final String snapuuid2 = UUID.randomUUID().toString(); final String snap2Task = device.takeSnapshotUuid("snap2", snapuuid2); final SnapshotMXBean snap2 = voldTestHelper.getSnapshot(dummyMbeanServer, vvrUuid, snap2Task); Assert.assertEquals("snap2", snap2.getName()); Assert.assertEquals(snapuuid2, snap2.getUuid()); // name, description, uuid final String snapuuid3 = UUID.randomUUID().toString(); final String snap3Task = device.takeSnapshotUuid("snap3", "description3", snapuuid3); final SnapshotMXBean snap3 = voldTestHelper.getSnapshot(dummyMbeanServer, vvrUuid, snap3Task); Assert.assertEquals("snap3", snap3.getName()); Assert.assertEquals("description3", snap3.getDescription()); Assert.assertEquals(snapuuid3, snap3.getUuid()); } @Test public void testCloneOfDevice() { // name final UUID vvrUuid = UUID.fromString(vvr.getUuid()); final String devTask1 = device.clone("clone1"); final DeviceMXBean clone1 = voldTestHelper.getDevice(dummyMbeanServer, vvrUuid, devTask1); Assert.assertEquals(snapshotRoot.getUuid(), clone1.getParent()); Assert.assertEquals("clone1", clone1.getName()); // name, description final String devTask2 = device.clone("clone2", "description2"); final DeviceMXBean clone2 = voldTestHelper.getDevice(dummyMbeanServer, vvrUuid, devTask2); Assert.assertEquals(snapshotRoot.getUuid(), clone2.getParent()); Assert.assertEquals("clone2", clone2.getName()); Assert.assertEquals("description2", clone2.getDescription()); // name, uuid final String devuuid3 = UUID.randomUUID().toString(); final String devTask3 = device.cloneUuid("clone3", devuuid3); final DeviceMXBean clone3 = voldTestHelper.getDevice(dummyMbeanServer, vvrUuid, devTask3); Assert.assertEquals(snapshotRoot.getUuid(), clone3.getParent()); Assert.assertEquals("clone3", clone3.getName()); Assert.assertEquals(devuuid3, clone3.getUuid()); // name, description, uuid final String devuuid4 = UUID.randomUUID().toString(); final String devTask4 = device.cloneUuid("clone4", "description4", devuuid4); final DeviceMXBean clone4 = voldTestHelper.getDevice(dummyMbeanServer, vvrUuid, devTask4); Assert.assertEquals(snapshotRoot.getUuid(), clone4.getParent()); Assert.assertEquals("clone4", clone4.getName()); Assert.assertEquals("description4", clone4.getDescription()); Assert.assertEquals(devuuid4, clone4.getUuid()); // clone of clone final String devTask5 = clone4.clone("clone5", "description5"); final DeviceMXBean clone5 = voldTestHelper.getDevice(dummyMbeanServer, vvrUuid, devTask5); Assert.assertEquals(snapshotRoot.getUuid(), clone4.getParent()); Assert.assertEquals("clone5", clone5.getName()); Assert.assertEquals("description5", clone5.getDescription()); } @Test public void testActivationDevice() { final UUID vvrUuid = UUID.fromString(vvr.getUuid()); boolean exceptionOnActivateRO = false, exceptionOnActivateRW = false; voldTestHelper.waitTaskEnd(vvrUuid, device.activateRO(), dummyMbeanServer); Assert.assertTrue(device.isActive() && device.isReadOnly()); voldTestHelper.waitTaskEnd(vvrUuid, device.deActivate(), dummyMbeanServer); Assert.assertFalse(device.isActive()); voldTestHelper.waitTaskEnd(vvrUuid, device.activateRW(), dummyMbeanServer); Assert.assertTrue(device.isActive() && !device.isReadOnly()); voldTestHelper.waitTaskEnd(vvrUuid, device.deActivate(), dummyMbeanServer); // activate two times the device, RO voldTestHelper.waitTaskEnd(vvrUuid, device.activateRO(), dummyMbeanServer); try { voldTestHelper.waitTaskEnd(vvrUuid, device.activateRO(), dummyMbeanServer); } catch (final IllegalStateException e) { exceptionOnActivateRO = true; } finally { voldTestHelper.waitTaskEnd(vvrUuid, device.deActivate(), dummyMbeanServer); } Assert.assertTrue(exceptionOnActivateRO); // activate two time the device, RW voldTestHelper.waitTaskEnd(vvrUuid, device.activateRW(), dummyMbeanServer); try { voldTestHelper.waitTaskEnd(vvrUuid, device.activateRW(), dummyMbeanServer); } catch (final IllegalStateException e) { exceptionOnActivateRW = true; } finally { voldTestHelper.waitTaskEnd(vvrUuid, device.deActivate(), dummyMbeanServer); } Assert.assertTrue(exceptionOnActivateRW); // activate in RO and RW exceptionOnActivateRW = false; voldTestHelper.waitTaskEnd(vvrUuid, device.activateRO(), dummyMbeanServer); try { voldTestHelper.waitTaskEnd(vvrUuid, device.activateRW(), dummyMbeanServer); } catch (final IllegalStateException e) { exceptionOnActivateRW = true; } finally { voldTestHelper.waitTaskEnd(vvrUuid, device.deActivate(), dummyMbeanServer); } Assert.assertTrue(exceptionOnActivateRW); // activate in RW and RO exceptionOnActivateRO = false; voldTestHelper.waitTaskEnd(vvrUuid, device.activateRW(), dummyMbeanServer); try { voldTestHelper.waitTaskEnd(vvrUuid, device.activateRO(), dummyMbeanServer); } catch (final IllegalStateException e) { exceptionOnActivateRO = true; } finally { voldTestHelper.waitTaskEnd(vvrUuid, device.deActivate(), dummyMbeanServer); } Assert.assertTrue(exceptionOnActivateRO); } @Test public void testLoadDevice() throws JMException, IOException, InterruptedException { final UUID deviceUuid = UUID.fromString(device.getUuid()); final UUID vvrUuid = UUID.fromString(vvr.getUuid()); device.setDescription("creation description"); device.setIscsiAlias("iscsi alias"); device.setIqn("iqn1"); device.setIscsiBlockSize(512); Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 3, dummyMbeanServer.getNbMXBeans()); vvr.stop(); Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 1, dummyMbeanServer.getNbMXBeans()); vvrManager.fini(); Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT - 1, dummyMbeanServer.getNbMXBeans()); VvrManagerHelper.initDtxManagement(vvrManager, dtxManager); Assert.assertTrue(VvrManagerTestUtils .waitMXBeanNumber(dummyMbeanServer, VoldTestHelper.MXBEANS_NUMBER_INIT + 1)); Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 1, dummyMbeanServer.getNbMXBeans()); vvr = (VvrMXBean) dummyMbeanServer.getMXBean(VvrManagerTestUtils.getVvrObjectName( voldTestHelper.VOLD_OWNER_UUID_TEST, vvrUuid)); vvr.start(); Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 3, dummyMbeanServer.getNbMXBeans()); device = (DeviceMXBean) dummyMbeanServer.getMXBean(VvrObjectNameFactory.newDeviceObjectName(deviceUuid, vvrUuid, deviceUuid)); checkDevice(device, deviceUuid.toString(), DEVICE_NAME_TEST, "creation description", snapshotRoot.getUuid(), "iscsi alias", "iqn1", 409600, 512); } @Test public void testSetIqn() { final UUID vvrUuid = UUID.fromString(vvr.getUuid()); boolean exceptionOnRO = false, exceptionOnRW = false; device.setIqn("iqn.2000-06.com.oodrive:test1"); voldTestHelper.waitTaskEnd(vvrUuid, device.activateRO(), dummyMbeanServer); try { device.setIqn("iqn.2000-06.com.oodrive:test2"); } catch (final IllegalStateException e) { exceptionOnRO = true; } finally { voldTestHelper.waitTaskEnd(vvrUuid, device.deActivate(), dummyMbeanServer); } voldTestHelper.waitTaskEnd(vvrUuid, device.deActivate(), dummyMbeanServer); voldTestHelper.waitTaskEnd(vvrUuid, device.activateRW(), dummyMbeanServer); try { voldTestHelper.waitTaskEnd(vvrUuid, device.setIqnNoWait("iqn.2000-06.com.oodrive:test2"), dummyMbeanServer); } catch (final IllegalStateException e) { exceptionOnRW = true; } finally { voldTestHelper.waitTaskEnd(vvrUuid, device.deActivate(), dummyMbeanServer); } Assert.assertTrue(exceptionOnRO && exceptionOnRW); } @Test public void testSetIscsiAlias() { boolean exceptionOnRO = false, exceptionOnRW = false; final UUID vvrUuid = UUID.fromString(vvr.getUuid()); device.setIscsiAlias("alias1"); voldTestHelper.waitTaskEnd(vvrUuid, device.activateRO(), dummyMbeanServer); try { device.setIscsiAlias("alias2"); } catch (final IllegalStateException e) { exceptionOnRO = true; } finally { voldTestHelper.waitTaskEnd(vvrUuid, device.deActivate(), dummyMbeanServer); } voldTestHelper.waitTaskEnd(vvrUuid, device.deActivate(), dummyMbeanServer); voldTestHelper.waitTaskEnd(vvrUuid, device.activateRW(), dummyMbeanServer); try { voldTestHelper.waitTaskEnd(vvrUuid, device.setIscsiAliasNoWait("alias2"), dummyMbeanServer); } catch (final IllegalStateException e) { exceptionOnRW = true; } finally { voldTestHelper.waitTaskEnd(vvrUuid, device.deActivate(), dummyMbeanServer); } Assert.assertTrue(exceptionOnRO && exceptionOnRW); } @Test public void testSetIscsiBlockSize() { boolean exceptionOnRO = false, exceptionOnRW = false; final UUID vvrUuid = UUID.fromString(vvr.getUuid()); device.setIscsiBlockSize(512); Assert.assertEquals(512, device.getIscsiBlockSize()); voldTestHelper.waitTaskEnd(vvrUuid, device.activateRO(), dummyMbeanServer); try { device.setIscsiBlockSize(1024); } catch (final IllegalStateException e) { exceptionOnRO = true; } finally { voldTestHelper.waitTaskEnd(vvrUuid, device.deActivate(), dummyMbeanServer); } voldTestHelper.waitTaskEnd(vvrUuid, device.deActivate(), dummyMbeanServer); voldTestHelper.waitTaskEnd(vvrUuid, device.activateRW(), dummyMbeanServer); try { voldTestHelper.waitTaskEnd(vvrUuid, device.setIscsiBlockSizeNoWait(1024), dummyMbeanServer); } catch (final IllegalStateException e) { exceptionOnRW = true; } finally { voldTestHelper.waitTaskEnd(vvrUuid, device.deActivate(), dummyMbeanServer); } Assert.assertTrue(exceptionOnRO && exceptionOnRW); voldTestHelper.waitTaskEnd(vvrUuid, device.deActivate(), dummyMbeanServer); device.setIscsiBlockSize(0); Assert.assertEquals(0, device.getIscsiBlockSize()); device.setIscsiBlockSize(-154); Assert.assertEquals(0, device.getIscsiBlockSize()); } private void checkDevice(final DeviceMXBean device, final String uuid, final String name, final String description, final String parent, final String iscsiAlias, final String iqn, final long size, final long blockSize) { Assert.assertEquals(name, device.getName()); Assert.assertEquals(uuid, device.getUuid()); Assert.assertEquals(description, device.getDescription()); Assert.assertEquals(parent, device.getParent()); Assert.assertEquals(iscsiAlias, device.getIscsiAlias()); Assert.assertEquals(iqn, device.getIqn()); Assert.assertEquals(size, device.getSize()); Assert.assertEquals(blockSize, device.getIscsiBlockSize()); } }