/** * Abiquo community edition * cloud management application for hybrid clouds * Copyright (C) 2008-2010 - Abiquo Holdings S.L. * * This application is free software; you can redistribute it and/or * modify it under the terms of the GNU LESSER GENERAL PUBLIC * LICENSE as published by the Free Software Foundation under * version 3 of the License * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * LESSER GENERAL PUBLIC LICENSE v.3 for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ package com.abiquo.api.eventing; import static org.testng.Assert.assertEquals; import java.util.ArrayList; import java.util.List; import java.util.UUID; import javax.persistence.EntityManager; import com.abiquo.api.common.AbstractUnitTest; import com.abiquo.commons.amqp.impl.vsm.domain.VirtualSystemEvent; import com.abiquo.server.core.cloud.Hypervisor; import com.abiquo.server.core.cloud.NodeVirtualImage; import com.abiquo.server.core.cloud.VirtualAppliance; import com.abiquo.server.core.cloud.VirtualMachine; import com.abiquo.server.core.enterprise.Enterprise; import com.abiquo.server.core.infrastructure.Datastore; import com.abiquo.server.core.infrastructure.Machine; import com.softwarementors.bzngine.engines.jpa.EntityManagerHelper; /** * @author eruiz */ public abstract class VSMEventProcessorTestBase extends AbstractUnitTest { protected abstract VSMEventProcessor getEventingProcessor(EntityManager em); protected void assertStage(final VirtualMachineStage stage) { // List of entities to persist List<Object> entitiesToPersist = new ArrayList<Object>(); // Create enterprise Enterprise enterprise = enterpriseGenerator.createUniqueInstance(); enterpriseGenerator.addAuxiliaryEntitiesToPersist(enterprise, entitiesToPersist); entitiesToPersist.add(enterprise); Machine machine = machineGenerator.createUniqueInstance(); machineGenerator.addAuxiliaryEntitiesToPersist(machine, entitiesToPersist); entitiesToPersist.add(machine); // Create hypervisor Hypervisor hypervisor = hypervisorGenerator.createInstance(machine); hypervisor.getMachine().setEnterprise(enterprise); // hypervisor.getMachine().setHypervisor(hypervisor); Datastore datastore = datastoreGenerator.createInstance(hypervisor.getMachine()); datastore.setDatastoreUUID(UUID.randomUUID().toString()); // TODO: UUID should be added to // 'datastoreGenerator' ?? datastoreGenerator.addAuxiliaryEntitiesToPersist(datastore, entitiesToPersist); entitiesToPersist.add(datastore); hypervisorGenerator.addAuxiliaryEntitiesToPersist(hypervisor, entitiesToPersist); entitiesToPersist.add(hypervisor); // Create virtual appliance VirtualAppliance vapp = virtualApplianceGenerator.createUniqueInstance(); virtualApplianceGenerator.addAuxiliaryEntitiesToPersist(vapp, entitiesToPersist); entitiesToPersist.add(vapp); VirtualMachine vm = vmGenerator.createInstance(hypervisor); vm.setHypervisor(hypervisor); vm.setEnterprise(enterprise); vm.setName(stage.getName()); vm.setState(stage.getState()); vm.setDatastore(datastore); vmGenerator.addAuxiliaryEntitiesToPersist(vm, entitiesToPersist); entitiesToPersist.add(vm); NodeVirtualImage node = nodeVirtualImageGenerator.createInstance(vapp, vm); nodeVirtualImageGenerator.addAuxiliaryEntitiesToPersist(node, entitiesToPersist); entitiesToPersist.add(node); vapp.addToNodeVirtualImages(node); // Persist all entities setup(entitiesToPersist.toArray()); // Testing stuff EntityManager manager = getEntityManagerWithAnActiveTransaction(); VSMEventProcessor processor = getEventingProcessor(manager); try { if (stage.getEvent() != null) { VirtualMachine foundVM = processor.virtualMachineRep.findByName(stage.getName()); processor.onEvent(buildEvent(stage.getEvent(), foundVM.getName(), foundVM .getHypervisor().getMachine().getName(), foundVM.getHypervisor().getType() .name())); foundVM = processor.virtualMachineRep.findByName(stage.getName()); assertEquals(foundVM.getState(), stage.getExpected()); } } finally { EntityManagerHelper.commit(manager); } } protected void assertStageAndDestroyed(final VirtualMachineStage stage) { // List of entities to persist List<Object> entitiesToPersist = new ArrayList<Object>(); // Create enterprise Enterprise enterprise = enterpriseGenerator.createUniqueInstance(); enterpriseGenerator.addAuxiliaryEntitiesToPersist(enterprise, entitiesToPersist); entitiesToPersist.add(enterprise); Machine machine = machineGenerator.createUniqueInstance(); machineGenerator.addAuxiliaryEntitiesToPersist(machine, entitiesToPersist); entitiesToPersist.add(machine); // Create hypervisor Hypervisor hypervisor = hypervisorGenerator.createInstance(machine); hypervisor.getMachine().setEnterprise(enterprise); // hypervisor.getMachine().setHypervisor(hypervisor); hypervisorGenerator.addAuxiliaryEntitiesToPersist(hypervisor, entitiesToPersist); entitiesToPersist.add(hypervisor); // Create virtual appliance VirtualAppliance vapp = virtualApplianceGenerator.createUniqueInstance(); virtualApplianceGenerator.addAuxiliaryEntitiesToPersist(vapp, entitiesToPersist); entitiesToPersist.add(vapp); VirtualMachine vm = vmGenerator.createInstance(hypervisor); vm.setHypervisor(hypervisor); vm.setEnterprise(enterprise); vm.setName(stage.getName()); vm.setState(stage.getState()); vm.setHdInBytes(1000000); vm.setCpu(2); vm.setRam(1000); Datastore datastore = datastoreGenerator.createInstance(hypervisor.getMachine()); datastore.setDatastoreUUID(UUID.randomUUID().toString()); // TODO: UUID should be added to // 'datastoreGenerator' ?? // Resources // TODO (should be filled with an actual VM Deploy) datastore.setUsedSize(vm.getHdInBytes()); hypervisor.getMachine().setVirtualCpusUsed(vm.getCpu()); hypervisor.getMachine().setVirtualRamUsedInMb(vm.getRam()); // Resources datastoreGenerator.addAuxiliaryEntitiesToPersist(datastore, entitiesToPersist); entitiesToPersist.add(datastore); vm.setDatastore(datastore); vmGenerator.addAuxiliaryEntitiesToPersist(vm, entitiesToPersist); entitiesToPersist.add(vm); NodeVirtualImage node = nodeVirtualImageGenerator.createInstance(vapp, vm); nodeVirtualImageGenerator.addAuxiliaryEntitiesToPersist(node, entitiesToPersist); entitiesToPersist.add(node); vapp.addToNodeVirtualImages(node); // Persist all entities setup(entitiesToPersist.toArray()); // Testing stuff EntityManager manager = getEntityManagerWithAnActiveTransaction(); VSMEventProcessor processor = getEventingProcessor(manager); try { if (stage.getEvent() != null) { VirtualMachine foundVM = processor.virtualMachineRep.findByName(stage.getName()); processor.onEvent(buildEvent(stage.getEvent(), foundVM.getName(), foundVM .getHypervisor().getMachine().getName(), foundVM.getHypervisor().getType() .name())); foundVM = processor.virtualMachineRep.findByName(stage.getName()); // state is as NOT_ALLOCATED as expected assertEquals(foundVM.getState(), stage.getExpected()); // Resources are freed assertEquals(foundVM.getDatastore().getUsedSize(), 0); assertEquals(foundVM.getHypervisor().getMachine().getVirtualCpusUsed().intValue(), 0); assertEquals(foundVM.getHypervisor().getMachine().getVirtualRamUsedInMb() .intValue(), 0); } } finally { EntityManagerHelper.commit(manager); } } protected VirtualSystemEvent buildEvent(final String event, final String virtualMachine, final String machineAddress, final String machineType) { VirtualSystemEvent notification = new VirtualSystemEvent(); notification.setEventType(event); notification.setVirtualSystemAddress(machineAddress); notification.setVirtualSystemId(virtualMachine); notification.setVirtualSystemType(machineType); return notification; } }