/** * 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.services.flex; import java.util.ArrayList; import java.util.List; import com.abiquo.abiserver.business.BusinessDelegateProxy; import com.abiquo.abiserver.commands.InfrastructureCommand; import com.abiquo.abiserver.commands.VirtualApplianceCommand; import com.abiquo.abiserver.commands.impl.InfrastructureCommandImpl; import com.abiquo.abiserver.commands.impl.VirtualApplianceCommandImpl; import com.abiquo.abiserver.commands.stub.APIStubFactory; import com.abiquo.abiserver.commands.stub.VirtualApplianceResourceStub; import com.abiquo.abiserver.commands.stub.VirtualMachineResourceStub; import com.abiquo.abiserver.commands.stub.impl.VirtualApplianceResourceStubImpl; import com.abiquo.abiserver.commands.stub.impl.VirtualMachineResourceStubImpl; import com.abiquo.abiserver.pojo.authentication.UserSession; import com.abiquo.abiserver.pojo.infrastructure.DataCenter; 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.virtualappliance.Node; import com.abiquo.abiserver.pojo.virtualappliance.TaskStatus; import com.abiquo.abiserver.pojo.virtualappliance.VirtualAppliance; import com.abiquo.server.core.cloud.VirtualMachineState; /** * This class defines a wide set of services that are considered "non-blocking services". * * @author Oliver */ public class NonBlockingService { /** * The commands related to this service */ InfrastructureCommand infrastructureCommand; VirtualApplianceCommand virtualAppCommand; protected VirtualApplianceResourceStub virtualApplianceResourceStub; protected VirtualMachineResourceStub vmResourceStub; /** * Constructor The implemention of the BasicCommand */ public NonBlockingService() { virtualApplianceResourceStub = new VirtualApplianceResourceStubImpl(); // to_delete vmResourceStub = new VirtualMachineResourceStubImpl(); try { infrastructureCommand = (InfrastructureCommand) Thread.currentThread().getContextClassLoader().loadClass( "com.abiquo.abiserver.commands.impl.InfrastructureCommandPremiumImpl") .newInstance(); } catch (Exception e) { infrastructureCommand = new InfrastructureCommandImpl(); } try { virtualAppCommand = (VirtualApplianceCommand) Thread.currentThread().getContextClassLoader().loadClass( "com.abiquo.abiserver.commands.impl.VirtualApplianceCommandPremiumImpl") .newInstance(); } catch (Exception e) { virtualAppCommand = new VirtualApplianceCommandImpl(); } } /* ______________________________ INFRASTRUCTURE _______________________________ */ /** * Retrieves an updated Infrastructre that belongs to a Datacenter * * @param session * @param dataCenter The Datacenter to return its infrastructure * @result a DataResult object, containing an ArrayList of InfrastructureElements with the last * state of the infrastructure for the given datacenter */ public BasicResult checkInfrastructureByDatacenter(final UserSession session, final DataCenter dataCenter) { InfrastructureCommand command = BusinessDelegateProxy.getInstance(session, infrastructureCommand, InfrastructureCommand.class); return command.getInfrastructureByDataCenter(dataCenter); } /** * @param session * @param virtualMachine * @return A DataResult object, containing the new State for the virtualMachine */ public BasicResult startVirtualMachine(final UserSession session, final Integer virtualApplianceId, final Integer virtualDatacenterId, final VirtualMachine virtualMachine) { return proxyVirtualMachineResourceStub(session).editVirtualMachineState( virtualDatacenterId, virtualApplianceId, virtualMachine, VirtualMachineState.ON); } /** * @param session * @param virtualMachine * @return A DataResult object, containing the new State for the virtualMachine */ public BasicResult startVirtualMachine(final UserSession session, final Integer datacenterId, final Integer rackId, final Integer machineId, final VirtualMachine virtualMachine) { return proxyVirtualMachineResourceStub(session).editInfrastructureVirtualMachineState( datacenterId, rackId, machineId, virtualMachine, VirtualMachineState.ON); } /** * @param session * @param virtualMachine * @return A DataResult object, containing the new State for the virtualMachine */ public BasicResult pauseVirtualMachine(final UserSession session, final Integer virtualApplianceId, final Integer virtualDatacenterId, final VirtualMachine virtualMachine) { return proxyVirtualMachineResourceStub(session).editVirtualMachineState( virtualDatacenterId, virtualApplianceId, virtualMachine, VirtualMachineState.PAUSED); } /** * @param session * @param virtualMachine * @return A DataResult object, containing the new State for the virtualMachine */ public BasicResult pauseVirtualMachine(final UserSession session, final Integer datacenterId, final Integer rackId, final Integer machineId, final VirtualMachine virtualMachine) { return proxyVirtualMachineResourceStub(session).editInfrastructureVirtualMachineState( datacenterId, rackId, machineId, virtualMachine, VirtualMachineState.PAUSED); } /** * @param session * @param virtualMachine * @return A DataResult object, containing the new State for the virtualMachine */ public BasicResult rebootVirtualMachine(final UserSession session, final Integer virtualApplianceId, final Integer virtualDatacenterId, final VirtualMachine virtualMachine) { return proxyVirtualMachineResourceStub(session).rebootVirtualMachine(virtualDatacenterId, virtualApplianceId, virtualMachine); } /** * @param session * @param virtualMachine * @return A DataResult object, containing the new State for the virtualMachine */ public BasicResult rebootVirtualMachine(final UserSession session, final Integer datacenterId, final Integer rackId, final Integer machineId, final VirtualMachine virtualMachine) { return proxyVirtualMachineResourceStub(session).rebootInfrastructureVirtualMachine( datacenterId, rackId, machineId, virtualMachine); } /** * @param session * @param virtualMachine * @return A DataResult object, containing the new State for the virtualMachine */ public BasicResult shutdownVirtualMachine(final UserSession session, final Integer virtualApplianceId, final Integer virtualDatacenterId, final VirtualMachine virtualMachine) { return proxyVirtualMachineResourceStub(session).editVirtualMachineState( virtualDatacenterId, virtualApplianceId, virtualMachine, VirtualMachineState.OFF); } /** * @param session * @param virtualMachine * @return A DataResult object, containing the new State for the virtualMachine */ public BasicResult shutdownVirtualMachine(final UserSession session, final Integer datacenterId, final Integer rackId, final Integer machineId, final VirtualMachine virtualMachine) { return proxyVirtualMachineResourceStub(session).editInfrastructureVirtualMachineState( datacenterId, rackId, machineId, virtualMachine, VirtualMachineState.OFF); } /* ______________________________ VIRTUAL APPLIANCE _______________________________ */ /** * Performs a "Start" action in the Virtual Machine * * @param session * @param virtualAppliance * @param force, indicating if the virtual appliance should be started even when the soft limit * is exceeded. if false and the soft limit is reached the BasicResult result code is * set to SOFT_LIMT_EXCEEDED. * @return a DataResult object, with a com.abiquo.abiserver.pojo.infrastructure.State object * that represents the state "Running" */ public BasicResult startVirtualAppliance(final UserSession session, final VirtualAppliance virtualAppliance, final Boolean force) { return deployVirtualAppliance(session, virtualAppliance, force); } /** * @param session * @param virtualAppliance * @return BasicResult */ public DataResult deployVirtualAppliance(final UserSession session, final VirtualAppliance virtualAppliance, final Boolean force) { return proxyVirtualApplianceResourceStub(session).deployVirtualAppliance( virtualAppliance.getVirtualDataCenter().getId(), virtualAppliance.getId(), force); } /** * Performs a "Shutdown" action in the Virtual Machine * * @param session * @param virtualAppliance * @return a DataResult object, with a com.abiquo.abiserver.pojo.infrastructure.State object * that represents the state "Powered Off" */ public BasicResult shutdownVirtualAppliance(final UserSession session, final VirtualAppliance virtualAppliance) { return proxyVirtualApplianceResourceStub(session).undeployVirtualAppliance( virtualAppliance.getVirtualDataCenter().getId(), virtualAppliance.getId(), true); } /** * Applies the VirtualAppliance changes in the virtual factory * * @param session * @param virtualAppliance * @return a BasicResult object, containing success = true if the changes were applied * successfully */ public DataResult<VirtualAppliance> applyChangesVirtualAppliance(final UserSession session, final VirtualAppliance virtualAppliance, final Boolean force) { VirtualApplianceResourceStub resourceStub = this.proxyVirtualApplianceResourceStub(session); return resourceStub.applyChangesVirtualAppliance(virtualAppliance, session, force); } /** * Deletes a VirtualAppliance that exists in the Data Base * * @param session * @param virtualAppliance * @return a BasicResult object, containing success = true if the deletion was successful */ public BasicResult deleteVirtualAppliance(final UserSession session, final VirtualAppliance virtualAppliance) { return proxyVirtualApplianceResourceStub(session).deleteVirtualAppliance(virtualAppliance, false); } /** * Retrieves a VirtualAppliance, with the current values in DataBase. Since a client can have an * old version of a VirtualAppliance, this service is useful to get the updated state of a * Virtual Appliance * * @param session * @param virtualAppliance The VirtualAppliance to check. * @return a DataResult<VirtualAppliance> object with the last updated values in DataBase The * returned VirtualAppliance will contain its list of noded */ public BasicResult checkVirtualAppliance(final UserSession session, final VirtualAppliance virtualAppliance) { return proxyVirtualApplianceResourceStub(session).getVirtualApplianceNodes( virtualAppliance.getVirtualDataCenter().getId(), virtualAppliance.getId(), "checkVirtualAppliance"); } /** * Bundles the virtual images associated to the specified nodes of a virtual appliance. * * @param session * @param virtualAppliance The VirtualAppliance to bundle. * @param nodes Selected nodes to bundle. * @param updateNodes True if the nodes must be updated with the bundled images. * @return A DataResult<VirtualAppliance> object with the last updated values in database. */ public BasicResult bundleVirtualAppliance(final UserSession session, final VirtualAppliance virtualAppliance, final ArrayList<Node> nodes, final Boolean updateNodes) { return proxyVirtualApplianceResourceStub(session).instanceVirtualApplianceNodes( virtualAppliance.getVirtualDataCenter().getId(), virtualAppliance.getId(), nodes); } protected VirtualApplianceResourceStub proxyVirtualApplianceResourceStub( final UserSession userSession) { return APIStubFactory.getInstance(userSession, virtualApplianceResourceStub, VirtualApplianceResourceStub.class); } protected VirtualMachineResourceStub proxyVirtualMachineResourceStub( final UserSession userSession) { return APIStubFactory.getInstance(userSession, vmResourceStub, VirtualMachineResourceStub.class); } /** * @param session * @param virtualAppliance * @return BasicResult */ public DataResult undeployVirtualAppliance(final UserSession session, final VirtualAppliance virtualAppliance) { return proxyVirtualApplianceResourceStub(session).undeployVirtualAppliance( virtualAppliance.getVirtualDataCenter().getId(), virtualAppliance.getId(), Boolean.FALSE); } /** * @param session * @param virtualAppliance * @return BasicResult */ public DataResult<List<TaskStatus>> updateTask(final UserSession session, final TaskStatus task) { return proxyVirtualApplianceResourceStub(session).updateTask(task); } }