From 41b1842dc683535a879ff7de0dd6df222fd04d97 Mon Sep 17 00:00:00 2001 From: Matthew Hu Date: Tue, 23 Jun 2020 19:55:53 -0400 Subject: [PATCH 1/2] Added qos option to torque and slurm --- lib/ood_core/job/adapters/slurm.rb | 1 + lib/ood_core/job/adapters/torque.rb | 1 + lib/ood_core/job/script.rb | 10 +++++++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/ood_core/job/adapters/slurm.rb b/lib/ood_core/job/adapters/slurm.rb index d2da58a38..ed20afa15 100644 --- a/lib/ood_core/job/adapters/slurm.rb +++ b/lib/ood_core/job/adapters/slurm.rb @@ -382,6 +382,7 @@ def submit(script, after: [], afterok: [], afternotok: [], afterany: []) args.concat ["-A", script.accounting_id] unless script.accounting_id.nil? args.concat ["-t", seconds_to_duration(script.wall_time)] unless script.wall_time.nil? args.concat ['-a', script.job_array_request] unless script.job_array_request.nil? + args.concat ['--qos', script.qos] unless script.qos.nil? # ignore nodes, don't know how to do this for slurm # Set dependencies diff --git a/lib/ood_core/job/adapters/torque.rb b/lib/ood_core/job/adapters/torque.rb index fae19e6c8..2f447b841 100644 --- a/lib/ood_core/job/adapters/torque.rb +++ b/lib/ood_core/job/adapters/torque.rb @@ -156,6 +156,7 @@ def submit(script, after: [], afterok: [], afternotok: [], afterany: []) args.concat ["-W", "depend=#{depend.join(",")}"] unless depend.empty? args.concat ["-l", "walltime=#{seconds_to_duration(script.wall_time)}"] unless script.wall_time.nil? args.concat ['-t', script.job_array_request] unless script.job_array_request.nil? + args.concat ['-l', "qos=#{script.qos}"] unless script.qos.nil? # Set environment variables env = script.job_environment.to_h args.concat ["-v", env.keys.join(",")] unless env.empty? diff --git a/lib/ood_core/job/script.rb b/lib/ood_core/job/script.rb index 204c9c7c2..578907e6f 100644 --- a/lib/ood_core/job/script.rb +++ b/lib/ood_core/job/script.rb @@ -99,6 +99,10 @@ class Script # @return [String, nil] job array request attr_reader :job_array_request + # The qos selected for the job + # @return [String, nil] qos + attr_reader :qos + # Object detailing any native specifications that are implementation specific # @note Should not be used at all costs. # @return [Object, nil] native specifications @@ -130,6 +134,8 @@ class Script # @param start_time [#to_i, nil] eligible start time # @param wall_time [#to_i, nil] max real time # @param accounting_id [#to_s, nil] accounting id + # @param job_array_request [#to_s, nil] job array request + # @param qos [#to_s, nil] qos # @param native [Object, nil] native specifications # @param copy_environment [Boolean, nil] copy the environment def initialize(content:, args: nil, submit_as_hold: nil, rerunnable: nil, @@ -139,7 +145,7 @@ def initialize(content:, args: nil, submit_as_hold: nil, rerunnable: nil, output_path: nil, error_path: nil, reservation_id: nil, queue_name: nil, priority: nil, start_time: nil, wall_time: nil, accounting_id: nil, job_array_request: nil, - native: nil, copy_environment: nil, **_) + qos: nil, native: nil, copy_environment: nil, **_) @content = content.to_s @submit_as_hold = submit_as_hold @@ -163,6 +169,7 @@ def initialize(content:, args: nil, submit_as_hold: nil, rerunnable: nil, @wall_time = wall_time && wall_time.to_i @accounting_id = accounting_id && accounting_id.to_s @job_array_request = job_array_request && job_array_request.to_s + @qos = qos && qos.to_s @native = native @copy_environment = (copy_environment.nil?) ? nil : !! copy_environment end @@ -192,6 +199,7 @@ def to_h wall_time: wall_time, accounting_id: accounting_id, job_array_request: job_array_request, + qos: qos, native: native, copy_environment: copy_environment } From 6c46b807dfe1563c82c3fc80f7357752cd3f1afb Mon Sep 17 00:00:00 2001 From: Matthew Hu Date: Wed, 1 Jul 2020 10:47:46 -0400 Subject: [PATCH 2/2] testing for QOS --- spec/job/adapters/slurm_spec.rb | 6 ++++++ spec/job/adapters/torque_spec.rb | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/spec/job/adapters/slurm_spec.rb b/spec/job/adapters/slurm_spec.rb index 8563ec9ec..8987eb4fe 100644 --- a/spec/job/adapters/slurm_spec.rb +++ b/spec/job/adapters/slurm_spec.rb @@ -227,6 +227,12 @@ def build_script(opts = {}) it { expect(slurm).to have_received(:submit_string).with(content, args: ["--export", "NONE", "A", "B", "C"], env: {}) } end + context "with :qos" do + before { adapter.submit(build_script(qos: 'high')) } + + it { expect(slurm).to have_received(:submit_string).with(content, args:["--qos", "high", "--export", "NONE"], env: {})} + end + %i(after afterok afternotok afterany).each do |after| context "and :#{after} is defined as a single job id" do before { adapter.submit(build_script, after => "job_id") } diff --git a/spec/job/adapters/torque_spec.rb b/spec/job/adapters/torque_spec.rb index 715c87cfa..c75f0493d 100644 --- a/spec/job/adapters/torque_spec.rb +++ b/spec/job/adapters/torque_spec.rb @@ -215,6 +215,12 @@ def build_script(opts = {}) it { expect(pbs).to have_received(:submit).with(content, args: ["-l", "walltime=26:15:34", "-j", "oe"], env: {}, chdir: nil) } end + context "with :qos" do + before { adapter.submit(build_script(qos: "high")) } + + it { expect(pbs).to have_received(:submit).with(content, args: ["-l", "qos=high", "-j", "oe"], env: {}, chdir: nil)} + end + context "with :native" do before { adapter.submit(build_script(native: ["A", "B", "C"])) }