ood_core 0.21.0 → 0.22.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: 6d1d489149a451b24284191ba966ef7c5d85f859c939b050d50b6501fd49a4cb
4
- data.tar.gz: 3d438089095a42b66f4edee0d3a6afe683e1d87ebb865d908120b977733c6169
3
+ metadata.gz: b8700bb802df78b66c3bb58ec5464a7f5e54a4dc3ebdc978f9816b8b5e5f7373
4
+ data.tar.gz: 1e2b4ca05369c8072afe8d1069679a8f2744cdcb3ed766924a778e78af65afa2
5
5
  SHA512:
6
- metadata.gz: 4106f8af4babd7ae5cf59e133d42e5d1ecda3c1436727740f91f8b3e8a21112254ec8d35f724e2614cc18b65043944ada99adf6dfdeb0959f618d5c90e8178c0
7
- data.tar.gz: a3caaaf21cc6ee4bd68fea96817f58b61592c93993813f69333e8acdce95df8b0d8b49b169000a50ddcb7bcd6031d151272882e5dc3cd02e09a0595ef1d31116
6
+ metadata.gz: a40fc234d2be728b697b9b68884b2286ac68e63ed36eeaa4a48487af99c262fdc1f9b3010554f9e369555734c6d2c0693ca54bc2308c5817f424ec4032759563
7
+ data.tar.gz: 5215f5c924002bfdc40576560898cae49b9a9750ff8d11c87d1e43cd43d0e86327a511ee97eea765a20f8ce6d6903acfaece7b26ad8e7733fd1d3f985b8a97e2
data/.gitignore CHANGED
@@ -50,4 +50,8 @@ Gemfile.lock
50
50
  .rvmrc
51
51
 
52
52
  # SSHFS temp files
53
- ._*
53
+ ._*
54
+
55
+ # docs are only held in the gh-pages branch
56
+ /docs/*
57
+ !/docs/.keep
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.22.0] - 10-31-2022
11
+
12
+ ### Added
13
+
14
+ - Added the `vnc_container` batch connect template in [774](https://github.com/OSC/ood_core/pull/774).
15
+ - https://osc.github.io/ood_core is now updated on every commit to master in [765](https://github.com/OSC/ood_core/pull/765).
16
+
17
+ ### Fixed
18
+
19
+ - Kubernetes can now read mulitple secrets in [778](https://github.com/OSC/ood_core/pull/778).
20
+ - PBSPro correctly reads usernames with periods in them in [780](https://github.com/OSC/ood_core/pull/780).
21
+
10
22
  ## [0.21.0] - 08-01-2022
11
23
 
12
24
  ### Added
@@ -443,7 +455,8 @@ Functionally the same as [0.17.3] but with some CI updates.
443
455
  ### Added
444
456
  - Initial release!
445
457
 
446
- [Unreleased]: https://github.com/OSC/ood_core/compare/v0.21.0...HEAD
458
+ [Unreleased]: https://github.com/OSC/ood_core/compare/v0.22.0...HEAD
459
+ [0.22.0]: https://github.com/OSC/ood_core/compare/v0.21.0...v0.22.0
447
460
  [0.21.0]: https://github.com/OSC/ood_core/compare/v0.20.2...v0.21.0
448
461
  [0.20.2]: https://github.com/OSC/ood_core/compare/v0.20.1...v0.20.2
449
462
  [0.20.1]: https://github.com/OSC/ood_core/compare/v0.20.0...v0.20.1
data/docs/.keep ADDED
File without changes
@@ -0,0 +1,252 @@
1
+ require "ood_core/refinements/hash_extensions"
2
+ require "securerandom"
3
+
4
+ module OodCore
5
+ module BatchConnect
6
+ class Factory
7
+ using Refinements::HashExtensions
8
+
9
+ # Build the VNC template from a configuration
10
+ # @param config [#to_h] the configuration for the batch connect template
11
+ def self.build_vnc_container(config)
12
+ context = config.to_h.symbolize_keys.reject { |k, _| k == :template }
13
+
14
+ unless context.key?(:container_path)
15
+ raise JobAdapterError, "You are missing the configuration 'container_path' for a vnc_container template."
16
+ end
17
+
18
+ Templates::VNC_Container.new(context)
19
+ end
20
+ end
21
+
22
+ module Templates
23
+ # A batch connect template that starts up a VNC server within a batch job
24
+ class VNC_Container < Template
25
+ # @param context [#to_h] the context used to render the template
26
+ # @option context [#to_sym, Array<#to_sym>] :conn_params ([]) A list of
27
+ # connection parameters added to the connection file (`:host`,
28
+ # `:port`, `:password`, `:spassword`, `:display` and `:websocket`
29
+ # will always exist)
30
+ # @option context [#to_s] :websockify_cmd
31
+ # ("${WEBSOCKIFY_CMD:-/opt/websockify/run}") the path to the
32
+ # websockify script (assumes you don't modify `:after_script`)
33
+ # @option context [#to_s] :vnc_log ("vnc.log") path to vnc server log
34
+ # file (assumes you don't modify `:before_script` or `:after_script`)
35
+ # @option context [#to_s] :vnc_passwd ("vnc.passwd") path to the file
36
+ # generated that contains the encrypted vnc password (assumes you
37
+ # don't modify `:before_script`)
38
+ # @option context [#to_s] :vnc_args arguments used when starting up the
39
+ # vnc server (overrides any specific vnc argument) (assumes you don't
40
+ # modify `:before_script`)
41
+ # @option context [#to_s] :name ("") name of the vnc server session
42
+ # (not set if blank or `:vnc_args` is set) (assumes you don't modify
43
+ # `:before_script`)
44
+ # @option context [#to_s] :geometry ("") resolution of vnc display (not
45
+ # set if blank or `:vnc_args` is set) (assumes you don't modify
46
+ # `:before_script`)
47
+ # @option context [#to_s] :dpi ("") dpi of vnc display (not set if
48
+ # blank or `:vnc_args` is set) (assumes you don't modify
49
+ # `:before_script`)
50
+ # @option context [#to_s] :fonts ("") command delimited list of fonts
51
+ # available in vnc display (not set if blank or `:vnc_args` is set)
52
+ # (assumes you don't modify `:before_script`)
53
+ # @option context [#to_s] :idle ("") timeout vnc server if no
54
+ # connection in this amount of time in seconds (not set if blank or
55
+ # `:vnc_args` is set) (assumes you don't modify `:before_script`)
56
+ # @option context [#to_s] :extra_args ("") any extra arguments used
57
+ # when initializing the vnc server process (not set if blank or
58
+ # `:vnc_args` is set) (assumes you don't modify `:before_script`)
59
+ # @option context [#to_s] :vnc_clean ("...") script used to clean up
60
+ # any active vnc sessions (assumes you don't modify `:before_script`
61
+ # or `:clean_script`)
62
+ # @option context [#to_s] :container_path ("vnc_container.sif") the path
63
+ # to the container with VNC
64
+ # @option context [#to_s] :container_bindpath ("") paths to bind into
65
+ # the container with VNC
66
+ # @option context [#to_s] :container_module ("singularity") the module
67
+ # that loads Singularity or Apptainer with Lmod. Supports versions (i.e.
68
+ # apptainer/1.10). If Singularity or Apptainer are installed at a
69
+ # system level (i.e., no module loaded to activate), set this to an
70
+ # empty string.
71
+ # @option context [#to_s] :container_command ("singularity") the
72
+ # singularity or apptainer execution command
73
+ # @param instance_name (uuid) a name for the instance
74
+ # @see Template
75
+
76
+ def initialize(context = {})
77
+ @instance_name = SecureRandom.uuid
78
+ super
79
+ end
80
+
81
+ private
82
+ # We need to know the VNC and websockify connection information
83
+ def conn_params
84
+ (super + [:display, :websocket, :spassword, :instance_name]).uniq
85
+ end
86
+
87
+ # Before running the main script, start up a VNC server and record
88
+ # the connection information
89
+ def before_script
90
+ container_path = context.fetch(:container_path, "vnc_container.sif").to_s
91
+ container_bindpath = context.fetch(:container_bindpath, "").to_s
92
+
93
+ <<-EOT.gsub(/^ {14}/, "")
94
+
95
+ # Load #{container_module}
96
+ echo "Loading #{container_module}..."
97
+ module load #{container_module}
98
+ export #{container_command.upcase}_BINDPATH="#{container_bindpath}"
99
+ export INSTANCE_NAME="#{@instance_name}"
100
+ export instance_name="#{@instance_name}"
101
+ echo "Starting instance..."
102
+ #{container_command} instance start #{container_path} #{@instance_name}
103
+
104
+ # Setup one-time use passwords and initialize the VNC password
105
+ function change_passwd () {
106
+ echo "Setting VNC password..."
107
+ password=$(create_passwd "#{password_size}")
108
+ spassword=${spassword:-$(create_passwd "#{password_size}")}
109
+ (
110
+ umask 077
111
+ echo -ne "${password}\\n${spassword}" | #{container_command} exec instance://#{@instance_name} vncpasswd -f > "#{vnc_passwd}"
112
+ )
113
+ }
114
+ change_passwd
115
+
116
+
117
+ # Start up vnc server (if at first you don't succeed, try, try again)
118
+ echo "Starting VNC server..."
119
+ for i in $(seq 1 10); do
120
+ # Clean up any old VNC sessions that weren't cleaned before
121
+ #{vnc_clean}
122
+
123
+ # for turbovnc 3.0 compatability.
124
+ if timeout 2 #{container_command} exec instance://#{@instance_name} vncserver --help 2>&1 | grep 'nohttpd' >/dev/null 2>&1; then
125
+ HTTPD_OPT='-nohttpd'
126
+ fi
127
+
128
+ # Attempt to start VNC server
129
+ VNC_OUT=$(#{container_command} exec instance://#{@instance_name} vncserver -log "#{vnc_log}" -rfbauth "#{vnc_passwd}" $HTTPD_OPT -noxstartup #{vnc_args} 2>&1)
130
+ VNC_PID=$(pgrep -s 0 Xvnc) # the script above will daemonize the Xvnc process
131
+ echo "${VNC_PID}"
132
+ echo "${VNC_OUT}"
133
+
134
+ # Sometimes Xvnc hangs if it fails to find working disaply, we
135
+ # should kill it and try again
136
+ kill -0 ${VNC_PID} 2>/dev/null && [[ "${VNC_OUT}" =~ "Fatal server error" ]] && kill -TERM ${VNC_PID}
137
+
138
+ # Check that Xvnc process is running, if not assume it died and
139
+ # wait some random period of time before restarting
140
+ kill -0 ${VNC_PID} 2>/dev/null || sleep 0.$(random_number 1 9)s
141
+
142
+ # If running, then all is well and break out of loop
143
+ kill -0 ${VNC_PID} 2>/dev/null && break
144
+ done
145
+
146
+ # If we fail to start it after so many tries, then just give up
147
+ kill -0 ${VNC_PID} 2>/dev/null || clean_up 1
148
+
149
+ # Parse output for ports used
150
+ display=$(echo "${VNC_OUT}" | awk -F':' '/^Desktop/{print $NF}')
151
+ port=$((5900+display))
152
+
153
+ echo "Successfully started VNC server on ${host}:${port}..."
154
+
155
+ #{super}
156
+ EOT
157
+ end
158
+
159
+ # Run the script under the VNC server's display
160
+ def run_script
161
+ %(DISPLAY=:${display} #{super})
162
+ end
163
+
164
+ # After startup the main script, scan the VNC server log file for
165
+ # successful connections so that the password can be reset
166
+ def after_script
167
+ websockify_cmd = context.fetch(:websockify_cmd, "${WEBSOCKIFY_CMD:-/opt/websockify/run}").to_s
168
+
169
+ <<-EOT.gsub(/^ {14}/, "")
170
+ #{super}
171
+
172
+ # Launch websockify websocket server
173
+ module load #{container_module}
174
+ echo "Starting websocket server..."
175
+ websocket=$(find_port)
176
+ #{container_command} exec instance://#{@instance_name} #{websockify_cmd} -D ${websocket} localhost:${port}
177
+
178
+ # Set up background process that scans the log file for successful
179
+ # connections by users, and change the password after every
180
+ # connection
181
+ echo "Scanning VNC log file for user authentications..."
182
+ while read -r line; do
183
+ if [[ ${line} =~ "Full-control authentication enabled for" ]]; then
184
+ change_passwd
185
+ create_yml
186
+ fi
187
+ done < <(tail -f --pid=${SCRIPT_PID} "#{vnc_log}") &
188
+ EOT
189
+ end
190
+
191
+ # Clean up the running VNC server and any other stale VNC servers
192
+ def clean_script
193
+ <<-EOT.gsub(/^ {14}/, "")
194
+ #{super}
195
+ module load #{container_module}
196
+
197
+ #{vnc_clean}
198
+ [[ -n ${display} ]] && vncserver -kill :${display}
199
+ #{container_command} instance stop #{@instance_name}
200
+ EOT
201
+ end
202
+
203
+ # Log file for VNC server
204
+ def vnc_log
205
+ context.fetch(:vnc_log, "vnc.log").to_s
206
+ end
207
+
208
+ # Password file for VNC server
209
+ def vnc_passwd
210
+ context.fetch(:vnc_passwd, "vnc.passwd").to_s
211
+ end
212
+
213
+ def container_module
214
+ context.fetch(:container_module, "singularity").to_s
215
+ end
216
+
217
+ def container_command
218
+ context.fetch(:container_command, "singularity").to_s
219
+ end
220
+
221
+ # Arguments sent to `vncserver` command
222
+ def vnc_args
223
+ context.fetch(:vnc_args) do
224
+ name = context.fetch(:name, "").to_s
225
+ geometry = context.fetch(:geometry, "").to_s
226
+ dpi = context.fetch(:dpi, "").to_s
227
+ fonts = context.fetch(:fonts, "").to_s
228
+ idle = context.fetch(:idle, "").to_s
229
+ extra_args = context.fetch(:extra_args, "").to_s
230
+
231
+ args = []
232
+ args << "-name #{name}" unless name.empty?
233
+ args << "-geometry #{geometry}" unless geometry.empty?
234
+ args << "-dpi #{dpi}" unless dpi.empty?
235
+ args << "-fp #{fonts}" unless fonts.empty?
236
+ args << "-idletimeout #{idle}" unless idle.empty?
237
+ args << extra_args
238
+
239
+ args.join(" ")
240
+ end.to_s
241
+ end
242
+
243
+ # Clean up any stale VNC sessions
244
+ def vnc_clean
245
+ context.fetch(:vnc_clean) do
246
+ %(#{container_command} exec instance://#{@instance_name} vncserver -list | awk '/^:/{system("kill -0 "$2" 2>/dev/null || #{container_command} exec instance://#{@instance_name} vncserver -kill "$1)}')
247
+ end.to_s
248
+ end
249
+ end
250
+ end
251
+ end
252
+ end
@@ -23,6 +23,7 @@ module OodCore
23
23
 
24
24
  class PromptError < StandardError; end
25
25
 
26
+ # The adapter class for the Cloudy Cluster product CCQ.
26
27
  class CCQ < Adapter
27
28
  using Refinements::ArrayExtensions
28
29
 
@@ -1,6 +1,8 @@
1
1
  require "ood_core/refinements/hash_extensions"
2
2
  require "json"
3
3
 
4
+ # Utility class for the Kubernetes adapter to interact
5
+ # with the Kuberenetes APIs.
4
6
  class OodCore::Job::Adapters::Kubernetes::Batch
5
7
 
6
8
  require_relative "helper"
@@ -1,3 +1,5 @@
1
+ # Utility class for the Kubernetes adapter to parse
2
+ # json data into Ruby objects.
1
3
  class OodCore::Job::Adapters::Kubernetes::Helper
2
4
 
3
5
  require_relative 'resources'
@@ -193,10 +195,14 @@ class OodCore::Job::Adapters::Kubernetes::Helper
193
195
  end
194
196
 
195
197
  def secret_info_from_json(json_data)
196
- raw = json_data.dig(:data, :password)
197
- { ood_connection_info: { password: Base64.decode64(raw) } }
198
- rescue
199
- {}
198
+ data = json_data.to_h[:data] || {}
199
+
200
+ info = data.symbolize_keys.each_with_object({}) do |data_kv, hash|
201
+ hash[data_kv[0]] = Base64.decode64(data_kv[1])
202
+ rescue
203
+ next
204
+ end
205
+ { ood_connection_info: info }
200
206
  end
201
207
 
202
208
  def dispatch_time(json_data)
@@ -1,4 +1,4 @@
1
- # An object that describes a submitted kubernetes job with extended information
1
+ # An object that describes a submitted kubernetes job with extended information.
2
2
  class OodCore::Job::Adapters::Kubernetes::K8sJobInfo < OodCore::Job::Info
3
3
  attr_reader :ood_connection_info
4
4
 
@@ -1,5 +1,5 @@
1
1
  module OodCore::Job::Adapters::Kubernetes::Resources
2
-
2
+ # Utility class for kubernetes configmap objects.
3
3
  class ConfigMap
4
4
  attr_accessor :name, :files
5
5
 
@@ -20,6 +20,7 @@ module OodCore::Job::Adapters::Kubernetes::Resources
20
20
  end
21
21
  end
22
22
 
23
+ # Utility class for mounting files in kubernetes configmap objects.
23
24
  class ConfigMapFile
24
25
  attr_accessor :filename, :data, :mount_path, :sub_path, :init_mount_path, :init_sub_path
25
26
 
@@ -33,6 +34,7 @@ module OodCore::Job::Adapters::Kubernetes::Resources
33
34
  end
34
35
  end
35
36
 
37
+ # Utility class for kuberenetes probe settings.
36
38
  class TCPProbe
37
39
  attr_accessor :port, :initial_delay_seconds, :failure_threshold, :period_seconds
38
40
 
@@ -54,6 +56,7 @@ module OodCore::Job::Adapters::Kubernetes::Resources
54
56
  end
55
57
  end
56
58
 
59
+ # Utility class for kuberenetes container object.
57
60
  class Container
58
61
  attr_accessor :name, :image, :command, :port, :env, :working_dir,
59
62
  :memory_limit, :memory_request, :cpu_limit, :cpu_request,
@@ -106,6 +109,7 @@ module OodCore::Job::Adapters::Kubernetes::Resources
106
109
  end
107
110
  end
108
111
 
112
+ # Utility class for kuberenetes podspec object.
109
113
  class PodSpec
110
114
  attr_accessor :container, :init_containers
111
115
  def initialize(container, init_containers: nil)
@@ -13,6 +13,8 @@ module OodCore
13
13
  end
14
14
 
15
15
  module Adapters
16
+
17
+ # The adapter class for Kubernetes.
16
18
  class Kubernetes < Adapter
17
19
 
18
20
  using Refinements::ArrayExtensions
@@ -22,6 +22,8 @@ module OodCore
22
22
  end
23
23
 
24
24
  module Adapters
25
+
26
+ # The adapter class for the LSF scheduler.
25
27
  class Lsf < Adapter
26
28
  using Refinements::ArrayExtensions
27
29
 
@@ -453,7 +453,7 @@ module OodCore
453
453
 
454
454
  # Parse hash describing PBS Pro job status
455
455
  def parse_job_info(v)
456
- /^(?<job_owner>[\w-]+)@(?<submit_host>.+)$/ =~ v[:Job_Owner]
456
+ /^(?<job_owner>[\w\-.]+)@(?<submit_host>.+)$/ =~ v[:Job_Owner]
457
457
  allocated_nodes = parse_nodes(v[:exec_host] || "")
458
458
  procs = allocated_nodes.inject(0) { |sum, x| sum + x[:procs] }
459
459
  if allocated_nodes.empty? # fill in with requested resources
@@ -1,3 +1,5 @@
1
+ # Utility helper class for the SGE adapter to parse
2
+ # input and generate submission arguements.
1
3
  class OodCore::Job::Adapters::Sge::Helper
2
4
  require 'ood_core/job/adapters/sge'
3
5
 
@@ -16,7 +16,6 @@ require 'ood_core/job/array_ids'
16
16
  # :status
17
17
  # :wallclock_limit
18
18
  # :wallclock_time
19
-
20
19
  class QstatXmlJRListener
21
20
  # [Hash]
22
21
  attr_reader :parsed_job
@@ -13,7 +13,6 @@ require 'date'
13
13
  # :queue_name
14
14
  # :status
15
15
  # :wallclock_limit
16
-
17
16
  class QstatXmlRListener
18
17
  # [Array<Hash>]
19
18
  attr_reader :parsed_jobs
@@ -22,6 +22,8 @@ module OodCore
22
22
  end
23
23
 
24
24
  module Adapters
25
+
26
+ # The adpater class for Grid Engine (GE) flavors like Sun Grid Engine.
25
27
  class Sge < Adapter
26
28
  using Refinements::HashExtensions
27
29
  using Refinements::ArrayExtensions
@@ -37,8 +37,7 @@ module OodCore
37
37
  end
38
38
 
39
39
  module Adapters
40
- # An adapter object that describes the communication with a remote host
41
- # for job management.
40
+ # The adapter for using systemd timers as the scheduler.
42
41
  class LinuxSystemd < Adapter
43
42
  using Refinements::ArrayExtensions
44
43
 
@@ -1,3 +1,4 @@
1
+ # Utility class to maintain all the Torque attributes available.
1
2
  class OodCore::Job::Adapters::Torque
2
3
  # Maintains a constant Hash of defined PBS attribute types
3
4
  # Includes:
@@ -1,5 +1,7 @@
1
1
  require 'open3'
2
2
 
3
+ # Utility class for the Torque adapter to communicate with the
4
+ # Torque scheduler.
3
5
  class OodCore::Job::Adapters::Torque
4
6
  # Object used for simplified communication with a batch server
5
7
  class Batch
@@ -1,3 +1,4 @@
1
+ # FFI errors for the Torque adapter.
1
2
  class OodCore::Job::Adapters::Torque::FFI
2
3
  # The root exception class that all PBS-specific exceptions inherit from
3
4
  class Error < StandardError; end
@@ -1,6 +1,6 @@
1
1
  require 'ffi'
2
2
 
3
- # An interface to the C-library of Torque
3
+ # An interface to the C-library of Torque.
4
4
  class OodCore::Job::Adapters::Torque::FFI
5
5
 
6
6
  extend ::FFI::Library
@@ -1,14 +1,14 @@
1
- # Builds a sorted array of job ids given a job array spec string
2
- #
3
- # Job array spec strings:
4
- # 1 Single id
5
- # 1-10 Range
6
- # 1-10:2 Range with step
7
- # 1-10,13 Compound (range with single id)
8
- #
9
- # Note that Ranges are expected to be inclusive
10
1
  module OodCore
11
2
  module Job
3
+ # Builds a sorted array of job ids given a job array spec string
4
+ #
5
+ # Job array spec strings:
6
+ # 1 Single id
7
+ # 1-10 Range
8
+ # 1-10:2 Range with step
9
+ # 1-10,13 Compound (range with single id)
10
+ #
11
+ # Note that Ranges are expected to be inclusive
12
12
  class ArrayIds
13
13
  attr_reader :spec_string
14
14
 
@@ -1,6 +1,6 @@
1
1
  module OodCore
2
2
  module Job
3
- # An object that contains details about the cluster's active and total nodes, processors, and gpus
3
+ # An object that contains details about the cluster's active and total nodes, processors and gpus.
4
4
  class ClusterInfo
5
5
  using Refinements::HashExtensions
6
6
 
@@ -2,7 +2,7 @@ require 'time'
2
2
 
3
3
  module OodCore
4
4
  module Job
5
- # An object that describes a submitted job
5
+ # An object that describes a submitted job.
6
6
  class Info
7
7
  # The identifier of the job
8
8
  # @return [String] job id
@@ -1,6 +1,6 @@
1
1
  module OodCore
2
2
  module Job
3
- # An object that describes the resources used on a specific node
3
+ # An object that describes the resources used on a specific node.
4
4
  class NodeInfo
5
5
  # The name of the host machine
6
6
  # @return [String] node name
@@ -1,6 +1,6 @@
1
1
  module OodCore
2
2
  module Job
3
- # An object that describes the current state of a submitted job
3
+ # An object that describes the current state of a submitted job.
4
4
  class Status
5
5
  class << self
6
6
  # Possible states a submitted job can be in:
@@ -1,4 +1,4 @@
1
1
  module OodCore
2
2
  # The current version of {OodCore}
3
- VERSION = "0.21.0"
3
+ VERSION = "0.22.0"
4
4
  end
data/ood_core.gemspec CHANGED
@@ -30,5 +30,5 @@ Gem::Specification.new do |spec|
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
- spec.add_development_dependency "climate_control", "~> 1.1.1"
33
+ spec.add_development_dependency "climate_control", "~> 1.2.0"
34
34
  end
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.21.0
4
+ version: 0.22.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: 2022-08-01 00:00:00.000000000 Z
13
+ date: 2022-10-31 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: ood_support
@@ -136,14 +136,14 @@ dependencies:
136
136
  requirements:
137
137
  - - "~>"
138
138
  - !ruby/object:Gem::Version
139
- version: 1.1.1
139
+ version: 1.2.0
140
140
  type: :development
141
141
  prerelease: false
142
142
  version_requirements: !ruby/object:Gem::Requirement
143
143
  requirements:
144
144
  - - "~>"
145
145
  - !ruby/object:Gem::Version
146
- version: 1.1.1
146
+ version: 1.2.0
147
147
  description: Open OnDemand core library that provides support for an HPC Center to
148
148
  globally define HPC services that web applications can then take advantage of.
149
149
  email:
@@ -164,6 +164,7 @@ files:
164
164
  - Rakefile
165
165
  - bin/console
166
166
  - bin/setup
167
+ - docs/.keep
167
168
  - lib/ood_core.rb
168
169
  - lib/ood_core/acl/adapter.rb
169
170
  - lib/ood_core/acl/adapters/group.rb
@@ -172,6 +173,7 @@ files:
172
173
  - lib/ood_core/batch_connect/template.rb
173
174
  - lib/ood_core/batch_connect/templates/basic.rb
174
175
  - lib/ood_core/batch_connect/templates/vnc.rb
176
+ - lib/ood_core/batch_connect/templates/vnc_container.rb
175
177
  - lib/ood_core/cluster.rb
176
178
  - lib/ood_core/clusters.rb
177
179
  - lib/ood_core/errors.rb