From e904781cf1a5e5e99892f4534141afcc9f669473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn?= Date: Tue, 5 Feb 2013 15:55:17 +0100 Subject: [PATCH] Feature #1483: Add new option --schedule TIME to onevm commands --- src/cli/one_helper/onevm_helper.rb | 29 +++++ src/cli/onevm | 143 +++++++++++++++------ src/oca/ruby/opennebula/virtual_machine.rb | 20 +++ 3 files changed, 153 insertions(+), 39 deletions(-) diff --git a/src/cli/one_helper/onevm_helper.rb b/src/cli/one_helper/onevm_helper.rb index 41f1646da2..d289d0d832 100644 --- a/src/cli/one_helper/onevm_helper.rb +++ b/src/cli/one_helper/onevm_helper.rb @@ -15,6 +15,7 @@ #--------------------------------------------------------------------------- # require 'one_helper' +require 'optparse/time' class OneVMHelper < OpenNebulaHelper::OneHelper MULTIPLE={ @@ -57,6 +58,13 @@ class OneVMHelper < OpenNebulaHelper::OneHelper :description => "Creates the new VM on hold state instead of pending" } + SCHEDULE = { + :name => "schedule", + :large => "--schedule TIME", + :description => "Schedules this action to be executed after the given time", + :format => Time + } + def self.rname "VM" end @@ -141,6 +149,27 @@ class OneVMHelper < OpenNebulaHelper::OneHelper table end + + def schedule_actions(ids,options,action) + perform_actions( + ids, options, + "#{action} scheduled at #{options[:schedule]}") do |vm| + + rc = vm.info + + if OpenNebula.is_error?(rc) + puts rc.message + exit -1 + end + + tmp_str = vm.user_template_str + + tmp_str << "\nSCHED_ACTION = [ACTION = #{action}, TIME = #{options[:schedule].to_i}]" + + vm.update(tmp_str) + end + end + private def factory(id=nil) diff --git a/src/cli/onevm b/src/cli/onevm index 913518457c..cea2d42190 100755 --- a/src/cli/onevm +++ b/src/cli/onevm @@ -192,9 +192,14 @@ cmd=CommandParser::CmdParser.new(ARGV) do States: ANY EOT - command :delete, delete_desc, [:range, :vmid_list] do - helper.perform_actions(args[0],options,"deleted") do |vm| - vm.finalize + command :delete, delete_desc, [:range, :vmid_list], + :options => [OneVMHelper::SCHEDULE] do + if (!options[:schedule].nil?) + helper.schedule_actions(args[0], options, @comm_name) + else + helper.perform_actions(args[0],options,"deleted") do |vm| + vm.finalize + end end end @@ -205,9 +210,14 @@ cmd=CommandParser::CmdParser.new(ARGV) do States: PENDING EOT - command :hold, hold_desc, [:range,:vmid_list] do - helper.perform_actions(args[0],options,"put on hold") do |vm| - vm.hold + command :hold, hold_desc, [:range,:vmid_list], + :options => [OneVMHelper::SCHEDULE] do + if (!options[:schedule].nil?) + helper.schedule_actions(args[0], options, @comm_name) + else + helper.perform_actions(args[0],options,"put on hold") do |vm| + vm.hold + end end end @@ -217,9 +227,14 @@ cmd=CommandParser::CmdParser.new(ARGV) do States: HOLD EOT - command :release, release_desc, [:range,:vmid_list] do - helper.perform_actions(args[0],options,"released") do |vm| - vm.release + command :release, release_desc, [:range,:vmid_list], + :options => [OneVMHelper::SCHEDULE] do + if (!options[:schedule].nil?) + helper.schedule_actions(args[0], options, @comm_name) + else + helper.perform_actions(args[0],options,"released") do |vm| + vm.release + end end end @@ -257,9 +272,14 @@ cmd=CommandParser::CmdParser.new(ARGV) do States: RUNNING EOT - command :shutdown, shutdown_desc, [:range,:vmid_list] do - helper.perform_actions(args[0],options,"shutting down") do |vm| - vm.shutdown + command :shutdown, shutdown_desc, [:range,:vmid_list], + :options => [OneVMHelper::SCHEDULE] do + if (!options[:schedule].nil?) + helper.schedule_actions(args[0], options, @comm_name) + else + helper.perform_actions(args[0],options,"shutting down") do |vm| + vm.shutdown + end end end @@ -270,9 +290,14 @@ cmd=CommandParser::CmdParser.new(ARGV) do States: RUNNING EOT - command :poweroff, poweroff_desc, [:range,:vmid_list] do - helper.perform_actions(args[0],options,"shutting down") do |vm| - vm.poweroff + command :poweroff, poweroff_desc, [:range,:vmid_list], + :options => [OneVMHelper::SCHEDULE] do + if (!options[:schedule].nil?) + helper.schedule_actions(args[0], options, @comm_name) + else + helper.perform_actions(args[0],options,"shutting down") do |vm| + vm.poweroff + end end end @@ -283,9 +308,14 @@ cmd=CommandParser::CmdParser.new(ARGV) do States: RUNNING EOT - command :reboot, reboot_desc, [:range,:vmid_list] do - helper.perform_actions(args[0],options,"rebooting") do |vm| - vm.reboot + command :reboot, reboot_desc, [:range,:vmid_list], + :options => [OneVMHelper::SCHEDULE] do + if (!options[:schedule].nil?) + helper.schedule_actions(args[0], options, @comm_name) + else + helper.perform_actions(args[0],options,"rebooting") do |vm| + vm.reboot + end end end @@ -295,9 +325,14 @@ cmd=CommandParser::CmdParser.new(ARGV) do States: RUNNING EOT - command :reset, reset_desc, [:range,:vmid_list] do - helper.perform_actions(args[0],options,"resetting") do |vm| - vm.reset + command :reset, reset_desc, [:range,:vmid_list], + :options => [OneVMHelper::SCHEDULE] do + if (!options[:schedule].nil?) + helper.schedule_actions(args[0], options, @comm_name) + else + helper.perform_actions(args[0],options,"resetting") do |vm| + vm.reset + end end end @@ -366,9 +401,14 @@ cmd=CommandParser::CmdParser.new(ARGV) do States: UNKNOWN, BOOT, POWEROFF EOT - command :restart, restart_desc, [:range,:vmid_list] do - helper.perform_actions(args[0],options,"restarting") do |vm| - vm.restart + command :restart, restart_desc, [:range,:vmid_list], + :options => [OneVMHelper::SCHEDULE] do + if (!options[:schedule].nil?) + helper.schedule_actions(args[0], options, @comm_name) + else + helper.perform_actions(args[0],options,"restarting") do |vm| + vm.restart + end end end @@ -380,9 +420,14 @@ cmd=CommandParser::CmdParser.new(ARGV) do States: ANY, except SUSPENDED or DONE EOT - command :resubmit, resubmit_desc, [:range,:vmid_list] do - helper.perform_actions(args[0],options,"resubmiting") do |vm| - vm.resubmit + command :resubmit, resubmit_desc, [:range,:vmid_list], + :options => [OneVMHelper::SCHEDULE] do + if (!options[:schedule].nil?) + helper.schedule_actions(args[0], options, @comm_name) + else + helper.perform_actions(args[0],options,"resubmiting") do |vm| + vm.resubmit + end end end @@ -394,9 +439,14 @@ cmd=CommandParser::CmdParser.new(ARGV) do States: RUNNING EOT - command :cancel, cancel_desc, [:range,:vmid_list] do - helper.perform_actions(args[0],options,"canceling") do |vm| - vm.cancel + command :cancel, cancel_desc, [:range,:vmid_list], + :options => [OneVMHelper::SCHEDULE] do + if (!options[:schedule].nil?) + helper.schedule_actions(args[0], options, @comm_name) + else + helper.perform_actions(args[0],options,"canceling") do |vm| + vm.cancel + end end end @@ -407,9 +457,14 @@ cmd=CommandParser::CmdParser.new(ARGV) do States: RUNNING EOT - command :stop, stop_desc, [:range,:vmid_list] do - helper.perform_actions(args[0],options,"stopping") do |vm| - vm.stop + command :stop, stop_desc, [:range,:vmid_list], + :options => [OneVMHelper::SCHEDULE] do + if (!options[:schedule].nil?) + helper.schedule_actions(args[0], options, @comm_name) + else + helper.perform_actions(args[0],options,"stopping") do |vm| + vm.stop + end end end @@ -422,9 +477,14 @@ cmd=CommandParser::CmdParser.new(ARGV) do States: RUNNING EOT - command :suspend, suspend_desc, [:range,:vmid_list] do - helper.perform_actions(args[0],options,"suspending") do |vm| - vm.suspend + command :suspend, suspend_desc, [:range,:vmid_list], + :options => [OneVMHelper::SCHEDULE] do + if (!options[:schedule].nil?) + helper.schedule_actions(args[0], options, @comm_name) + else + helper.perform_actions(args[0],options,"suspending") do |vm| + vm.suspend + end end end @@ -434,9 +494,14 @@ cmd=CommandParser::CmdParser.new(ARGV) do States: STOPPED, SUSPENDED EOT - command :resume, resume_desc, [:range,:vmid_list] do - helper.perform_actions(args[0],options,"resuming") do |vm| - vm.resume + command :resume, resume_desc, [:range,:vmid_list], + :options => [OneVMHelper::SCHEDULE] do + if (!options[:schedule].nil?) + helper.schedule_actions(args[0], options, @comm_name) + else + helper.perform_actions(args[0],options,"resuming") do |vm| + vm.resume + end end end diff --git a/src/oca/ruby/opennebula/virtual_machine.rb b/src/oca/ruby/opennebula/virtual_machine.rb index 94a21f22b6..ebf5be492b 100644 --- a/src/oca/ruby/opennebula/virtual_machine.rb +++ b/src/oca/ruby/opennebula/virtual_machine.rb @@ -155,6 +155,26 @@ module OpenNebula super(VM_METHODS[:update], new_template) end + # Returns the element in text form + # + # @param indent [true,false] indents the resulting string, defaults to true + # + # @return [String] The USER_TEMPLATE + def user_template_str(indent=true) + template_like_str('USER_TEMPLATE', indent) + end + + # Returns the element in XML form + # + # @return [String] The USER_TEMPLATE + def user_template_xml + if NOKOGIRI + @xml.xpath('TEMPLATE').to_s + else + @xml.elements['TEMPLATE'].to_s + end + end + # Initiates the instance of the VM on the target host. #