2008-06-17 20:27:32 +04:00
/* -------------------------------------------------------------------------- */
2014-01-09 14:51:20 +04:00
/* Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs */
2008-06-17 20:27:32 +04:00
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); you may */
/* not use this file except in compliance with the License. You may obtain */
/* a copy of the License at */
/* */
/* http://www.apache.org/licenses/LICENSE-2.0 */
/* */
/* Unless required by applicable law or agreed to in writing, software */
/* distributed under the License is distributed on an "AS IS" BASIS, */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
/* See the License for the specific language governing permissions and */
/* limitations under the License. */
/* -------------------------------------------------------------------------- */
# ifndef DISPATCH_MANAGER_H_
# define DISPATCH_MANAGER_H_
# include "ActionManager.h"
# include "HostPool.h"
# include "VirtualMachinePool.h"
using namespace std ;
extern " C " void * dm_action_loop ( void * arg ) ;
class DispatchManager : public ActionListener
{
public :
DispatchManager (
VirtualMachinePool * _vmpool ,
HostPool * _hpool ) :
hpool ( _hpool ) ,
vmpool ( _vmpool )
{
am . addListener ( this ) ;
} ;
~ DispatchManager ( )
{ }
;
enum Actions
{
2010-12-31 19:48:50 +03:00
SUSPEND_SUCCESS , /**< Send by LCM when a VM is suspended*/
STOP_SUCCESS , /**< Send by LCM when a VM is stopped*/
2013-04-02 19:01:22 +04:00
UNDEPLOY_SUCCESS , /**< Send by LCM when a VM is undeployed and saved*/
2012-09-04 20:30:53 +04:00
POWEROFF_SUCCESS , /**< Send by LCM when a VM is powered off */
2010-12-31 19:48:50 +03:00
DONE , /**< Send by LCM when a VM is shut down*/
FAILED , /**< Send by LCM when one of the execution steps fails*/
RESUBMIT , /**< Send by LCM when a VM is ready for resubmission*/
2008-06-17 20:27:32 +04:00
FINALIZE
} ;
/**
* Triggers specific actions to the Dispatch Manager . This function
* wraps the ActionManager trigger function .
* @ param action the DM action
2010-07-14 20:11:29 +04:00
* @ param vid VM unique id . This is the argument of the passed to the
2008-06-17 20:27:32 +04:00
* invoked action .
*/
void trigger (
Actions action ,
int _vid ) ;
/**
2010-07-14 20:11:29 +04:00
* This functions creates a new thread for the Dispatch Manager . This
2008-06-17 20:27:32 +04:00
* thread will wait in an action loop till it receives ACTION_FINALIZE .
* @ return 0 on success .
*/
int start ( ) ;
2010-07-14 20:11:29 +04:00
2008-06-17 20:27:32 +04:00
/**
* Gets the thread identification .
* @ return pthread_t for the manager thread ( that in the action loop ) .
*/
pthread_t get_thread_id ( ) const
{
return dm_thread ;
} ;
//--------------------------------------------------------------------------
// DM Actions, the RM and the Scheduler will invoke this methods
//--------------------------------------------------------------------------
/**
* Deploys a VM . A new history record MUST be added before calling this
* function . Also the VM MUST have its mutex locked . If the function fails
* the calling funtion is responsible for recovering from the error .
* @ param vm pointer to a VirtualMachine with its mutex locked .
2010-07-14 20:11:29 +04:00
* @ return 0 on success
2008-06-17 20:27:32 +04:00
*/
int deploy (
VirtualMachine * vm ) ;
2015-02-06 00:49:33 +03:00
/**
* Sets an imported VM to RUNNING state , a history record MUST be added ,
* and the VM MUST be locked .
* @ param vm pointer to a VirtualMachine with its mutex locked .
* @ return 0 on success
*/
int import (
VirtualMachine * vm ) ;
2008-06-17 20:27:32 +04:00
/**
2010-07-14 20:11:29 +04:00
* Migrates a VM . The following actions must be performed before calling
* this function :
2008-06-17 20:27:32 +04:00
* - Lock the VM mutex .
* - Update the History statistics of the current host .
2010-07-14 20:11:29 +04:00
* - Add a new History record with the new host .
* If the function fails the calling funtion is responsible for recovering
2008-06-17 20:27:32 +04:00
* from the error .
* @ param vm pointer to a VirtualMachine with its mutex locked .
2010-07-14 20:11:29 +04:00
* @ return 0 on success
2008-06-17 20:27:32 +04:00
*/
int migrate (
VirtualMachine * vm ) ;
/**
2010-07-14 20:11:29 +04:00
* Migrates a VM . The following actions must be performed before calling
* this function :
2008-06-17 20:27:32 +04:00
* - Lock the VM mutex .
* - Update the History statistics of the current host .
2010-07-14 20:11:29 +04:00
* - Add a new History record with the new host .
* If the function fails the calling funtion is responsible for recovering
2008-06-17 20:27:32 +04:00
* from the error .
* @ param vm pointer to a VirtualMachine with its mutex locked .
2010-07-14 20:11:29 +04:00
* @ return 0 on success
2008-06-17 20:27:32 +04:00
*/
int live_migrate (
VirtualMachine * vm ) ;
2010-07-14 20:11:29 +04:00
2008-06-17 20:27:32 +04:00
/**
* Shuts down a VM .
* @ param vid VirtualMachine identification
2010-07-14 20:11:29 +04:00
* @ return 0 on success , - 1 if the VM does not exits or - 2 if the VM is
* in a wrong a state
*/
2008-06-17 20:27:32 +04:00
int shutdown (
int vid ) ;
2013-03-27 21:15:53 +04:00
/**
* Shuts down a VM , but it is saved in the system DS instead of destroyed .
* @ param vid VirtualMachine identification
* @ param hard True to force the shutdown ( cancel instead of shutdown )
* @ return 0 on success , - 1 if the VM does not exits or - 2 if the VM is
* in a wrong a state
*/
2013-04-02 19:01:22 +04:00
int undeploy (
2013-03-27 21:15:53 +04:00
int vid ,
bool hard ) ;
2012-09-04 20:30:53 +04:00
/**
* Powers off a VM .
* @ param vid VirtualMachine identification
2013-03-27 16:48:06 +04:00
* @ param hard True to force the poweroff ( cancel instead of shutdown )
2012-09-04 20:30:53 +04:00
* @ return 0 on success , - 1 if the VM does not exits or - 2 if the VM is
* in a wrong a state
*/
int poweroff (
2013-03-27 16:48:06 +04:00
int vid ,
bool hard ) ;
2012-09-04 20:30:53 +04:00
2008-06-17 20:27:32 +04:00
/**
* Holds a VM .
* @ param vid VirtualMachine identification
2010-07-14 20:11:29 +04:00
* @ return 0 on success , - 1 if the VM does not exits or - 2 if the VM is
* in a wrong a state
*/
2008-06-17 20:27:32 +04:00
int hold (
int vid ) ;
/**
* Releases a VM .
* @ param vid VirtualMachine identification
2010-07-14 20:11:29 +04:00
* @ return 0 on success , - 1 if the VM does not exits or - 2 if the VM is
* in a wrong a state
*/
2008-06-17 20:27:32 +04:00
int release (
int vid ) ;
/**
* Stops a VM .
* @ param vid VirtualMachine identification
2010-07-14 20:11:29 +04:00
* @ return 0 on success , - 1 if the VM does not exits or - 2 if the VM is
* in a wrong a state
*/
2008-06-17 20:27:32 +04:00
int stop (
int vid ) ;
2008-09-08 14:57:52 +04:00
/**
* Cancels a VM .
* @ param vid VirtualMachine identification
2010-07-14 20:11:29 +04:00
* @ return 0 on success , - 1 if the VM does not exits or - 2 if the VM is
* in a wrong a state
*/
2008-09-08 14:57:52 +04:00
int cancel (
int vid ) ;
2008-06-17 20:27:32 +04:00
/**
* Suspends a VM .
* @ param vid VirtualMachine identification
2010-07-14 20:11:29 +04:00
* @ return 0 on success , - 1 if the VM does not exits or - 2 if the VM is
* in a wrong a state
*/
2008-06-17 20:27:32 +04:00
int suspend (
int vid ) ;
/**
* Resumes a VM .
* @ param vid VirtualMachine identification
2010-07-14 20:11:29 +04:00
* @ return 0 on success , - 1 if the VM does not exits or - 2 if the VM is
* in a wrong a state
*/
2008-06-17 20:27:32 +04:00
int resume (
int vid ) ;
2010-07-14 20:11:29 +04:00
2009-07-09 18:34:34 +04:00
/**
* Restart a previusly deployed VM .
* @ param vid VirtualMachine identification
2010-07-14 20:11:29 +04:00
* @ return 0 on success , - 1 if the VM does not exits or - 2 if the VM is
* in a wrong a state
*/
2009-07-09 18:34:34 +04:00
int restart (
int vid ) ;
2008-06-17 20:27:32 +04:00
/**
* Ends a VM life cycle inside ONE .
* @ param vid VirtualMachine identification
2010-07-14 20:11:29 +04:00
* @ return 0 on success , - 1 if the VM does not exits or - 2 if the VM is
* in a wrong a state
*/
2008-06-17 20:27:32 +04:00
int finalize (
int vid ) ;
2010-12-31 19:48:50 +03:00
/**
* Moves a VM to PENDING state preserving any resource ( i . e . leases ) and id
* @ param vid VirtualMachine identification
* @ return 0 on success , - 1 if the VM does not exits or - 2 if the VM is
* in a wrong a state
*/
int resubmit (
int vid ) ;
2011-12-26 02:46:19 +04:00
/**
* Reboots a VM preserving any resource and RUNNING state
* @ param vid VirtualMachine identification
* @ return 0 on success , - 1 if the VM does not exits or - 2 if the VM is
* in a wrong a state
*/
int reboot (
int vid ) ;
2012-05-09 00:33:59 +04:00
/**
* Resets a VM preserving any resource and RUNNING state
* @ param vid VirtualMachine identification
* @ return 0 on success , - 1 if the VM does not exits or - 2 if the VM is
* in a wrong a state
*/
int reset (
int vid ) ;
2012-04-26 21:06:49 +04:00
/**
* Set the re - scheduling flag for the VM ( must be in RUNNING state )
* @ param vid VirtualMachine identification
* @ param do_resched set or unset the flag
2012-06-15 14:28:20 +04:00
*
2012-04-26 21:06:49 +04:00
* @ return 0 on success , - 1 if the VM does not exits or - 2 if the VM is
* in a wrong a state
*/
int resched (
int vid ,
bool do_resched ) ;
2012-06-13 20:47:04 +04:00
/**
2012-06-15 14:28:20 +04:00
* Starts the attach disk action .
* @ param vid VirtualMachine identification
* @ param tmpl Template containing the new DISK attribute .
* @ param error_str Error reason , if any
2012-06-13 20:47:04 +04:00
*
2012-06-15 14:28:20 +04:00
* @ return 0 on success , - 1 otherwise
2012-06-13 20:47:04 +04:00
*/
2012-06-15 18:28:30 +04:00
int attach (
2013-03-06 18:59:58 +04:00
int vid ,
VirtualMachineTemplate * tmpl ,
2012-06-15 18:28:30 +04:00
string & error_str ) ;
2012-06-13 20:47:04 +04:00
2012-06-14 19:45:41 +04:00
/**
* Starts the detach disk action .
2012-06-15 18:28:30 +04:00
* @ param vid VirtualMachine identification
* @ param disk_id Disk to detach
* @ param error_str Error reason , if any
2012-06-14 19:45:41 +04:00
*
2012-06-15 18:28:30 +04:00
* @ return 0 on success , - 1 otherwise
2012-06-14 19:45:41 +04:00
*/
int detach (
2012-06-15 18:28:30 +04:00
int id ,
int disk_id ,
string & error_str ) ;
2012-06-14 19:45:41 +04:00
2012-12-12 21:31:27 +04:00
/**
* Starts the attach NIC action .
* @ param vid VirtualMachine identification
* @ param tmpl Template containing the new NIC attribute .
* @ param error_str Error reason , if any
*
* @ return 0 on success , - 1 otherwise
*/
int attach_nic (
int vid ,
VirtualMachineTemplate * tmpl ,
string & error_str ) ;
/**
* Starts the detach NIC action .
* @ param vid VirtualMachine identification
* @ param nic_id NIC to detach
* @ param error_str Error reason , if any
*
* @ return 0 on success , - 1 otherwise
*/
int detach_nic (
int id ,
int nic_id ,
string & error_str ) ;
2013-02-19 18:21:33 +04:00
/**
* Starts the snapshot create action
*
* @ param vid VirtualMachine identification
* @ param name Name for the new snapshot
2013-02-20 21:11:58 +04:00
* @ param snap_id Will contain the new snapshot ID
2013-02-19 18:21:33 +04:00
* @ param error_str Error reason , if any
*
* @ return 0 on success , - 1 otherwise
*/
int snapshot_create (
int vid ,
string & name ,
2013-02-20 21:11:58 +04:00
int & snap_id ,
2013-02-19 18:21:33 +04:00
string & error_str ) ;
2013-02-20 19:04:09 +04:00
/**
* Starts the snapshot revert action
*
* @ param vid VirtualMachine identification
* @ param snap_id Snapshot to be restored
* @ param error_str Error reason , if any
*
* @ return 0 on success , - 1 otherwise
*/
int snapshot_revert (
int vid ,
int snap_id ,
string & error_str ) ;
2013-02-21 18:01:48 +04:00
/**
* Starts the snapshot delete action
*
* @ param vid VirtualMachine identification
* @ param snap_id Snapshot to be deleted
* @ param error_str Error reason , if any
*
* @ return 0 on success , - 1 otherwise
*/
int snapshot_delete (
int vid ,
int snap_id ,
string & error_str ) ;
2012-12-12 21:31:27 +04:00
2008-06-17 20:27:32 +04:00
private :
/**
* Thread id for the Dispatch Manager
*/
pthread_t dm_thread ;
/**
* Pointer to the Host Pool , to access hosts
*/
HostPool * hpool ;
/**
2008-11-13 19:21:17 +03:00
* Pointer to the Virtual Machine Pool , to access hosts
2008-06-17 20:27:32 +04:00
*/
VirtualMachinePool * vmpool ;
/**
* Action engine for the Manager
*/
ActionManager am ;
/**
2010-07-14 20:11:29 +04:00
* Function to execute the Manager action loop method within a new pthread
2008-06-17 20:27:32 +04:00
* ( requires C linkage )
*/
friend void * dm_action_loop ( void * arg ) ;
/**
* The action function executed when an action is triggered .
* @ param action the name of the action
* @ param arg arguments for the action function
*/
void do_action (
const string & action ,
void * arg ) ;
2012-06-27 20:50:19 +04:00
/**
* Called from finalize ( ) . Releases the images and networks acquired by this
* vm , and unlocks it .
* @ param vm the VM
*/
void finalize_cleanup ( VirtualMachine * vm ) ;
2008-06-17 20:27:32 +04:00
//--------------------------------------------------------------------------
// DM Actions associated with a VM state transition
//--------------------------------------------------------------------------
2010-07-14 20:11:29 +04:00
2008-06-17 20:27:32 +04:00
void suspend_success_action ( int vid ) ;
void stop_success_action ( int vid ) ;
2013-04-02 19:01:22 +04:00
void undeploy_success_action ( int vid ) ;
2013-03-27 21:15:53 +04:00
2012-09-04 20:30:53 +04:00
void poweroff_success_action ( int vid ) ;
2008-06-17 20:27:32 +04:00
void done_action ( int vid ) ;
2010-07-14 20:11:29 +04:00
void failed_action ( int vid ) ;
2010-12-31 19:48:50 +03:00
void resubmit_action ( int vid ) ;
2008-06-17 20:27:32 +04:00
} ;
# endif /*DISPATCH_MANAGER_H*/