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 static org.junit.Assert.assertTrue;
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.VvrManagerMXBean;
import io.eguan.vold.model.VvrManagerTask;
import io.eguan.vold.model.VvrManagerTestUtils;
import io.eguan.vold.model.VvrTask;
import java.util.UUID;
import javax.management.MalformedObjectNameException;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class TestMultiVoldHistoryL extends TestMultiVoldAbstract {
private final long size1 = 4096;
private final long size2 = 40960;
private final long size3 = 409600;
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 MalformedObjectNameException {
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 testHistory() throws Exception {
SnapshotMXBean rootSnapshot1 = createVvrStarted();
// Create the history into the first peer
// New device11
final DeviceMXBean device11 = VvrManagerTestUtils.createDevice(server1, voldTestHelper1, rootSnapshot1,
vvrUuid, "D1", size1);
// New snapshot11
final SnapshotMXBean snapshot11 = VvrManagerTestUtils.takeSnapshot(server1, voldTestHelper1, device11, "snap1",
VOLD_OWNER, vvrUuid);
// New device12
final DeviceMXBean device12 = VvrManagerTestUtils.createDevice(server1, voldTestHelper1, snapshot11, vvrUuid,
"d2", size2);
// New snapshot12 of device12
final SnapshotMXBean snapshot12 = VvrManagerTestUtils.takeSnapshot(server1, voldTestHelper1, device12, "snap2",
VOLD_OWNER, vvrUuid);
// New snapshot13 of device12
final SnapshotMXBean snapshot13 = VvrManagerTestUtils.takeSnapshot(server1, voldTestHelper1, device12, "snap3",
VOLD_OWNER, vvrUuid);
device12.setSize(size3);
SnapshotMXBean rootSnapshot2 = VvrManagerTestUtils.getSnapshotMXBean(server2, VOLD_OWNER, vvrUuid,
UUID.fromString(rootSnapshot1.getUuid()));
// Check those operations
checkTree(server1, rootSnapshot1, vvrUuid, UUID.fromString(device11.getUuid()),
UUID.fromString(device12.getUuid()), UUID.fromString(snapshot11.getUuid()),
UUID.fromString(snapshot12.getUuid()), UUID.fromString(snapshot13.getUuid()));
checkTree(server2, rootSnapshot2, vvrUuid, UUID.fromString(device11.getUuid()),
UUID.fromString(device12.getUuid()), UUID.fromString(snapshot11.getUuid()),
UUID.fromString(snapshot12.getUuid()), UUID.fromString(snapshot13.getUuid()));
// Check Tasks
checkVvrManagerTasks(VvrManagerTestUtils.getVvrManagerMXBean(server1, VOLD_OWNER).getVvrManagerTasks(),
VvrManagerTestUtils.getVvrManagerMXBean(server2, VOLD_OWNER).getVvrManagerTasks());
checkVvrTasks(VvrManagerTestUtils.getVvrMXBean(server1, VOLD_OWNER, vvrUuid).getVvrTasks(), VvrManagerTestUtils
.getVvrMXBean(server2, VOLD_OWNER, vvrUuid).getVvrTasks());
final int nbMXBeans1 = server1.getNbMXBeans();
final int nbMXBeans2 = server2.getNbMXBeans();
// Restart VVR managers
restartNodes();
initialize(); // reload local variables
assertTrue(VvrManagerTestUtils.waitMXBeanNumber(server1, nbMXBeans1));
assertTrue(VvrManagerTestUtils.waitMXBeanNumber(server2, nbMXBeans2));
// Refresh root snapshots
rootSnapshot1 = VvrManagerTestUtils.getSnapshotMXBean(server1, VOLD_OWNER, vvrUuid,
UUID.fromString(rootSnapshot1.getUuid()));
rootSnapshot2 = VvrManagerTestUtils.getSnapshotMXBean(server2, VOLD_OWNER, vvrUuid,
UUID.fromString(rootSnapshot2.getUuid()));
// Check peers after restart
checkTree(server1, rootSnapshot1, vvrUuid, UUID.fromString(device11.getUuid()),
UUID.fromString(device12.getUuid()), UUID.fromString(snapshot11.getUuid()),
UUID.fromString(snapshot12.getUuid()), UUID.fromString(snapshot13.getUuid()));
checkTree(server2, rootSnapshot2, vvrUuid, UUID.fromString(device11.getUuid()),
UUID.fromString(device12.getUuid()), UUID.fromString(snapshot11.getUuid()),
UUID.fromString(snapshot12.getUuid()), UUID.fromString(snapshot13.getUuid()));
// Check tasks after restart
checkVvrManagerTasks(VvrManagerTestUtils.getVvrManagerMXBean(server1, VOLD_OWNER).getVvrManagerTasks(),
VvrManagerTestUtils.getVvrManagerMXBean(server2, VOLD_OWNER).getVvrManagerTasks());
checkVvrTasks(VvrManagerTestUtils.getVvrMXBean(server1, VOLD_OWNER, vvrUuid).getVvrTasks(), VvrManagerTestUtils
.getVvrMXBean(server2, VOLD_OWNER, vvrUuid).getVvrTasks());
// New device13 after restarting VVR manager
final DeviceMXBean device13 = VvrManagerTestUtils.createDevice(server1, voldTestHelper1, rootSnapshot1,
vvrUuid, "d3", size2);
Assert.assertEquals(rootSnapshot1.getUuid(), device13.getParent());
}
// Check the tree generated by the method above
private final void checkTree(final DummyMBeanServer server, final SnapshotMXBean rootSnapshot, final UUID vvrUuid,
final UUID device11, final UUID device12, final UUID snapshot11, final UUID snapshot12,
final UUID snapshot13) throws MalformedObjectNameException {
final DeviceMXBean device21 = VvrManagerTestUtils.getDeviceMXBean(server, VOLD_OWNER, vvrUuid, device11);
final SnapshotMXBean snapshot21 = VvrManagerTestUtils
.getSnapshotMXBean(server, VOLD_OWNER, vvrUuid, snapshot11);
final DeviceMXBean device22 = VvrManagerTestUtils.getDeviceMXBean(server, VOLD_OWNER, vvrUuid, device12);
final SnapshotMXBean snapshot22 = VvrManagerTestUtils
.getSnapshotMXBean(server, VOLD_OWNER, vvrUuid, snapshot12);
final SnapshotMXBean snapshot23 = VvrManagerTestUtils
.getSnapshotMXBean(server, VOLD_OWNER, vvrUuid, snapshot13);
Assert.assertEquals(size2, snapshot23.getSize());
Assert.assertEquals(size3, device22.getSize());
Assert.assertEquals(size1, device21.getSize());
Assert.assertEquals(size1, snapshot21.getSize());
Assert.assertEquals(size2, snapshot22.getSize());
Assert.assertEquals(1, rootSnapshot.getChildrenSnapshots().length);
Assert.assertEquals(1, snapshot21.getChildrenSnapshots().length);
Assert.assertEquals(1, snapshot22.getChildrenSnapshots().length);
Assert.assertEquals(0, snapshot23.getChildrenSnapshots().length);
Assert.assertEquals(0, rootSnapshot.getChildrenDevices().length);
Assert.assertEquals(1, snapshot21.getChildrenDevices().length);
Assert.assertEquals(0, snapshot22.getChildrenDevices().length);
Assert.assertEquals(1, snapshot23.getChildrenDevices().length);
Assert.assertEquals(rootSnapshot.getUuid(), snapshot21.getParent());
Assert.assertEquals(snapshot21.getUuid(), snapshot22.getParent());
Assert.assertEquals(snapshot22.getUuid(), snapshot23.getParent());
Assert.assertEquals(snapshot23.getUuid(), device22.getParent());
Assert.assertEquals(snapshot21.getUuid(), device21.getParent());
}
private void checkVvrTasks(final VvrTask[] vvrTasks1, final VvrTask[] vvrTasks2) {
boolean found = false;
// Compare the task list
for (final VvrTask task1 : vvrTasks1) {
for (final VvrTask task2 : vvrTasks2) {
if (task1.getTaskId().equals(task2.getTaskId())) {
Assert.assertEquals(task1.getStatus(), task2.getStatus());
Assert.assertEquals(task1.getInfo().getOperation(), task2.getInfo().getOperation());
Assert.assertEquals(task1.getInfo().getSource(), task2.getInfo().getSource());
Assert.assertEquals(task1.getInfo().getTargetId(), task2.getInfo().getTargetId());
Assert.assertEquals(task1.getInfo().getTargetType(), task2.getInfo().getTargetType());
found = true;
break;
}
}
assertTrue(found);
found = false;
}
}
private void checkVvrManagerTasks(final VvrManagerTask[] vvrManagerTasks1, final VvrManagerTask[] vvrManagerTasks2) {
boolean found = false;
// Compare the task list
for (final VvrManagerTask task1 : vvrManagerTasks1) {
for (final VvrManagerTask task2 : vvrManagerTasks2) {
if (task1.getTaskId().equals(task2.getTaskId())) {
Assert.assertEquals(task1.getStatus(), task2.getStatus());
Assert.assertEquals(task1.getInfo().getOperation(), task2.getInfo().getOperation());
Assert.assertEquals(task1.getInfo().getSource(), task2.getInfo().getSource());
Assert.assertEquals(task1.getInfo().getTargetId(), task2.getInfo().getTargetId());
Assert.assertEquals(task1.getInfo().getTargetType(), task2.getInfo().getTargetType());
found = true;
break;
}
}
assertTrue(found);
found = false;
}
}
@Test
public void testHistoryDeleteSnapshot() throws Exception {
final SnapshotMXBean rootSnapshot1 = createVvrStarted();
// New device11
final DeviceMXBean device11 = VvrManagerTestUtils.createDevice(server1, voldTestHelper1, rootSnapshot1,
vvrUuid, "D1", size1);
// New snapshot11
final SnapshotMXBean snapshot11 = VvrManagerTestUtils.takeSnapshot(server1, voldTestHelper1, device11, "snap1",
VOLD_OWNER, vvrUuid);
// New snapshot12
final SnapshotMXBean snapshot12 = VvrManagerTestUtils.takeSnapshot(server1, voldTestHelper1, device11, "snap2",
VOLD_OWNER, vvrUuid);
// New snapshot13
final SnapshotMXBean snapshot13 = VvrManagerTestUtils.takeSnapshot(server1, voldTestHelper1, device11, "snap3",
VOLD_OWNER, vvrUuid);
SnapshotMXBean rootSnapshot2 = VvrManagerTestUtils.getSnapshotMXBean(server2, VOLD_OWNER, vvrUuid,
UUID.fromString(rootSnapshot1.getUuid()));
// Check those operations onto the second peer
DeviceMXBean device21 = VvrManagerTestUtils.getDeviceMXBean(server2, VOLD_OWNER, vvrUuid,
UUID.fromString(device11.getUuid()));
final SnapshotMXBean snapshot21 = VvrManagerTestUtils.getSnapshotMXBean(server2, VOLD_OWNER, vvrUuid,
UUID.fromString(snapshot11.getUuid()));
SnapshotMXBean snapshot22 = VvrManagerTestUtils.getSnapshotMXBean(server2, VOLD_OWNER, vvrUuid,
UUID.fromString(snapshot12.getUuid()));
final SnapshotMXBean snapshot23 = VvrManagerTestUtils.getSnapshotMXBean(server2, VOLD_OWNER, vvrUuid,
UUID.fromString(snapshot13.getUuid()));
Assert.assertEquals(size1, device21.getSize());
Assert.assertEquals(size1, snapshot21.getSize());
Assert.assertEquals(size1, snapshot22.getSize());
Assert.assertEquals(size1, snapshot23.getSize());
Assert.assertEquals(rootSnapshot2.getUuid(), snapshot21.getParent());
Assert.assertEquals(snapshot21.getUuid(), snapshot22.getParent());
Assert.assertEquals(snapshot22.getUuid(), snapshot23.getParent());
Assert.assertEquals(snapshot23.getUuid(), device21.getParent());
// Delete snapshot11 from the first peer and check if its removed from the second peer
voldTestHelper1.waitTaskEnd(vvrUuid, snapshot11.delete(), server1);
Assert.assertEquals(rootSnapshot2.getUuid(), snapshot22.getParent());
// Delete from the first peer and check if its removed from the second peer
voldTestHelper1.waitTaskEnd(vvrUuid, snapshot13.delete(), server1);
Assert.assertEquals(snapshot22.getUuid(), device21.getParent());
final int nbMXBeans1 = server1.getNbMXBeans();
final int nbMXBeans2 = server2.getNbMXBeans();
// Restart VVR managers
restartNodes();
initialize(); // reload local variables
Assert.assertTrue(VvrManagerTestUtils.waitMXBeanNumber(server1, nbMXBeans1));
Assert.assertTrue(VvrManagerTestUtils.waitMXBeanNumber(server2, nbMXBeans2));
rootSnapshot2 = VvrManagerTestUtils.getSnapshotMXBean(server2, VOLD_OWNER, vvrUuid,
UUID.fromString(rootSnapshot2.getUuid()));
snapshot22 = VvrManagerTestUtils.getSnapshotMXBean(server2, VOLD_OWNER, vvrUuid,
UUID.fromString(snapshot22.getUuid()));
device21 = VvrManagerTestUtils.getDeviceMXBean(server2, VOLD_OWNER, vvrUuid,
UUID.fromString(device21.getUuid()));
Assert.assertEquals(rootSnapshot2.getUuid(), snapshot22.getParent());
Assert.assertEquals(snapshot22.getUuid(), device21.getParent());
}
}