2008-06-17 20:27:32 +04:00
/* -------------------------------------------------------------------------- */
2020-04-30 16:00:02 +03:00
/* Copyright 2002-2020, OpenNebula Project, OpenNebula Systems */
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 VIRTUAL_MACHINE_MANAGER_DRIVER_H_
# define VIRTUAL_MACHINE_MANAGER_DRIVER_H_
# include <map>
# include <string>
# include <sstream>
2020-06-29 13:14:00 +03:00
# include "ProtocolMessages.h"
# include "Driver.h"
2016-02-09 18:33:13 +03:00
# include "ActionSet.h"
2019-09-09 14:13:52 +03:00
# include "VMActions.h"
2019-09-30 11:01:23 +03:00
# include "Host.h"
# include "Cluster.h"
2020-06-29 13:14:00 +03:00
# include "VirtualMachine.h"
2008-06-17 20:27:32 +04:00
/**
* VirtualMachineManagerDriver provides a base class to implement VM Manager
* Drivers . This class implements the protocol and recover functions
* from the Mad interface . Classes derived from the VirtualMachineManagerDriver
2013-01-21 03:15:46 +04:00
* must implement the deployment function to generate specific VM
2008-06-17 20:27:32 +04:00
* deployment information for the unerlying MAD .
*/
2020-06-29 13:14:00 +03:00
class VirtualMachineManagerDriver : public Driver < vm_msg_t >
2008-06-17 20:27:32 +04:00
{
public :
2020-06-29 13:14:00 +03:00
VirtualMachineManagerDriver ( const std : : string & mad_location ,
const std : : map < std : : string , std : : string > & attrs ) ;
2008-06-17 20:27:32 +04:00
2019-09-30 11:01:23 +03:00
virtual ~ VirtualMachineManagerDriver ( ) = default ;
2008-06-17 20:27:32 +04:00
/**
* Generates a driver - specific deployment file :
* @ param vm pointer to a virtual machine
* @ param file_name to generate the deployment description
* @ return 0 on success
*/
virtual int deployment_description (
const VirtualMachine * vm ,
2020-06-29 13:14:00 +03:00
const std : : string & file_name ) const = 0 ;
2013-01-21 03:15:46 +04:00
2020-05-18 03:23:29 +03:00
/**
* Validates de VM raws section
* @ param raw_section raw section of the VM .
* @ param error description on error
* @ return 0 on success
*/
2020-06-29 13:14:00 +03:00
virtual int validate_raw ( const std : : string & raw , std : : string & error ) const
2020-05-18 03:23:29 +03:00
{
return 0 ;
}
2015-11-20 17:44:37 +03:00
/**
* Check if action is supported for imported VMs
* @ param action
* @ return True if it is supported
*/
2019-09-09 14:13:52 +03:00
bool is_imported_action_supported ( VMActions : : Action action ) const
2015-11-20 17:44:37 +03:00
{
2016-02-09 18:33:13 +03:00
return imported_actions . is_set ( action ) ;
2015-11-20 17:44:37 +03:00
}
2016-05-18 20:48:43 +03:00
/**
* @ return true if system snapshots are preserved
*/
bool is_keep_snapshots ( ) const
{
return keep_snapshots ;
}
2019-01-31 19:27:55 +03:00
/**
* @ return true if datastore live migration
*/
bool is_ds_live_migration ( ) const
{
return ds_live_migration ;
}
2020-02-26 19:51:40 +03:00
/**
* @ return true if cold nic attach
*/
bool is_cold_nic_attach ( ) const
{
return cold_nic_attach ;
}
2013-01-21 03:15:46 +04:00
protected :
2008-07-05 19:46:29 +04:00
/**
2013-01-21 03:15:46 +04:00
* Gets a configuration attr from driver configuration file ( single
2008-07-05 19:46:29 +04:00
* version )
* @ param name of config attribute
* @ param value of the attribute
*/
2016-02-09 18:33:13 +03:00
template < typename T >
2020-06-29 13:14:00 +03:00
void get_default ( const std : : string & name , T & value ) const
2008-07-05 19:46:29 +04:00
{
2016-02-09 18:33:13 +03:00
driver_conf . get ( name , value ) ;
2013-01-21 03:15:46 +04:00
}
2008-06-17 20:27:32 +04:00
2008-07-05 19:46:29 +04:00
/**
2013-01-21 03:15:46 +04:00
* Gets a configuration attr from driver configuration file ( vector
2008-07-05 19:46:29 +04:00
* version )
* @ param name of config vector attribute for the domain
* @ param vname of the attribute
* @ param value of the attribute
*/
2016-02-09 18:33:13 +03:00
template < typename T >
int get_default ( const char * name , const char * vname , T & value ) const
{
const VectorAttribute * vattr = driver_conf . get ( name ) ;
2013-01-21 03:15:46 +04:00
2016-02-12 18:25:06 +03:00
if ( vattr = = 0 )
2016-02-09 18:33:13 +03:00
{
return - 1 ;
}
return vattr - > vector_value ( vname , value ) ;
}
2013-02-26 17:56:41 +04:00
2019-09-30 11:01:23 +03:00
/**
* Gets a configuration attribute ( single version )
* priority VM > host > cluster > config_file
* @ param vm pointer to Virtual Machine
* @ param host pointer to Host
* @ param cluster pointer Cluster
* @ param name of config attribute
* @ param value of the attribute
* @ return true if atribute was found , false otherwise
*/
template < typename T >
bool get_attribute ( const VirtualMachine * vm ,
const Host * host ,
const Cluster * cluster ,
2020-06-29 13:14:00 +03:00
const std : : string & name ,
2019-09-30 11:01:23 +03:00
T & value ) const
{
// Get value from VM
if ( vm & & vm - > get_template_attribute ( name , value ) )
{
return true ;
}
// Get value from host
if ( host & & host - > get_template_attribute ( name , value ) )
{
return true ;
}
// Get value from cluster
if ( cluster & & cluster - > get_template_attribute ( name , value ) )
{
return true ;
}
return driver_conf . get ( name , value ) ;
}
/**
* Gets a configuration attribute ( vector version )
* priority VM > host > cluster > config_file
* @ param vm pointer to Virtual Machine
* @ param host pointer to Host
* @ param cluster pointer Cluster
* @ param name of config vector attribute for the domain
* @ param vname of the attribute
* @ param value of the attribute
* @ return true if atribute was found , false otherwise
*/
template < typename T >
bool get_attribute ( const VirtualMachine * vm ,
const Host * host ,
const Cluster * cluster ,
2020-06-29 13:14:00 +03:00
const std : : string & name ,
const std : : string & vname ,
2019-09-30 11:01:23 +03:00
T & value ) const
{
const VectorAttribute * vattr ;
// Get value from VM
if ( vm )
{
vattr = vm - > get_template_attribute ( name ) ;
if ( vattr & & vattr - > vector_value ( vname , value ) = = 0 )
{
return true ;
}
}
// Get value from host
if ( host )
{
vattr = host - > get_template_attribute ( name ) ;
if ( vattr & & vattr - > vector_value ( vname , value ) = = 0 )
{
return true ;
}
}
// Get value from cluster
if ( cluster )
{
vattr = cluster - > get_template_attribute ( name ) ;
if ( vattr & & vattr - > vector_value ( vname , value ) = = 0 )
{
return true ;
}
}
vattr = driver_conf . get ( name ) ;
if ( vattr & & vattr - > vector_value ( vname , value ) = = 0 )
{
return true ;
}
return false ;
}
2013-01-21 03:15:46 +04:00
private :
2016-02-09 18:33:13 +03:00
friend class VirtualMachineManager ;
2020-06-29 13:14:00 +03:00
static const std : : string imported_actions_default ;
static const std : : string imported_actions_default_public ;
2016-02-09 18:33:13 +03:00
2015-07-01 22:15:40 +03:00
/**
* Configuration file for the driver
*/
Template driver_conf ;
2013-01-21 03:15:46 +04:00
2015-11-20 17:44:37 +03:00
/**
* List of available actions for imported VMs . Each bit is an action
* as defined in History . h , 1 = supported and 0 = not supported
*/
2019-09-09 14:13:52 +03:00
ActionSet < VMActions : : Action > imported_actions ;
2015-11-20 17:44:37 +03:00
2016-05-18 20:48:43 +03:00
/**
* Set to true if the hypervisor can keep system snapshots across
* create / delete cycles and live migrations .
*/
bool keep_snapshots ;
2019-01-31 19:27:55 +03:00
/**
* Set to true if live migration between datastores is allowed .
*/
bool ds_live_migration ;
2020-02-26 19:51:40 +03:00
/**
* Set to true if cold nic attach / detach calls ( pre , post , clean scripts )
*/
bool cold_nic_attach ;
2008-06-17 20:27:32 +04:00
/**
2011-11-10 14:15:58 +04:00
* Sends a deploy request to the MAD : " DEPLOY ID XML_DRV_MSG "
2008-06-17 20:27:32 +04:00
* @ param oid the virtual machine id .
2011-11-10 14:15:58 +04:00
* @ param drv_msg xml data for the mad operation
2008-06-17 20:27:32 +04:00
*/
2019-07-26 14:45:26 +03:00
void deploy (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2012-05-09 00:33:59 +04:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : DEPLOY , oid , drv_msg ) ;
2012-05-09 00:33:59 +04:00
}
2008-06-17 20:27:32 +04:00
/**
2011-11-10 14:15:58 +04:00
* Sends a shutdown request to the MAD : " SHUTDOWN ID XML_DRV_MSG "
2008-06-17 20:27:32 +04:00
* @ param oid the virtual machine id .
2011-11-10 14:15:58 +04:00
* @ param drv_msg xml data for the mad operation
2008-06-17 20:27:32 +04:00
*/
2019-07-26 14:45:26 +03:00
void shutdown (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2012-05-09 00:33:59 +04:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : SHUTDOWN , oid , drv_msg ) ;
2012-05-09 00:33:59 +04:00
}
/**
* Sends a reset request to the MAD : " RESET ID XML_DRV_MSG "
* @ param oid the virtual machine id .
* @ param drv_msg xml data for the mad operation
*/
2019-07-26 14:45:26 +03:00
void reset (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2012-05-09 00:33:59 +04:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : RESET , oid , drv_msg ) ;
2012-05-09 00:33:59 +04:00
}
2008-06-17 20:27:32 +04:00
2011-12-26 02:46:19 +04:00
/**
* Sends a reboot request to the MAD : " REBOOT ID XML_DRV_MSG "
* @ param oid the virtual machine id .
* @ param drv_msg xml data for the mad operation
*/
2019-07-26 14:45:26 +03:00
void reboot (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2012-05-09 00:33:59 +04:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : REBOOT , oid , drv_msg ) ;
2012-05-09 00:33:59 +04:00
}
2011-12-26 02:46:19 +04:00
2008-06-17 20:27:32 +04:00
/**
2011-11-10 14:15:58 +04:00
* Sends a cancel request to the MAD : " CANCEL ID XML_DRV_MSG "
2008-06-17 20:27:32 +04:00
* @ param oid the virtual machine id .
2011-11-10 14:15:58 +04:00
* @ param drv_msg xml data for the mad operation
2008-06-17 20:27:32 +04:00
*/
2019-07-26 14:45:26 +03:00
void cancel (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2012-05-09 00:33:59 +04:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : CANCEL , oid , drv_msg ) ;
2012-05-09 00:33:59 +04:00
}
2008-06-17 20:27:32 +04:00
2013-01-21 03:15:46 +04:00
/**
* Sends a cleanup request to the MAD : " CLEANUP ID XML_DRV_MSG "
* @ param oid the virtual machine id .
* @ param drv_msg xml data for the mad operation
*/
2019-07-26 14:45:26 +03:00
void cleanup (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2013-01-21 03:15:46 +04:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : CLEANUP , oid , drv_msg ) ;
2013-01-21 03:15:46 +04:00
}
2008-06-17 20:27:32 +04:00
/**
2011-11-10 14:15:58 +04:00
* Sends a checkpoint request to the MAD : " CHECKPOINT ID XML_DRV_MSG "
2008-06-17 20:27:32 +04:00
* @ param oid the virtual machine id .
2011-11-10 14:15:58 +04:00
* @ param drv_msg xml data for the mad operation
2008-06-17 20:27:32 +04:00
*/
2019-07-26 14:45:26 +03:00
void checkpoint (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2012-05-09 00:33:59 +04:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : CHECKPOINT , oid , drv_msg ) ;
2012-05-09 00:33:59 +04:00
}
2008-06-17 20:27:32 +04:00
/**
2011-11-10 14:15:58 +04:00
* Sends a save request to the MAD : " SAVE ID XML_DRV_MSG "
2008-06-17 20:27:32 +04:00
* @ param oid the virtual machine id .
2011-11-10 14:15:58 +04:00
* @ param drv_msg xml data for the mad operation
2008-06-17 20:27:32 +04:00
*/
2019-07-26 14:45:26 +03:00
void save (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2012-05-09 00:33:59 +04:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : SAVE , oid , drv_msg ) ;
2012-05-09 00:33:59 +04:00
}
2008-06-17 20:27:32 +04:00
/**
2020-06-29 13:14:00 +03:00
* Sends a save request to the MAD : " SAVE ID XML_DRV_MSG "
2008-06-17 20:27:32 +04:00
* @ param oid the virtual machine id .
*/
2020-06-29 13:14:00 +03:00
void driver_cancel ( const int oid ) const
2012-05-09 00:33:59 +04:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : DRIVER_CANCEL , oid , " " ) ;
2012-05-09 00:33:59 +04:00
}
2008-06-17 20:27:32 +04:00
/**
2020-06-29 13:14:00 +03:00
* Sends a save request to the MAD : " RESTORE ID XML_DRV_MSG "
2008-06-17 20:27:32 +04:00
* @ param oid the virtual machine id .
2011-11-10 14:15:58 +04:00
* @ param drv_msg xml data for the mad operation
2008-06-17 20:27:32 +04:00
*/
2020-06-29 13:14:00 +03:00
void restore (
const int oid ,
const std : : string & drv_msg ) const
2012-05-09 00:33:59 +04:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : RESTORE , oid , drv_msg ) ;
2012-05-09 00:33:59 +04:00
}
2008-06-17 20:27:32 +04:00
2020-06-29 13:14:00 +03:00
2008-06-17 20:27:32 +04:00
/**
2020-06-29 13:14:00 +03:00
* Sends a migrate request to the MAD : " MIGRATE ID XML_DRV_MSG "
2008-06-17 20:27:32 +04:00
* @ param oid the virtual machine id .
2011-11-10 14:15:58 +04:00
* @ param drv_msg xml data for the mad operation
2008-06-17 20:27:32 +04:00
*/
2020-06-29 13:14:00 +03:00
void migrate (
const int oid ,
const std : : string & drv_msg ) const
2012-05-09 00:33:59 +04:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : MIGRATE , oid , drv_msg ) ;
2012-05-09 00:33:59 +04:00
}
2012-06-13 20:42:42 +04:00
/**
2012-12-12 21:31:27 +04:00
* Sends an attach request to the MAD : " ATTACHDISK ID XML_DRV_MSG "
2012-06-13 20:42:42 +04:00
* @ param oid the virtual machine id .
* @ param drv_msg xml data for the mad operation
*/
2019-07-26 14:45:26 +03:00
void attach (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2012-06-13 20:42:42 +04:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : ATTACHDISK , oid , drv_msg ) ;
2012-06-13 20:42:42 +04:00
}
2012-06-14 19:45:41 +04:00
/**
2012-12-12 21:31:27 +04:00
* Sends a detach request to the MAD : " DETACHDISK ID XML_DRV_MSG "
2012-06-14 19:45:41 +04:00
* @ param oid the virtual machine id .
* @ param drv_msg xml data for the mad operation
*/
2019-07-26 14:45:26 +03:00
void detach (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2012-06-14 19:45:41 +04:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : DETACHDISK , oid , drv_msg ) ;
2012-06-14 19:45:41 +04:00
}
2012-12-12 21:31:27 +04:00
/**
* Sends an attach NIC request to the MAD : " ATTACHNIC ID XML_DRV_MSG "
* @ param oid the virtual machine id .
* @ param drv_msg xml data for the mad operation
*/
2019-07-26 14:45:26 +03:00
void attach_nic (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2012-12-12 21:31:27 +04:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : ATTACHNIC , oid , drv_msg ) ;
2012-12-12 21:31:27 +04:00
}
/**
* Sends a detach request to the MAD : " DETACHNIC ID XML_DRV_MSG "
* @ param oid the virtual machine id .
* @ param drv_msg xml data for the mad operation
*/
2019-07-26 14:45:26 +03:00
void detach_nic (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2012-12-12 21:31:27 +04:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : DETACHNIC , oid , drv_msg ) ;
2012-12-12 21:31:27 +04:00
}
2013-02-19 18:21:33 +04:00
/**
* Sends a snapshot create request to the MAD :
* " SNAPSHOTCREATE ID XML_DRV_MSG "
* @ param oid the virtual machine id .
* @ param drv_msg xml data for the mad operation
*/
2019-07-26 14:45:26 +03:00
void snapshot_create (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2013-02-19 18:21:33 +04:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : SNAPSHOTCREATE , oid , drv_msg ) ;
2013-02-19 18:21:33 +04:00
}
2013-02-20 19:04:09 +04:00
/**
* Sends a snapshot revert request to the MAD :
* " SNAPSHOTREVERT ID XML_DRV_MSG "
* @ param oid the virtual machine id .
* @ param drv_msg xml data for the mad operation
*/
2019-07-26 14:45:26 +03:00
void snapshot_revert (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2013-02-20 19:04:09 +04:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : SNAPSHOTREVERT , oid , drv_msg ) ;
2013-02-20 19:04:09 +04:00
}
2012-05-09 00:33:59 +04:00
2013-02-21 18:01:48 +04:00
/**
* Sends a snapshot delete request to the MAD :
* " SNAPSHOTDELETE ID XML_DRV_MSG "
* @ param oid the virtual machine id .
* @ param drv_msg xml data for the mad operation
*/
2019-07-26 14:45:26 +03:00
void snapshot_delete (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2013-02-21 18:01:48 +04:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : SNAPSHOTDELETE , oid , drv_msg ) ;
2013-02-21 18:01:48 +04:00
}
2015-07-01 14:37:58 +03:00
/**
* Sends a disk snapshot create request to the MAD :
* " DISKSNAPSHOTCREATE ID XML_DRV_MSG "
* @ param oid the virtual machine id .
* @ param drv_msg xml data for the mad operation
*/
2019-07-26 14:45:26 +03:00
void disk_snapshot_create (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2015-07-01 14:37:58 +03:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : DISKSNAPSHOTCREATE , oid , drv_msg ) ;
2015-07-01 14:37:58 +03:00
}
2016-12-17 21:30:11 +03:00
/**
* Sends a disk resize request to the MAD :
* " RESIZE ID XML_DRV_MSG "
* @ param oid the virtual machine id .
* @ param drv_msg xml data for the mad operation
*/
2019-07-26 14:45:26 +03:00
void disk_resize (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2016-12-17 21:30:11 +03:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : RESIZEDISK , oid , drv_msg ) ;
2016-12-17 21:30:11 +03:00
}
2019-07-26 14:45:26 +03:00
/**
* Sends an updateconf request to the MAD : " UPDATECONF ID XML_DRV_MSG "
* @ param oid the virtual machine id .
* @ param drv_msg xml data for the mad operation
*/
void update_conf (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2019-07-26 14:45:26 +03:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : UPDATECONF , oid , drv_msg ) ;
2019-07-26 14:45:26 +03:00
}
2016-03-02 01:31:31 +03:00
/**
* Sends a request to update the VM security groups :
* " UPDATESG ID XML_DRV_MSG "
* @ param oid the virtual machine id .
* @ param drv_msg xml data for the mad operation
*/
2019-07-26 14:45:26 +03:00
void updatesg (
2020-06-29 13:14:00 +03:00
const int oid ,
const std : : string & drv_msg ) const
2016-03-02 01:31:31 +03:00
{
2020-06-29 13:14:00 +03:00
write_drv ( VMManagerMessages : : UPDATESG , oid , drv_msg ) ;
2016-03-02 01:31:31 +03:00
}
2013-03-06 18:59:58 +04:00
/**
*
*/
2020-06-29 13:14:00 +03:00
void write_drv ( VMManagerMessages type ,
const int oid ,
const std : : string & msg ) const
2012-05-09 00:33:59 +04:00
{
2020-06-29 13:14:00 +03:00
vm_msg_t drv_msg ( type , " " , oid , msg ) ;
write ( drv_msg ) ;
2012-05-09 00:33:59 +04:00
}
2008-06-17 20:27:32 +04:00
} ;
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
# endif /*VIRTUAL_MACHINE_MANAGER_DRIVER_H_*/