/** * 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.abiserver.commands.impl; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; import java.util.UUID; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.abiquo.abiserver.business.hibernate.pojohb.infrastructure.HypervisorHB; import com.abiquo.abiserver.business.hibernate.pojohb.infrastructure.StateEnum; import com.abiquo.abiserver.business.hibernate.pojohb.networking.IpPoolManagementHB; import com.abiquo.abiserver.business.hibernate.pojohb.networking.NetworkConfigurationHB; import com.abiquo.abiserver.business.hibernate.pojohb.user.UserHB; import com.abiquo.abiserver.business.hibernate.pojohb.virtualappliance.NodeHB; import com.abiquo.abiserver.business.hibernate.pojohb.virtualappliance.NodeVirtualImageHB; import com.abiquo.abiserver.business.hibernate.pojohb.virtualappliance.VirtualDataCenterHB; import com.abiquo.abiserver.business.hibernate.pojohb.virtualappliance.VirtualappHB; import com.abiquo.abiserver.business.hibernate.pojohb.virtualappliance.VirtualmachineHB; import com.abiquo.abiserver.business.hibernate.pojohb.virtualhardware.ResourceAllocationSettingData; import com.abiquo.abiserver.business.hibernate.pojohb.virtualhardware.ResourceManagementHB; import com.abiquo.abiserver.business.hibernate.pojohb.virtualimage.VirtualImageConversionsHB; import com.abiquo.abiserver.business.hibernate.pojohb.virtualimage.VirtualimageHB; import com.abiquo.abiserver.commands.BasicCommand; import com.abiquo.abiserver.commands.VirtualApplianceCommand; import com.abiquo.abiserver.commands.stub.APIStubFactory; import com.abiquo.abiserver.commands.stub.VirtualApplianceResourceStub; import com.abiquo.abiserver.commands.stub.VirtualDatacenterResourceStub; import com.abiquo.abiserver.commands.stub.impl.VirtualApplianceResourceStubImpl; import com.abiquo.abiserver.commands.stub.impl.VirtualDatacenterResourceStubImpl; import com.abiquo.abiserver.exception.HardLimitExceededException; import com.abiquo.abiserver.exception.PersistenceException; import com.abiquo.abiserver.exception.VirtualApplianceCommandException; import com.abiquo.abiserver.exception.VirtualApplianceTimeoutException; import com.abiquo.abiserver.persistence.DAOFactory; import com.abiquo.abiserver.persistence.dao.user.UserDAO; import com.abiquo.abiserver.persistence.dao.virtualappliance.VirtualApplianceDAO; import com.abiquo.abiserver.persistence.hibernate.HibernateDAOFactory; import com.abiquo.abiserver.persistence.hibernate.HibernateUtil; import com.abiquo.abiserver.pojo.authentication.UserSession; import com.abiquo.abiserver.pojo.infrastructure.DataCenter; import com.abiquo.abiserver.pojo.infrastructure.HyperVisor; import com.abiquo.abiserver.pojo.infrastructure.State; import com.abiquo.abiserver.pojo.infrastructure.VirtualMachine; import com.abiquo.abiserver.pojo.result.BasicResult; import com.abiquo.abiserver.pojo.result.DataResult; import com.abiquo.abiserver.pojo.result.ListRequest; import com.abiquo.abiserver.pojo.user.Enterprise; import com.abiquo.abiserver.pojo.virtualappliance.Node; import com.abiquo.abiserver.pojo.virtualappliance.NodeVirtualImage; import com.abiquo.abiserver.pojo.virtualappliance.VirtualAppliance; import com.abiquo.abiserver.pojo.virtualappliance.VirtualDataCenter; import com.abiquo.abiserver.pojo.virtualappliance.VirtualDatacentersListResult; import com.abiquo.abiserver.pojo.virtualimage.VirtualImageConversions; import com.abiquo.commons.amqp.impl.vsm.VSMProducer; import com.abiquo.commons.amqp.impl.vsm.domain.VirtualSystemEvent; import com.abiquo.model.enumerator.NetworkType; import com.abiquo.ovfmanager.cim.CIMTypesUtils.CIMResourceTypeEnum; import com.abiquo.tracer.ComponentType; import com.abiquo.tracer.EventType; import com.abiquo.tracer.SeverityType; import com.abiquo.util.ErrorManager; import com.abiquo.util.resources.ResourceManager; import com.abiquo.vsm.events.VMEventType; /** * This command collects all actions related to Virtual Appliances * * @author abiquo */ public class VirtualApplianceCommandImpl extends BasicCommand implements VirtualApplianceCommand { /** The logger object */ private final static Logger logger = LoggerFactory.getLogger(VirtualApplianceCommandImpl.class); public VirtualApplianceCommandImpl() { } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#checkVirtualAppliance(com.abiquo.abiserver * .pojo.virtualappliance.VirtualAppliance) */ @Override public DataResult<VirtualAppliance> checkVirtualAppliance( final VirtualAppliance virtualAppliance) { DataResult<VirtualAppliance> dataResult = new DataResult<VirtualAppliance>(); Session session = null; Transaction transaction = null; try { session = HibernateUtil.getSession(true); transaction = session.beginTransaction(); // Getting the given VirtualAppliance from the DataBase VirtualappHB updatedVirtualAppHB = (VirtualappHB) session.get("VirtualappExtendedHB", virtualAppliance.getId()); // Generating the result if (updatedVirtualAppHB != null) { dataResult.setSuccess(true); dataResult.setData(updatedVirtualAppHB.toPojo()); dataResult.setMessage(resourceManager.getMessage("checkVirtualAppliance.success")); } else { logger .trace("Unexpected error when refreshing the information of the virtual appliance"); } transaction.commit(); } catch (Exception e) { if (transaction != null && transaction.isActive()) { transaction.rollback(); } logger.trace( "Unexpected error when refreshing the information of the virtual appliance", e); } return dataResult; } /* * (non-Javadoc)s * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#createVirtualAppliance(com.abiquo.abiserver * .pojo.authentication.UserSession, * com.abiquo.abiserver.pojo.virtualappliance.VirtualAppliance) */ @Override public DataResult<VirtualAppliance> createVirtualAppliance(final UserSession userSession, VirtualAppliance virtualAppliance) { DataResult<VirtualAppliance> dataResult = new DataResult<VirtualAppliance>(); VirtualappHB virtualAppHBPojo = null; Session session = null; Transaction transaction = null; // Variable to hold the id of the virtual appliance - this will be used // to report an error // to the database Integer virtualApplianceId = null; try { session = HibernateUtil.getSession(); transaction = session.beginTransaction(); virtualAppHBPojo = virtualAppliance.toPojoHB(); virtualAppHBPojo.setState(StateEnum.NOT_ALLOCATED); // virtualAppHBPojo.setSubState(StateEnum.NOT_ALLOCATED); // Saving the data session.save("VirtualappHB", virtualAppHBPojo); // Set the virtualApplianceId virtualApplianceId = virtualAppHBPojo.getIdVirtualApp(); // Recovering the best information virtualAppliance = ((VirtualappHB) session.get("VirtualappExtendedHB", virtualApplianceId)).toPojo(); // Updating dataResult information dataResult.setData(virtualAppliance); dataResult.setMessage(resourceManager.getMessage("createVirtualAppliance.success")); dataResult.setSuccess(true); transaction.commit(); // Log the event traceLog(SeverityType.INFO, ComponentType.VIRTUAL_APPLIANCE, EventType.VAPP_CREATE, userSession, null, virtualAppliance.getVirtualDataCenter().getName(), "Virtual Appliance '" + virtualAppliance.getName() + "' has been created", virtualAppliance, null, null, null, null); } catch (Exception e) { if (transaction != null && transaction.isActive()) { transaction.rollback(); } errorManager.reportError(resourceManager, dataResult, "createVirtualAppliance", e, virtualApplianceId); traceLog(SeverityType.CRITICAL, ComponentType.VIRTUAL_APPLIANCE, EventType.VAPP_CREATE, userSession, null, virtualAppliance.getVirtualDataCenter().getName(), e .getMessage(), null, null, null, null, null); return dataResult; } return dataResult; } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#createVirtualDataCenter(com.abiquo. * abiserver.pojo.authentication.UserSession, * com.abiquo.abiserver.pojo.virtualappliance.VirtualDataCenter, java.lang.String, * com.abiquo.abiserver.business.hibernate.pojohb.networking.NetworkConfigurationHB) */ @Override public DataResult<VirtualDataCenter> createVirtualDataCenter(final UserSession userSession, final VirtualDataCenter virtualDataCenter, final String networkName, final NetworkConfigurationHB configuration) { VirtualDatacenterResourceStub proxy = APIStubFactory.getInstance(userSession, new VirtualDatacenterResourceStubImpl(), VirtualDatacenterResourceStub.class); DataResult<VirtualDataCenter> result = proxy.createVirtualDatacenter(virtualDataCenter, networkName, configuration, resourceManager); if (!result.getSuccess()) { BasicCommand.traceLog(SeverityType.CRITICAL, ComponentType.VIRTUAL_DATACENTER, EventType.VDC_CREATE, userSession, null, virtualDataCenter.getName(), result .getMessage(), null, null, null, null, null); } else { BasicCommand.traceLog(SeverityType.INFO, ComponentType.VIRTUAL_DATACENTER, EventType.VDC_CREATE, userSession, null, result.getData().getName(), "Virtual datacenter '" + result.getData().getName() + "' with a " + result.getData().getHyperType().getName() + " hypervisor has been created", null, null, null, null, null); } return result; } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#deleteVirtualDataCenter(com.abiquo. * abiserver.pojo.authentication.UserSession, * com.abiquo.abiserver.pojo.virtualappliance.VirtualDataCenter) */ @Override public BasicResult deleteVirtualDataCenter(final UserSession userSession, final VirtualDataCenter virtualDataCenter) { VirtualDatacenterResourceStub proxy = APIStubFactory.getInstance(userSession, new VirtualDatacenterResourceStubImpl(), VirtualDatacenterResourceStub.class); BasicResult result = proxy.deleteVirtualDatacenter(virtualDataCenter, resourceManager); if (!result.getSuccess()) { BasicCommand.traceLog(SeverityType.INFO, ComponentType.VIRTUAL_DATACENTER, EventType.VDC_DELETE, userSession, null, virtualDataCenter.getName(), "Error deleting Virtual datacenter '" + virtualDataCenter.getName() + "'", null, null, null, null, null); } else { BasicCommand.traceLog(SeverityType.CRITICAL, ComponentType.VIRTUAL_DATACENTER, EventType.VDC_DELETE, userSession, null, virtualDataCenter.getName(), "Virtual datacenter '" + virtualDataCenter.getName() + "' with a " + virtualDataCenter.getHyperType().getName() + " hypervisor has been deleted", null, null, null, null, null); } return result; } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#editVirtualDataCenter(com.abiquo.abiserver * .pojo.authentication.UserSession, * com.abiquo.abiserver.pojo.virtualappliance.VirtualDataCenter) */ @Override public BasicResult editVirtualDataCenter(final UserSession userSession, final VirtualDataCenter virtualDataCenter) { // Checked en api // Session session = HibernateUtil.getSession(); // Transaction tx = session.beginTransaction(); // // try // { // VirtualDataCenterHB vdcHb = virtualDataCenter.toPojoHB(); // checkLimits(vdcHb, userSession); // } // catch (HardLimitExceededException e) // { // BasicResult basicResult = new BasicResult(); // basicResult.setSuccess(false); // basicResult.setMessage(resourceManager // .getMessage("editVirtualDataCenter.limitExceeded")); // // return basicResult; // } // finally // { // tx.commit(); // } VirtualDatacenterResourceStub proxy = APIStubFactory.getInstance(userSession, new VirtualDatacenterResourceStubImpl(), VirtualDatacenterResourceStub.class); DataResult<VirtualDataCenter> result = proxy.updateVirtualDatacenter(virtualDataCenter, resourceManager); if (!result.getSuccess()) { BasicCommand.traceLog(SeverityType.CRITICAL, ComponentType.VIRTUAL_DATACENTER, EventType.VDC_MODIFY, userSession, null, virtualDataCenter.getName(), result .getMessage(), null, null, null, null, null); } else { VirtualDataCenter vdc = result.getData(); // Log the event BasicCommand.traceLog(SeverityType.INFO, ComponentType.VIRTUAL_DATACENTER, EventType.VDC_MODIFY, userSession, null, vdc.getName(), "Virtual datacenter '" + vdc.getName() + "' with a " + vdc.getHyperType().getFriendlyName() + " hypervisor type has been modified [Name: " + vdc.getName() + "]", null, null, null, null, null); } return result; } protected void checkLimits(final VirtualDataCenterHB vdc, final UserSession userSession) throws HardLimitExceededException { // community impl (no limits at all) } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#getVirtualApplianceNodes(com.abiquo * .abiserver.pojo.virtualappliance.VirtualAppliance) */ @Override @SuppressWarnings("unchecked") public DataResult<Collection<Node>> getVirtualApplianceNodes( final VirtualAppliance virtualAppliance) { DataResult<Collection<Node>> dataResult = new DataResult<Collection<Node>>(); Session session = null; Transaction transaction = null; try { session = HibernateUtil.getSession(); transaction = session.beginTransaction(); String query = "from NodeHB nodes where nodes.idVirtualApp = :vappId"; Query namedQuery = session.createQuery(query).setParameter("vappId", virtualAppliance.getId()); List<NodeHB<Node< ? >>> nodes = namedQuery.list(); Collection<Node> nodeList = new ArrayList<Node>(); for (NodeHB<Node< ? >> n : nodes) { nodeList.add(n.toPojo()); } // Building result dataResult.setSuccess(true); dataResult.setData(nodeList); dataResult.setMessage("VirtualAppliance nodes successfully retrieved"); transaction.commit(); } catch (Exception e) { if (transaction != null && transaction.isActive()) { transaction.rollback(); } errorManager.reportError(resourceManager, dataResult, "getVirtualApplianceNodes", e, virtualAppliance.getId()); } return dataResult; } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#getVirtualAppliancesByEnterprise(com * .abiquo.abiserver.pojo.user.Enterprise) */ @Override public DataResult<Collection<VirtualAppliance>> getVirtualAppliancesByEnterprise( final UserSession userSession, final Enterprise enterprise) { VirtualApplianceResourceStub proxy = APIStubFactory.getInstance(userSession, new VirtualApplianceResourceStubImpl(), VirtualApplianceResourceStub.class); DataResult<Collection<VirtualAppliance>> result = proxy.getVirtualAppliancesByEnterprise(userSession, enterprise); if (result.getSuccess()) { result.setMessage(resourceManager .getMessage("getVirtualAppliancesByEnterprise.success")); } return result; } /* * (non-Javadoc) * @seecom.abiquo.abiserver.commands.VirtualApplianceCommand# * getVirtualAppliancesByEnterpriseAndDatacenter(com.abiquo.abiserver.pojo.user.Enterprise, * com.abiquo.abiserver.pojo.infrastructure.DataCenter) */ @Override public DataResult<Collection<VirtualAppliance>> getVirtualAppliancesByEnterpriseAndDatacenter( final UserSession userSession, final Enterprise enterprise, final DataCenter datacenter) { return new GetVirtualAppliancesList(userSession, enterprise.getId(), datacenter.getId()) { @Override protected Collection<VirtualappHB> get(final UserHB user, final VirtualApplianceDAO dao) { return dao.getVirtualAppliancesByEnterpriseAndDatacenter(user, enterpriseId, datacenterId); } }.getVirtualAppliances(errorManager, resourceManager); } @Override public DataResult<VirtualDatacentersListResult> getVirtualDataCentersByEnterprise( final UserSession userSession, final Enterprise enterprise, final ListRequest listRequest) { VirtualDatacenterResourceStub proxy = APIStubFactory.getInstance(userSession, new VirtualDatacenterResourceStubImpl(), VirtualDatacenterResourceStub.class); DataResult<VirtualDatacentersListResult> dataResult = proxy.getVirtualDatacentersByEnterprise(enterprise, listRequest); if (dataResult.getSuccess()) { dataResult.setMessage(resourceManager.getMessage("getVirtualDataCenters.success")); } return dataResult; } @Override public DataResult<Collection<VirtualDataCenter>> getVirtualDataCentersByEnterpriseFaster( final UserSession userSession, final Enterprise enterprise) { VirtualDatacenterResourceStub proxy = APIStubFactory.getInstance(userSession, new VirtualDatacenterResourceStubImpl(), VirtualDatacenterResourceStub.class); DataResult<Collection<VirtualDataCenter>> dataResult = proxy.getVirtualDatacentersByEnterprise(enterprise); if (dataResult.getSuccess()) { dataResult.setMessage(resourceManager.getMessage("getVirtualDataCenters.success")); } return dataResult; } private static abstract class GetVirtualAppliancesList { protected final UserSession userSession; protected final Integer enterpriseId; protected final Integer datacenterId; public GetVirtualAppliancesList(final UserSession userSession, final Integer enterpriseId, final Integer datacenterId) { this.userSession = userSession; this.enterpriseId = enterpriseId; this.datacenterId = datacenterId; } protected abstract Collection<VirtualappHB> get(UserHB user, VirtualApplianceDAO dao); public DataResult<Collection<VirtualAppliance>> getVirtualAppliances( final ErrorManager errorManager, final ResourceManager resourceManager) { DataResult<Collection<VirtualAppliance>> dataResult = new DataResult<Collection<VirtualAppliance>>(); DAOFactory factory = HibernateDAOFactory.instance(); factory.beginConnection(true); VirtualApplianceDAO dao = factory.getVirtualApplianceDAO(); UserDAO userDAO = factory.getUserDAO(); UserHB user = userDAO.getUserByLoginAuth(userSession.getUser(), userSession.getAuthType()); try { Collection<VirtualappHB> vAppsHB = get(user, dao); Collection<VirtualAppliance> vapps = new ArrayList<VirtualAppliance>(); for (VirtualappHB vd : vAppsHB) { vapps.add(vd.toPojo()); } // Building result dataResult.setSuccess(true); dataResult.setData(vapps); dataResult.setMessage(resourceManager .getMessage("getVirtualAppliancesByEnterprise.success")); } catch (Exception e) { errorManager.reportError(resourceManager, dataResult, "getVirtualAppliancesByEnterprise", e); } finally { factory.endConnection(); } return dataResult; } } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#blockVirtualAppliance(com.abiquo.abiserver * .pojo.virtualappliance.VirtualAppliance, * com.abiquo.abiserver.business.hibernate.pojohb.infrastructure.StateEnum) */ @Override public boolean blockVirtualAppliance(final VirtualAppliance virtualAppliance, final StateEnum subState) throws PersistenceException { DAOFactory daoFactory = HibernateDAOFactory.instance(); boolean blocked = false; daoFactory.beginConnection(); VirtualApplianceDAO applianceDAO = daoFactory.getVirtualApplianceDAO(); VirtualappHB current = applianceDAO.findByIdNamedExtended(virtualAppliance.getId()); if (current.getState() != StateEnum.LOCKED) { current.setState(StateEnum.LOCKED); // current.setSubState(subState); applianceDAO.makePersistent(current); blocked = true; } else { logger.debug("Unable to block the virtual appliance."); } daoFactory.endConnection(); return blocked; } protected DataResult<VirtualAppliance> traceErrorStartingVirtualAppliance( final UserSession userSession, VirtualAppliance vApp, State state, State subState, final UserHB userHB, final ComponentType componentType, final String message, final String reportErrorKey, final Exception exception, EventType eventType, final int... resultCode) { eventType = eventType == null ? EventType.VAPP_POWERON : eventType; DataResult<VirtualAppliance> dataResult = new DataResult<VirtualAppliance>(); if (resultCode != null && resultCode.length > 0 && resultCode[0] == BasicResult.SOFT_LIMT_EXCEEDED) { traceLog(SeverityType.INFO, componentType, eventType, userSession, null, vApp .getVirtualDataCenter().getName(), message, vApp, null, null, null, null); } else { traceLog(SeverityType.CRITICAL, componentType, eventType, userSession, null, vApp .getVirtualDataCenter().getName(), message, vApp, null, null, null, null); } errorManager.reportError(resourceManager, dataResult, reportErrorKey, exception, vApp .getId()); if (exception instanceof VirtualApplianceTimeoutException) { state = new State(StateEnum.UNKNOWN); subState = new State(StateEnum.UNKNOWN); } vApp = updateStateAndSubStateInDB(vApp, state, subState).getData(); dataResult.setData(vApp); dataResult.setMessage(message); if (resultCode != null && resultCode.length > 0) { dataResult.setResultCode(resultCode[0]); } return dataResult; } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#traceErrorStartingVirtualAppliance( * com.abiquo.abiserver.pojo.virtualappliance.VirtualAppliance, * com.abiquo.abiserver.pojo.infrastructure.State, * com.abiquo.abiserver.pojo.infrastructure.State, * com.abiquo.abiserver.business.hibernate.pojohb.user.UserHB, com.abiquo.tracer.ComponentType, * java.lang.String, java.lang.String, boolean, int) */ // @Override protected DataResult<VirtualAppliance> traceErrorStartingVirtualAppliance( final UserSession userSession, final VirtualAppliance vApp, final State state, final State subState, final UserHB userHB, final ComponentType componentType, final String message, final String reportErrorKey, final Exception exception, final int... resultCode) { return traceErrorStartingVirtualAppliance(userSession, vApp, state, subState, userHB, componentType, message, reportErrorKey, exception, null, resultCode); } /** * Private helper to update the state and the sub-state of a virtual appliance in the database. * * @param virtualappliance The Virtual appliance to update. * @param state The new state to update. * @param subState the new SubState to update. * @return A basic Result with the operation result. */ private DataResult<VirtualAppliance> updateStateAndSubStateInDB( VirtualAppliance virtualappliance, final State state, final State subState) { DataResult<VirtualAppliance> dataResult = new DataResult<VirtualAppliance>(); Session session = null; Transaction transaction = null; try { session = HibernateUtil.getSession(); transaction = checkOpenTransaction(session).getTransaction();// session.beginTransaction(); VirtualappHB virtualAppliance = (VirtualappHB) session.get("VirtualappExtendedHB", virtualappliance.getId()); virtualAppliance.setState(state.toEnum()); // virtualAppliance.setSubState(subState.toEnum()); session.update("VirtualappHB", virtualAppliance); virtualappliance = virtualAppliance.toPojo(); transaction.commit(); dataResult.setData(virtualappliance); } catch (HibernateException e) { if (transaction != null && transaction.isActive()) { transaction.rollback(); } errorManager.reportError(resourceManager, dataResult, "updateStateInDB", e); } return dataResult; } protected void publishVirtualMachineEvents(final Collection<Node> nodes, final VMEventType eventType) { try { VSMProducer producer = new VSMProducer(); producer.openChannel(); for (Node< ? > node : nodes) { if (node.isNodeTypeVirtualImage()) { NodeVirtualImage nvi = (NodeVirtualImage) node; VirtualMachine vm = nvi.getVirtualMachine(); HyperVisor hv = (HyperVisor) vm.getAssignedTo(); VirtualSystemEvent event = new VirtualSystemEvent(); event.setEventType(eventType.name()); event.setVirtualSystemAddress(String.format("http://%s:%d/", hv.getIp(), hv .getPort())); event.setVirtualSystemId(vm.getName()); event.setVirtualSystemType(hv.getType().getName()); producer.publish(event); } } producer.closeChannel(); } catch (IOException e) { logger.error("Can not connect RabbitMQ to refresh virtual machine states."); } } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#beforeCallingVirtualFactory(com.abiquo * .abiserver.pojo.virtualappliance.VirtualAppliance) */ @Override public void beforeCallingVirtualFactory(final VirtualAppliance virtualAppliance) throws Exception { // Do nothing by default. } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#createEmptyVirtualMachine(com.abiquo * .abiserver.business.hibernate.pojohb.virtualappliance.NodeVirtualImageHB, * com.abiquo.abiserver.business.hibernate.pojohb.user.UserHB) */ @Override public VirtualmachineHB createEmptyVirtualMachine(final NodeVirtualImageHB nodeVIPojo, final UserHB owner) { VirtualmachineHB virtualMachineHB = new VirtualmachineHB(); VirtualimageHB virtualImageHB = nodeVIPojo.getVirtualImageHB(); // virtualMachineHB.setIdVm(0); HypervisorHB hyper = null; virtualMachineHB.setHypervisor(hyper); virtualMachineHB.setImage(nodeVIPojo.getVirtualImageHB()); virtualMachineHB.setState(StateEnum.NOT_ALLOCATED); String uuid = UUID.randomUUID().toString(); virtualMachineHB.setUuid(uuid); virtualMachineHB.setName(uuid); virtualMachineHB.setDescription(virtualImageHB.getDescription()); virtualMachineHB.setRam(virtualImageHB.getRamRequired()); virtualMachineHB.setCpu(virtualImageHB.getCpuRequired()); virtualMachineHB.setHd(virtualImageHB.getHdRequired()); virtualMachineHB.setVdrpPort(0); virtualMachineHB.setHighDisponibility(0); virtualMachineHB.setIdType(VirtualmachineHB.MANAGED_VM); virtualMachineHB.setUserHB(owner); virtualMachineHB.setEnterpriseHB(owner.getEnterpriseHB()); virtualMachineHB.setConversion(null); return virtualMachineHB; } private Session checkOpenTransaction(Session session) { if (!session.isOpen()) { session = HibernateDAOFactory.getSessionFactory().getCurrentSession(); } Transaction tx = session.getTransaction(); boolean isActive = tx.isActive(); if (!isActive) { tx = session.beginTransaction(); } return session; } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#prepareVirtualImage(com.abiquo.abiserver * .business.hibernate.pojohb.virtualimage.VirtualimageHB, * com.abiquo.abiserver.business.hibernate.pojohb.virtualappliance.VirtualmachineHB) */ @Override public VirtualimageHB prepareVirtualImage(final VirtualimageHB virtualImage, final VirtualmachineHB virtualMachine) { return virtualImage; } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#updateStateInDB(com.abiquo.abiserver * .pojo.virtualappliance.VirtualAppliance, * com.abiquo.abiserver.business.hibernate.pojohb.infrastructure.StateEnum) */ @Override public DataResult<VirtualAppliance> updateStateInDB(VirtualAppliance virtualappliance, final StateEnum newState) { DataResult<VirtualAppliance> dataResult; dataResult = new DataResult<VirtualAppliance>(); dataResult.setSuccess(true); Session session = null; Transaction transaction = null; try { session = HibernateUtil.getSession(); transaction = session.beginTransaction(); VirtualappHB virtualAppPojo = (VirtualappHB) session.get("VirtualappExtendedHB", virtualappliance.getId()); virtualAppPojo.setState(newState); // virtualAppPojo.setSubState(newState); session.update("VirtualappHB", virtualAppPojo); virtualappliance = virtualAppPojo.toPojo(); transaction.commit(); dataResult.setData(virtualappliance); } catch (HibernateException e) { if (transaction != null && transaction.isActive()) { transaction.rollback(); } errorManager.reportError(resourceManager, dataResult, "updateStateInDB", e); } return dataResult; } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#updateOnlyStateInDB(com.abiquo.abiserver * .pojo.virtualappliance.VirtualAppliance, * com.abiquo.abiserver.business.hibernate.pojohb.infrastructure.StateEnum) */ @Override public DataResult<VirtualAppliance> updateOnlyStateInDB(VirtualAppliance virtualappliance, final StateEnum newState) { DataResult<VirtualAppliance> dataResult; dataResult = new DataResult<VirtualAppliance>(); dataResult.setSuccess(true); Session session = null; Transaction transaction = null; try { session = HibernateUtil.getSession(); transaction = session.beginTransaction(); VirtualappHB virtualAppPojo = (VirtualappHB) session.get("VirtualappExtendedHB", virtualappliance.getId()); virtualAppPojo.setState(newState); session.update("VirtualappHB", virtualAppPojo); virtualappliance = virtualAppPojo.toPojo(); transaction.commit(); dataResult.setData(virtualappliance); } catch (HibernateException e) { if (transaction != null && transaction.isActive()) { transaction.rollback(); } errorManager.reportError(resourceManager, dataResult, "updateStateInDB", e); } return dataResult; } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#deleteRasdFromNode(org.hibernate.Session * , com.abiquo.abiserver.business.hibernate.pojohb.virtualappliance.NodeVirtualImageHB) */ @Override public void deleteRasdFromNode(final Session session, final NodeVirtualImageHB node) { Set<ResourceManagementHB> resmans = node.getVirtualMachineHB().getResman(); if (resmans != null && resmans.size() > 0) { for (ResourceManagementHB resm : resmans) { int resourceType = Integer.valueOf(resm.getIdResourceType()); if (resourceType == CIMResourceTypeEnum.Ethernet_Adapter.getNumericResourceType()) { deleteNetworkRasd(session, resm); } else if (resourceType == CIMResourceTypeEnum.iSCSI_HBA.getNumericResourceType()) { deleteStorageRasd(session, resm); } } node.getVirtualMachineHB().getResman().clear(); } } /** * Delete a network RASD when deleting a note or virtual appliance. * * @param session The hibernate session. * @param resourceManagement The resource to delete. */ protected void deleteNetworkRasd(final Session session, final ResourceManagementHB resourceManagement) { if (resourceManagement instanceof IpPoolManagementHB) { IpPoolManagementHB netMan = (IpPoolManagementHB) resourceManagement; ResourceAllocationSettingData rasd = netMan.getRasd(); session.delete(rasd); if (resourceManagement.getVirtualDataCenter().getDefaultVlan().getNetworkType().equals( NetworkType.UNMANAGED.name())) { session.delete(netMan); } else { netMan.setRasd(null); netMan.setVirtualMachine(null); netMan.setVirtualApp(null); netMan.setConfigureGateway(Boolean.FALSE); if (rasd.getResourceSubType() != null && rasd.getResourceSubType().equalsIgnoreCase("2")) { netMan.setMac(null); netMan.setVirtualDataCenter(null); netMan.setName(null); } session.saveOrUpdate(netMan); } } } /** * Delete a storage RASD when removing a node or a virtual appliance. * * @param session The Hibernate session. * @param resourceManagement The resource to delete. */ protected void deleteStorageRasd(final Session session, final ResourceManagementHB resourceManagement) { resourceManagement.setVirtualApp(null); resourceManagement.setVirtualMachine(null); session.saveOrUpdate(resourceManagement); } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#deleteRasdFromNode(com.abiquo.abiserver * .business.hibernate.pojohb.virtualappliance.NodeVirtualImageHB) */ @Override public void deleteRasdFromNode(final NodeVirtualImageHB node) { Session session = null; Transaction transaction = null; session = HibernateUtil.getSession(); transaction = session.beginTransaction(); deleteRasdFromNode(session, node); session.close(); } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#getConversionByNodeVirtualImage(int) */ @Override public VirtualImageConversions getConversionByNodeVirtualImage(final int id) { DAOFactory factory = HibernateDAOFactory.instance(); try { factory.beginConnection(); NodeVirtualImageHB node = factory.getNodeVirtualImageDAO().findById(id); factory.endConnection(); VirtualImageConversionsHB conversion = node.getVirtualMachineHB().getConversion(); if (conversion != null) { return conversion.toPojo(); } return null; } catch (PersistenceException e) { return null; } } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#getVirtualAppliance(java.lang.Integer) */ @Override public VirtualappHB getVirtualAppliance(final Integer virtualApplianceId) throws VirtualApplianceCommandException { DAOFactory factory = HibernateDAOFactory.instance(); try { factory.beginConnection(); VirtualApplianceDAO vappDAO = factory.getVirtualApplianceDAO(); VirtualappHB vapp = vappDAO.findByIdNamedExtended(virtualApplianceId); factory.endConnection(); return vapp; } catch (PersistenceException e) { throw new VirtualApplianceCommandException(e.getMessage(), e); } } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#beforeDeletingNode(org.hibernate.Session * , com.abiquo.abiserver.business.hibernate.pojohb.virtualappliance.NodeVirtualImageHB) */ @Override public void beforeDeletingNode(final Session session, final NodeVirtualImageHB nodeVi) { // Override to customize behavior } /* * (non-Javadoc) * @see * com.abiquo.abiserver.commands.VirtualApplianceCommand#afterCreatingNode(org.hibernate.Session * , com.abiquo.abiserver.pojo.virtualappliance.VirtualAppliance, * com.abiquo.abiserver.business.hibernate.pojohb.virtualappliance.NodeHB) */ @Override public void afterCreatingNode(final Session session, final VirtualAppliance virtualAppliance, final NodeHB newNode) { // Override to customize behavior } }