From 007f5f6b9c8a87a635ab268638d6e3a90f4b1da6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn?= Date: Wed, 21 Jul 2010 18:06:40 +0200 Subject: [PATCH] feature #200: XML-RPC method for saving images while a VM is executing. --- include/RequestManager.h | 28 ++++++++++++++++++++++++ include/VirtualMachine.h | 12 +++++++++++ src/rm/RequestManager.cc | 6 +++++- src/rm/SConstruct | 1 + src/vm/VirtualMachine.cc | 46 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 92 insertions(+), 1 deletion(-) diff --git a/include/RequestManager.h b/include/RequestManager.h index 8ead3ab3c9..8035b90fe5 100644 --- a/include/RequestManager.h +++ b/include/RequestManager.h @@ -438,6 +438,34 @@ private: UserPool * upool; }; + /* ---------------------------------------------------------------------- */ + + class VirtualMachineSaveDisk: public xmlrpc_c::method + { + public: + VirtualMachineSaveDisk( + VirtualMachinePool * _vmpool, + UserPool * _upool, + ImagePool * _ipool): + vmpool(_vmpool), + upool(_upool), + ipool(_ipool) + { + _signature="A:siii"; + _help="Sets the disk to be saved in the given image."; + }; + + ~VirtualMachineSaveDisk(){}; + + void execute( + xmlrpc_c::paramList const& paramList, + xmlrpc_c::value * const retval); + + private: + VirtualMachinePool * vmpool; + UserPool * upool; + ImagePool * ipool; + }; /* ---------------------------------------------------------------------- */ diff --git a/include/VirtualMachine.h b/include/VirtualMachine.h index af7c76e551..8330967428 100644 --- a/include/VirtualMachine.h +++ b/include/VirtualMachine.h @@ -731,6 +731,18 @@ public: */ int generate_context(string &files); + + // ------------------------------------------------------------------------ + // Image repository related functions + // ------------------------------------------------------------------------ + /** + * Set the SAVE_AS attribute for the "disk_id"th disk. + * @param disk_id Index of the disk to save + * @param img_id ID of the image this disk will be saved to. + * @return 0 if success + */ + int save_disk(int disk_id, int img_id); + private: // ------------------------------------------------------------------------- diff --git a/src/rm/RequestManager.cc b/src/rm/RequestManager.cc index aa11c4cfb0..eef1d2cf52 100644 --- a/src/rm/RequestManager.cc +++ b/src/rm/RequestManager.cc @@ -224,7 +224,10 @@ void RequestManager::register_xml_methods() xmlrpc_c::methodPtr vm_action(new RequestManager::VirtualMachineAction(vmpool,upool)); - + + xmlrpc_c::methodPtr vm_savedisk(new + RequestManager::VirtualMachineSaveDisk(vmpool,upool,ipool)); + xmlrpc_c::methodPtr vm_info(new RequestManager::VirtualMachineInfo(vmpool,upool)); @@ -322,6 +325,7 @@ void RequestManager::register_xml_methods() RequestManagerRegistry.addMethod("one.vm.action", vm_action); RequestManagerRegistry.addMethod("one.vm.migrate", vm_migrate); RequestManagerRegistry.addMethod("one.vm.info", vm_info); + RequestManagerRegistry.addMethod("one.vm.savedisk",vm_savedisk); RequestManagerRegistry.addMethod("one.vmpool.info", vm_pool_info); diff --git a/src/rm/SConstruct b/src/rm/SConstruct index 59eb18572f..8bdf6dc050 100644 --- a/src/rm/SConstruct +++ b/src/rm/SConstruct @@ -27,6 +27,7 @@ source_files=[ 'RequestManagerAllocate.cc', 'RequestManagerDeploy.cc', 'RequestManagerMigrate.cc', + 'RequestManagerSaveDisk.cc', 'RequestManagerInfo.cc', 'RequestManagerPoolInfo.cc', 'RequestManagerHostAllocate.cc', diff --git a/src/vm/VirtualMachine.cc b/src/vm/VirtualMachine.cc index 78b99c49bd..6a1580073b 100644 --- a/src/vm/VirtualMachine.cc +++ b/src/vm/VirtualMachine.cc @@ -1098,6 +1098,52 @@ int VirtualMachine::generate_context(string &files) /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ +int VirtualMachine::save_disk(int disk_id, int img_id) +{ + int num_disks; + vector disks; + VectorAttribute * disk; + + string disk_id_str; + int tmp_disk_id; + + ostringstream oss; + istringstream iss; + + + num_disks = vm_template->get("DISK",disks); + + for(int i=0; i(disks[i]); + + if ( disk == 0 ) + { + continue; + } + + disk_id_str = disk->vector_value("DISK_ID"); + + iss.str(disk_id_str); + iss >> tmp_disk_id; + + if( tmp_disk_id == disk_id ) + { + disk->replace("SAVE", "YES"); + + oss << (img_id); + disk->replace("SAVE_AS", oss.str()); + + return 0; + } + } + + return -1; +} + +/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ + pthread_mutex_t VirtualMachine::lex_mutex = PTHREAD_MUTEX_INITIALIZER; extern "C"