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.srv.BasicIopsTestHelper;
import io.eguan.srv.ClientBasicIops;
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.VvrManagerTestUtils;
import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(value = Parameterized.class)
public abstract class TestMultiVoldBasicIopsOnTargetAbstract extends TestMultiVoldAbstract {
private ClientBasicIops client1;
private ClientBasicIops client2;
private ClientBasicIops client3;
private final BasicIopsTestHelper ioHelper;
private final String deviceName = "dev0";
private final long deviceSize = 8192 * 1024L * 1024L;
private VvrManagerMXBean vvrManager1;
private DummyMBeanServer server1;
private DummyMBeanServer server2;
private DummyMBeanServer server3;
private VoldTestHelper voldTestHelper1;
private VoldTestHelper voldTestHelper2;
private VoldTestHelper voldTestHelper3;
private DeviceMXBean d1;
@Parameters
public static Collection<Object[]> testOps() {
final Object[][] data = new Object[][] { { Integer.valueOf(BLOCKSIZE), Integer.valueOf(NUMBLOCKS) },
{ Integer.valueOf(BLOCKSIZE), Integer.valueOf(NUMBLOCKS_SINGLE) },
{ Integer.valueOf(BLOCKSIZE_PARTIAL), Integer.valueOf(NUMBLOCKS_SINGLE) } };
return Arrays.asList(data);
}
// 3 nodes, vvr started automatically
public TestMultiVoldBasicIopsOnTargetAbstract(final int blockSize, final int numBlocks) {
ioHelper = new BasicIopsTestHelper(blockSize, numBlocks, LENGTH);
}
@BeforeClass
public static final void init() throws Exception {
setUpVolds(3, 3, true);
}
/**
* Create a new client on a given server.
*
* @param numServer
* the index of the server. Start from 0
*
* @return the new client
*/
protected abstract ClientBasicIops createClient(final int serverIndex);
@Before
public void initialize() throws Exception {
server1 = getDummyMBeanServer(0);
Assert.assertNotNull(server1);
voldTestHelper1 = getVoldTestHelper(0);
Assert.assertNotNull(voldTestHelper1);
vvrManager1 = VvrManagerTestUtils.getVvrManagerMXBean(server1, VOLD_OWNER);
Assert.assertNotNull(vvrManager1);
server2 = getDummyMBeanServer(1);
Assert.assertNotNull(server2);
voldTestHelper2 = getVoldTestHelper(1);
Assert.assertNotNull(voldTestHelper2);
server3 = getDummyMBeanServer(2);
Assert.assertNotNull(server3);
voldTestHelper3 = getVoldTestHelper(2);
Assert.assertNotNull(voldTestHelper3);
// Create a vvr on node 1
final SnapshotMXBean rootSnapshot = 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());
// Check if that VVR is created into the third VVR manager
Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 2, server3.getNbMXBeans());
// Create and activate a RW device on node 1
d1 = VvrManagerTestUtils.createDevice(server1, voldTestHelper1, rootSnapshot, vvrUuid, deviceName, deviceSize);
d1.setIscsiBlockSize(ioHelper.getBlockSize());
setDeviceRW(server1, voldTestHelper1, vvrUuid, d1);
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());
// Check if that device is created into the third VVR manager
Assert.assertEquals(VoldTestHelper.MXBEANS_NUMBER_INIT + 3, server3.getNbMXBeans());
// Create client for the two first servers
client1 = createClient(0);
client2 = createClient(1);
client3 = createClient(2);
}
@Test
public void testWriteReadAfterStopNode() throws Exception {
// Stop server2
stopNode(1);
// Write data on device from node 1
final File data = ioHelper.initiatorReadWriteData(client1, deviceName, deviceSize);
try {
// Deactivate device on node 1
setDeviceDeActivated(server1, voldTestHelper1, vvrUuid, d1);
// Stop server1
stopNode(0);
// Restart server2
startNode(1);
server2 = getDummyMBeanServer(1);
Assert.assertNotNull(server2);
voldTestHelper2 = getVoldTestHelper(1);
Assert.assertNotNull(voldTestHelper2);
// Read data on node 2
setDeviceRO(server2, voldTestHelper2, vvrUuid, waitDeviceMXBeanOnOtherServer(vvrUuid, d1, server2));
ioHelper.initiatorReadData(data, client2, deviceName, deviceSize);
// Read data on node 3
setDeviceRO(server3, voldTestHelper3, vvrUuid, waitDeviceMXBeanOnOtherServer(vvrUuid, d1, server3));
ioHelper.initiatorReadData(data, client3, deviceName, deviceSize);
}
finally {
data.delete();
}
}
}