ood_core 0.22.0 → 0.23.0
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 +16 -1
- data/lib/ood_core/job/account_info.rb +36 -0
- data/lib/ood_core/job/adapter.rb +16 -0
- data/lib/ood_core/job/adapters/helper.rb +11 -0
- data/lib/ood_core/job/adapters/linux_host/launcher.rb +1 -1
- data/lib/ood_core/job/adapters/slurm.rb +64 -1
- data/lib/ood_core/job/queue_info.rb +33 -0
- data/lib/ood_core/version.rb +1 -1
- data/lib/ood_core.rb +2 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 379d230153e94bdbeca027f601afc89a525b328d8e200cc1a6a18754b3370b88
|
4
|
+
data.tar.gz: 5544e85c81b6e955a63144a056eee24d6bd5ec062de4d17a535d9df78eb5a817
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 972cabe2a634f50b730e29d31a54e34c2784ea707fd562b867c8f8731e4d612bd39fd8bcacb84b49585a08131d4f9e3770195f2c1c6036fde52ff4e3d4f7124c
|
7
|
+
data.tar.gz: 4a0997de2400017ad8a921358b76341706cd4e58034c881dd8b9dfe63e9d9b7c559c42ed711a13051cd5168dde6703164714d22ee1e8ae2d7980fa33d2da3e4c
|
data/CHANGELOG.md
CHANGED
@@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
7
7
|
|
8
8
|
## [Unreleased]
|
9
9
|
|
10
|
+
## [0.23.0] - 01-17-2023
|
11
|
+
|
12
|
+
### Added
|
13
|
+
|
14
|
+
- [787](https://github.com/OSC/ood_core/pull/787) added the `queues` API to the adapter class with
|
15
|
+
support for Slurm.
|
16
|
+
- [783](https://github.com/OSC/ood_core/pull/783) added the `accounts` API to the adapter class with
|
17
|
+
support for Slurm.
|
18
|
+
|
19
|
+
### Fixed
|
20
|
+
|
21
|
+
- The linux host adapter now supports apptainer in [788](https://github.com/OSC/ood_core/pull/788).
|
22
|
+
|
23
|
+
|
10
24
|
## [0.22.0] - 10-31-2022
|
11
25
|
|
12
26
|
### Added
|
@@ -455,7 +469,8 @@ Functionally the same as [0.17.3] but with some CI updates.
|
|
455
469
|
### Added
|
456
470
|
- Initial release!
|
457
471
|
|
458
|
-
[Unreleased]: https://github.com/OSC/ood_core/compare/v0.
|
472
|
+
[Unreleased]: https://github.com/OSC/ood_core/compare/v0.23.0...HEAD
|
473
|
+
[0.23.0]: https://github.com/OSC/ood_core/compare/v0.22.0...v0.23.0
|
459
474
|
[0.22.0]: https://github.com/OSC/ood_core/compare/v0.21.0...v0.22.0
|
460
475
|
[0.21.0]: https://github.com/OSC/ood_core/compare/v0.20.2...v0.21.0
|
461
476
|
[0.20.2]: https://github.com/OSC/ood_core/compare/v0.20.1...v0.20.2
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module OodCore
|
2
|
+
module Job
|
3
|
+
|
4
|
+
class AccountInfo
|
5
|
+
|
6
|
+
# The name of the account.
|
7
|
+
attr_reader :name
|
8
|
+
alias to_s name
|
9
|
+
|
10
|
+
# The QoS values this account can use.
|
11
|
+
attr_reader :qos
|
12
|
+
|
13
|
+
# The cluster this account is associated with.
|
14
|
+
attr_reader :cluster
|
15
|
+
|
16
|
+
# The queue this account can use. nil means there is no queue info
|
17
|
+
# for this account.
|
18
|
+
attr_reader :queue
|
19
|
+
|
20
|
+
def initialize(**opts)
|
21
|
+
orig_name = opts.fetch(:name, 'unknown')
|
22
|
+
@name = OodCore::Job::Adapters::Helper.upcase_accounts? ? orig_name.upcase : orig_name
|
23
|
+
@qos = opts.fetch(:qos, [])
|
24
|
+
@cluster = opts.fetch(:cluster, nil)
|
25
|
+
@queue = opts.fetch(:queue, nil)
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_h
|
29
|
+
instance_variables.map do |var|
|
30
|
+
name = var.to_s.gsub('@', '').to_sym
|
31
|
+
[name, send(name)]
|
32
|
+
end.to_h
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/ood_core/job/adapter.rb
CHANGED
@@ -197,6 +197,22 @@ module OodCore
|
|
197
197
|
def job_name_illegal_chars
|
198
198
|
ENV["OOD_JOB_NAME_ILLEGAL_CHARS"].to_s
|
199
199
|
end
|
200
|
+
|
201
|
+
# Retrieve the accounts available to use for the current user.
|
202
|
+
#
|
203
|
+
# Subclasses that do not implement this will return empty arrays.
|
204
|
+
# @return [Array<AccountInfo>] the accounts available to the user.
|
205
|
+
def accounts
|
206
|
+
[]
|
207
|
+
end
|
208
|
+
|
209
|
+
# Return the list of queues for this scheduler.
|
210
|
+
#
|
211
|
+
# Subclasses that do not implement this will return empty arrays.
|
212
|
+
# @return [Array<QueueInfo>]
|
213
|
+
def queues
|
214
|
+
[]
|
215
|
+
end
|
200
216
|
end
|
201
217
|
end
|
202
218
|
end
|
@@ -31,6 +31,17 @@ module OodCore
|
|
31
31
|
|
32
32
|
return 'ssh', args + [cmd] + cmd_args
|
33
33
|
end
|
34
|
+
|
35
|
+
# Determine whether to upcase account strings when returning adapter#accounts
|
36
|
+
def self.upcase_accounts?
|
37
|
+
env_var = ENV['OOD_UPCASE_ACCOUNTS']
|
38
|
+
|
39
|
+
if env_var.nil? || env_var.to_s.downcase == 'false'
|
40
|
+
false
|
41
|
+
else
|
42
|
+
true
|
43
|
+
end
|
44
|
+
end
|
34
45
|
end
|
35
46
|
end
|
36
47
|
end
|
@@ -73,7 +73,7 @@ class OodCore::Job::Adapters::LinuxHost::Launcher
|
|
73
73
|
# Get the tmux pane PID for the target session
|
74
74
|
pane_pid=$(tmux list-panes -aF '\#{session_name} \#{pane_pid}' | grep '#{session_name}' | cut -f 2 -d ' ')
|
75
75
|
# Find the Singularity sinit PID child of the pane process
|
76
|
-
pane_sinit_pid=$(pstree -p -l "$pane_pid" | egrep -o 'sinit[(][[:digit:]]*|shim-init[(][[:digit:]]
|
76
|
+
pane_sinit_pid=$(pstree -p -l "$pane_pid" | egrep -o 'sinit[(][[:digit:]]*|shim-init[(][[:digit:]]|appinit[(][[:digit:]]' | grep -o '[[:digit:]]*')
|
77
77
|
# Kill sinit which stops both Singularity-based processes and the tmux session
|
78
78
|
kill "$pane_sinit_pid"
|
79
79
|
SCRIPT
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "time"
|
2
|
+
require 'etc'
|
2
3
|
require "ood_core/refinements/hash_extensions"
|
3
4
|
require "ood_core/refinements/array_extensions"
|
4
5
|
require "ood_core/job/adapters/helper"
|
@@ -178,6 +179,27 @@ module OodCore
|
|
178
179
|
return [{ id: id, state: 'undetermined' }]
|
179
180
|
end
|
180
181
|
|
182
|
+
def accounts
|
183
|
+
user = Etc.getlogin
|
184
|
+
args = ['-nP', 'show', 'users', 'withassoc', 'format=account,cluster,partition,qos', 'where', "user=#{user}"]
|
185
|
+
|
186
|
+
[].tap do |accts|
|
187
|
+
call('sacctmgr', *args).each_line do |line|
|
188
|
+
acct, cluster, queue, qos = line.split('|')
|
189
|
+
next if acct.nil?
|
190
|
+
|
191
|
+
args = {
|
192
|
+
name: acct,
|
193
|
+
qos: qos.to_s.chomp.split(','),
|
194
|
+
cluster: cluster,
|
195
|
+
queue: queue.empty? ? nil : queue
|
196
|
+
}
|
197
|
+
info = OodCore::Job::AccountInfo.new(**args) unless acct.nil?
|
198
|
+
accts << info unless acct.nil?
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
181
203
|
def squeue_fields(attrs)
|
182
204
|
if attrs.nil?
|
183
205
|
all_squeue_fields
|
@@ -300,7 +322,37 @@ module OodCore
|
|
300
322
|
}
|
301
323
|
end
|
302
324
|
|
325
|
+
def queues
|
326
|
+
info_raw = call('scontrol', 'show', 'part', '-o')
|
327
|
+
|
328
|
+
[].tap do |ret_arr|
|
329
|
+
info_raw.each_line do |line|
|
330
|
+
ret_arr << str_to_acct_info(line)
|
331
|
+
end
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
303
335
|
private
|
336
|
+
def str_to_acct_info(line)
|
337
|
+
hsh = line.split(' ').map do |token|
|
338
|
+
m = token.match(/^(?<key>\w+)=(?<value>.+)$/)
|
339
|
+
[m[:key], m[:value]]
|
340
|
+
end.to_h.symbolize_keys
|
341
|
+
|
342
|
+
hsh[:name] = hsh[:PartitionName]
|
343
|
+
hsh[:qos] = hsh[:QoS].to_s == 'N/A' ? [] : hsh[:QoS].to_s.split(',')
|
344
|
+
hsh[:allow_accounts] = if hsh[:AllowAccounts].nil? || hsh[:AllowAccounts].to_s == 'ALL'
|
345
|
+
nil
|
346
|
+
else
|
347
|
+
hsh[:AllowAccounts].to_s.split(',')
|
348
|
+
end
|
349
|
+
|
350
|
+
|
351
|
+
hsh[:deny_accounts] = hsh[:DenyAccounts].nil? ? [] : hsh[:DenyAccounts].to_s.split(',')
|
352
|
+
|
353
|
+
OodCore::Job::QueueInfo.new(**hsh)
|
354
|
+
end
|
355
|
+
|
304
356
|
# Modify the StringIO instance by advancing past the squeue header
|
305
357
|
#
|
306
358
|
# The first two "records" should always be discarded. Consider the
|
@@ -325,7 +377,7 @@ module OodCore
|
|
325
377
|
cmd = OodCore::Job::Adapters::Helper.bin_path(cmd, bin, bin_overrides)
|
326
378
|
|
327
379
|
args = args.map(&:to_s)
|
328
|
-
args.concat ["-M", cluster] if cluster
|
380
|
+
args.concat ["-M", cluster] if cluster && cmd != 'sacctmgr'
|
329
381
|
|
330
382
|
env = env.to_h
|
331
383
|
env["SLURM_CONF"] = conf.to_s if conf
|
@@ -483,6 +535,13 @@ module OodCore
|
|
483
535
|
@slurm.get_cluster_info
|
484
536
|
end
|
485
537
|
|
538
|
+
# Retrieve the accounts available to use for the current user.
|
539
|
+
#
|
540
|
+
# @return [Array<String>] the accounts available to the user.
|
541
|
+
def accounts
|
542
|
+
@slurm.accounts
|
543
|
+
end
|
544
|
+
|
486
545
|
# Retrieve info for all jobs from the resource manager
|
487
546
|
# @raise [JobAdapterError] if something goes wrong getting job info
|
488
547
|
# @return [Array<Info>] information describing submitted jobs
|
@@ -605,6 +664,10 @@ module OodCore
|
|
605
664
|
'#SBATCH'
|
606
665
|
end
|
607
666
|
|
667
|
+
def queues
|
668
|
+
@slurm.queues
|
669
|
+
end
|
670
|
+
|
608
671
|
private
|
609
672
|
# Convert duration to seconds
|
610
673
|
def duration_in_seconds(time)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# QueueInfo is information about a given queue on a scheduler.
|
4
|
+
class OodCore::Job::QueueInfo
|
5
|
+
# The name of the queue.
|
6
|
+
attr_reader :name
|
7
|
+
alias to_s name
|
8
|
+
|
9
|
+
# The QoSes associated with this queue
|
10
|
+
attr_reader :qos
|
11
|
+
|
12
|
+
# The accounts that are allowed to use this queue.
|
13
|
+
#
|
14
|
+
# nil means ALL accounts are allowed.
|
15
|
+
attr_reader :allow_accounts
|
16
|
+
|
17
|
+
# The accounts that are not allowed to use this queue.
|
18
|
+
attr_reader :deny_accounts
|
19
|
+
|
20
|
+
def initialize(**opts)
|
21
|
+
@name = opts.fetch(:name, 'unknown')
|
22
|
+
@qos = opts.fetch(:qos, [])
|
23
|
+
@allow_accounts = opts.fetch(:allow_accounts, nil)
|
24
|
+
@deny_accounts = opts.fetch(:deny_accounts, [])
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_h
|
28
|
+
instance_variables.map do |var|
|
29
|
+
name = var.to_s.gsub('@', '').to_sym
|
30
|
+
[name, send(name)]
|
31
|
+
end.to_h
|
32
|
+
end
|
33
|
+
end
|
data/lib/ood_core/version.rb
CHANGED
data/lib/ood_core.rb
CHANGED
@@ -12,6 +12,8 @@ module OodCore
|
|
12
12
|
require "ood_core/job/script"
|
13
13
|
require "ood_core/job/info"
|
14
14
|
require "ood_core/job/cluster_info"
|
15
|
+
require "ood_core/job/account_info"
|
16
|
+
require "ood_core/job/queue_info"
|
15
17
|
require "ood_core/job/status"
|
16
18
|
require "ood_core/job/adapter"
|
17
19
|
require "ood_core/job/factory"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ood_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.23.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Franz
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2023-01-18 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: ood_support
|
@@ -178,6 +178,7 @@ files:
|
|
178
178
|
- lib/ood_core/clusters.rb
|
179
179
|
- lib/ood_core/errors.rb
|
180
180
|
- lib/ood_core/invalid_cluster.rb
|
181
|
+
- lib/ood_core/job/account_info.rb
|
181
182
|
- lib/ood_core/job/adapter.rb
|
182
183
|
- lib/ood_core/job/adapters/ccq.rb
|
183
184
|
- lib/ood_core/job/adapters/drmaa.rb
|
@@ -217,6 +218,7 @@ files:
|
|
217
218
|
- lib/ood_core/job/factory.rb
|
218
219
|
- lib/ood_core/job/info.rb
|
219
220
|
- lib/ood_core/job/node_info.rb
|
221
|
+
- lib/ood_core/job/queue_info.rb
|
220
222
|
- lib/ood_core/job/script.rb
|
221
223
|
- lib/ood_core/job/status.rb
|
222
224
|
- lib/ood_core/job/task.rb
|