torque_rm 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile ADDED
@@ -0,0 +1,52 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "torque_rm"
18
+ gem.homepage = "http://github.com/helios/torque_rm"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{TORQUE Resource Manager wrapper for Ruby}
21
+ gem.description = %Q{TORQUE Resource Manager for Ruby. Submit, check and control your job directly from Ruby.}
22
+ gem.email = "ilpuccio.febo@gmail.com"
23
+ gem.authors = ["Raoul Jean Pierre Bonnal"]
24
+ # dependencies defined in Gemfile
25
+ end
26
+ Jeweler::RubygemsDotOrgTasks.new
27
+
28
+ require 'rspec/core'
29
+ require 'rspec/core/rake_task'
30
+ RSpec::Core::RakeTask.new(:spec) do |spec|
31
+ spec.pattern = FileList['spec/**/*_spec.rb']
32
+ end
33
+
34
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
35
+ spec.pattern = 'spec/**/*_spec.rb'
36
+ spec.rcov = true
37
+ end
38
+
39
+ require 'cucumber/rake/task'
40
+ Cucumber::Rake::Task.new(:features)
41
+
42
+ task :default => :spec
43
+
44
+ require 'rdoc/task'
45
+ Rake::RDocTask.new do |rdoc|
46
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
47
+
48
+ rdoc.rdoc_dir = 'rdoc'
49
+ rdoc.title = "torque_rm #{version}"
50
+ rdoc.rdoc_files.include('README*')
51
+ rdoc.rdoc_files.include('lib/**/*.rb')
52
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,147 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'haml'
4
+ require 'sinatra'
5
+ require 'torque_rm'
6
+ require 'sinatra/twitter-bootstrap'
7
+ require 'sinatra/json'
8
+ require 'sinatra/respond_with'
9
+ # require 'ap'
10
+ require "#{File.dirname(__FILE__)}/../web/helpers/qstat.rb"
11
+
12
+
13
+ set :run, true
14
+ enable :run
15
+
16
+ register Sinatra::Twitter::Bootstrap::Assets
17
+
18
+ set :root, File.join(File.dirname(__FILE__),"..","web")
19
+
20
+
21
+ helpers TORQUE::Qstat::Sinatra::Helpers
22
+
23
+ get '/' do
24
+ 'Welcome to our gorgeous TORQUE/PBS web interface.'.to_json
25
+ end
26
+
27
+
28
+ get '/qstat', :provides => [:json, :html] do
29
+ jobs = TORQUE::Qstat.new.query
30
+ respond_to do |format|
31
+ format.json do
32
+ jobs.to_json
33
+ end
34
+ format.html { haml :qstat, :format => :html5, :locals => {:jobs => jobs}}
35
+ end
36
+ end
37
+
38
+ get '/qstat/fields', :provides => [:json] do
39
+
40
+ json TORQUE::Qstat::FIELDS
41
+ end
42
+
43
+ get '/qstat/all/:field', :provides => [:json] do |field|
44
+ if TORQUE::Qstat::FIELDS.include? field
45
+ jobs = TORQUE::Qstat.new.query
46
+ json jobs.map{|job| job[field.to_sym]}
47
+ else
48
+ return status 404
49
+ end
50
+ end
51
+
52
+
53
+ ### JOBS
54
+
55
+ get '/qstat/:job_id', :provides => [:json] do |job_id|
56
+ respond_to do |format|
57
+ format.json do
58
+ job = TORQUE::Qstat.new.query job_id: job_id
59
+ # q = TORQUE::Qstat.new
60
+ # p = TORQUE::Qstat::Parser.new
61
+ # t = TORQUE::Qstat::Trans.new
62
+
63
+ # s= "Job Id: 2770.deep.space.nine\n Job_Name = STDIN\n Job_Owner = johndoe@deep.space.nine\n resources_used.cput = 00:00:00\n resources_used.mem = 3148kb\n resources_used.vmem = 32528kb\n resources_used.walltime = 00:28:05\n job_state = R\n queue = bio\n server = deep.space.nine\n Checkpoint = u\n ctime = Mon Sep 2 18:43:10 2013\n Error_Path = deep.space.nine:/mnt/bio/ngs/data/home/johndoe/STDIN.e2770\n exec_host = scrapper/0\n exec_port = 15003\n Hold_Types = n\n Join_Path = n\n Keep_Files = n\n Mail_Points = a\n mtime = Mon Sep 2 18:43:11 2013\n Output_Path = deep.space.nine:/mnt/bio/ngs/data/home/johndoe/STDIN.o2770\n\t\n Priority = 0\n qtime = Mon Sep 2 18:43:10 2013\n Rerunable = True\n Resource_List.ncpus = 2\n Resource_List.nice = 0\n session_id = 16963\n Variable_List = PBS_O_QUEUE=bio,PBS_O_HOST=deep.space.nine,\n\tPBS_O_HOME=/mnt/bio/ngs/data/home/johndoe,PBS_O_LANG=it_IT.UTF-8,\n\tPBS_O_LOGNAME=johndoe,\n\tPBS_O_PATH=/mnt/bio/ngs/data/opt/fastx_toolkit/bin:/mnt/bio/ngs/data/\n\topt/bedtools/bin:/mnt/bio/ngs/data/opt/fuseki:/mnt/bio/ngs/data/opt/je\n\tna/bin:/mnt/bio/ngs/data/opt/CASAVA/bin:/mnt/bio/ngs/data/bin/cloaked-\n\thipster/utils:/mnt/bio/ngs/data/bin/cloaked-hipster/utils/ngs/pipeline\n\ts:/mnt/bio/ngs/data/bin/cloaked-hipster/utils/db:/mnt/bio/ngs/data/opt\n\t/trimmomatic:/mnt/bio/ngs/data/opt/PHYLOCSF/hmmer-3.0-linux-intel-x86_\n\t64/binaries:/mnt/bio/ngs/data/opt/PHYLOCSF/mlin-PhyloCSF-983a652/:/mnt\n\t/bio/ngs/data/bin/cloaked-hipster/ncrnapp/PBS_pipeline/:/mnt/bio/ngs/d\n\tata/opt/bowtie-0.12.9:/mnt/bio/ngs/data/opt/bowtie_current:/mnt/bio/ng\n\ts/data/opt/STAR_current:/mnt/bio/ngs/data/opt/RSeQC-2.3.5/RQC/usr/loca\n\tl/bin:/mnt/bio/ngs/data/opt/tophat_current:/mnt/bio/ngs/data/opt/PASA/\n\tscripts:/mnt/bio/ngs/data/opt/PASA/bin:/mnt/bio/ngs/data/opt/fasta/bin\n\t:/mnt/bio/ngs/data/opt/cufflinks:/mnt/bio/ngs/data/opt/samtools:/mnt/b\n\tio/ngs/data/opt/samtools/bcftools:/mnt/bio/ngs/data/opt/samtools/misc:\n\t/mnt/bio/ngs/data/opt/STAR_current/bin:/mnt/bio/ngs/data/opt/gmap/bin:\n\t/mnt/bio/ngs/data/opt/velvet:/mnt/bio/ngs/data/opt/velvet/contrib/colu\n\tmbus_scripts:/opt/blat:/mnt/bio/ngs/data/opt/oases/:/mnt/bio/ngs/data/\n\topt/oases/scripts:/mnt/bio/ngs/data/opt/trinityrnaseq:/mnt/bio/ngs/dat\n\ta/opt/trinityrnaseq/util:/usr/local/bin/:/mnt/bio/ngs/data/home/bonnal\n\traoul/.rbenv/bin:/mnt/bio/ngs/data/home/johndoe/.rbenv/shims:/mnt/\n\tbio/ngs/data/home/johndoe/.rbenv/bin:/usr/local/sbin:/usr/local/bi\n\tn:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games,\n\tPBS_O_MAIL=/var/mail/johndoe,PBS_O_SHELL=/bin/bash,\n\tPBS_SERVER=spark,PBS_O_WORKDIR=/mnt/bio/ngs/data/home/johndoe\n etime = Mon Sep 2 18:43:10 2013\n submit_args = -l ncpus=2 -l nice=0\n start_time = Mon Sep 2 18:43:11 2013\n start_count = 1\n fault_tolerant = False\n submit_host = deep.space.nine"
64
+ # job = job_id == "2770" ? q.mock(t.apply(p.parse(s.gsub(/\n\t/,'')))) : []
65
+ if job.empty?
66
+ return status 404
67
+ else
68
+ json :job => job.first
69
+ end
70
+ end
71
+ end
72
+ # if job.empty?
73
+ # "There is no job running with id #{job_id}"
74
+ # else
75
+
76
+ # haml :qstat_job, :format => :html5, :locals => {:job => job.first} #get the first and unique elment if the array is not empty
77
+ # end
78
+ end
79
+
80
+ get '/qstat/job/fields', :provides => [:json] do
81
+ json :job_fields => TORQUE::Qstat::Job.fields
82
+ end
83
+
84
+ get '/qstat/:job_id/:field', :provides => [:json] do |job_id, field|
85
+
86
+
87
+ # puts TORQUE::Qstat::Job.fields
88
+ if TORQUE::Qstat::Job.fields.include? field
89
+ # q = TORQUE::Qstat.new
90
+ # p = TORQUE::Qstat::Parser.new
91
+ # t = TORQUE::Qstat::Trans.new
92
+ # s= "Job Id: 2770.deep.space.nine\n Job_Name = STDIN\n Job_Owner = johndoe@deep.space.nine\n resources_used.cput = 00:00:00\n resources_used.mem = 3148kb\n resources_used.vmem = 32528kb\n resources_used.walltime = 00:28:05\n job_state = R\n queue = bio\n server = deep.space.nine\n Checkpoint = u\n ctime = Mon Sep 2 18:43:10 2013\n Error_Path = deep.space.nine:/mnt/bio/ngs/data/home/johndoe/STDIN.e2770\n exec_host = scrapper/0\n exec_port = 15003\n Hold_Types = n\n Join_Path = n\n Keep_Files = n\n Mail_Points = a\n mtime = Mon Sep 2 18:43:11 2013\n Output_Path = deep.space.nine:/mnt/bio/ngs/data/home/johndoe/STDIN.o2770\n\t\n Priority = 0\n qtime = Mon Sep 2 18:43:10 2013\n Rerunable = True\n Resource_List.ncpus = 2\n Resource_List.nice = 0\n session_id = 16963\n Variable_List = PBS_O_QUEUE=bio,PBS_O_HOST=deep.space.nine,\n\tPBS_O_HOME=/mnt/bio/ngs/data/home/johndoe,PBS_O_LANG=it_IT.UTF-8,\n\tPBS_O_LOGNAME=johndoe,\n\tPBS_O_PATH=/mnt/bio/ngs/data/opt/fastx_toolkit/bin:/mnt/bio/ngs/data/\n\topt/bedtools/bin:/mnt/bio/ngs/data/opt/fuseki:/mnt/bio/ngs/data/opt/je\n\tna/bin:/mnt/bio/ngs/data/opt/CASAVA/bin:/mnt/bio/ngs/data/bin/cloaked-\n\thipster/utils:/mnt/bio/ngs/data/bin/cloaked-hipster/utils/ngs/pipeline\n\ts:/mnt/bio/ngs/data/bin/cloaked-hipster/utils/db:/mnt/bio/ngs/data/opt\n\t/trimmomatic:/mnt/bio/ngs/data/opt/PHYLOCSF/hmmer-3.0-linux-intel-x86_\n\t64/binaries:/mnt/bio/ngs/data/opt/PHYLOCSF/mlin-PhyloCSF-983a652/:/mnt\n\t/bio/ngs/data/bin/cloaked-hipster/ncrnapp/PBS_pipeline/:/mnt/bio/ngs/d\n\tata/opt/bowtie-0.12.9:/mnt/bio/ngs/data/opt/bowtie_current:/mnt/bio/ng\n\ts/data/opt/STAR_current:/mnt/bio/ngs/data/opt/RSeQC-2.3.5/RQC/usr/loca\n\tl/bin:/mnt/bio/ngs/data/opt/tophat_current:/mnt/bio/ngs/data/opt/PASA/\n\tscripts:/mnt/bio/ngs/data/opt/PASA/bin:/mnt/bio/ngs/data/opt/fasta/bin\n\t:/mnt/bio/ngs/data/opt/cufflinks:/mnt/bio/ngs/data/opt/samtools:/mnt/b\n\tio/ngs/data/opt/samtools/bcftools:/mnt/bio/ngs/data/opt/samtools/misc:\n\t/mnt/bio/ngs/data/opt/STAR_current/bin:/mnt/bio/ngs/data/opt/gmap/bin:\n\t/mnt/bio/ngs/data/opt/velvet:/mnt/bio/ngs/data/opt/velvet/contrib/colu\n\tmbus_scripts:/opt/blat:/mnt/bio/ngs/data/opt/oases/:/mnt/bio/ngs/data/\n\topt/oases/scripts:/mnt/bio/ngs/data/opt/trinityrnaseq:/mnt/bio/ngs/dat\n\ta/opt/trinityrnaseq/util:/usr/local/bin/:/mnt/bio/ngs/data/home/bonnal\n\traoul/.rbenv/bin:/mnt/bio/ngs/data/home/johndoe/.rbenv/shims:/mnt/\n\tbio/ngs/data/home/johndoe/.rbenv/bin:/usr/local/sbin:/usr/local/bi\n\tn:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games,\n\tPBS_O_MAIL=/var/mail/johndoe,PBS_O_SHELL=/bin/bash,\n\tPBS_SERVER=spark,PBS_O_WORKDIR=/mnt/bio/ngs/data/home/johndoe\n etime = Mon Sep 2 18:43:10 2013\n submit_args = -l ncpus=2 -l nice=0\n start_time = Mon Sep 2 18:43:11 2013\n start_count = 1\n fault_tolerant = False\n submit_host = deep.space.nine"
93
+ job = TORQUE::Qstat.new.query job_id: job_id
94
+ # job = q.mock(t.apply(p.parse(query.gsub(/\n\t/,''))))
95
+ json field.to_sym => job.first[field.to_sym]
96
+ else
97
+ return status 404
98
+ end
99
+ # if job.empty?
100
+ # "There is no job running with id #{job_id}"
101
+ # else
102
+
103
+ # haml :qstat_job, :format => :html5, :locals => {:job => job.first} #get the first and unique elment if the array is not empty
104
+ # end
105
+ end
106
+
107
+ post '/qstat/:job_id/del', :provides => [:json] do |job_id|
108
+ job = TORQUE::Qstat.new.query job_id: job_id
109
+ if job.empty?
110
+ return status 404
111
+ else
112
+ json job.first.del
113
+ end
114
+
115
+ end
116
+
117
+
118
+
119
+ __END__
120
+
121
+ @@ layout
122
+ %html
123
+ %head
124
+ = bootstrap_assets
125
+ %body
126
+ - container :fluid do
127
+ .navbar
128
+ .navbar-inner
129
+ %a{class:"brand", href:"#"} TORQUE PBS
130
+ %ul{class:"nav"}
131
+ %li{class:"active"}
132
+ %a{href:"#"} Getting Started
133
+ %li
134
+ %a{href:"#"} Documentation
135
+ %li
136
+ %a{href:"#"} REST Api
137
+ %li
138
+ %a{href:"#"} About
139
+ %li
140
+ %a{href:"#"} Contact
141
+
142
+
143
+ - row do
144
+ - span8 do
145
+ = yield
146
+ - span4 :offset => 4 do
147
+ footer
@@ -0,0 +1,21 @@
1
+ Given(/^the server "(.*?)"$/) do |server_name|
2
+ TORQUE.server = server_name # express the regexp above with the code you wish you had
3
+ end
4
+
5
+
6
+ When(/^I request the server name without specify the hostname$/) do
7
+ @server = TORQUE.server
8
+ end
9
+
10
+ When(/^I request the server name$/) do
11
+ @server = TORQUE.server # express the regexp above with the code you wish you had
12
+ end
13
+
14
+ # Then(/^I should get a "(.*?)"$/) do |reply|
15
+ # @server.should be_an_instance_of(Rye::Box) # express the regexp above with the code you wish you had
16
+ # end
17
+
18
+ Then(/^I should get a "(.*?)" on "(.*?)"$/) do |ssh_manager_object, hostname|
19
+ @server.should be_an_instance_of(Object.const_get(ssh_manager_object)) # express the regexp above with the code you wish you had
20
+ @server.host.should == hostname
21
+ end
@@ -0,0 +1,47 @@
1
+ Before do
2
+ @qsub = TORQUE::Qsub.new
3
+ end
4
+
5
+ Given /^I want to be notified if the job begins$/ do
6
+ @qsub.m << "b"
7
+ end
8
+
9
+ Given /^I want to be notified if the job ends$/ do
10
+ @qsub.m << "e"
11
+ end
12
+
13
+ Given /^I want to be notified if the job aborts$/ do
14
+ @qsub.m << "a"
15
+ end
16
+
17
+ Given(/^the name "(.*?)"$/) do |job_name|
18
+ @qsub.name = job_name
19
+ end
20
+
21
+
22
+ Given(/^I want to use the "(.*?)" shell$/) do |job_shell|
23
+ @qsub.shell = job_shell
24
+ end
25
+
26
+ Given(/^I want to set the "(.*?)" to "(.*?)"$/) do |qsub_parameter, value|
27
+ @qsub.send "#{qsub_parameter}=", value # express the regexp above with the code you wish you had
28
+ end
29
+
30
+ Given(/^I want to use (\d+) cpus for a single node$/) do |n_cpus|
31
+ @qsub.cpus = n_cpus # express the regexp above with the code you wish you had
32
+ end
33
+
34
+
35
+ Given(/^the command "(.*?)"$/) do |job_command|
36
+ @qsub.script = job_command # express the regexp above with the code you wish you had
37
+ end
38
+
39
+ Then(/^I should get a configuration like$/) do |pbs_script|
40
+ @qsub.to_s.should == pbs_script # express the regexp above with the code you wish you had
41
+ end
42
+
43
+ Then(/^I should get the pbs script$/) do |pbs_script|
44
+ @qsub.to_s.should == pbs_script # express the regexp above with the code you wish you had
45
+ end
46
+
47
+
File without changes
@@ -0,0 +1,13 @@
1
+ require 'bundler'
2
+ begin
3
+ Bundler.setup(:default, :development)
4
+ rescue Bundler::BundlerError => e
5
+ $stderr.puts e.message
6
+ $stderr.puts "Run `bundle install` to install missing gems"
7
+ exit e.status_code
8
+ end
9
+
10
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
11
+ require 'torque_rm'
12
+
13
+ require 'rspec/expectations'
@@ -0,0 +1,9 @@
1
+ #Feature: something something
2
+ # In order to something something
3
+ # A user something something
4
+ # something something something
5
+
6
+ # Scenario: something something
7
+ # Given inspiration
8
+ # When I create a sweet new gem
9
+ # Then everyone should see how awesome I am
@@ -0,0 +1,22 @@
1
+ Feature: Configure torque_rm
2
+ In order to interact with the Torque server
3
+ As a user I must configure the system
4
+
5
+ Scenario: Torque is the localhost
6
+ When I request the server name without specify the hostname
7
+ Then I should get a "Rye::Box" on "localhost"
8
+
9
+ Scenario: Torque is a remote machine
10
+ Given the server "torque.remote.net"
11
+ When I request the server name
12
+ Then I should get a "Rye::Box" on "torque.remote.net"
13
+
14
+ Scenario: Torque binary are installed in the default location
15
+ Given the server "torque.remote.net"
16
+ When I try to get a qstat
17
+ Then the server tell me it can execute the command
18
+
19
+ Scenario: Torque binary are not installed in the default location
20
+ Given the server "torque.remote.net"
21
+ When I try to get a qstat
22
+ Then the server tell me it can not execute the command
@@ -0,0 +1,52 @@
1
+ Feature: Submit jobs
2
+ In order to submit a job
3
+ A user should be able to create a batch job
4
+ prividing multiple PBS options
5
+ attaching a shell script
6
+
7
+ Scenario: Configure a batch job
8
+ Given the name "MyBatch"
9
+ And I want to use the "/bin/bash" shell
10
+ And I want to be notified if the job begins
11
+ And I want to be notified if the job ends
12
+ And I want to be notified if the job aborts
13
+ Then I should get a configuration like
14
+ """
15
+ #PBS -m bea
16
+ #PBS -N MyBatch
17
+ #PBS -S /bin/bash
18
+
19
+ """
20
+
21
+ Scenario: Prepare a script to get the hostname from a node
22
+ Given the name "MyBatch"
23
+ And I want to use the "/bin/bash" shell
24
+ And I want to be notified if the job begins
25
+ And I want to be notified if the job ends
26
+ And I want to be notified if the job aborts
27
+ And I want to set the "working_directory" to "/home/submitter/test_cluster"
28
+ And I want to set the "stdout" to "/home/submitter/test_cluster"
29
+ And I want to set the "stderr" to "/home/submitter/test_cluster"
30
+ And I want to use 4 cpus for a single node
31
+ And the command "echo `hostname`"
32
+ Then I should get the pbs script
33
+ """
34
+ #PBS -d /home/submitter/test_cluster
35
+ #PBS -e /home/submitter/test_cluster
36
+ #PBS -l nodes=1:ppn=4
37
+ #PBS -m bea
38
+ #PBS -N MyBatch
39
+ #PBS -o /home/submitter/test_cluster
40
+ #PBS -S /bin/bash
41
+ echo `hostname`
42
+ """
43
+
44
+
45
+ Scenario: Get the hostname from a node
46
+ Given the name "MyBatch"
47
+ And I want to use the "/bin/bash" shell
48
+ And I want to be notified if the job begins
49
+ And I want to be notified if the job ends
50
+ And I want to be notified if the job aborts
51
+ And the command "echo `hostname`"
52
+ Then I should get the name of the execution node
data/lib/torque_rm.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'parslet'
2
+ require 'yaml'
3
+ require 'colorize'
4
+ require 'terminal-table'
5
+ require 'torque_rm/common'
6
+ require 'torque_rm/qsub'
7
+ require 'torque_rm/qstat'
8
+ require 'torque_rm/qdel'
9
+
10
+ # Try to laod the default configuration
11
+ TORQUE.load_config
@@ -0,0 +1,74 @@
1
+ require 'rye'
2
+ require 'etc'
3
+
4
+ module TORQUE
5
+ @@username = Etc.getlogin
6
+ @@qcommands_path = '/usr/bin'
7
+ @@master = Rye::Box.new("localhost")
8
+ @@conf = {}
9
+ def self.server=(hostname)
10
+ if hostname
11
+ @@master = Rye::Box.new(hostname, @@conf)
12
+ end
13
+ end
14
+
15
+ def self.server
16
+ @@master
17
+ end
18
+
19
+ def self.username=(username)
20
+ @@username = username
21
+ end
22
+
23
+
24
+ def self.qcommands_path=(path)
25
+ @@qcommands_path = path
26
+ %w(qstat qsub qdel).each do |command|
27
+ Rye::Cmd.remove_command command if Rye::Cmd.can? command
28
+ Rye::Cmd.add_command command, File.join(qcommands_path, command)
29
+ end
30
+ end
31
+
32
+ def self.qcommands_path
33
+ @@qcommands_path
34
+ end
35
+
36
+ def self.path
37
+ self.qcommands_path
38
+ end
39
+
40
+ def self.read_config(file)
41
+ if File.exists?(file)
42
+ conf = YAML::load( File.open( file) )
43
+ @@conf = conf.dup
44
+ @@conf.delete(:hostname)
45
+ @@conf.delete(:path)
46
+ self.qcommands_path = conf[:path]
47
+ self.username = conf[:user] unless conf[:user].nil?
48
+ # self.port = conf[:port] unless conf[:port].nil?
49
+ # self.password = conf[:password] unless conf[:password].nil?
50
+ self.server = conf[:hostname]
51
+ end
52
+ end
53
+
54
+ # Load configuration, default from file in user home with name .toruqe_rm.yaml
55
+ def self.load_config(file=nil)
56
+ self.read_config File.expand_path(file.nil? ? "~/.torque_rm.yaml" : file)
57
+ self
58
+ end
59
+
60
+ # Save configuration, default in user home with name .toruqe_rm.yaml
61
+ def self.save_config(file=nil)
62
+ File.write File.expand_path(file.nil? ? "~/.torque_rm.yaml" : file), {hostname: @@master.host, path: @@qcommands_path, user: @@username}.to_yaml
63
+ end
64
+
65
+ # Get the host name/ip of the local/remote server user as submitter/interface to PBS
66
+ def self.host
67
+ self.server.host
68
+ end
69
+
70
+ # Get the hostname, this may require an internet connection and fully qualified name
71
+ def self.hostname
72
+ self.server.hostname
73
+ end
74
+ end