diff --git a/include/VirtualMachine.h b/include/VirtualMachine.h index 76df2cd372..0428156b11 100644 --- a/include/VirtualMachine.h +++ b/include/VirtualMachine.h @@ -85,7 +85,9 @@ public: HOTPLUG = 17, SHUTDOWN_POWEROFF = 18, BOOT_UNKNOWN = 19, - BOOT_POWEROFF = 20 + BOOT_POWEROFF = 20, + BOOT_SUSPENDED = 21, + BOOT_STOPPED = 22 }; // ------------------------------------------------------------------------- diff --git a/share/doc/states/states-complete.dot b/share/doc/states/states-complete.dot index 5cbe8c3041..9bc7da637f 100644 --- a/share/doc/states/states-complete.dot +++ b/share/doc/states/states-complete.dot @@ -9,7 +9,7 @@ digraph OpenNebula { node [fontname="Helvetica"]; edge [fontname="Menlo"]; - + user [ fillcolor="black", style="filled", shape="box", @@ -131,12 +131,6 @@ digraph OpenNebula { boot_suspended -> suspended [style="dotted"]; boot_stopped -> epilog_stop [style="dotted"]; - running -> failure [style="dotted"]; - unknown -> failure [style="dotted"]; - - running -> save_suspend [style="dotted"]; - unknown -> save_suspend [style="dotted"]; - running -> unknown [style="dotted"]; unknown -> running [style="dashed"]; } diff --git a/share/doc/xsd/acct.xsd b/share/doc/xsd/acct.xsd index c5fa3f6919..8403b8120b 100644 --- a/share/doc/xsd/acct.xsd +++ b/share/doc/xsd/acct.xsd @@ -103,6 +103,8 @@ SHUTDOWN_POWEROFF = 18 BOOT_UNKNOWN = 19 BOOT_POWEROFF = 20 + BOOT_SUSPENDED = 21 + BOOT_STOPPED = 22 --> diff --git a/share/doc/xsd/vm.xsd b/share/doc/xsd/vm.xsd index a30ecfe3c3..e341b8525a 100644 --- a/share/doc/xsd/vm.xsd +++ b/share/doc/xsd/vm.xsd @@ -65,6 +65,8 @@ SHUTDOWN_POWEROFF = 18 BOOT_UNKNOWN = 19 BOOT_POWEROFF = 20 + BOOT_SUSPENDED = 21 + BOOT_STOPPED = 22 --> diff --git a/src/dm/DispatchManagerActions.cc b/src/dm/DispatchManagerActions.cc index f7aac5343e..efeb0e9798 100644 --- a/src/dm/DispatchManagerActions.cc +++ b/src/dm/DispatchManagerActions.cc @@ -556,7 +556,9 @@ int DispatchManager::restart(int vid) (vm->get_lcm_state() == VirtualMachine::UNKNOWN || vm->get_lcm_state() == VirtualMachine::BOOT || vm->get_lcm_state() == VirtualMachine::BOOT_UNKNOWN || - vm->get_lcm_state() == VirtualMachine::BOOT_POWEROFF)) + vm->get_lcm_state() == VirtualMachine::BOOT_POWEROFF || + vm->get_lcm_state() == VirtualMachine::BOOT_SUSPENDED || + vm->get_lcm_state() == VirtualMachine::BOOT_STOPPED)) || vm->get_state() == VirtualMachine::POWEROFF ) { Nebula& nd = Nebula::instance(); diff --git a/src/dm/DispatchManagerStates.cc b/src/dm/DispatchManagerStates.cc index 169741ea11..98053f2565 100644 --- a/src/dm/DispatchManagerStates.cc +++ b/src/dm/DispatchManagerStates.cc @@ -70,7 +70,8 @@ void DispatchManager::stop_success_action(int vid) } if ((vm->get_state() == VirtualMachine::ACTIVE) && - (vm->get_lcm_state() == VirtualMachine::EPILOG_STOP)) + (vm->get_lcm_state() == VirtualMachine::EPILOG_STOP || + vm->get_lcm_state() == VirtualMachine::PROLOG_RESUME)) { vm->set_state(VirtualMachine::STOPPED); diff --git a/src/lcm/LifeCycleActions.cc b/src/lcm/LifeCycleActions.cc index c71d3afdc8..a4a84a8198 100644 --- a/src/lcm/LifeCycleActions.cc +++ b/src/lcm/LifeCycleActions.cc @@ -408,7 +408,7 @@ void LifeCycleManager::restore_action(int vid) //---------------------------------------------------- vm->set_state(VirtualMachine::ACTIVE); - vm->set_state(VirtualMachine::BOOT); + vm->set_state(VirtualMachine::BOOT_SUSPENDED); vm->cp_history(); @@ -420,7 +420,7 @@ void LifeCycleManager::restore_action(int vid) vmpool->update_history(vm); - vm->log("LCM", Log::INFO, "New state is BOOT"); + vm->log("LCM", Log::INFO, "New state is BOOT_SUSPENDED"); //---------------------------------------------------- @@ -500,7 +500,9 @@ void LifeCycleManager::restart_action(int vid) (vm->get_lcm_state() == VirtualMachine::UNKNOWN || vm->get_lcm_state() == VirtualMachine::BOOT || vm->get_lcm_state() == VirtualMachine::BOOT_UNKNOWN || - vm->get_lcm_state() == VirtualMachine::BOOT_POWEROFF)) + vm->get_lcm_state() == VirtualMachine::BOOT_POWEROFF || + vm->get_lcm_state() == VirtualMachine::BOOT_SUSPENDED || + vm->get_lcm_state() == VirtualMachine::BOOT_STOPPED)) ||vm->get_state() == VirtualMachine::POWEROFF) { Nebula& nd = Nebula::instance(); @@ -513,7 +515,9 @@ void LifeCycleManager::restart_action(int vid) if (vm->get_state() == VirtualMachine::ACTIVE && (vm->get_lcm_state() == VirtualMachine::BOOT || vm->get_lcm_state() == VirtualMachine::BOOT_UNKNOWN || - vm->get_lcm_state() == VirtualMachine::BOOT_POWEROFF)) + vm->get_lcm_state() == VirtualMachine::BOOT_POWEROFF || + vm->get_lcm_state() == VirtualMachine::BOOT_SUSPENDED || + vm->get_lcm_state() == VirtualMachine::BOOT_STOPPED)) { vm->log("LCM", Log::INFO, "Sending BOOT command to VM again"); } @@ -659,6 +663,8 @@ void LifeCycleManager::clean_up_vm(VirtualMachine * vm) case VirtualMachine::BOOT: case VirtualMachine::BOOT_UNKNOWN: case VirtualMachine::BOOT_POWEROFF: + case VirtualMachine::BOOT_SUSPENDED: + case VirtualMachine::BOOT_STOPPED: case VirtualMachine::RUNNING: case VirtualMachine::UNKNOWN: case VirtualMachine::SHUTDOWN: diff --git a/src/lcm/LifeCycleStates.cc b/src/lcm/LifeCycleStates.cc index bd37bdae0a..e5f5c58f9c 100644 --- a/src/lcm/LifeCycleStates.cc +++ b/src/lcm/LifeCycleStates.cc @@ -373,6 +373,43 @@ void LifeCycleManager::deploy_failure_action(int vid) vm->log("LCM", Log::INFO, "Fail to boot VM. New VM state is POWEROFF"); } + else if (vm->get_lcm_state() == VirtualMachine::BOOT_SUSPENDED) + { + vm->set_state(VirtualMachine::SUSPENDED); + vm->set_state(VirtualMachine::LCM_INIT); + + vmpool->update(vm); + + vm->log("LCM", Log::INFO, "Fail to boot VM. New VM state is SUSPENDED"); + } + else if (vm->get_lcm_state() == VirtualMachine::BOOT_STOPPED) + { + Nebula& nd = Nebula::instance(); + TransferManager * tm = nd.get_tm(); + time_t the_time = time(0); + + //---------------------------------------------------- + // EPILOG_STOP STATE FROM BOOT + //---------------------------------------------------- + + vm->set_state(VirtualMachine::EPILOG_STOP); + + vmpool->update(vm); + + vm->set_epilog_stime(the_time); + + vm->set_running_etime(the_time); + + vm->set_reason(History::STOP_RESUME); + + vmpool->update_history(vm); + + vm->log("LCM", Log::INFO, "Fail to boot VM. New VM state is EPILOG_STOP"); + + //---------------------------------------------------- + + tm->trigger(TransferManager::EPILOG_STOP,vid); + } vm->unlock(); } @@ -524,7 +561,14 @@ void LifeCycleManager::prolog_success_action(int vid) // BOOT STATE //---------------------------------------------------- - vm->set_state(VirtualMachine::BOOT); + if ( lcm_state == VirtualMachine::PROLOG_RESUME ) + { + vm->set_state(VirtualMachine::BOOT_STOPPED); + } + else // PROLOG || PROLOG_MIGRATE + { + vm->set_state(VirtualMachine::BOOT); + } vmpool->update(vm); @@ -550,7 +594,9 @@ void LifeCycleManager::prolog_success_action(int vid) void LifeCycleManager::prolog_failure_action(int vid) { - VirtualMachine * vm; + VirtualMachine::LcmState state; + VirtualMachine * vm; + time_t the_time = time(0); vm = vmpool->get(vid,true); @@ -560,9 +606,52 @@ void LifeCycleManager::prolog_failure_action(int vid) return; } - vm->set_prolog_etime(the_time); + state = vm->get_lcm_state(); - failure_action(vm); + if ( state == VirtualMachine::PROLOG || + state == VirtualMachine::PROLOG_MIGRATE ) + { + vm->set_prolog_etime(the_time); + + failure_action(vm); + } + else if ( state == VirtualMachine::PROLOG_RESUME ) + { + //---------------------------------------------------- + // STOPPED STATE FROM PROLOG_RESUME + //---------------------------------------------------- + + Nebula& nd = Nebula::instance(); + DispatchManager * dm = nd.get_dm(); + + int cpu,mem,disk; + + vm->set_prolog_etime(the_time); + + vm->set_resched(false); + + vmpool->update(vm); + + vm->set_etime(the_time); + + vm->set_vm_info(); + + vm->set_reason(History::STOP_RESUME); + + vmpool->update_history(vm); + + vm->get_requirements(cpu,mem,disk); + + hpool->del_capacity(vm->get_hid(),cpu,mem,disk); + + //---------------------------------------------------- + + dm->trigger(DispatchManager::STOP_SUCCESS,vid); + } + else + { + vm->log("LCM",Log::ERROR,"prolog_failure_action, VM in a wrong state"); + } vm->unlock(); diff --git a/src/oca/java/src/org/opennebula/client/vm/VirtualMachine.java b/src/oca/java/src/org/opennebula/client/vm/VirtualMachine.java index fe8d3756aa..d402c835d2 100644 --- a/src/oca/java/src/org/opennebula/client/vm/VirtualMachine.java +++ b/src/oca/java/src/org/opennebula/client/vm/VirtualMachine.java @@ -86,7 +86,9 @@ public class VirtualMachine extends PoolElement{ "HOTPLUG", "SHUTDOWN_POWEROFF", "BOOT_UNKNOWN", - "BOOT_POWEROFF" }; + "BOOT_POWEROFF", + "BOOT_SUSPENDED", + "BOOT_STOPPED" }; private static final String[] SHORT_LCM_STATES = { @@ -110,6 +112,8 @@ public class VirtualMachine extends PoolElement{ "hotp", "poff", "boot", + "boot", + "boot", "boot" }; /** diff --git a/src/oca/ruby/OpenNebula/VirtualMachine.rb b/src/oca/ruby/OpenNebula/VirtualMachine.rb index ccab73f4e2..5e7c061c8b 100644 --- a/src/oca/ruby/OpenNebula/VirtualMachine.rb +++ b/src/oca/ruby/OpenNebula/VirtualMachine.rb @@ -44,7 +44,7 @@ module OpenNebula LCM_STATE=%w{LCM_INIT PROLOG BOOT RUNNING MIGRATE SAVE_STOP SAVE_SUSPEND SAVE_MIGRATE PROLOG_MIGRATE PROLOG_RESUME EPILOG_STOP EPILOG SHUTDOWN CANCEL FAILURE CLEANUP UNKNOWN HOTPLUG SHUTDOWN_POWEROFF - BOOT_UNKNOWN BOOT_POWEROFF} + BOOT_UNKNOWN BOOT_POWEROFF BOOT_SUSPENDED BOOT_STOPPED} SHORT_VM_STATES={ "INIT" => "init", @@ -78,7 +78,9 @@ module OpenNebula "HOTPLUG" => "hotp", "SHUTDOWN_POWEROFF" => "shut", "BOOT_UNKNOWN" => "boot", - "BOOT_POWEROFF" => "boot" + "BOOT_POWEROFF" => "boot", + "BOOT_SUSPENDED" => "boot", + "BOOT_STOPPED" => "boot" } MIGRATE_REASON=%w{NONE ERROR STOP_RESUME USER CANCEL} diff --git a/src/ozones/Server/public/js/ozones.js b/src/ozones/Server/public/js/ozones.js index c72410e95f..3a1d54501a 100644 --- a/src/ozones/Server/public/js/ozones.js +++ b/src/ozones/Server/public/js/ozones.js @@ -99,7 +99,9 @@ var oZones = { "HOTPLUG", "SHUTDOWN_POWEROFF", "BOOT_UNKNOWN", - "BOOT_POWEROFF"][value]); + "BOOT_POWEROFF", + "BOOT_SUSPENDED", + "BOOT_STOPPED"][value]); break; case "IMAGE": case "image": diff --git a/src/sunstone/public/js/opennebula.js b/src/sunstone/public/js/opennebula.js index c65cefdafa..5c1f5d53c4 100644 --- a/src/sunstone/public/js/opennebula.js +++ b/src/sunstone/public/js/opennebula.js @@ -107,7 +107,9 @@ var OpenNebula = { "HOTPLUG", "SHUTDOWN_POWEROFF", "BOOT_UNKNOWN", - "BOOT_POWEROFF"][value]); + "BOOT_POWEROFF", + "BOOT_SUSPENDED", + "BOOT_STOPPED"][value]); break; case "IMAGE": case "image":