ood_core 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +63 -20
- data/lib/ood_core.rb +6 -0
- data/lib/ood_core/batch_connect/factory.rb +42 -0
- data/lib/ood_core/batch_connect/template.rb +207 -0
- data/lib/ood_core/batch_connect/templates/basic.rb +23 -0
- data/lib/ood_core/batch_connect/templates/vnc.rb +201 -0
- data/lib/ood_core/cluster.rb +33 -8
- data/lib/ood_core/errors.rb +6 -0
- data/lib/ood_core/job/adapter.rb +11 -0
- data/lib/ood_core/job/adapters/lsf.rb +16 -22
- data/lib/ood_core/job/adapters/lsf/batch.rb +28 -15
- data/lib/ood_core/job/adapters/lsf/helper.rb +79 -0
- data/lib/ood_core/job/adapters/pbspro.rb +424 -0
- data/lib/ood_core/job/adapters/slurm.rb +8 -0
- data/lib/ood_core/job/adapters/torque.rb +32 -2
- data/lib/ood_core/job/info.rb +9 -2
- data/lib/ood_core/refinements/hash_extensions.rb +9 -0
- data/lib/ood_core/version.rb +1 -1
- data/ood_core.gemspec +1 -1
- metadata +11 -6
@@ -455,6 +455,13 @@ module OodCore
|
|
455
455
|
# Parse hash describing Slurm job status
|
456
456
|
def parse_job_info(v)
|
457
457
|
allocated_nodes = parse_nodes(v[:node_list])
|
458
|
+
if allocated_nodes.empty?
|
459
|
+
if v[:scheduled_nodes] && v[:scheduled_nodes] != "(null)"
|
460
|
+
allocated_nodes = parse_nodes(v[:scheduled_nodes])
|
461
|
+
else
|
462
|
+
allocated_nodes = [ { name: nil } ] * v[:nodes].to_i
|
463
|
+
end
|
464
|
+
end
|
458
465
|
Info.new(
|
459
466
|
id: v[:job_id],
|
460
467
|
status: get_state(v[:state_compact]),
|
@@ -466,6 +473,7 @@ module OodCore
|
|
466
473
|
procs: v[:cpus],
|
467
474
|
queue_name: v[:partition],
|
468
475
|
wallclock_time: duration_in_seconds(v[:time_used]),
|
476
|
+
wallclock_limit: duration_in_seconds(v[:time_limit]),
|
469
477
|
cpu_time: nil,
|
470
478
|
submission_time: Time.parse(v[:submit_time]),
|
471
479
|
dispatch_time: v[:start_time] == "N/A" ? nil : Time.parse(v[:start_time]),
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require "ood_core/refinements/hash_extensions"
|
2
2
|
|
3
|
-
gem "pbs", "~> 2.
|
3
|
+
gem "pbs", "~> 2.1"
|
4
4
|
require "pbs"
|
5
5
|
|
6
6
|
module OodCore
|
@@ -27,6 +27,7 @@ module OodCore
|
|
27
27
|
# An adapter object that describes the communication with a Torque resource
|
28
28
|
# manager for job management.
|
29
29
|
class Torque < Adapter
|
30
|
+
using Refinements::ArrayExtensions
|
30
31
|
using Refinements::HashExtensions
|
31
32
|
|
32
33
|
# Mapping of state characters for PBS
|
@@ -133,6 +134,24 @@ module OodCore
|
|
133
134
|
raise JobAdapterError, e.message
|
134
135
|
end
|
135
136
|
|
137
|
+
# Retrieve info for all jobs for a given owner or owners from the
|
138
|
+
# resource manager
|
139
|
+
# @param owner [#to_s, Array<#to_s>] the owner(s) of the jobs
|
140
|
+
# @raise [JobAdapterError] if something goes wrong getting job info
|
141
|
+
# @return [Array<Info>] information describing submitted jobs
|
142
|
+
def info_where_owner(owner)
|
143
|
+
owner = Array.wrap(owner).map(&:to_s)
|
144
|
+
@pbs.select_jobs(
|
145
|
+
attribs: [
|
146
|
+
{ name: "User_List", value: owner.join(","), op: :eq }
|
147
|
+
]
|
148
|
+
).map do |k, v|
|
149
|
+
parse_job_info(k, v)
|
150
|
+
end
|
151
|
+
rescue PBS::Error => e
|
152
|
+
raise JobAdapterError, e.message
|
153
|
+
end
|
154
|
+
|
136
155
|
# Retrieve job info from the resource manager
|
137
156
|
# @param id [#to_s] the id of the job
|
138
157
|
# @raise [JobAdapterError] if something goes wrong getting job info
|
@@ -238,6 +257,16 @@ module OodCore
|
|
238
257
|
def parse_job_info(k, v)
|
239
258
|
/^(?<job_owner>[\w-]+)@/ =~ v[:Job_Owner]
|
240
259
|
allocated_nodes = parse_nodes(v[:exec_host] || "")
|
260
|
+
procs = allocated_nodes.inject(0) { |sum, x| sum + x[:procs] }
|
261
|
+
if allocated_nodes.empty?
|
262
|
+
allocated_nodes = [ { name: nil } ] * v.fetch(:Resource_List, {})[:nodect].to_i
|
263
|
+
# Only cover the simplest of cases where there is a single
|
264
|
+
# `ppn=##` and ignore otherwise
|
265
|
+
ppn_list = v.fetch(:Resource_List, {})[:nodes].to_s.scan(/ppn=(\d+)/)
|
266
|
+
if ppn_list.size == 1
|
267
|
+
procs = allocated_nodes.size * ppn_list.first.first.to_i
|
268
|
+
end
|
269
|
+
end
|
241
270
|
Info.new(
|
242
271
|
id: k,
|
243
272
|
status: STATE_MAP.fetch(v[:job_state], :undetermined),
|
@@ -246,9 +275,10 @@ module OodCore
|
|
246
275
|
job_name: v[:Job_Name],
|
247
276
|
job_owner: job_owner,
|
248
277
|
accounting_id: v[:Account_Name],
|
249
|
-
procs:
|
278
|
+
procs: procs,
|
250
279
|
queue_name: v[:queue],
|
251
280
|
wallclock_time: duration_in_seconds(v.fetch(:resources_used, {})[:walltime]),
|
281
|
+
wallclock_limit: duration_in_seconds(v.fetch(:Resource_List, {})[:walltime]),
|
252
282
|
cpu_time: duration_in_seconds(v.fetch(:resources_used, {})[:cput]),
|
253
283
|
submission_time: v[:ctime],
|
254
284
|
dispatch_time: v[:start_time],
|
data/lib/ood_core/job/info.rb
CHANGED
@@ -44,6 +44,10 @@ module OodCore
|
|
44
44
|
# @return [Fixnum, nil] wallclock time
|
45
45
|
attr_reader :wallclock_time
|
46
46
|
|
47
|
+
# The total wall clock time limit in seconds
|
48
|
+
# @return [Fixnum, nil] wallclock time limit
|
49
|
+
attr_reader :wallclock_limit
|
50
|
+
|
47
51
|
# The accumulated CPU time in seconds
|
48
52
|
# @return [Fixnum, nil] cpu time
|
49
53
|
attr_reader :cpu_time
|
@@ -71,6 +75,7 @@ module OodCore
|
|
71
75
|
# @param procs [#to_i, nil] allocated total number of procs
|
72
76
|
# @param queue_name [#to_s, nil] queue name
|
73
77
|
# @param wallclock_time [#to_i, nil] wallclock time
|
78
|
+
# @param wallclock_limit [#to_i, nil] wallclock time limit
|
74
79
|
# @param cpu_time [#to_i, nil] cpu time
|
75
80
|
# @param submission_time [#to_i, nil] submission time
|
76
81
|
# @param dispatch_time [#to_i, nil] dispatch time
|
@@ -78,8 +83,8 @@ module OodCore
|
|
78
83
|
def initialize(id:, status:, allocated_nodes: [], submit_host: nil,
|
79
84
|
job_name: nil, job_owner: nil, accounting_id: nil,
|
80
85
|
procs: nil, queue_name: nil, wallclock_time: nil,
|
81
|
-
|
82
|
-
native: nil, **_)
|
86
|
+
wallclock_limit: nil, cpu_time: nil, submission_time: nil,
|
87
|
+
dispatch_time: nil, native: nil, **_)
|
83
88
|
@id = id.to_s
|
84
89
|
@status = Status.new(state: status.to_sym)
|
85
90
|
@allocated_nodes = allocated_nodes.map { |n| NodeInfo.new(n.to_h) }
|
@@ -90,6 +95,7 @@ module OodCore
|
|
90
95
|
@procs = procs && procs.to_i
|
91
96
|
@queue_name = queue_name && queue_name.to_s
|
92
97
|
@wallclock_time = wallclock_time && wallclock_time.to_i
|
98
|
+
@wallclock_limit = wallclock_limit && wallclock_limit.to_i
|
93
99
|
@cpu_time = cpu_time && cpu_time.to_i
|
94
100
|
@submission_time = submission_time && Time.at(submission_time.to_i)
|
95
101
|
@dispatch_time = dispatch_time && Time.at(dispatch_time.to_i)
|
@@ -110,6 +116,7 @@ module OodCore
|
|
110
116
|
procs: procs,
|
111
117
|
queue_name: queue_name,
|
112
118
|
wallclock_time: wallclock_time,
|
119
|
+
wallclock_limit: wallclock_limit,
|
113
120
|
cpu_time: cpu_time,
|
114
121
|
submission_time: submission_time,
|
115
122
|
dispatch_time: dispatch_time,
|
@@ -19,6 +19,15 @@ module OodCore
|
|
19
19
|
keys.map! { |key| convert_key(key) } if respond_to?(:convert_key, true)
|
20
20
|
keys.each_with_object(self.class.new) { |k, hash| hash[k] = self[k] if has_key?(k) }
|
21
21
|
end
|
22
|
+
|
23
|
+
# Return a hash with non `nil` values
|
24
|
+
# @example
|
25
|
+
# { a: 1, b: nil, c: 3, d: nil }.compact
|
26
|
+
# # => {:a=>1, :c=>3}
|
27
|
+
# @see https://apidock.com/rails/Hash/compact
|
28
|
+
def compact
|
29
|
+
self.select { |_, value| !value.nil? }
|
30
|
+
end
|
22
31
|
end
|
23
32
|
end
|
24
33
|
end
|
data/lib/ood_core/version.rb
CHANGED
data/ood_core.gemspec
CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.required_ruby_version = ">= 2.2.0"
|
24
24
|
|
25
25
|
spec.add_runtime_dependency "ood_support", "~> 0.0.2"
|
26
|
-
spec.add_development_dependency "pbs", "~> 2.
|
26
|
+
spec.add_development_dependency "pbs", "~> 2.1", ">= 2.1.0"
|
27
27
|
spec.add_development_dependency "bundler", "~> 1.7"
|
28
28
|
spec.add_development_dependency "rake", "~> 10.0"
|
29
29
|
spec.add_development_dependency "rspec", "~> 3.0"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ood_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Nicklas
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05
|
11
|
+
date: 2017-07-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ood_support
|
@@ -30,20 +30,20 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '2.
|
33
|
+
version: '2.1'
|
34
34
|
- - ">="
|
35
35
|
- !ruby/object:Gem::Version
|
36
|
-
version: 2.0
|
36
|
+
version: 2.1.0
|
37
37
|
type: :development
|
38
38
|
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
40
40
|
requirements:
|
41
41
|
- - "~>"
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: '2.
|
43
|
+
version: '2.1'
|
44
44
|
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: 2.0
|
46
|
+
version: 2.1.0
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: bundler
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,6 +136,10 @@ files:
|
|
136
136
|
- lib/ood_core/acl/adapter.rb
|
137
137
|
- lib/ood_core/acl/adapters/group.rb
|
138
138
|
- lib/ood_core/acl/factory.rb
|
139
|
+
- lib/ood_core/batch_connect/factory.rb
|
140
|
+
- lib/ood_core/batch_connect/template.rb
|
141
|
+
- lib/ood_core/batch_connect/templates/basic.rb
|
142
|
+
- lib/ood_core/batch_connect/templates/vnc.rb
|
139
143
|
- lib/ood_core/cluster.rb
|
140
144
|
- lib/ood_core/clusters.rb
|
141
145
|
- lib/ood_core/errors.rb
|
@@ -143,6 +147,7 @@ files:
|
|
143
147
|
- lib/ood_core/job/adapters/lsf.rb
|
144
148
|
- lib/ood_core/job/adapters/lsf/batch.rb
|
145
149
|
- lib/ood_core/job/adapters/lsf/helper.rb
|
150
|
+
- lib/ood_core/job/adapters/pbspro.rb
|
146
151
|
- lib/ood_core/job/adapters/slurm.rb
|
147
152
|
- lib/ood_core/job/adapters/torque.rb
|
148
153
|
- lib/ood_core/job/factory.rb
|