package org.zstack.test.network; import junit.framework.Assert; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.SimpleQuery; import org.zstack.core.thread.AsyncThread; import org.zstack.header.message.MessageReply; import org.zstack.header.network.l2.L2NetworkInventory; import org.zstack.header.network.l3.*; import org.zstack.header.zone.ZoneInventory; import org.zstack.test.*; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import org.zstack.utils.network.NetworkUtils; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.TimeUnit; public class TestFirstAvailableIpAllocatorStrategyConcurrent { CLogger logger = Utils.getLogger(TestFirstAvailableIpAllocatorStrategyConcurrent.class); Api api; ComponentLoader loader; DatabaseFacade dbf; CloudBus bus; int testNum = 10; CyclicBarrier barrier = new CyclicBarrier(testNum + 1); CountDownLatch latch = new CountDownLatch(testNum); String startIp = "10.223.110.10"; String endIp = "10.223.110.109"; long ipNum = NetworkUtils.ipv4StringToLong(endIp) - NetworkUtils.ipv4StringToLong(startIp) + 1; @Before public void setUp() throws Exception { DBUtil.reDeployDB(); BeanConstructor con = new WebBeanConstructor(); /* This loads spring application context */ loader = con.addXml("PortalForUnitTest.xml").addXml("ZoneManager.xml").addXml("NetworkManager.xml").addXml("AccountManager.xml").build(); dbf = loader.getComponent(DatabaseFacade.class); bus = loader.getComponent(CloudBus.class); api = new Api(); api.startServer(); } @After public void tearDown() throws Exception { api.stopServer(); } @AsyncThread private void allocate(L3NetworkInventory l3inv) throws InterruptedException, BrokenBarrierException { barrier.await(); int times = (int) (ipNum / testNum); try { for (int i = 0; i < times; i++) { AllocateIpMsg msg = new AllocateIpMsg(); msg.setL3NetworkUuid(l3inv.getUuid()); msg.setServiceId(bus.makeLocalServiceId(L3NetworkConstant.SERVICE_ID)); msg.setAllocateStrategy(L3NetworkConstant.FIRST_AVAILABLE_IP_ALLOCATOR_STRATEGY); MessageReply reply = bus.call(msg); if (!reply.isSuccess()) { logger.warn(reply.getError().toString()); return; } } } finally { latch.countDown(); } } @Test public void test() throws ApiSenderException, InterruptedException, BrokenBarrierException { ZoneInventory zone = api.createZones(1).get(0); L2NetworkInventory linv = api.createNoVlanL2Network(zone.getUuid(), "eth0"); L3NetworkInventory l3inv = api.createL3BasicNetwork(linv.getUuid()); L3NetworkVO vo = dbf.findByUuid(l3inv.getUuid(), L3NetworkVO.class); Assert.assertNotNull(vo); IpRangeInventory ipInv = api.addIpRange(l3inv.getUuid(), startIp, endIp, "10.223.110.1", "255.255.255.0"); IpRangeVO ipvo = dbf.findByUuid(ipInv.getUuid(), IpRangeVO.class); Assert.assertNotNull(ipvo); for (int i = 0; i < testNum; i++) { allocate(l3inv); } barrier.await(); latch.await(120, TimeUnit.SECONDS); SimpleQuery<UsedIpVO> query = dbf.createQuery(UsedIpVO.class); long count = query.count(); Assert.assertEquals(ipNum, count); } }