ood_core 0.22.0 → 0.23.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b8700bb802df78b66c3bb58ec5464a7f5e54a4dc3ebdc978f9816b8b5e5f7373
4
- data.tar.gz: 1e2b4ca05369c8072afe8d1069679a8f2744cdcb3ed766924a778e78af65afa2
3
+ metadata.gz: bd8cb5dc98cf0b2c2120fdb6234e5482fb40cbec59f6688318e0d33b050d0dc4
4
+ data.tar.gz: 0fe72b2fe29aa1e4ca2d5e28ca43e8b3f9e0381fe17f4678ea7218a5c062a3e7
5
5
  SHA512:
6
- metadata.gz: a40fc234d2be728b697b9b68884b2286ac68e63ed36eeaa4a48487af99c262fdc1f9b3010554f9e369555734c6d2c0693ca54bc2308c5817f424ec4032759563
7
- data.tar.gz: 5215f5c924002bfdc40576560898cae49b9a9750ff8d11c87d1e43cd43d0e86327a511ee97eea765a20f8ce6d6903acfaece7b26ad8e7733fd1d3f985b8a97e2
6
+ metadata.gz: 53bd81e896ae96b55e92732b86d9ca364449f8140bedbaba0b6fc9de73d5ffb06e65ea9ba84cc84e621bbf64af5b30a241a803b7fb4944745ebb50cc2a6ba39f
7
+ data.tar.gz: 9106dbc505aff7040bedeba9c0531cd539dbcd11e3aac54072e7bc01660f8f07147fb19be325631496215b6c1725bb68ca57968b39e377b0567747ef5569563c
data/CHANGELOG.md CHANGED
@@ -7,6 +7,30 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.23.1] - 02-01-2023
11
+
12
+ ### Fixed
13
+
14
+ - `QueueInfo` objects also upcase accounts when applicable in [792](https://github.com/OSC/ood_core/pull/792).
15
+
16
+ ### Added
17
+
18
+ - `queue_name` has the alias `queue` in [790](https://github.com/OSC/ood_core/pull/790).
19
+
20
+ ## [0.23.0] - 01-17-2023
21
+
22
+ ### Added
23
+
24
+ - [787](https://github.com/OSC/ood_core/pull/787) added the `queues` API to the adapter class with
25
+ support for Slurm.
26
+ - [783](https://github.com/OSC/ood_core/pull/783) added the `accounts` API to the adapter class with
27
+ support for Slurm.
28
+
29
+ ### Fixed
30
+
31
+ - The linux host adapter now supports apptainer in [788](https://github.com/OSC/ood_core/pull/788).
32
+
33
+
10
34
  ## [0.22.0] - 10-31-2022
11
35
 
12
36
  ### Added
@@ -455,7 +479,9 @@ Functionally the same as [0.17.3] but with some CI updates.
455
479
  ### Added
456
480
  - Initial release!
457
481
 
458
- [Unreleased]: https://github.com/OSC/ood_core/compare/v0.22.0...HEAD
482
+ [Unreleased]: https://github.com/OSC/ood_core/compare/v0.23.1...HEAD
483
+ [0.23.1]: https://github.com/OSC/ood_core/compare/v0.22.0...v0.23.0
484
+ [0.23.0]: https://github.com/OSC/ood_core/compare/v0.22.0...v0.23.0
459
485
  [0.22.0]: https://github.com/OSC/ood_core/compare/v0.21.0...v0.22.0
460
486
  [0.21.0]: https://github.com/OSC/ood_core/compare/v0.20.2...v0.21.0
461
487
  [0.20.2]: https://github.com/OSC/ood_core/compare/v0.20.1...v0.20.2
@@ -0,0 +1,14 @@
1
+ module OodCore
2
+ module DataFormatter
3
+ # Determine whether to upcase account strings when returning adapter#accounts
4
+ def upcase_accounts?
5
+ env_var = ENV['OOD_UPCASE_ACCOUNTS']
6
+
7
+ if env_var.nil? || env_var.to_s.downcase == 'false'
8
+ false
9
+ else
10
+ true
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,38 @@
1
+ module OodCore
2
+ module Job
3
+
4
+ class AccountInfo
5
+
6
+ include OodCore::DataFormatter
7
+
8
+ # The name of the account.
9
+ attr_reader :name
10
+ alias to_s name
11
+
12
+ # The QoS values this account can use.
13
+ attr_reader :qos
14
+
15
+ # The cluster this account is associated with.
16
+ attr_reader :cluster
17
+
18
+ # The queue this account can use. nil means there is no queue info
19
+ # for this account.
20
+ attr_reader :queue
21
+
22
+ def initialize(**opts)
23
+ orig_name = opts.fetch(:name, 'unknown')
24
+ @name = upcase_accounts? ? orig_name.upcase : orig_name
25
+ @qos = opts.fetch(:qos, [])
26
+ @cluster = opts.fetch(:cluster, nil)
27
+ @queue = opts.fetch(:queue, nil)
28
+ end
29
+
30
+ def to_h
31
+ instance_variables.map do |var|
32
+ name = var.to_s.gsub('@', '').to_sym
33
+ [name, send(name)]
34
+ end.to_h
35
+ end
36
+ end
37
+ end
38
+ end
@@ -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
@@ -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:]]*' | grep -o '[[: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? || acct.chomp.empty?
190
+
191
+ args = {
192
+ name: acct,
193
+ qos: qos.to_s.chomp.split(','),
194
+ cluster: cluster,
195
+ queue: queue.to_s.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,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ # QueueInfo is information about a given queue on a scheduler.
4
+ class OodCore::Job::QueueInfo
5
+
6
+ include OodCore::DataFormatter
7
+
8
+ # The name of the queue.
9
+ attr_reader :name
10
+ alias to_s name
11
+
12
+ # The QoSes associated with this queue
13
+ attr_reader :qos
14
+
15
+ # The accounts that are allowed to use this queue.
16
+ #
17
+ # nil means ALL accounts are allowed.
18
+ attr_reader :allow_accounts
19
+
20
+ # The accounts that are not allowed to use this queue.
21
+ attr_reader :deny_accounts
22
+
23
+ def initialize(**opts)
24
+ @name = opts.fetch(:name, 'unknown')
25
+ @qos = opts.fetch(:qos, [])
26
+
27
+ allow_accounts = opts.fetch(:allow_accounts, nil)
28
+ @allow_accounts = if allow_accounts.nil?
29
+ nil
30
+ else
31
+ allow_accounts.compact.map { |acct| upcase_accounts? ? acct.to_s.upcase : acct }
32
+ end
33
+
34
+ @deny_accounts = opts.fetch(:deny_accounts, []).compact.map do |acct|
35
+ upcase_accounts? ? acct.to_s.upcase : acct
36
+ end
37
+ end
38
+
39
+ def to_h
40
+ instance_variables.map do |var|
41
+ name = var.to_s.gsub('@', '').to_sym
42
+ [name, send(name)]
43
+ end.to_h
44
+ end
45
+ end
@@ -77,6 +77,7 @@ module OodCore
77
77
  # Name of the queue the job should be submitted to
78
78
  # @return [String, nil] queue name
79
79
  attr_reader :queue_name
80
+ alias queue queue_name
80
81
 
81
82
  # The scheduling priority for the job
82
83
  # @return [Integer, nil] scheduling priority
@@ -1,4 +1,4 @@
1
1
  module OodCore
2
2
  # The current version of {OodCore}
3
- VERSION = "0.22.0"
3
+ VERSION = "0.23.1"
4
4
  end
data/lib/ood_core.rb CHANGED
@@ -3,6 +3,7 @@ require "ood_core/errors"
3
3
  require "ood_core/cluster"
4
4
  require "ood_core/clusters"
5
5
  require "ood_core/invalid_cluster"
6
+ require "ood_core/data_formatter"
6
7
 
7
8
  # The main namespace for ood_core
8
9
  module OodCore
@@ -12,6 +13,8 @@ module OodCore
12
13
  require "ood_core/job/script"
13
14
  require "ood_core/job/info"
14
15
  require "ood_core/job/cluster_info"
16
+ require "ood_core/job/account_info"
17
+ require "ood_core/job/queue_info"
15
18
  require "ood_core/job/status"
16
19
  require "ood_core/job/adapter"
17
20
  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.22.0
4
+ version: 0.23.1
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: 2022-10-31 00:00:00.000000000 Z
13
+ date: 2023-02-01 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: ood_support
@@ -176,8 +176,10 @@ files:
176
176
  - lib/ood_core/batch_connect/templates/vnc_container.rb
177
177
  - lib/ood_core/cluster.rb
178
178
  - lib/ood_core/clusters.rb
179
+ - lib/ood_core/data_formatter.rb
179
180
  - lib/ood_core/errors.rb
180
181
  - lib/ood_core/invalid_cluster.rb
182
+ - lib/ood_core/job/account_info.rb
181
183
  - lib/ood_core/job/adapter.rb
182
184
  - lib/ood_core/job/adapters/ccq.rb
183
185
  - lib/ood_core/job/adapters/drmaa.rb
@@ -217,6 +219,7 @@ files:
217
219
  - lib/ood_core/job/factory.rb
218
220
  - lib/ood_core/job/info.rb
219
221
  - lib/ood_core/job/node_info.rb
222
+ - lib/ood_core/job/queue_info.rb
220
223
  - lib/ood_core/job/script.rb
221
224
  - lib/ood_core/job/status.rb
222
225
  - lib/ood_core/job/task.rb