ood_core 0.25.0 → 0.27.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ad05a0d8cf307f0237329f0e33e8a66f809781e5b164ddf20b9f03d65078451d
4
- data.tar.gz: 396dde55b4b5aaa321ccaf6fbc3cb049d01239335533c35c39ee9a11a1aa5d9b
3
+ metadata.gz: 6aafe5b9d84b0b825241691c28be26cbce7402534e0ac1555a033191d13a7a1a
4
+ data.tar.gz: f214cbaf84997e4c27dc184f3b3a12cfc82e510c5d6eb7b9ccdfb5df0b164089
5
5
  SHA512:
6
- metadata.gz: 4a1d7cb53117266c577eaa7792d867508f3e94ef78f2f9af7817882ad1f6165d5d43e8179e17163a83dd438627215700501ea75281204ee6b7d900649c77de9f
7
- data.tar.gz: 4aaf01f40d43e7b496a053e2ef85548769beb169c78e954cd055659ecc08f2e8ef7221561f94a184eb986b9f13d52c2efda30ffdd07faeb697fab4d9d4411ce7
6
+ metadata.gz: d1cc480563eaffcafeaf68b09ec55e5cec02d2c610b7264e45c0c0f0d830ac11e62a9b91fe395a00140c38b8bc5b01390e52d4dc8d962579fee0cf7ff33c6fc3
7
+ data.tar.gz: 68d5c95f5a4d87ab89cd5938d92c2d186398701942fd8a460409e5f5864b9eccedcb8ac8668d211dc0318886e6978aa0528371ede004466f0b9dcf7bc2a95118
data/CHANGELOG.md CHANGED
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ # [0.26.1] - 07-31-2024
11
+
12
+ - 0.26.0 didn't publish correctly. There's no meaningful difference between 0.26.1 and 0.26.0.
13
+
14
+ # [0.26.0] - 07-26-2024
15
+
16
+ - Adapter class now has `nodes` API in [830](https://github.com/OSC/ood_core/pull/830).
17
+ - QueueInfo objects are GPU aware in [825](https://github.com/OSC/ood_core/pull/825).
18
+ - Systemd adapter bugfix for zsh in [834](https://github.com/OSC/ood_core/pull/834).
19
+ - Websockify timeout is variable in [840](https://github.com/OSC/ood_core/pull/840).
20
+ - Slurm adapter now forces utf-8 encoding in [842](https://github.com/OSC/ood_core/pull/842).
21
+
10
22
  # [0.25.0] - 03-27-2024
11
23
 
12
24
  - [828](https://github.com/OSC/ood_core/pull/828) and [826](https://github.com/OSC/ood_core/pull/826)
@@ -535,6 +547,9 @@ Functionally the same as [0.17.3] but with some CI updates.
535
547
  - Initial release!
536
548
 
537
549
  [Unreleased]: https://github.com/OSC/ood_core/compare/v0.24.2...HEAD
550
+ [0.26.1]: https://github.com/OSC/ood_core/compare/v0.26.0...v0.26.1
551
+ [0.26.0]: https://github.com/OSC/ood_core/compare/v0.25.0...v0.26.0
552
+ [0.25.0]: https://github.com/OSC/ood_core/compare/v0.24.2...v0.25.0
538
553
  [0.24.2]: https://github.com/OSC/ood_core/compare/v0.24.1...v0.24.2
539
554
  [0.24.1]: https://github.com/OSC/ood_core/compare/v0.24.0...v0.24.1
540
555
  [0.24.0]: https://github.com/OSC/ood_core/compare/v0.23.5...v0.24.0
data/Rakefile CHANGED
@@ -1,6 +1,17 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
+ require "minitest/test_task"
4
+
5
+ require_relative 'lib/tasks/slurm'
3
6
 
4
7
  RSpec::Core::RakeTask.new(:spec)
5
8
 
9
+
10
+ Minitest::TestTask.create(:test) do |t|
11
+ t.libs << "test"
12
+ t.libs << "lib"
13
+ t.warning = false
14
+ t.test_globs = ["test/**/*_test.rb"]
15
+ end
16
+
6
17
  task :default => :spec
@@ -134,7 +134,8 @@ module OodCore
134
134
  def after_script
135
135
  websockify_cmd = context.fetch(:websockify_cmd, "${WEBSOCKIFY_CMD:-/opt/websockify/run}").to_s
136
136
  websockify_hb = context.fetch(:websockify_heartbeat_seconds, "${WEBSOCKIFY_HEARTBEAT_SECONDS:-30}").to_s
137
-
137
+ websockify_timeout_seconds = context.fetch(:websockify_timeout_seconds, '${WEBSOCKIFY_TIMEOUT_SECONDS:-10}').to_s
138
+
138
139
  <<-EOT.gsub(/^ {14}/, "")
139
140
  #{super}
140
141
 
@@ -146,6 +147,7 @@ module OodCore
146
147
  #{websockify_cmd} $1 --heartbeat=#{websockify_hb} $2 &> $log_file &
147
148
  local ws_pid=$!
148
149
  local counter=0
150
+ local max_timeout=#{websockify_timeout_seconds}
149
151
 
150
152
  # wait till websockify has successfully started
151
153
  echo "[websockify]: pid: $ws_pid (proxying $1 ==> $2)" >&2
@@ -156,9 +158,9 @@ module OodCore
156
158
  if ! ps $ws_pid > /dev/null; then
157
159
  echo "[websockify]: failed to launch!" >&2
158
160
  return 1
159
- elif [ $counter -ge 5 ]; then
160
- # timeout after ~5 seconds
161
- echo "[websockify]: timed-out :(!" >&2
161
+ elif [ $counter -ge $max_timeout ]; then
162
+ # timeout after max_timeout seconds
163
+ echo "[websockify]: timed-out after $max_timeout seconds :(!" >&2
162
164
  return 1
163
165
  else
164
166
  sleep 1
@@ -213,6 +213,14 @@ module OodCore
213
213
  def queues
214
214
  []
215
215
  end
216
+
217
+ # Return the list of nodes for this scheduler.
218
+ #
219
+ # Subclasses that do not implement this will return empty arrays.
220
+ # @return [Array<NodeInfo>]
221
+ def nodes
222
+ []
223
+ end
216
224
  end
217
225
  end
218
226
  end
@@ -233,6 +233,7 @@ module OodCore
233
233
 
234
234
  args.concat ["-N", script.job_name] unless script.job_name.nil?
235
235
  args.concat ["-o", script.output_path] unless script.output_path.nil?
236
+ args.concat ['--mpi', "proc=#{script.cores}"] unless script.cores.nil?
236
237
  if script.error_path.nil?
237
238
  args.concat ["-j"]
238
239
  else
@@ -239,7 +239,7 @@ class OodCore::Job::Adapters::Kubernetes::Batch
239
239
  node_selector = native_data[:node_selector].nil? ? {} : native_data[:node_selector]
240
240
  gpu_type = native_data[:gpu_type].nil? ? "nvidia.com/gpu" : native_data[:gpu_type]
241
241
 
242
- template = ERB.new(File.read(resource_file), nil, '-')
242
+ template = ERB.new(File.read(resource_file), trim_mode: '-')
243
243
 
244
244
  [template.result(binding), id]
245
245
  end
@@ -271,7 +271,7 @@ class OodCore::Job::Adapters::Kubernetes::Batch
271
271
  end
272
272
 
273
273
  def namespace
274
- "#{namespace_prefix}#{username}"
274
+ "#{namespace_prefix}#{username.gsub(/[.@]/, '-')}"
275
275
  end
276
276
 
277
277
  def formatted_ns_cmd
@@ -170,6 +170,7 @@ class OodCore::Job::Adapters::LinuxHost::Launcher
170
170
  'script_timeout' => script_timeout(script),
171
171
  'session_name' => session_name,
172
172
  'singularity_bin' => singularity_bin,
173
+ 'singularity_options' => singularity_options(script.native),
173
174
  'singularity_image' => singularity_image(script.native),
174
175
  'ssh_hosts' => ssh_hosts,
175
176
  'tmux_bin' => tmux_bin,
@@ -205,6 +206,12 @@ class OodCore::Job::Adapters::LinuxHost::Launcher
205
206
  native[:singularity_bindpath]
206
207
  end
207
208
 
209
+ def singularity_options(native)
210
+ return '' unless native && native[:singularity_options]
211
+
212
+ native[:singularity_options]
213
+ end
214
+
208
215
  def script_timeout(script)
209
216
  wall_time = script.wall_time.to_i
210
217
  return site_timeout if wall_time == 0
@@ -294,4 +301,4 @@ class OodCore::Job::Adapters::LinuxHost::Launcher
294
301
  end.compact.last.to_s
295
302
  end
296
303
 
297
- end
304
+ end
@@ -47,7 +47,7 @@ trap exit_script SIGINT SIGTERM
47
47
  OUTPUT_PATH=<%= output_path %>
48
48
  ERROR_PATH=<%= error_path %>
49
49
  ({
50
- timeout <%= script_timeout %>s <%= singularity_bin %> exec <%= contain %> --pid <%= singularity_image %> /bin/bash --login $singularity_tmp_file <%= arguments %>
50
+ timeout <%= script_timeout %>s <%= singularity_bin %> exec <%= singularity_options %> <%= contain %> --pid <%= singularity_image %> /bin/bash --login $singularity_tmp_file <%= arguments %>
51
51
  } | tee "$OUTPUT_PATH") 3>&1 1>&2 2>&3 | tee "$ERROR_PATH"
52
52
 
53
53
  <%= email_on_terminated %>
@@ -91,6 +91,7 @@ class OodCore::Job::Adapters::Lsf::Helper
91
91
  args.concat ["-b", script.start_time.localtime.strftime("%Y:%m:%d:%H:%M")] unless script.start_time.nil?
92
92
  args.concat ["-W", (script.wall_time / 60).to_i] unless script.wall_time.nil?
93
93
  args.concat ["-L", script.shell_path.to_s] unless script.shell_path.nil?
94
+ args.concat ['-n', script.cores] unless script.cores.nil?
94
95
 
95
96
  # environment
96
97
  env = script.job_environment || {}
@@ -269,6 +269,7 @@ module OodCore
269
269
  args.concat ["-a", script.start_time.localtime.strftime("%C%y%m%d%H%M.%S")] unless script.start_time.nil?
270
270
  args.concat ["-A", script.accounting_id] unless script.accounting_id.nil?
271
271
  args.concat ["-l", "walltime=#{seconds_to_duration(script.wall_time)}"] unless script.wall_time.nil?
272
+ args.concat ppn(script)
272
273
 
273
274
  # Set dependencies
274
275
  depend = []
@@ -422,6 +423,13 @@ module OodCore
422
423
  '#PBS'
423
424
  end
424
425
 
426
+ # place holder for when we support both nodes and cpus.
427
+ def ppn(script)
428
+ return [] if script.cores.nil?
429
+
430
+ ['-l', "ncpus=#{script.cpus}"]
431
+ end
432
+
425
433
  private
426
434
  # Convert duration to seconds
427
435
  def duration_in_seconds(time)
@@ -41,7 +41,7 @@ module OodCore
41
41
  # calculated from gres string
42
42
  # @return [Integer] the number of gpus in gres
43
43
  def self.gpus_from_gres(gres)
44
- gres.to_s.scan(/gpu:[^,]*(\d+)/).flatten.map(&:to_i).sum
44
+ gres.to_s.scan(/gpu[^(,]*[:=](\d+)/).flatten.map(&:to_i).sum
45
45
  end
46
46
 
47
47
  # Object used for simplified communication with a Slurm batch server
@@ -169,6 +169,7 @@ module OodCore
169
169
  # jobs << job
170
170
  #
171
171
  # assuming keys and values are same length! if not we have an error!
172
+ line = line.encode('UTF-8', invalid: :replace, undef: :replace)
172
173
  values = line.chomp(RECORD_SEPARATOR).strip.split(UNIT_SEPARATOR)
173
174
  jobs << Hash[fields.keys.zip(values)] unless values.empty?
174
175
  end
@@ -327,13 +328,37 @@ module OodCore
327
328
 
328
329
  [].tap do |ret_arr|
329
330
  info_raw.each_line do |line|
330
- ret_arr << str_to_acct_info(line)
331
+ ret_arr << str_to_queue_info(line)
331
332
  end
332
333
  end
333
334
  end
334
335
 
336
+ def all_sinfo_node_fields
337
+ {
338
+ procs: '%c',
339
+ name: '%n',
340
+ features: '%f'
341
+ }
342
+ end
343
+
344
+ def nodes
345
+ args = all_sinfo_node_fields.values.join(UNIT_SEPARATOR)
346
+ output = call('sinfo', '-ho', "#{RECORD_SEPARATOR}#{args}")
347
+
348
+ output.each_line(RECORD_SEPARATOR).map do |line|
349
+ values = line.chomp(RECORD_SEPARATOR).strip.split(UNIT_SEPARATOR)
350
+
351
+ next if values.empty?
352
+
353
+ data = Hash[all_sinfo_node_fields.keys.zip(values)]
354
+ data[:name] = data[:name].to_s.split(',').first
355
+ data[:features] = data[:features].to_s.split(',')
356
+ NodeInfo.new(**data)
357
+ end.compact
358
+ end
359
+
335
360
  private
336
- def str_to_acct_info(line)
361
+ def str_to_queue_info(line)
337
362
  hsh = line.split(' ').map do |token|
338
363
  m = token.match(/^(?<key>\w+)=(?<value>.+)$/)
339
364
  [m[:key], m[:value]]
@@ -349,6 +374,7 @@ module OodCore
349
374
 
350
375
 
351
376
  hsh[:deny_accounts] = hsh[:DenyAccounts].nil? ? [] : hsh[:DenyAccounts].to_s.split(',')
377
+ hsh[:tres] = hsh[:TRES].nil? ? {} : hsh[:TRES].to_s.split(',').map { |str| str.split('=') }.to_h
352
378
 
353
379
  OodCore::Job::QueueInfo.new(**hsh)
354
380
  end
@@ -500,6 +526,7 @@ module OodCore
500
526
  args.concat ['-a', script.job_array_request] unless script.job_array_request.nil?
501
527
  args.concat ['--qos', script.qos] unless script.qos.nil?
502
528
  args.concat ['--gpus-per-node', script.gpus_per_node] unless script.gpus_per_node.nil?
529
+ args.concat ['-n', script.cores] unless script.cores.nil?
503
530
  # ignore nodes, don't know how to do this for slurm
504
531
 
505
532
  # Set dependencies
@@ -669,6 +696,10 @@ module OodCore
669
696
  @slurm.queues
670
697
  end
671
698
 
699
+ def nodes
700
+ @slurm.nodes
701
+ end
702
+
672
703
  private
673
704
  # Convert duration to seconds
674
705
  def duration_in_seconds(time)
@@ -204,7 +204,7 @@ class OodCore::Job::Adapters::LinuxSystemd::Launcher
204
204
 
205
205
  # List all Systemd sessions on destination_host started by this adapter
206
206
  def list_remote_systemd_session(destination_host)
207
- cmd = ssh_cmd(destination_host, ['systemctl', '--user', 'show', '-t', 'service', '--state=running', "#{session_name_label}-*"])
207
+ cmd = ssh_cmd(destination_host, ['systemctl', '--user', 'show', '-t', 'service', '--state=running', "#{session_name_label}-\\*"])
208
208
 
209
209
  # individual units are separated with an empty line
210
210
  call(*cmd).split("\n\n").map do |oneunit|
@@ -160,6 +160,7 @@ module OodCore
160
160
  args.concat ['-t', script.job_array_request] unless script.job_array_request.nil?
161
161
  args.concat ['-l', "qos=#{script.qos}"] unless script.qos.nil?
162
162
  args.concat ['-l', "gpus=#{script.gpus_per_node}"] unless script.gpus_per_node.nil?
163
+ args.concat ppn(script)
163
164
 
164
165
  # Set environment variables
165
166
  env = script.job_environment.to_h
@@ -302,6 +303,13 @@ module OodCore
302
303
  '#QSUB'
303
304
  end
304
305
 
306
+ # place holder for when we support both nodes and cpus.
307
+ def ppn(script)
308
+ return [] if script.cores.nil?
309
+
310
+ ['-l', "procs=#{script.cpus}"]
311
+ end
312
+
305
313
  private
306
314
  # Convert duration to seconds
307
315
  def duration_in_seconds(time)
@@ -10,17 +10,26 @@ module OodCore
10
10
  # @return [Integer, nil] number of procs
11
11
  attr_reader :procs
12
12
 
13
+ # The features associated with this node.
14
+ # @return [Array<String>, []]
15
+ attr_reader :features
16
+
13
17
  # @param name [#to_s] node name
14
18
  # @param procs [#to_i, nil] number of procs
15
- def initialize(name:, procs: nil, **_)
19
+ # @param features [#to_a, []] list of features
20
+ def initialize(name:, procs: nil, features: [], **_)
16
21
  @name = name.to_s
17
22
  @procs = procs && procs.to_i
23
+ @features = features.to_a
18
24
  end
19
25
 
20
26
  # Convert object to hash
21
27
  # @return [Hash] object as hash
22
28
  def to_h
23
- { name: name, procs: procs }
29
+ instance_variables.map do |var|
30
+ name = var.to_s.gsub('@', '').to_sym
31
+ [name, send(name)]
32
+ end.to_h
24
33
  end
25
34
 
26
35
  # The comparison operator
@@ -20,9 +20,13 @@ class OodCore::Job::QueueInfo
20
20
  # The accounts that are not allowed to use this queue.
21
21
  attr_reader :deny_accounts
22
22
 
23
+ # An Hash of Trackable Resources and their values.
24
+ attr_reader :tres
25
+
23
26
  def initialize(**opts)
24
27
  @name = opts.fetch(:name, 'unknown')
25
28
  @qos = opts.fetch(:qos, [])
29
+ @tres = opts.fetch(:tres, {})
26
30
 
27
31
  allow_accounts = opts.fetch(:allow_accounts, nil)
28
32
  @allow_accounts = if allow_accounts.nil?
@@ -42,4 +46,8 @@ class OodCore::Job::QueueInfo
42
46
  [name, send(name)]
43
47
  end.to_h
44
48
  end
49
+
50
+ def gpu?
51
+ tres.keys.any? { |name| name.to_s.match?(%r{^gres/gpu($|:)}i) }
52
+ end
45
53
  end
@@ -108,6 +108,10 @@ module OodCore
108
108
  # @return [Integer, nil] gpus per node
109
109
  attr_reader :gpus_per_node
110
110
 
111
+ # The core request for this job
112
+ # @return [Integer, nil] cores
113
+ attr_reader :cores
114
+
111
115
  # Object detailing any native specifications that are implementation specific
112
116
  # @note Should not be used at all costs.
113
117
  # @return [Object, nil] native specifications
@@ -151,7 +155,8 @@ module OodCore
151
155
  output_path: nil, error_path: nil, reservation_id: nil,
152
156
  queue_name: nil, priority: nil, start_time: nil,
153
157
  wall_time: nil, accounting_id: nil, job_array_request: nil,
154
- qos: nil, gpus_per_node: nil, native: nil, copy_environment: nil, **_)
158
+ qos: nil, gpus_per_node: nil, native: nil, copy_environment: nil,
159
+ cores: nil, **_)
155
160
  @content = content.to_s
156
161
 
157
162
  @submit_as_hold = submit_as_hold
@@ -179,6 +184,7 @@ module OodCore
179
184
  @gpus_per_node = gpus_per_node && gpus_per_node.to_i
180
185
  @native = native
181
186
  @copy_environment = (copy_environment.nil?) ? nil : !! copy_environment
187
+ @cores = cores&.to_i
182
188
  end
183
189
 
184
190
  # Convert object to hash
@@ -209,7 +215,8 @@ module OodCore
209
215
  qos: qos,
210
216
  gpus_per_node: gpus_per_node,
211
217
  native: native,
212
- copy_environment: copy_environment
218
+ cores: cores,
219
+ copy_environment: copy_environment,
213
220
  }
214
221
  end
215
222
 
@@ -1,4 +1,4 @@
1
1
  module OodCore
2
2
  # The current version of {OodCore}
3
- VERSION = "0.25.0"
3
+ VERSION = "0.27.0"
4
4
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../ood_core'
4
+ require_relative '../ood_core/job/adapters/slurm'
5
+
6
+ namespace :slurm do
7
+
8
+ desc 'Get squeue output in the format this gem expects'
9
+ task :squeue do
10
+ fields = OodCore::Job::Adapters::Slurm::Batch.new.all_squeue_fields
11
+ args = OodCore::Job::Adapters::Slurm::Batch.new.squeue_args(options: fields.values)
12
+
13
+ single_job = `squeue #{args.join(' ')}`.split("\n")[0...2]
14
+
15
+ puts single_job
16
+ end
17
+ end
data/ood_core.gemspec CHANGED
@@ -23,12 +23,14 @@ Gem::Specification.new do |spec|
23
23
  spec.required_ruby_version = ">= 2.5.0"
24
24
 
25
25
  spec.add_runtime_dependency "ood_support", "~> 0.0.2"
26
- spec.add_runtime_dependency "ffi", "~> 1.9", ">= 1.9.6"
26
+ spec.add_runtime_dependency "ffi", "~> 1.16.3"
27
27
  spec.add_runtime_dependency "rexml", "~> 3.2"
28
28
  spec.add_development_dependency "bundler", "~> 2.1"
29
- spec.add_development_dependency "rake", "~> 13.1.0"
29
+ spec.add_development_dependency "rake", "~> 13.2.0"
30
30
  spec.add_development_dependency "rspec", "~> 3.0"
31
31
  spec.add_development_dependency "pry", "~> 0.10"
32
32
  spec.add_development_dependency "timecop", "~> 0.8"
33
33
  spec.add_development_dependency "climate_control", "~> 1.2.0"
34
+ spec.add_development_dependency "minitest", "~> 5"
35
+ spec.add_development_dependency "mocha", "~> 2.4"
34
36
  end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ood_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.25.0
4
+ version: 0.27.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Franz
8
8
  - Morgan Rodgers
9
9
  - Jeremy Nicklas
10
- autorequire:
10
+ autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2024-03-27 00:00:00.000000000 Z
13
+ date: 2024-12-18 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: ood_support
@@ -32,20 +32,14 @@ dependencies:
32
32
  requirements:
33
33
  - - "~>"
34
34
  - !ruby/object:Gem::Version
35
- version: '1.9'
36
- - - ">="
37
- - !ruby/object:Gem::Version
38
- version: 1.9.6
35
+ version: 1.16.3
39
36
  type: :runtime
40
37
  prerelease: false
41
38
  version_requirements: !ruby/object:Gem::Requirement
42
39
  requirements:
43
40
  - - "~>"
44
41
  - !ruby/object:Gem::Version
45
- version: '1.9'
46
- - - ">="
47
- - !ruby/object:Gem::Version
48
- version: 1.9.6
42
+ version: 1.16.3
49
43
  - !ruby/object:Gem::Dependency
50
44
  name: rexml
51
45
  requirement: !ruby/object:Gem::Requirement
@@ -80,14 +74,14 @@ dependencies:
80
74
  requirements:
81
75
  - - "~>"
82
76
  - !ruby/object:Gem::Version
83
- version: 13.1.0
77
+ version: 13.2.0
84
78
  type: :development
85
79
  prerelease: false
86
80
  version_requirements: !ruby/object:Gem::Requirement
87
81
  requirements:
88
82
  - - "~>"
89
83
  - !ruby/object:Gem::Version
90
- version: 13.1.0
84
+ version: 13.2.0
91
85
  - !ruby/object:Gem::Dependency
92
86
  name: rspec
93
87
  requirement: !ruby/object:Gem::Requirement
@@ -144,6 +138,34 @@ dependencies:
144
138
  - - "~>"
145
139
  - !ruby/object:Gem::Version
146
140
  version: 1.2.0
141
+ - !ruby/object:Gem::Dependency
142
+ name: minitest
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - "~>"
146
+ - !ruby/object:Gem::Version
147
+ version: '5'
148
+ type: :development
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - "~>"
153
+ - !ruby/object:Gem::Version
154
+ version: '5'
155
+ - !ruby/object:Gem::Dependency
156
+ name: mocha
157
+ requirement: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - "~>"
160
+ - !ruby/object:Gem::Version
161
+ version: '2.4'
162
+ type: :development
163
+ prerelease: false
164
+ version_requirements: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - "~>"
167
+ - !ruby/object:Gem::Version
168
+ version: '2.4'
147
169
  description: Open OnDemand core library that provides support for an HPC Center to
148
170
  globally define HPC services that web applications can then take advantage of.
149
171
  email:
@@ -227,12 +249,13 @@ files:
227
249
  - lib/ood_core/refinements/drmaa_extensions.rb
228
250
  - lib/ood_core/refinements/hash_extensions.rb
229
251
  - lib/ood_core/version.rb
252
+ - lib/tasks/slurm.rb
230
253
  - ood_core.gemspec
231
254
  homepage: https://github.com/OSC/ood_core
232
255
  licenses:
233
256
  - MIT
234
257
  metadata: {}
235
- post_install_message:
258
+ post_install_message:
236
259
  rdoc_options: []
237
260
  require_paths:
238
261
  - lib
@@ -248,7 +271,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
248
271
  version: '0'
249
272
  requirements: []
250
273
  rubygems_version: 3.1.2
251
- signing_key:
274
+ signing_key:
252
275
  specification_version: 4
253
276
  summary: Open OnDemand core library
254
277
  test_files: []