package org.zstack.test.kvm; import junit.framework.Assert; import org.junit.Before; import org.junit.Test; import org.zstack.core.CoreGlobalProperty; 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.db.SimpleQuery.Op; import org.zstack.core.thread.SyncTask; import org.zstack.core.thread.ThreadFacade; import org.zstack.header.configuration.InstanceOfferingInventory; import org.zstack.header.identity.SessionInventory; import org.zstack.header.image.ImageInventory; import org.zstack.header.image.ImageVO; import org.zstack.header.network.l2.L2NetworkInventory; import org.zstack.header.network.l3.L3NetworkVO; import org.zstack.header.network.l3.L3NetworkVO_; import org.zstack.header.vm.VmInstanceState; import org.zstack.header.vm.VmInstanceVO; import org.zstack.header.vm.VmInstanceVO_; import org.zstack.simulator.kvm.KVMSimulatorConfig; import org.zstack.simulator.virtualrouter.VirtualRouterSimulatorConfig; import org.zstack.test.*; import org.zstack.test.deployer.Deployer; import org.zstack.utils.CollectionUtils; import org.zstack.utils.function.Function; import java.util.List; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; public class TestKvm1000Vm { Deployer deployer; Api api; ComponentLoader loader; CloudBus bus; DatabaseFacade dbf; SessionInventory session; VirtualRouterSimulatorConfig vconfig; KVMSimulatorConfig kconfig; ThreadFacade thdf; int total = 500000; int syncLevel = 1000; int timeout = 1200; @Before public void setUp() throws Exception { DBUtil.reDeployDB(); WebBeanConstructor con = new WebBeanConstructor(); deployer = new Deployer("deployerXml/kvm/TestKvm1000Vm.xml", con); deployer.addSpringConfig("VirtualRouter.xml"); deployer.addSpringConfig("VirtualRouterSimulator.xml"); deployer.addSpringConfig("KVMRelated.xml"); deployer.build(); api = deployer.getApi(); loader = deployer.getComponentLoader(); vconfig = loader.getComponent(VirtualRouterSimulatorConfig.class); kconfig = loader.getComponent(KVMSimulatorConfig.class); bus = loader.getComponent(CloudBus.class); dbf = loader.getComponent(DatabaseFacade.class); thdf = loader.getComponent(ThreadFacade.class); session = api.loginAsAdmin(); } @Test public void test() throws ApiSenderException, InterruptedException { CoreGlobalProperty.VM_TRACER_ON = false; L2NetworkInventory l2 = deployer.l2Networks.get("TestL2Network"); SimpleQuery<L3NetworkVO> l3q = dbf.createQuery(L3NetworkVO.class); l3q.add(L3NetworkVO_.l2NetworkUuid, Op.EQ, l2.getUuid()); List<L3NetworkVO> l3vos = l3q.list(); final List<String> l3Uuids = CollectionUtils.transformToList(l3vos, new Function<String, L3NetworkVO>() { @Override public String call(L3NetworkVO arg) { return arg.getUuid(); } }); final ImageInventory img = deployer.images.get("TestImage"); ImageVO imgvo = dbf.findByUuid(img.getUuid(), ImageVO.class); imgvo.setSize(1); dbf.update(imgvo); final InstanceOfferingInventory ioinv = deployer.instanceOfferings.get("TestInstanceOffering"); final Random random = new Random(); final CountDownLatch latch = new CountDownLatch(total); for (int i = 0; i < total; i++) { final int finalI = i; thdf.syncSubmit(new SyncTask<Object>() { @Override public String getSyncSignature() { return "creating-vm"; } @Override public int getSyncLevel() { return syncLevel; } @Override public String getName() { return getSyncSignature(); } @Override public Object call() throws Exception { try { VmCreator creator = new VmCreator(api); creator.addL3Network(l3Uuids.get(random.nextInt(l3Uuids.size()))); creator.instanceOfferingUuid = ioinv.getUuid(); creator.imageUuid = img.getUuid(); creator.name = "vm-" + finalI; creator.timeout = (int) TimeUnit.MINUTES.toSeconds(10); creator.create(); } finally { latch.countDown(); } return null; } }); } latch.await(timeout, TimeUnit.MINUTES); SimpleQuery<VmInstanceVO> q = dbf.createQuery(VmInstanceVO.class); q.add(VmInstanceVO_.state, Op.EQ, VmInstanceState.Running); long count = q.count(); Assert.assertEquals(total + 3, count); } }