mirror of
https://github.com/OpenNebula/one.git
synced 2025-03-21 14:50:08 +03:00
F #2340: Add support for sched disk snapshots
co-authored-by: Alejandro Huertas Herrero <ahuertas@opennebula.systems>
This commit is contained in:
parent
4ec9d50424
commit
ce388212f5
@ -457,6 +457,7 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
||||
|
||||
tmp_str << "\nSCHED_ACTION = "
|
||||
tmp_str << "[ID = #{id}, ACTION = #{action}, "
|
||||
tmp_str << "ARGS = \"#{options[:args]}\"," if options[:args]
|
||||
tmp_str << "TIME = #{options[:schedule].to_i}"
|
||||
tmp_str << str_periodic << ']'
|
||||
|
||||
@ -1151,6 +1152,10 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
|
||||
d['ACTION'] unless d.nil?
|
||||
end
|
||||
|
||||
column :ARGS, '', :left, :size => 15 do |d|
|
||||
d['ARGS'] ? d['ARGS'] : '-'
|
||||
end
|
||||
|
||||
column :SCHEDULED, '', :size => 12 do |d|
|
||||
OpenNebulaHelper.time_to_str(d['TIME'], false) \
|
||||
unless d.nil?
|
||||
|
@ -927,6 +927,9 @@ CommandParser::CmdParser.new(ARGV) do
|
||||
OneVMHelper::HOURLY,
|
||||
OneVMHelper::END_TIME] do
|
||||
if !options[:schedule].nil?
|
||||
# add name as an argument
|
||||
options[:args] = args[1]
|
||||
|
||||
helper.schedule_actions(args[0], options, @comm_name)
|
||||
else
|
||||
helper.perform_actions(args[0], options, 'snapshot created') do |o|
|
||||
@ -940,9 +943,22 @@ CommandParser::CmdParser.new(ARGV) do
|
||||
Reverts a VM to a saved snapshot
|
||||
EOT
|
||||
|
||||
command :"snapshot-revert", snapshot_revert_desc, :vmid, :snapshot_id do
|
||||
helper.perform_action(args[0], options, 'snapshot reverted') do |o|
|
||||
o.snapshot_revert(args[1].to_i)
|
||||
command :"snapshot-revert", snapshot_revert_desc, :vmid, :snapshot_id,
|
||||
:options => [OneVMHelper::SCHEDULE,
|
||||
OneVMHelper::WEEKLY,
|
||||
OneVMHelper::MONTHLY,
|
||||
OneVMHelper::YEARLY,
|
||||
OneVMHelper::HOURLY,
|
||||
OneVMHelper::END_TIME] do
|
||||
if !options[:schedule].nil?
|
||||
# add snap ID as an argument
|
||||
options[:args] = args[1]
|
||||
|
||||
helper.schedule_actions([args[0]], options, @comm_name)
|
||||
else
|
||||
helper.perform_action(args[0], options, 'snapshot reverted') do |o|
|
||||
o.snapshot_revert(args[1].to_i)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -951,9 +967,22 @@ CommandParser::CmdParser.new(ARGV) do
|
||||
Delets a snapshot of a VM
|
||||
EOT
|
||||
|
||||
command :"snapshot-delete", snapshot_delete_desc, :vmid, :snapshot_id do
|
||||
helper.perform_action(args[0], options, 'snapshot deleted') do |o|
|
||||
o.snapshot_delete(args[1])
|
||||
command :"snapshot-delete", snapshot_delete_desc, :vmid, :snapshot_id,
|
||||
:options => [OneVMHelper::SCHEDULE,
|
||||
OneVMHelper::WEEKLY,
|
||||
OneVMHelper::MONTHLY,
|
||||
OneVMHelper::YEARLY,
|
||||
OneVMHelper::HOURLY,
|
||||
OneVMHelper::END_TIME] do
|
||||
if !options[:schedule].nil?
|
||||
# add snap ID as an argument
|
||||
options[:args] = args[1]
|
||||
|
||||
helper.schedule_actions([args[0]], options, @comm_name)
|
||||
else
|
||||
helper.perform_action(args[0], options, 'snapshot deleted') do |o|
|
||||
o.snapshot_delete(args[1])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -965,9 +994,22 @@ CommandParser::CmdParser.new(ARGV) do
|
||||
EOT
|
||||
|
||||
command :"disk-snapshot-create", disk_snapshot_create_desc,
|
||||
:vmid, :diskid, :name do
|
||||
helper.perform_action(args[0], options, 'disk snapshot created') do |o|
|
||||
o.disk_snapshot_create(args[1].to_i, args[2])
|
||||
:vmid, :diskid, :name,
|
||||
:options => [OneVMHelper::SCHEDULE,
|
||||
OneVMHelper::WEEKLY,
|
||||
OneVMHelper::MONTHLY,
|
||||
OneVMHelper::YEARLY,
|
||||
OneVMHelper::HOURLY,
|
||||
OneVMHelper::END_TIME] do
|
||||
if !options[:schedule].nil?
|
||||
# add disk ID and name as arguments
|
||||
options[:args] = "#{args[1]},#{args[2]}"
|
||||
|
||||
helper.schedule_actions([args[0]], options, @comm_name)
|
||||
else
|
||||
helper.perform_action(args[0], options, 'disk snapshot created') do |o|
|
||||
o.disk_snapshot_create(args[1].to_i, args[2])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -978,9 +1020,22 @@ CommandParser::CmdParser.new(ARGV) do
|
||||
EOT
|
||||
|
||||
command :"disk-snapshot-revert", disk_snapshot_revert_desc,
|
||||
:vmid, :diskid, :disk_snapshot_id do
|
||||
helper.perform_action(args[0], options, 'disk snapshot reverted') do |o|
|
||||
o.disk_snapshot_revert(args[1].to_i, args[2].to_i)
|
||||
:vmid, :diskid, :disk_snapshot_id,
|
||||
:options => [OneVMHelper::SCHEDULE,
|
||||
OneVMHelper::WEEKLY,
|
||||
OneVMHelper::MONTHLY,
|
||||
OneVMHelper::YEARLY,
|
||||
OneVMHelper::HOURLY,
|
||||
OneVMHelper::END_TIME] do
|
||||
if !options[:schedule].nil?
|
||||
# add disk ID and snap ID as arguments
|
||||
options[:args] = "#{args[1]},#{args[2]}"
|
||||
|
||||
helper.schedule_actions([args[0]], options, @comm_name)
|
||||
else
|
||||
helper.perform_action(args[0], options, 'disk snapshot reverted') do |o|
|
||||
o.disk_snapshot_revert(args[1].to_i, args[2].to_i)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -991,9 +1046,22 @@ CommandParser::CmdParser.new(ARGV) do
|
||||
EOT
|
||||
|
||||
command :"disk-snapshot-delete", disk_snapshot_delete_desc,
|
||||
:vmid, :diskid, :disk_snapshot_id do
|
||||
helper.perform_action(args[0], options, 'disk snapshot deleted') do |o|
|
||||
o.disk_snapshot_delete(args[1].to_i, args[2].to_i)
|
||||
:vmid, :diskid, :disk_snapshot_id,
|
||||
:options => [OneVMHelper::SCHEDULE,
|
||||
OneVMHelper::WEEKLY,
|
||||
OneVMHelper::MONTHLY,
|
||||
OneVMHelper::YEARLY,
|
||||
OneVMHelper::HOURLY,
|
||||
OneVMHelper::END_TIME] do
|
||||
if !options[:schedule].nil?
|
||||
# add disk ID and snap ID as arguments
|
||||
options[:args] = "#{args[1]},#{args[2]}"
|
||||
|
||||
helper.schedule_actions([args[0]], options, @comm_name)
|
||||
else
|
||||
helper.perform_action(args[0], options, 'disk snapshot deleted') do |o|
|
||||
o.disk_snapshot_delete(args[1].to_i, args[2].to_i)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -153,11 +153,15 @@ public:
|
||||
*
|
||||
* @param vid The VM id
|
||||
* @param action Action argument (terminate, hold, release...)
|
||||
* @param args Action arguments
|
||||
* @param error_msg Error reason, if any
|
||||
*
|
||||
* @return 0 on success, -1 otherwise
|
||||
*/
|
||||
int action(int vid, const string &action, string &error_msg) const;
|
||||
int action(int vid,
|
||||
const string &action,
|
||||
const string &args,
|
||||
string &error_msg) const;
|
||||
|
||||
protected:
|
||||
|
||||
|
@ -17,6 +17,99 @@
|
||||
#include "VirtualMachinePoolXML.h"
|
||||
#include <stdexcept>
|
||||
#include <iomanip>
|
||||
#include <queue>
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/**
|
||||
* Parses value from string to given type
|
||||
*
|
||||
* @param val_s string value
|
||||
* @param val parsed value
|
||||
*
|
||||
* @return 0 on success, -1 otherwise
|
||||
*/
|
||||
/* -------------------------------------------------------------------------- */
|
||||
template<typename T>
|
||||
static int from_str(const string& val_s, T& val)
|
||||
{
|
||||
if (val_s.empty())
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
istringstream iss(val_s);
|
||||
|
||||
iss >> val;
|
||||
|
||||
if (iss.fail() || !iss.eof())
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
template<>
|
||||
int from_str(const string& val_s, string& val)
|
||||
{
|
||||
if (val_s.empty())
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
val = val_s;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/**
|
||||
* Parses tokens to scpecific value with given type
|
||||
*
|
||||
* @param tokens values to parse
|
||||
* @param value given type to parse it
|
||||
*
|
||||
* @return 0 on success, -1 otherwise
|
||||
*/
|
||||
/* -------------------------------------------------------------------------- */
|
||||
template<typename T>
|
||||
static int parse_args(queue<string>& tokens, T& value)
|
||||
{
|
||||
if (tokens.empty())
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
int rc = from_str(tokens.front(), value);
|
||||
|
||||
tokens.pop();
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
template<typename T, typename... Args>
|
||||
static int parse_args(queue<string>& tokens, T& value, Args&... args)
|
||||
{
|
||||
if (tokens.empty())
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
int rc = from_str(tokens.front(), value);
|
||||
|
||||
tokens.pop();
|
||||
|
||||
if ( rc != 0 )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return parse_args(tokens, args...);
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
int VirtualMachinePoolXML::set_up()
|
||||
{
|
||||
@ -38,7 +131,7 @@ int VirtualMachinePoolXML::set_up()
|
||||
for ( it = objects.begin(); it != objects.end(); ++it )
|
||||
{
|
||||
vm_resources.add_resource(it->first);
|
||||
}
|
||||
}
|
||||
|
||||
if (NebulaLog::log_level() >= Log::DDDEBUG)
|
||||
{
|
||||
@ -282,16 +375,133 @@ int VirtualMachineActionsPoolXML::set_up()
|
||||
int VirtualMachineActionsPoolXML::action(
|
||||
int vid,
|
||||
const string& action,
|
||||
const string& args,
|
||||
string& error_msg) const
|
||||
{
|
||||
xmlrpc_c::value result;
|
||||
bool success;
|
||||
|
||||
queue<string> sargs;
|
||||
string tmp_arg;
|
||||
|
||||
stringstream ss(args);
|
||||
|
||||
while (getline(ss, tmp_arg, ','))
|
||||
{
|
||||
sargs.push(tmp_arg);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (action == "snapshot-create")
|
||||
{
|
||||
client->call("one.vm.snapshotcreate", "is", &result, vid, "");
|
||||
string name = "";
|
||||
|
||||
int rc = parse_args(sargs, name);
|
||||
|
||||
if (rc != 0)
|
||||
{
|
||||
error_msg = "Missing or malformed ARGS for: snapshot-create."
|
||||
" Format: snapshot-name";
|
||||
return -1;
|
||||
}
|
||||
|
||||
client->call("one.vm.snapshotcreate",
|
||||
"is",
|
||||
&result,
|
||||
vid,
|
||||
name.c_str());
|
||||
}
|
||||
else if (action == "snapshot-revert")
|
||||
{
|
||||
int snapid = 0;
|
||||
|
||||
int rc = parse_args(sargs, snapid);
|
||||
|
||||
if (rc != 0)
|
||||
{
|
||||
error_msg = "Missing or malformed ARGS for: snapshot-revert."
|
||||
" Format: snapshot-id";
|
||||
return -1;
|
||||
}
|
||||
|
||||
client->call("one.vm.snapshotrevert", "ii", &result, vid, snapid);
|
||||
}
|
||||
else if (action == "snapshot-delete")
|
||||
{
|
||||
int snapid = 0;
|
||||
|
||||
int rc = parse_args(sargs, snapid);
|
||||
|
||||
if (rc != 0)
|
||||
{
|
||||
error_msg = "Missing or malformed ARGS for: snapshot-delete."
|
||||
" Format: snapshot-id";
|
||||
return -1;
|
||||
}
|
||||
|
||||
client->call("one.vm.snapshotdelete", "ii", &result, vid, snapid);
|
||||
}
|
||||
else if (action == "disk-snapshot-create")
|
||||
{
|
||||
int diskid = 0;
|
||||
string name = "";
|
||||
|
||||
int rc = parse_args(sargs, diskid, name);
|
||||
|
||||
if (rc != 0)
|
||||
{
|
||||
error_msg = "Missing or malformed ARGS for: disk-snapshot-create."
|
||||
" Format: disk-id, snapshot-name";
|
||||
return -1;
|
||||
}
|
||||
|
||||
client->call("one.vm.disksnapshotcreate",
|
||||
"iis",
|
||||
&result,
|
||||
vid,
|
||||
diskid,
|
||||
name.c_str());
|
||||
}
|
||||
else if (action == "disk-snapshot-revert")
|
||||
{
|
||||
int diskid = 0, snapid = 0;
|
||||
|
||||
int rc = parse_args(sargs, diskid, snapid);
|
||||
|
||||
if (rc != 0)
|
||||
{
|
||||
error_msg = "Missing or malformed ARGS for: disk-snapshot-revert."
|
||||
" Format: disk-id, snapshot-id";
|
||||
return -1;
|
||||
}
|
||||
|
||||
client->call("one.vm.disksnapshotrevert",
|
||||
"iii",
|
||||
&result,
|
||||
vid,
|
||||
diskid,
|
||||
snapid);
|
||||
}
|
||||
else if (action == "disk-snapshot-delete")
|
||||
{
|
||||
int diskid = 0, snapid = 0;
|
||||
|
||||
int rc = parse_args(sargs, diskid, snapid);
|
||||
|
||||
if (rc != 0)
|
||||
{
|
||||
error_msg = "Missing or malformed ARGS for: disk-snapshot-delete."
|
||||
" Format: disk-id, snapshot-id";
|
||||
return -1;
|
||||
}
|
||||
|
||||
client->call("one.vm.disksnapshotdelete",
|
||||
"iii",
|
||||
&result,
|
||||
vid,
|
||||
diskid,
|
||||
snapid);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -318,6 +528,7 @@ int VirtualMachineActionsPoolXML::action(
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
|
@ -657,6 +657,11 @@ int VirtualMachineXML::parse_action_name(string& action_st)
|
||||
&& action_st != "poweroff"
|
||||
&& action_st != "poweroff-hard"
|
||||
&& action_st != "snapshot-create"
|
||||
&& action_st != "snapshot-revert"
|
||||
&& action_st != "snapshot-delete"
|
||||
&& action_st != "disk-snapshot-create"
|
||||
&& action_st != "disk-snapshot-revert"
|
||||
&& action_st != "disk-snapshot-delete"
|
||||
|
||||
// Compatibility with 4.x
|
||||
&& action_st != "shutdown"
|
||||
|
@ -1714,7 +1714,7 @@ int Scheduler::do_scheduled_actions()
|
||||
const map<int, ObjectXML*> vms = vmapool->get_objects();
|
||||
map<int, ObjectXML*>::const_iterator vm_it;
|
||||
|
||||
string action_st, error_msg;
|
||||
string action_st, args_st, error_msg;
|
||||
|
||||
string time_str = one_util::log_time(time(0));
|
||||
|
||||
@ -1736,6 +1736,7 @@ int Scheduler::do_scheduled_actions()
|
||||
}
|
||||
|
||||
action_st = (*action)->vector_value("ACTION");
|
||||
args_st = (*action)->vector_value("ARGS");
|
||||
|
||||
int rc = VirtualMachineXML::parse_action_name(action_st);
|
||||
|
||||
@ -1748,7 +1749,7 @@ int Scheduler::do_scheduled_actions()
|
||||
}
|
||||
else
|
||||
{
|
||||
rc = vmapool->action(vm->get_oid(), action_st, error_msg);
|
||||
rc = vmapool->action(vm->get_oid(), action_st, args_st, error_msg);
|
||||
|
||||
if (rc == 0)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user