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":