mirror of
https://github.com/OpenNebula/one.git
synced 2024-12-23 17:33:56 +03:00
(cherry picked from commit 22222bfeef
)
This commit is contained in:
parent
5591f88a3b
commit
1242fbca95
@ -99,7 +99,13 @@ public:
|
|||||||
int parse(std::string& error, bool clean);
|
int parse(std::string& error, bool clean);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param stime time when the time was started for relative time specs
|
* @param stime time when the VM was started for relative time specs
|
||||||
|
* @return action execution time. Returns -1 on error
|
||||||
|
*/
|
||||||
|
time_t get_time(time_t stime);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param stime time when the VM was started for relative time specs
|
||||||
* @return true if the action needs to be executed.
|
* @return true if the action needs to be executed.
|
||||||
*/
|
*/
|
||||||
bool is_due(time_t stime);
|
bool is_due(time_t stime);
|
||||||
|
@ -1693,80 +1693,96 @@ int Scheduler::do_scheduled_actions()
|
|||||||
|
|
||||||
const map<int, ObjectXML*> vms = vmapool->get_objects();
|
const map<int, ObjectXML*> vms = vmapool->get_objects();
|
||||||
|
|
||||||
string action_st, args_st, error_msg;
|
|
||||||
|
|
||||||
string time_str = one_util::log_time(time(0));
|
|
||||||
|
|
||||||
for (auto vm_it=vms.begin(); vm_it != vms.end(); vm_it++)
|
for (auto vm_it=vms.begin(); vm_it != vms.end(); vm_it++)
|
||||||
{
|
{
|
||||||
vm = static_cast<VirtualMachineXML *>(vm_it->second);
|
vm = static_cast<VirtualMachineXML *>(vm_it->second);
|
||||||
|
|
||||||
SchedActions sas = vm->get_actions();
|
SchedActions sas = vm->get_actions();
|
||||||
|
|
||||||
for ( auto action : sas)
|
SchedAction* first_action = nullptr;
|
||||||
{
|
|
||||||
ostringstream oss;
|
|
||||||
|
|
||||||
if (!action->is_due(vm->get_stime()))
|
for (auto action : sas)
|
||||||
|
{
|
||||||
|
auto stime = vm->get_stime();
|
||||||
|
if (!action->is_due(stime))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
action_st = action->vector_value("ACTION");
|
if (!first_action ||
|
||||||
args_st = action->vector_value("ARGS");
|
first_action->get_time(stime) > action->get_time(stime))
|
||||||
|
|
||||||
int rc = VirtualMachineXML::parse_action_name(action_st);
|
|
||||||
|
|
||||||
oss << "Executing action '" << action_st << "' for VM "
|
|
||||||
<< vm->get_oid() << " : ";
|
|
||||||
|
|
||||||
if ( rc != 0 )
|
|
||||||
{
|
{
|
||||||
error_msg = "This action is not supported.";
|
// Only first is_due action with lower time will be executed
|
||||||
|
first_action = action;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
rc = vmapool->action(vm->get_oid(), action_st, args_st, error_msg);
|
|
||||||
|
|
||||||
if (rc == 0)
|
|
||||||
{
|
|
||||||
time_t done_time = time(0);
|
|
||||||
time_t next_time;
|
|
||||||
|
|
||||||
action->remove("MESSAGE");
|
|
||||||
|
|
||||||
action->replace("DONE", done_time);
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
next_time = action->next_action();
|
|
||||||
} while ( next_time < done_time && next_time != -1 );
|
|
||||||
|
|
||||||
oss << "Success.";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( rc != 0 )
|
|
||||||
{
|
|
||||||
ostringstream oss_aux;
|
|
||||||
|
|
||||||
oss_aux << time_str << " : " << error_msg;
|
|
||||||
|
|
||||||
action->replace("MESSAGE", oss_aux.str());
|
|
||||||
|
|
||||||
oss << "Failure. " << error_msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!vm->update_sched_action(action))
|
|
||||||
{
|
|
||||||
ostringstream oss;
|
|
||||||
action->to_xml(oss);
|
|
||||||
NebulaLog::warn("SCHED", string("Unable to update sched action: ")
|
|
||||||
+ oss.str());
|
|
||||||
}
|
|
||||||
|
|
||||||
NebulaLog::log("VM", Log::INFO, oss);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!first_action)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ostringstream oss;
|
||||||
|
|
||||||
|
string error_msg;
|
||||||
|
|
||||||
|
string action_st = first_action->vector_value("ACTION");
|
||||||
|
|
||||||
|
int rc = VirtualMachineXML::parse_action_name(action_st);
|
||||||
|
|
||||||
|
oss << "Executing action '" << action_st << "' for VM "
|
||||||
|
<< vm->get_oid() << " : ";
|
||||||
|
|
||||||
|
if ( rc != 0 )
|
||||||
|
{
|
||||||
|
error_msg = "This action is not supported.";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string args_st = first_action->vector_value("ARGS");
|
||||||
|
|
||||||
|
rc = vmapool->action(vm->get_oid(), action_st, args_st, error_msg);
|
||||||
|
|
||||||
|
if (rc == 0)
|
||||||
|
{
|
||||||
|
time_t done_time = time(0);
|
||||||
|
time_t next_time;
|
||||||
|
|
||||||
|
first_action->remove("MESSAGE");
|
||||||
|
|
||||||
|
first_action->replace("DONE", done_time);
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
next_time = first_action->next_action();
|
||||||
|
} while ( next_time < done_time && next_time != -1 );
|
||||||
|
|
||||||
|
oss << "Success.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( rc != 0 )
|
||||||
|
{
|
||||||
|
ostringstream oss_aux;
|
||||||
|
|
||||||
|
string time_str = one_util::log_time(time(0));
|
||||||
|
|
||||||
|
oss_aux << time_str << " : " << error_msg;
|
||||||
|
|
||||||
|
first_action->replace("MESSAGE", oss_aux.str());
|
||||||
|
|
||||||
|
oss << "Failure. " << error_msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!vm->update_sched_action(first_action))
|
||||||
|
{
|
||||||
|
ostringstream oss;
|
||||||
|
first_action->to_xml(oss);
|
||||||
|
NebulaLog::warn("SCHED", string("Unable to update sched action: ")
|
||||||
|
+ oss.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
NebulaLog::log("VM", Log::INFO, oss);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -295,15 +295,12 @@ static int days_in_period(SchedAction::Repeat& r, int month, int year)
|
|||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
bool SchedAction::is_due(time_t stime)
|
time_t SchedAction::get_time(time_t stime)
|
||||||
{
|
{
|
||||||
time_t action_time, done_time, origin = 0;
|
time_t action_time, origin = 0;
|
||||||
int repeat;
|
|
||||||
|
|
||||||
std::istringstream iss;
|
std::istringstream iss;
|
||||||
|
|
||||||
bool has_done = vector_value("DONE", done_time) == 0;
|
|
||||||
bool has_repeat = vector_value("REPEAT", repeat) == 0;
|
|
||||||
std::string action_time_s = vector_value("TIME");
|
std::string action_time_s = vector_value("TIME");
|
||||||
|
|
||||||
if ( action_time_s[0] == '+' )
|
if ( action_time_s[0] == '+' )
|
||||||
@ -318,13 +315,30 @@ bool SchedAction::is_due(time_t stime)
|
|||||||
|
|
||||||
if (iss.fail() || !iss.eof())
|
if (iss.fail() || !iss.eof())
|
||||||
{
|
{
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
action_time += origin;
|
action_time += origin;
|
||||||
|
|
||||||
return ((!has_done || done_time < action_time || has_repeat)
|
return action_time;
|
||||||
&& action_time < time(0));
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
bool SchedAction::is_due(time_t stime)
|
||||||
|
{
|
||||||
|
time_t action_time, done_time, origin = 0;
|
||||||
|
int repeat;
|
||||||
|
|
||||||
|
bool has_done = vector_value("DONE", done_time) == 0;
|
||||||
|
bool has_repeat = vector_value("REPEAT", repeat) == 0;
|
||||||
|
|
||||||
|
action_time = get_time(stime);
|
||||||
|
|
||||||
|
return (action_time != -1)
|
||||||
|
&& ((!has_done || done_time < action_time || has_repeat)
|
||||||
|
&& action_time < time(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
Loading…
Reference in New Issue
Block a user