/**
* 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;
import java.util.ArrayList;
import java.util.Collection;
import org.hibernate.Session;
import com.abiquo.abiserver.business.hibernate.pojohb.infrastructure.StateEnum;
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.VirtualappHB;
import com.abiquo.abiserver.business.hibernate.pojohb.virtualappliance.VirtualmachineHB;
import com.abiquo.abiserver.business.hibernate.pojohb.virtualimage.VirtualimageHB;
import com.abiquo.abiserver.exception.PersistenceException;
import com.abiquo.abiserver.exception.VirtualApplianceCommandException;
import com.abiquo.abiserver.pojo.authentication.UserSession;
import com.abiquo.abiserver.pojo.infrastructure.DataCenter;
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.VirtualAppliance;
import com.abiquo.abiserver.pojo.virtualappliance.VirtualDataCenter;
import com.abiquo.abiserver.pojo.virtualappliance.VirtualDatacentersListResult;
import com.abiquo.abiserver.pojo.virtualimage.VirtualImageConversions;
public interface VirtualApplianceCommand
{
/**
* 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 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 abstract DataResult<VirtualAppliance> checkVirtualAppliance(
final VirtualAppliance virtualAppliance);
/**
* Creates a new Virtual Appliance, that belongs to the user who called this method
*
* @param userSession the user connected.
* @param virtualAppliance object
* @return A DataResult object containing the VirtualAppliance created in the Data Base
*/
public abstract DataResult<VirtualAppliance> createVirtualAppliance(
final UserSession userSession, VirtualAppliance virtualAppliance);
/**
* Creates a new VirtualDataCenter in the Data Base
*
* @param userSession The UserSession with the user that called this method
* @param virtualDataCenter The VirtualDataCenter that will be created in Data Base
* @return a DataResult object containing the VirtualDataCenter that has been created
*/
public abstract DataResult<VirtualDataCenter> createVirtualDataCenter(
final UserSession userSession, final VirtualDataCenter virtualDataCenter,
final String networkName, final NetworkConfigurationHB configuration);
/**
* Deletes a VirtualDataCenter from the DataBase. A VirtualDataCenter can only be deleted if any
* of its Virtual Appliances are powered on
*
* @param virtualDataCenter The VirtualDataCenter to be deleted
* @return A BasicResult object with the success of the deletion. BasicResult.success = false
* will be returned if the VirtualDataCenter has any assigned VirtualAppliance powered
* on
*/
public abstract BasicResult deleteVirtualDataCenter(final UserSession userSession,
final VirtualDataCenter virtualDataCenter);
/**
* Updates an existing VirtualDataCenter with new information
*
* @param userSession The UserSession with the user that called this method
* @param virtualDataCenter The VirtualDataCenter that will be updated
* @return a BasicResult object, with the success of the edition
*/
public abstract BasicResult editVirtualDataCenter(final UserSession userSession,
final VirtualDataCenter virtualDataCenter);
/**
* Given a VirtualAppliance, retrieves its node list.
*
* @param virtualAppliance The VirtualAppliance to retrieve the nodes.
* @return a DataResult<ArrayList<Node>> object, containing the virtualAppliance's Nodes.
*/
public abstract DataResult<Collection<Node>> getVirtualApplianceNodes(
final VirtualAppliance virtualAppliance);
/**
* Retrieves a list of Virtual Appliances that belong to the same Enterprise The
* VirtualAppliance retrieved will not contain their Node list, for performance purposes It will
* also return those Virtual Appliance marked as public
*
* @param enterprise The Enterprise to retrieve the VirtualAppliance list
* @return a DataResult<ArrayList<VirtualAppliance>> object with the VirtualAppliance that
* belong to the given enterprise.
*/
public abstract DataResult<Collection<VirtualAppliance>> getVirtualAppliancesByEnterprise(
UserSession userSession, final Enterprise enterprise);
public abstract DataResult<Collection<VirtualAppliance>> getVirtualAppliancesByEnterpriseAndDatacenter(
UserSession userSession, final Enterprise enterprise, final DataCenter datacenter);
public DataResult<VirtualDatacentersListResult> getVirtualDataCentersByEnterprise(
final UserSession userSession, final Enterprise enterprise, final ListRequest listRequest);
public abstract DataResult<Collection<VirtualDataCenter>> getVirtualDataCentersByEnterpriseFaster(
UserSession userSession, final Enterprise enterprise);
public abstract boolean blockVirtualAppliance(final VirtualAppliance virtualAppliance,
final StateEnum subState) throws PersistenceException;
// public abstract DataResult<VirtualAppliance> traceErrorStartingVirtualAppliance(
// VirtualAppliance vApp, final State state, final State subState, final UserHB userHB,
// final ComponentType componentType, final String message, final String reportErrorKey,
// final boolean mustRecoverResources, final int... resultCode);
/**
* Performs a "Start" action in the Virtual Machine. It the hard resource allocation limit is
* exceeded the BasicResult result code is set to HARD_LIMT_EXCEEDED.
*
* @param virtualAppliance virtualApp to start
* @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.
* @param sourceState The state of the virtual appliance before to be started.
* @param sourceSubState The sub state of the virtual appliance before to be started.
* @return a DataResult object, with a VirtualAppliance object with all its virtual machines
* created
*/
// public abstract DataResult<VirtualAppliance> startVirtualAppliance(final int idUser,
// VirtualAppliance virtualAppliance, final State sourceState, final State sourceSubState,
// final Boolean force);
/**
* Used to perform last environment configurations before calling the Virtual Factory.
*
* @param virtualAppliance The Virtual Appliance being deployed.
* @throws Exception If an error occurs.
*/
public abstract void beforeCallingVirtualFactory(final VirtualAppliance virtualAppliance)
throws Exception;
/**
* Private helper to create an empty virtual machine used for pre-instantiating a virtual
* machine
*
* @param nodeVIPojo the virtual image to attach the empty virtual machine
* @param owner the virtual machine's owner
* @return the virtual machine
*/
public abstract VirtualmachineHB createEmptyVirtualMachine(final NodeVirtualImageHB nodeVIPojo,
final UserHB owner);
public abstract VirtualimageHB prepareVirtualImage(final VirtualimageHB virtualImage,
final VirtualmachineHB virtualMachine);
/**
* Private helper to update the state in the Database
*
* @param virtualappliance
* @param newState the new state to update
* @return a basic Result with the operation result
*/
public abstract DataResult<VirtualAppliance> updateStateInDB(VirtualAppliance virtualappliance,
final StateEnum newState);
/**
* Private helper to update the state in the Database
*
* @param virtualappliance
* @param newState the new state to update
* @return a basic Result with the operation result
*/
public abstract DataResult<VirtualAppliance> updateOnlyStateInDB(
VirtualAppliance virtualappliance, final StateEnum newState);
/**
* This method deletes the existing rasd of a node
*
* @param session the session to mantain the transaction
* @param node the objecte to delete the rasd
*/
public abstract void deleteRasdFromNode(final Session session, final NodeVirtualImageHB node);
/**
* This method deletes the existing rasd of a node.
*
* @param node the objecte to delete the rasd
*/
public abstract void deleteRasdFromNode(final NodeVirtualImageHB node);
public abstract VirtualImageConversions getConversionByNodeVirtualImage(final int id);
/**
* Retrives a virtual appliance based on its id.
*
* @param virtualApplianceId identifier of the virtual appliance
* @return a {@link VirtualAppliance} object
* @throws VirtualApplianceCommandException if can not retrieve for persitence errors
*/
public abstract VirtualappHB getVirtualAppliance(final Integer virtualApplianceId)
throws VirtualApplianceCommandException;
/**
* Called before deleting a node to customize deletion behavior.
*
* @param session The Hibernate session.
* @param nodeVi The node being deleted.
*/
public abstract void beforeDeletingNode(final Session session, final NodeVirtualImageHB nodeVi);
/**
* Called after creating a new node to customize creation behavior.
*
* @param session The Hibernate session.
* @param virtualAppliance The Virtual Appliance being edited.
* @param newNode The node being created.
*/
public abstract void afterCreatingNode(final Session session,
final VirtualAppliance virtualAppliance, final NodeHB newNode);
}