1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-01-11 05:17:41 +03:00

feature #1791: set the hotplug_saveas state at the beginning of the action. Allow for suspended and poweroff to be saveas-hot valid states.

This commit is contained in:
Jaime Melis 2013-03-07 13:09:57 +01:00
parent 3816c614ef
commit d74c51e7a4
5 changed files with 177 additions and 68 deletions

View File

@ -66,31 +66,33 @@ public:
*/
enum LcmState
{
LCM_INIT = 0,
PROLOG = 1,
BOOT = 2,
RUNNING = 3,
MIGRATE = 4,
SAVE_STOP = 5,
SAVE_SUSPEND = 6,
SAVE_MIGRATE = 7,
PROLOG_MIGRATE = 8,
PROLOG_RESUME = 9,
EPILOG_STOP = 10,
EPILOG = 11,
SHUTDOWN = 12,
CANCEL = 13,
FAILURE = 14,
CLEANUP_RESUBMIT = 15,
UNKNOWN = 16,
HOTPLUG = 17,
SHUTDOWN_POWEROFF = 18,
BOOT_UNKNOWN = 19,
BOOT_POWEROFF = 20,
BOOT_SUSPENDED = 21,
BOOT_STOPPED = 22,
CLEANUP_DELETE = 23,
HOTPLUG_SAVEAS = 24
LCM_INIT = 0,
PROLOG = 1,
BOOT = 2,
RUNNING = 3,
MIGRATE = 4,
SAVE_STOP = 5,
SAVE_SUSPEND = 6,
SAVE_MIGRATE = 7,
PROLOG_MIGRATE = 8,
PROLOG_RESUME = 9,
EPILOG_STOP = 10,
EPILOG = 11,
SHUTDOWN = 12,
CANCEL = 13,
FAILURE = 14,
CLEANUP_RESUBMIT = 15,
UNKNOWN = 16,
HOTPLUG = 17,
SHUTDOWN_POWEROFF = 18,
BOOT_UNKNOWN = 19,
BOOT_POWEROFF = 20,
BOOT_SUSPENDED = 21,
BOOT_STOPPED = 22,
CLEANUP_DELETE = 23,
HOTPLUG_SAVEAS = 24,
HOTPLUG_SAVEAS_POWEROFF = 25,
HOTPLUG_SAVEAS_SUSPENDED = 26
};
// -------------------------------------------------------------------------

View File

@ -326,6 +326,10 @@ static void mkfs_action(istringstream& is,
string info;
int rc;
istringstream iss;
int vm_oid;
int disk_oid;
VirtualMachine * vm;
ostringstream oss;
@ -357,9 +361,35 @@ static void mkfs_action(istringstream& is,
return;
}
is_saving = image->isSaving();
is_hot = image->isHot();
if ( is_saving )
{
image->get_template_attribute("SAVED_DISK_ID", disk_id);
image->get_template_attribute("SAVED_VM_ID", vm_id);
iss.str(vm_id);
iss >> vm_oid;
iss.clear();
iss.str(disk_id);
iss >> disk_oid;
}
if ( result == "FAILURE" )
{
goto error_img;
if ( is_hot )
{
LifeCycleManager * lcm = nd.get_lcm();
lcm->trigger(LifeCycleManager::HOTPLUG_SAVEAS_FAILURE, vm_oid);
goto error_img_hot;
}
else
{
goto error_img;
}
}
if ( is.good() )
@ -372,32 +402,20 @@ static void mkfs_action(istringstream& is,
goto error_img;
}
is_saving = image->isSaving();
is_hot = image->isHot();
image->set_source(source);
if (is_saving)
if ( !is_saving && !is_hot )
{
image->get_template_attribute("SAVED_DISK_ID", disk_id);
image->get_template_attribute("SAVED_VM_ID", vm_id);
image->set_state(Image::READY);
}
else
{
if ( !is_hot )
{
image->set_state(Image::READY);
}
NebulaLog::log("ImM", Log::INFO, "Image created and ready to use");
}
NebulaLog::log("ImM", Log::INFO, "Image created and ready to use");
ipool->update(image);
image->unlock();
if ( ! is_saving )
if ( !is_saving )
{
return;
}
@ -411,34 +429,12 @@ static void mkfs_action(istringstream& is,
if ( is_hot )
{
istringstream iss;
int vm_oid;
int disk_oid;
/* change state */
iss.str(vm_id);
iss >> vm_oid;
iss.clear();
iss.str(disk_id);
iss >> disk_oid;
vm->set_state(VirtualMachine::HOTPLUG_SAVEAS);
vm->set_hotplug_saveas(disk_oid, id);
vm->set_resched(false);
vmpool->update(vm);
vm->log("LCM", Log::INFO, "New VM state is HOTPLUG_SAVEAS");
/* call tm */
TransferManager * tm = nd.get_tm();
TransferManager * tm = nd.get_tm();
vm->unlock();
tm->saveas_hot_transfer_command(vm_oid, disk_oid, source);
}
else
@ -458,6 +454,7 @@ static void mkfs_action(istringstream& is,
return;
error_img_hot:
error_img:
oss << "Error creating datablock";
goto error;

View File

@ -1226,6 +1226,28 @@ void LifeCycleManager::hotplug_saveas_success_action(int vid)
vmpool->update(vm);
}
else if (vm->get_lcm_state() == VirtualMachine::HOTPLUG_SAVEAS_POWEROFF)
{
image_id = vm->get_hotplug_saveas_image_id();
vm->clear_hotplug_saveas();
vm->set_state(VirtualMachine::POWEROFF);
vm->set_state(VirtualMachine::LCM_INIT);
vmpool->update(vm);
}
else if (vm->get_lcm_state() == VirtualMachine::HOTPLUG_SAVEAS_SUSPENDED)
{
image_id = vm->get_hotplug_saveas_image_id();
vm->clear_hotplug_saveas();
vm->set_state(VirtualMachine::SUSPENDED);
vm->set_state(VirtualMachine::LCM_INIT);
vmpool->update(vm);
}
else
{
vm->log("LCM",Log::ERROR,"hotplug_saveas_success_action,"
@ -1234,7 +1256,6 @@ void LifeCycleManager::hotplug_saveas_success_action(int vid)
vm->unlock();
ostringstream oss;
image = ipool->get(image_id, true);
@ -1282,6 +1303,28 @@ void LifeCycleManager::hotplug_saveas_failure_action(int vid)
vmpool->update(vm);
}
else if (vm->get_lcm_state() == VirtualMachine::HOTPLUG_SAVEAS_POWEROFF)
{
image_id = vm->get_hotplug_saveas_image_id();
vm->clear_hotplug_saveas();
vm->set_state(VirtualMachine::POWEROFF);
vm->set_state(VirtualMachine::LCM_INIT);
vmpool->update(vm);
}
else if (vm->get_lcm_state() == VirtualMachine::HOTPLUG_SAVEAS_SUSPENDED)
{
image_id = vm->get_hotplug_saveas_image_id();
vm->clear_hotplug_saveas();
vm->set_state(VirtualMachine::SUSPENDED);
vm->set_state(VirtualMachine::LCM_INIT);
vmpool->update(vm);
}
else
{
vm->log("LCM",Log::ERROR,"hotplug_saveas_success_action,"
@ -1290,7 +1333,6 @@ void LifeCycleManager::hotplug_saveas_failure_action(int vid)
vm->unlock();
ostringstream oss;
image = ipool->get(image_id, true);

View File

@ -697,6 +697,7 @@ void VirtualMachineSaveDisk::request_execute(xmlrpc_c::paramList const& paramLis
is_hot = xmlrpc_c::value_boolean(paramList.getBoolean(5));
}
VirtualMachinePool * vmpool = static_cast<VirtualMachinePool *>(pool);
VirtualMachine * vm;
int iid;
int iid_orig;
@ -726,8 +727,22 @@ void VirtualMachineSaveDisk::request_execute(xmlrpc_c::paramList const& paramLis
return;
}
if (!( (vm->get_state() == VirtualMachine::POWEROFF) ||
(vm->get_state() == VirtualMachine::SUSPENDED) ||
(vm->get_state() == VirtualMachine::ACTIVE &&
vm->get_lcm_state() == VirtualMachine::RUNNING)))
{
failure_response(ACTION,
request_error("Wrong state to perform action",""),
att);
vm->unlock();
return;
}
iid_orig = vm->get_image_from_disk(disk_id, error_str);
// TODO: remove this update?
pool->update(vm);
vm->unlock();
@ -809,6 +824,55 @@ void VirtualMachineSaveDisk::request_execute(xmlrpc_c::paramList const& paramLis
return;
}
// -------------------------------------------------------------------------
// Change to one of the HOTPLUG_SAVEAS states if it's a hot saveas
// -------------------------------------------------------------------------
if ( is_hot )
{
vm = vmpool->get(id,true);
if ( vm == 0 )
{
failure_response(NO_EXISTS,
get_error(object_name(PoolObjectSQL::VM), id),
att);
return;
}
if ( vm->get_state() == VirtualMachine::ACTIVE &&
vm->get_lcm_state() == VirtualMachine::RUNNING)
{
vm->set_state(VirtualMachine::HOTPLUG_SAVEAS);
}
else if (vm->get_state() == VirtualMachine::POWEROFF)
{
vm->set_state(VirtualMachine::ACTIVE);
vm->set_state(VirtualMachine::HOTPLUG_SAVEAS_POWEROFF);
}
else if (vm->get_state() == VirtualMachine::SUSPENDED)
{
vm->set_state(VirtualMachine::ACTIVE);
vm->set_state(VirtualMachine::HOTPLUG_SAVEAS_SUSPENDED);
}
else
{
failure_response(ACTION,
request_error("Wrong state to perform action",""),
att);
vm->unlock();
return;
}
vm->log("RM", Log::INFO, "New VM state is HOTPLUG_SAVEAS");
vm->set_resched(false);
vmpool->update(vm);
vm->unlock();
}
// -------------------------------------------------------------------------
// Get the data of the DataStore for the new image
// -------------------------------------------------------------------------

View File

@ -132,6 +132,8 @@ void TransferManagerDriver::protocol(
break;
case VirtualMachine::HOTPLUG_SAVEAS:
case VirtualMachine::HOTPLUG_SAVEAS_POWEROFF:
case VirtualMachine::HOTPLUG_SAVEAS_SUSPENDED:
lcm_action = LifeCycleManager::HOTPLUG_SAVEAS_SUCCESS;
break;
@ -173,6 +175,8 @@ void TransferManagerDriver::protocol(
break;
case VirtualMachine::HOTPLUG_SAVEAS:
case VirtualMachine::HOTPLUG_SAVEAS_POWEROFF:
case VirtualMachine::HOTPLUG_SAVEAS_SUSPENDED:
lcm_action = LifeCycleManager::HOTPLUG_SAVEAS_FAILURE;
break;