diff options
-rw-r--r-- | lib/chef/provider/windows_task.rb | 23 | ||||
-rw-r--r-- | lib/chef/resource/windows_task.rb | 19 | ||||
-rw-r--r-- | spec/functional/resource/windows_task_spec.rb | 25 | ||||
-rw-r--r-- | spec/unit/provider/windows_task_spec.rb | 28 |
4 files changed, 84 insertions, 11 deletions
diff --git a/lib/chef/provider/windows_task.rb b/lib/chef/provider/windows_task.rb index 8703c30da9..7dbb4fa8c3 100644 --- a/lib/chef/provider/windows_task.rb +++ b/lib/chef/provider/windows_task.rb @@ -89,11 +89,17 @@ class Chef basic_validation options = {} options["F"] = "" if new_resource.force || task_need_update? - options["SC"] = schedule + if schedule == :none + options["SC"] = :once + options["ST"] = "00:00" + options["SD"] = convert_user_date_to_system_date "12/12/2012" + else + options["SC"] = schedule + options["ST"] = new_resource.start_time unless new_resource.start_time.nil? + options["SD"] = convert_user_date_to_system_date new_resource.start_day unless new_resource.start_day.nil? + end options["MO"] = new_resource.frequency_modifier if frequency_modifier_allowed options["I"] = new_resource.idle_time unless new_resource.idle_time.nil? - options["SD"] = convert_user_date_to_system_date new_resource.start_day unless new_resource.start_day.nil? - options["ST"] = new_resource.start_time unless new_resource.start_time.nil? options["TR"] = new_resource.command options["RU"] = new_resource.user options["RP"] = new_resource.password if use_password? @@ -277,6 +283,7 @@ class Chef :daily => "Triggers/CalendarTrigger/RandomDelay", :weekly => "Triggers/CalendarTrigger/RandomDelay", :monthly => "Triggers/CalendarTrigger/RandomDelay", + :none => "Triggers", } xml_element_mapping = { @@ -297,6 +304,12 @@ class Chef doc = REXML::Document.new(xml_cmd.stdout) + if new_resource.frequency == :none + doc.root.elements.delete(xml_element_mapping["random_delay"]) + cwd_element = REXML::Element.new(xml_element_mapping["random_delay"]) + doc.root.elements.add(cwd_element) + end + options.each do |option| Chef::Log.debug 'Removing former #{option} if any' doc.root.elements.delete(xml_element_mapping[option]) @@ -410,7 +423,8 @@ class Chef task[:idle_time] = root.elements["Settings/IdleSettings/Duration"].text if root.elements["Settings/IdleSettings/Duration"] && task[:on_idle] - task[:once] = true if !(task[:repetition_interval] || task[:schedule_by_day] || task[:schedule_by_week] || task[:schedule_by_month] || task[:on_logon] || task[:onstart] || task[:on_idle]) + task[:none] = true if root.elements["Triggers/"] && root.elements["Triggers/"].entries.empty? + task[:once] = true if !(task[:repetition_interval] || task[:schedule_by_day] || task[:schedule_by_week] || task[:schedule_by_month] || task[:on_logon] || task[:onstart] || task[:on_idle] || task[:none]) task[:execution_time_limit] = root.elements["Settings/ExecutionTimeLimit"].text if root.elements["Settings/ExecutionTimeLimit"] #by default PT72H task[:random_delay] = root.elements["Triggers/TimeTrigger/RandomDelay"].text if root.elements["Triggers/TimeTrigger/RandomDelay"] task[:random_delay] = root.elements["Triggers/CalendarTrigger/RandomDelay"].text if root.elements["Triggers/CalendarTrigger/RandomDelay"] @@ -481,6 +495,7 @@ class Chef current_resource.frequency(:onstart) if task_hash[:onstart] current_resource.frequency(:on_idle) if task_hash[:on_idle] current_resource.frequency(:once) if task_hash[:once] + current_resource.frequency(:none) if task_hash[:none] end def set_current_idle_time(idle_time) diff --git a/lib/chef/resource/windows_task.rb b/lib/chef/resource/windows_task.rb index f9c0599c49..235bbdfd67 100644 --- a/lib/chef/resource/windows_task.rb +++ b/lib/chef/resource/windows_task.rb @@ -51,7 +51,8 @@ class Chef :once, :on_logon, :onstart, - :on_idle], default: :hourly + :on_idle, + :none], default: :hourly property :start_day, String property :start_time, String property :day, [String, Integer] @@ -81,7 +82,7 @@ class Chef execution_time_limit("PT72H") end - validate_start_time(start_time) if frequency == :once + validate_start_time(start_time, frequency) validate_start_day(start_day, frequency) if start_day validate_user_and_password(user, password) validate_interactive_setting(interactive_enabled, password) @@ -94,7 +95,7 @@ class Chef private def validate_random_delay(random_delay, frequency) - if [:once, :on_logon, :onstart, :on_idle].include? frequency + if [:once, :on_logon, :onstart, :on_idle, :none].include? frequency raise ArgumentError, "`random_delay` property is supported only for frequency :minute, :hourly, :daily, :weekly and :monthly" end @@ -102,13 +103,17 @@ class Chef end def validate_start_day(start_day, frequency) - if [:once, :on_logon, :onstart, :on_idle].include? frequency + if [:once, :on_logon, :onstart, :on_idle, :none].include? frequency raise ArgumentError, "`start_day` property is not supported with frequency: #{frequency}" end end - def validate_start_time(start_time) - raise ArgumentError, "`start_time` needs to be provided with `frequency :once`" unless start_time + def validate_start_time(start_time, frequency) + if frequency == :once + raise ArgumentError, "`start_time` needs to be provided with `frequency :once`" unless start_time + elsif frequency == :none + raise ArgumentError, "`start_time` property is not supported with `frequency :none`" if start_time + end end SYSTEM_USERS = ['NT AUTHORITY\SYSTEM', "SYSTEM", 'NT AUTHORITY\LOCALSERVICE', 'NT AUTHORITY\NETWORKSERVICE', 'BUILTIN\USERS', "USERS"].freeze @@ -132,7 +137,7 @@ class Chef end def validate_create_frequency_modifier(frequency, frequency_modifier) - # Currently is handled in create action 'frequency_modifier_allowed' line. Does not allow for frequency_modifier for once,onstart,onlogon,onidle + # Currently is handled in create action 'frequency_modifier_allowed' line. Does not allow for frequency_modifier for once,onstart,onlogon,onidle,none # Note that 'OnEvent' is not a supported frequency. unless frequency.nil? || frequency_modifier.nil? case frequency diff --git a/spec/functional/resource/windows_task_spec.rb b/spec/functional/resource/windows_task_spec.rb index fbb5e4dd12..5ee0ba3f70 100644 --- a/spec/functional/resource/windows_task_spec.rb +++ b/spec/functional/resource/windows_task_spec.rb @@ -158,6 +158,31 @@ describe Chef::Resource::WindowsTask, :windows_only do end end + context "frequency :none" do + subject do + new_resource = Chef::Resource::WindowsTask.new(task_name, run_context) + new_resource.command task_name + new_resource.run_level :highest + new_resource.frequency :none + new_resource.random_delay "" + new_resource + end + + it "creates the scheduled task to run on demand only" do + subject.run_action(:create) + task_details = windows_task_provider.send(:load_task_hash, task_name) + + expect(task_details[:TaskName]).to eq("\\chef-client") + expect(task_details[:TaskToRun]).to eq("chef-client") + expect(task_details[:ScheduleType]).to eq("On demand only") + expect(task_details[:StartTime]).to eq("N/A") + expect(task_details[:StartDate]).to eq("N/A") + expect(task_details[:NextRunTime]).to eq("N/A") + expect(task_details[:none]).to eq(true) + expect(task_details[:run_level]).to eq("HighestAvailable") + end + end + context "frequency :weekly" do subject do new_resource = Chef::Resource::WindowsTask.new(task_name, run_context) diff --git a/spec/unit/provider/windows_task_spec.rb b/spec/unit/provider/windows_task_spec.rb index ec66cf2551..137cc8564d 100644 --- a/spec/unit/provider/windows_task_spec.rb +++ b/spec/unit/provider/windows_task_spec.rb @@ -143,6 +143,17 @@ describe Chef::Provider::WindowsTask do provider.run_action(:create) expect(new_resource).to be_updated_by_last_action end + + it "updates the task XML if frequency is set as `:none`" do + new_resource.frequency :none + new_resource.random_delay "" + allow(provider).to receive(:task_need_update?).and_return(true) + allow(provider).to receive(:basic_validation).and_return(true) + allow(provider).to receive(:run_schtasks).with("CREATE", { "F" => "", "SC" => :once, "ST" => "00:00", "SD" => "12/12/2012", "TR" => nil, "RU" => "SYSTEM" }).twice + expect(provider).to receive(:update_task_xml) + provider.run_action(:create) + expect(new_resource).to be_updated_by_last_action + end end end @@ -507,6 +518,18 @@ describe Chef::Provider::WindowsTask do expect(provider).to receive(:run_schtasks).twice output = provider.send(:update_task_xml, ["random_delay"]) end + + it "updates the task XML if frequency is set as `:none`" do + new_resource.frequency :none + new_resource.random_delay "" + shell_out_obj = double("xml", :exitstatus => 0, :stdout => task_xml) + allow(provider).to receive(:powershell_out).and_return(shell_out_obj) + expect(::File).to receive(:delete) + expect(::File).to receive(:join) + expect(::File).to receive(:open) + expect(provider).to receive(:run_schtasks).twice + output = provider.send(:update_task_xml, ["random_delay"]) + end end describe "#load_task_hash" do @@ -541,5 +564,10 @@ describe Chef::Provider::WindowsTask do new_resource.frequency :once expect(provider.send(:frequency_modifier_allowed)).to be(false) end + + it "returns false for frequency :none" do + new_resource.frequency :none + expect(provider.send(:frequency_modifier_allowed)).to be(false) + end end end |