summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNAshwini <ashwini.nehate@msystechnologies.com>2017-09-12 13:21:41 +0000
committerNAshwini <ashwini.nehate@msystechnologies.com>2017-09-20 17:56:46 +0530
commit82fb01b9dc854b8adb5dfde7e848b6a41beeb928 (patch)
treefe00986f71cbdd9e47f81512ffe378cc571b7fa1
parent8b91c383a5e88d5039163831f50f8bc42673bb61 (diff)
downloadchef-82fb01b9dc854b8adb5dfde7e848b6a41beeb928.tar.gz
Added none frequency to windows task resource
Signed-off-by: NAshwini <ashwini.nehate@msystechnologies.com>
-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
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