summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan McLellan <btm@loftninjas.org>2017-10-13 13:19:36 -0400
committerGitHub <noreply@github.com>2017-10-13 13:19:36 -0400
commit9ba0d593044e4b66dc6b28ba0355776c56d1bc17 (patch)
tree57576004045267976b80697a605d9893873966a2
parent71f4a954d0fd7c9cb0a636c5503e25c7cf46e9bd (diff)
parente295ddfad36a9c8fb35c65fe9099f75a17f1a3b0 (diff)
downloadchef-9ba0d593044e4b66dc6b28ba0355776c56d1bc17.tar.gz
Merge pull request #6394 from chef/ash/add_none_frequency_to_windows_task_resource
Windows: Added :none frequency to windows_task resource
-rw-r--r--lib/chef/provider/windows_task.rb23
-rw-r--r--lib/chef/resource/windows_task.rb19
-rw-r--r--spec/functional/resource/windows_task_spec.rb25
-rw-r--r--spec/unit/provider/windows_task_spec.rb28
-rw-r--r--spec/unit/resource/windows_task_spec.rb10
5 files changed, 92 insertions, 13 deletions
diff --git a/lib/chef/provider/windows_task.rb b/lib/chef/provider/windows_task.rb
index b090a3c1d3..588a731767 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"])
+ trigger_element = REXML::Element.new(xml_element_mapping["random_delay"])
+ doc.root.elements.add(trigger_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 c2496c702f..6c4b4c4fdc 100644
--- a/spec/functional/resource/windows_task_spec.rb
+++ b/spec/functional/resource/windows_task_spec.rb
@@ -163,6 +163,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 b18d842bfa..55a1e77e4e 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).and_return("CREATE", { "F" => "", "SC" => :once, "ST" => "00:00", "SD" => "12/12/2012", "TR" => nil, "RU" => "SYSTEM" })
+ 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
diff --git a/spec/unit/resource/windows_task_spec.rb b/spec/unit/resource/windows_task_spec.rb
index 2b3ee16024..cf4651cf52 100644
--- a/spec/unit/resource/windows_task_spec.rb
+++ b/spec/unit/resource/windows_task_spec.rb
@@ -102,8 +102,14 @@ describe Chef::Resource::WindowsTask do
end
context "#validate_start_time" do
- it "raises error if start_time is nil" do
- expect { resource.send(:validate_start_time, nil) }.to raise_error(Chef::Exceptions::ArgumentError, "`start_time` needs to be provided with `frequency :once`")
+ it "raises error if start_time is nil when frequency `:once`" do
+ resource.frequency :once
+ expect { resource.send(:validate_start_time, nil, :once) }.to raise_error(Chef::Exceptions::ArgumentError, "`start_time` needs to be provided with `frequency :once`")
+ end
+
+ it "raises error if start_time is given when frequency `:none`" do
+ resource.frequency :none
+ expect { resource.send(:validate_start_time, "12.00", :none) }.to raise_error(Chef::Exceptions::ArgumentError, "`start_time` property is not supported with `frequency :none`")
end
end