summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvasu1105 <vasundhara.jagdale@msystechnologies.com>2018-07-13 11:22:39 +0530
committervasu1105 <vasundhara.jagdale@msystechnologies.com>2018-07-25 09:31:41 +0530
commit5b7f53dc6253fe7da492da2392202575df3e3cd3 (patch)
treea4c36a9960b911e564d70b522926290a1d1e88bd
parent98762283604d272c39c9993dd407648f52db5c96 (diff)
downloadchef-5b7f53dc6253fe7da492da2392202575df3e3cd3.tar.gz
Add support for setting task priority
Signed-off-by: vasu1105 <vasundhara.jagdale@msystechnologies.com>
-rw-r--r--lib/chef/provider/windows_task.rb7
-rw-r--r--lib/chef/resource/windows_task.rb2
-rw-r--r--spec/functional/resource/windows_task_spec.rb102
-rw-r--r--spec/unit/resource/windows_task_spec.rb14
4 files changed, 124 insertions, 1 deletions
diff --git a/lib/chef/provider/windows_task.rb b/lib/chef/provider/windows_task.rb
index b1c59ec41c..045e418c7a 100644
--- a/lib/chef/provider/windows_task.rb
+++ b/lib/chef/provider/windows_task.rb
@@ -99,6 +99,9 @@ class Chef
31 => TaskScheduler::TASK_THIRTY_FIRST,
}.freeze
+ PRIORITY = { "critical" => 0, "highest" => 1, "above_normal_2" => 2 , "above_normal_3" => 3, "normal_4" => 4,
+ "normal_5" => 5, "normal_6" => 6, "below_normal_7" => 7, "below_normal_8" => 8, "lowest" => 9, "idle" => 10 }.freeze
+
def load_current_resource
@current_resource = Chef::Resource::WindowsTask.new(new_resource.name)
task = TaskScheduler.new(new_resource.task_name, nil, "\\", false)
@@ -349,7 +352,8 @@ class Chef
task.parameters != new_resource.command_arguments.to_s ||
task.working_directory != new_resource.cwd.to_s ||
task.principals[:logon_type] != logon_type ||
- task.principals[:run_level] != run_level
+ task.principals[:run_level] != run_level ||
+ PRIORITY[task.priority] != new_resource.priority
if trigger_type == TaskScheduler::MONTHLYDATE
flag = true if current_task_trigger[:run_on_last_day_of_month] != new_task_trigger[:run_on_last_day_of_month]
@@ -547,6 +551,7 @@ class Chef
}
settings[:idle_duration] = new_resource.idle_time if new_resource.idle_time
settings[:run_only_if_idle] = true if new_resource.idle_time
+ settings[:priority] = new_resource.priority
settings
end
diff --git a/lib/chef/resource/windows_task.rb b/lib/chef/resource/windows_task.rb
index b311caf743..97ade20774 100644
--- a/lib/chef/resource/windows_task.rb
+++ b/lib/chef/resource/windows_task.rb
@@ -59,6 +59,8 @@ class Chef
property :execution_time_limit, [String, Integer], default: "PT72H" # 72 hours in ISO8601 duration format
property :minutes_duration, [String, Integer]
property :minutes_interval, [String, Integer]
+ property :priority, Integer, description: "Use to set Priority Levels range from 0 to 10.", default: 7,
+ callbacks: { "should be in range of 0 to 10" => proc { |v| v >= 0 && v <= 10 } }
attr_accessor :exists, :task, :command_arguments
diff --git a/spec/functional/resource/windows_task_spec.rb b/spec/functional/resource/windows_task_spec.rb
index a4cee114f4..02c84d5229 100644
--- a/spec/functional/resource/windows_task_spec.rb
+++ b/spec/functional/resource/windows_task_spec.rb
@@ -1179,6 +1179,108 @@ describe Chef::Resource::WindowsTask, :windows_only do
end
end
+ describe "priority" do
+ after { delete_task }
+ subject do
+ new_resource = Chef::Resource::WindowsTask.new(task_name, run_context)
+ new_resource.command task_name
+ new_resource.frequency :once
+ new_resource.execution_time_limit = 259200 / 60 # converting "PT72H" into minutes and passing here since win32-taskscheduler accespts this
+ new_resource
+ end
+
+ it "default sets to 7" do
+ call_for_create_action
+ current_resource = call_for_load_current_resource
+ expect(current_resource.task.priority).to eq("below_normal_7")
+ end
+
+ it "0 sets priority level to critical" do
+ subject.priority = 0
+ call_for_create_action
+ current_resource = call_for_load_current_resource
+ expect(current_resource.task.priority).to eq("critical")
+ end
+
+ it "2 sets priority level to highest" do
+ subject.priority = 1
+ call_for_create_action
+ current_resource = call_for_load_current_resource
+ expect(current_resource.task.priority).to eq("highest")
+ end
+
+ it "2 sets priority level to above_normal" do
+ subject.priority = 2
+ call_for_create_action
+ current_resource = call_for_load_current_resource
+ expect(current_resource.task.priority).to eq("above_normal_2")
+ end
+
+ it "3 sets priority level to above_normal" do
+ subject.priority = 3
+ call_for_create_action
+ current_resource = call_for_load_current_resource
+ expect(current_resource.task.priority).to eq("above_normal_3")
+ end
+
+ it "4 sets priority level to normal" do
+ subject.priority = 4
+ call_for_create_action
+ current_resource = call_for_load_current_resource
+ expect(current_resource.task.priority).to eq("normal_4")
+ end
+
+ it "5 sets priority level to normal" do
+ subject.priority = 5
+ call_for_create_action
+ current_resource = call_for_load_current_resource
+ expect(current_resource.task.priority).to eq("normal_5")
+ end
+
+ it "6 sets priority level to normal" do
+ subject.priority = 6
+ call_for_create_action
+ current_resource = call_for_load_current_resource
+ expect(current_resource.task.priority).to eq("normal_6")
+ end
+
+ it "7 sets priority level to below_normal" do
+ subject.priority = 7
+ call_for_create_action
+ current_resource = call_for_load_current_resource
+ expect(current_resource.task.priority).to eq("below_normal_7")
+ end
+
+ it "8 sets priority level to below_normal" do
+ subject.priority = 8
+ call_for_create_action
+ current_resource = call_for_load_current_resource
+ expect(current_resource.task.priority).to eq("below_normal_8")
+ end
+
+ it "9 sets priority level to lowest" do
+ subject.priority = 9
+ call_for_create_action
+ current_resource = call_for_load_current_resource
+ expect(current_resource.task.priority).to eq("lowest")
+ end
+
+ it "10 sets priority level to idle" do
+ subject.priority = 10
+ call_for_create_action
+ current_resource = call_for_load_current_resource
+ expect(current_resource.task.priority).to eq("idle")
+ end
+
+ it "is idempotent" do
+ subject.priority 8
+ subject.run_action(:create)
+ subject.run_action(:create)
+ expect(subject).not_to be_updated_by_last_action
+ end
+
+ end
+
describe "Examples of idempotent checks for each frequency" do
after { delete_task }
context "For frequency :once" do
diff --git a/spec/unit/resource/windows_task_spec.rb b/spec/unit/resource/windows_task_spec.rb
index 6dbda35274..cbf15092f5 100644
--- a/spec/unit/resource/windows_task_spec.rb
+++ b/spec/unit/resource/windows_task_spec.rb
@@ -153,6 +153,20 @@ describe Chef::Resource::WindowsTask, :windows_only do
end
end
+ context "priority" do
+ it "default value is 7" do
+ expect(resource.priority).to eq(7)
+ end
+
+ it "raise error when priority value less than 0" do
+ expect { resource.priority (-1) }.to raise_error(Chef::Exceptions::ValidationFailed, "Option priority's value -1 should be in range of 0 to 10!")
+ end
+
+ it "raise error when priority values is greater than 10" do
+ expect { resource.priority 11 }.to raise_error(Chef::Exceptions::ValidationFailed, "Option priority's value 11 should be in range of 0 to 10!")
+ end
+ end
+
context "#validate_start_time" do
it "raises error if start_time is nil when frequency `:once`" do
resource.frequency :once