oats 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,7 +1,7 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
- unless defined?(OATS_GEM_IS_ALREADY_INCLUDED)
4
- OATS_GEM_IS_ALREADY_INCLUDED = true
3
+ unless defined?(OATS_IS_ALREADY_INCLUDED)
4
+ OATS_IS_ALREADY_INCLUDED = true
5
5
 
6
6
  gemspec
7
7
  # Include Gemfile from dir_tests
data/bin/oats CHANGED
@@ -1,10 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
-
3
- dir = File.dirname(__FILE__)
4
- $:.unshift File.expand_path('../lib', dir )
5
- require 'oats'
6
- if $oats_execution['options']["_:agent"]
7
- Oats::Driver.agent
8
- else
9
- Oats.run
10
- end
2
+ require File.expand_path('../../lib/oats', __FILE__ )
3
+ Oats.run
data/lib/oats/driver.rb CHANGED
@@ -9,39 +9,7 @@ module Oats
9
9
 
10
10
  module Driver
11
11
 
12
- def Driver.agent
13
- ENV['KILL_AGENT' ] = 'KILL_AGENT' if $oats_execution['options']["_:kill_agent"]
14
- ENV['OATS_USER' ] = $oats_execution['options']["_:oats_user"] if $oats_execution['options']["_:oats_user"]
15
- ENV['OATS_TESTS_REPOSITORY_VERSION' ] = $oats_execution['options']["_:repository_version"] if $oats_execution['options']["_:repository_version"]
16
- nick = $oats_execution['options']["execution:occ:agent_nickname"]
17
- ENV['OATS_AGENT_NICKNAME' ] = nick if nick
18
- port = $oats_execution['options']["execution:occ:agent_port"].to_s
19
- ENV['OATS_AGENT_PORT'] = port if port
20
- dir = ENV['HOME'] + "/results_archive/#{nick}/agent_logs"
21
- FileUtils.mkdir_p(dir) unless File.exists?(dir)
22
- ENV['OATS_AGENT_CONFIG_FILE'] = "#{dir}/config-agent.txt"
23
- dat = `date +'%m%d%H%M%S'`.chomp
24
- log_file = "#{dir}/agent_#{dat}.log"
25
- ENV['OATS_AGENT_LOGFILE'] = log_file
26
- agent_log_file = "#{dir}/agent.log"
27
- cmd = ENV['OATS_HOME'] + '/bin/agent'
28
- pid = `#{cmd}`.chomp
29
- puts "Running PID: " + pid + ', Log: ' + log_file
30
- # echo "$NICKNAME $PORT $PID $DISPLAY_NUM" >| $config_agent_file
31
- 10.times do
32
- if File.exist? log_file
33
- FileUtils.rm_f agent_log_file
34
- FileUtils.ln log_file, agent_log_file
35
- break
36
- end
37
- sleep 1
38
- end
39
- end
40
-
41
- # Main method that starts oats execution in either agent or standalone mode.
42
- # Parameters are command-line arguments
43
- # Returns oats_info object containing execution results
44
- def Driver.run(args)
12
+ def Driver.init(args=nil)
45
13
  unless ENV['HOSTNAME']
46
14
  if RUBY_PLATFORM =~ /(mswin|mingw)/
47
15
  ENV['HOSTNAME'] = ENV['COMPUTERNAME']
@@ -49,7 +17,6 @@ module Oats
49
17
  ENV['HOSTNAME'] = `hostname`.chomp
50
18
  end
51
19
  end
52
-
53
20
  Log4r::Logger.root.level = Log4r::DEBUG
54
21
  Log4r::StdoutOutputter.new('console', :level=>1,
55
22
  :formatter=>Log4r::PatternFormatter.new(:depth=>50,
@@ -62,33 +29,15 @@ module Oats
62
29
  @@quiet = options['_:quiet'] # save quiet option from initial commandline options
63
30
  $log.remove('console') if @@quiet
64
31
  ENV['HOME'] = Util.expand_path(ENV['HOME']) if ENV['HOME'] # Normalize for cygwin
65
- if $oats_execution['agent']
66
- require 'oats/ragent'
67
- # $oats_execution['agent'] (used by framework) == Oats.global['agent'] (by YAMLs) === options
68
- $oats = OatsData.load(options['_:ini_file'])
69
- $oats['_']['options'] = options
70
- Roptions.override(options)
71
- # $oats would be reset and and regenerated by agents across jobs.
72
-
73
- options['execution:occ:agent_host'] = $oats['execution']['occ']['agent_host']
74
- options['execution:occ:agent_port'] = $oats['execution']['occ']['agent_port']
75
- options['execution:occ:agent_nickname'] = ($oats['execution']['occ']['agent_nickname'] || options['execution:occ:agent_host'].sub(/\..*/,''))
76
- $oats['execution']['occ']['agent_nickname'] = options['execution:occ:agent_nickname']
77
-
78
- if options['_:command']
79
- require 'oats/rclient'
80
- options['_:id'] = Time.now.to_i.to_s
81
- request = { :command => options['_:command'], :args => options['_:args'] }
82
- request[:id] = options['_:id'] if options['_:id']
83
- EventMachine::run { EventMachine::connect options['execution:occ:agent_host'],
84
- options['execution:occ:agent_port'].to_i, Rclient, options['execution:occ:agent_host'], request
85
- }
86
- else
87
- Ragent.start $oats['execution']['occ']
88
- end
89
- else
90
- Driver.start(nil,options)
91
- end
32
+ options
33
+ end
34
+
35
+ # Main method that starts oats execution in either agent or standalone mode.
36
+ # Parameters are command-line arguments
37
+ # Returns oats_info object containing execution results
38
+ def Driver.run(args)
39
+ options = Driver.init(args)
40
+ Driver.start(nil,options)
92
41
  $oats_info
93
42
  end
94
43
 
data/lib/oats/report.rb CHANGED
@@ -140,8 +140,8 @@ module Oats
140
140
  $log.error exc
141
141
  return oats_info
142
142
  end
143
+ OatsAgent::Ragent.snapshot_oats_info(rinfo) if $oats_execution['agent']
143
144
  begin
144
- Ragent.snapshot_oats_info(rinfo) if $oats_execution['agent']
145
145
  FileUtils.mv(results_file_tmp, results_file)
146
146
  rescue
147
147
  $log.error "Error moving [#{results_file_tmp}]. Skipping saving the intermediate results."
data/lib/oats/user_api.rb CHANGED
@@ -183,7 +183,7 @@ module Oats
183
183
  oats_data['execution']['dir_results'] = Util.expand_path(oats_data['execution']['dir_results'])
184
184
  oats_data['result_archive_dir'] = oats_data['execution']['dir_results'] + '_archive'
185
185
  if $oats_execution['agent']
186
- agent_nickname = Ragent.occ['agent_nickname']
186
+ agent_nickname = OatsAgent::Ragent.occ['agent_nickname']
187
187
  if oats_data['execution']['dir_results'] !~ /#{agent_nickname}$/
188
188
  # Should move to a better place.This is unrelated to results, Just picking up the agent file.
189
189
  agent_ini_file = File.join(ENV['HOME'], agent_nickname + '_oats.yml')
data/lib/oats/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Oats
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1 "
3
3
  end
data/lib/oats.rb CHANGED
@@ -23,9 +23,8 @@ require 'oats/keywords'
23
23
 
24
24
  # GEMS needed by OATS.
25
25
  require 'rubygems'
26
- require "bundler/setup"
26
+ #require "bundler/setup"
27
27
  #Bundler.require
28
- #gem 'log4r'
29
28
  #require 'deep_merge' # Need modified version of https://github.com/danielsdeleo/deep_merge for 1.9 compatibility
30
29
  require 'log4r' # http://log4r.sourceforge.net/rdoc/index.html
31
30
 
data/oats.gemspec CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.test_files = File.directory?('.git') ? `git ls-files -- {test,spec,features}/*`.split("\n") : []
18
18
  end
19
19
  # s.test_files = ["test/test_cgi_wrapper.rb" ]
20
- s.executables = %w{oats occ}
20
+ s.executables = %w{oats}
21
21
  s.require_paths = ["lib"]
22
22
 
23
23
  # s.extra_rdoc_files = ["CHANGELOG", "COPYING", "lib/oats/oats.rb", "LICENSE", "README"]
@@ -32,12 +32,5 @@ Gem::Specification.new do |s|
32
32
 
33
33
  if RUBY_PLATFORM =~ /(mswin|mingw)/ # Assume won't use the agent
34
34
  s.add_dependency 'win32-process'
35
- else
36
- s.add_dependency 'json'
37
- s.add_dependency 'em-http-request'
38
- if RUBY_PLATFORM =~ /linux/ # Seems to be needed by Ubuntu
39
- s.add_dependency 'execjs'
40
- s.add_dependency 'therubyracer'
41
- end
42
35
  end
43
36
  end
data/oats_tests/bin/oats CHANGED
@@ -1,8 +1,2 @@
1
1
  #!/usr/bin/env ruby
2
- unless defined? Gem
3
- require 'rubygems'
4
- gem 'oats'
5
- end
6
- require 'oats'
7
- ENV['OATS_TESTS'] ||= File.expand_path(File.dirname(File.dirname(__FILE__)))
8
- Oats.run
2
+ require File.expand_path('../oats', __FILE__)
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ ENV['OATS_TESTS'] ||= File.expand_path(File.dirname(File.dirname(__FILE__)))
3
+ oats_lib = File.expand_path('../oats/lib', ENV['OATS_TESTS'])
4
+ if File.directory?(oats_lib) and false
5
+ $:.unshift(oats_lib)
6
+ else
7
+ require 'rubygems' unless defined? Gem
8
+ gem 'oats'
9
+ end
10
+ require 'oats'
11
+ Oats.run
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oats
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 0
10
- version: 0.1.0
9
+ - 1
10
+ version: 0.1.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Levent Atasoy
@@ -45,40 +45,11 @@ dependencies:
45
45
  version: "0"
46
46
  type: :runtime
47
47
  version_requirements: *id002
48
- - !ruby/object:Gem::Dependency
49
- name: json
50
- prerelease: false
51
- requirement: &id003 !ruby/object:Gem::Requirement
52
- none: false
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- hash: 3
57
- segments:
58
- - 0
59
- version: "0"
60
- type: :runtime
61
- version_requirements: *id003
62
- - !ruby/object:Gem::Dependency
63
- name: em-http-request
64
- prerelease: false
65
- requirement: &id004 !ruby/object:Gem::Requirement
66
- none: false
67
- requirements:
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- hash: 3
71
- segments:
72
- - 0
73
- version: "0"
74
- type: :runtime
75
- version_requirements: *id004
76
48
  description: A flexible automated system integration regression test framework.
77
49
  email:
78
50
  - levent.atasoy@gmail.com
79
51
  executables:
80
52
  - oats
81
- - occ
82
53
  extensions: []
83
54
 
84
55
  extra_rdoc_files: []
@@ -89,10 +60,7 @@ files:
89
60
  - Gemfile
90
61
  - README.txt
91
62
  - Rakefile
92
- - bin/agent
93
63
  - bin/oats
94
- - bin/occ
95
- - bin/results_cleanup
96
64
  - doc/COPYING
97
65
  - doc/LICENSE
98
66
  - doc/OATS_Framework.doc
@@ -119,9 +87,6 @@ files:
119
87
  - lib/oats/oats_selenium_api.rb
120
88
  - lib/oats/oselenium.rb
121
89
  - lib/oats/ossh.rb
122
- - lib/oats/patches_for_eventmachine_12.10.rb
123
- - lib/oats/ragent.rb
124
- - lib/oats/rclient.rb
125
90
  - lib/oats/report.rb
126
91
  - lib/oats/roptions.rb
127
92
  - lib/oats/test_case.rb
@@ -141,6 +106,7 @@ files:
141
106
  - oats_tests/Gemfile
142
107
  - oats_tests/aut_ini.yml
143
108
  - oats_tests/bin/oats
109
+ - oats_tests/bin/oats.rb
144
110
  - oats_tests/environments/qa.yml
145
111
  - oats_tests/environments/qa_chrome.yml
146
112
  - oats_tests/examples/core/coreExamples.yml
data/bin/agent DELETED
@@ -1,174 +0,0 @@
1
- #!/bin/bash
2
- # This script is used to start OATS in agent mode and communicate with OCC.
3
-
4
- [ "$OS" ] || export OS=$(uname)
5
- if [ "$OS" == "Windows_NT" ]; then
6
- export PATH="$PATH:/cygdrive/c/apps/cygwin/bin"
7
- [ "$HOSTNAME" ] || HOSTNAME="$COMPUTERNAME"
8
- else
9
- [ "$HOSTNAME" ] || HOSTNAME=`hostname`
10
- fi
11
- export HOSTNAME
12
- [ "$OATS_AGENT_NICKNAME" ] || OATS_AGENT_NICKNAME=${HOSTNAME/.*}
13
- doc="
14
- Starts OATS agent to be used with OCC
15
-
16
- USAGE: agent [-k[ill]] [-n[ickname] OATS_AGENT_NICKNAME] [ -p[ort] OATS_AGENT_PORT ]
17
- [ -r[epo] OATS_TESTS_REPOSITORY_VERSION ] [ -u OATS_USER]
18
-
19
- Parameters: (also can be passed in via environment variables
20
- -n OATS_AGENT_NICKNAME OCC ID of the agent.
21
- -p OATS_AGENT_PORT Agent port to communicate with OCC. Default is port previously
22
- used for OATS_AGENT_NICKNAME.
23
- -u OATS_USER who started the agent. Used for logging purposes only.
24
- -r OATS_TESTS_REPOSITORY_VERSION Required to update the agent.
25
- -k kill the agent, or set OATS_KILL_AGENT
26
-
27
- Example:
28
- /home/occadmin/oats/bin/agent -p 3011 -n occ_1 -r 403cc620c265db84dbd3fb7d7cce4d57416bff09
29
-
30
- The agent script should be in the path so that ssh from occ can pick it up.
31
- Git requires definition of OATS_TESTS_GIT_REPOSITORY environment variable.
32
- "
33
- input_pars="$@"
34
- while [ "$1" ]; do
35
- case $1 in
36
- -p*) shift; OATS_AGENT_PORT="$1" ;;
37
- -n*) shift; OATS_AGENT_NICKNAME="$1" ;;
38
- -u*) shift; OATS_USER="$1" ;;
39
- -k*) OATS_KILL_AGENT='OATS_KILL_AGENT' ;;
40
- -r*) shift; OATS_TESTS_REPOSITORY_VERSION="$1" ;;
41
- -d*) shift; DISPLAY_NUM="$1" ;;
42
- *) echo "Unrecognized parameter: $1" ;
43
- echo "$doc"
44
- exit ;;
45
- esac
46
- shift
47
- done
48
-
49
- function agent_echo {
50
- echo "$(date +'%m/%d/%H:%M:%S') $*"
51
- }
52
- function fkill {
53
- agent_echo "Killing PID: $each_pid"
54
- if [ "$OS" == "Windows_NT" ]; then
55
- pskill $1
56
- else
57
- kill -9 $1
58
- fi
59
- }
60
-
61
- {
62
- agent_echo "Invoking $0 $input_pars"
63
-
64
- # Need these off when called by OCC, otherwise they OCC values are inherited
65
- unset RUBYOPT BUNDLE_BIN_PATH BUNDLE_GEMFILE # GEM_HOME GEM_PATH # RAILS_ENV
66
- [ "$OATS_TESTS_GIT_REPOSITORY" ] && export OATS_TESTS="$HOME/results_archive/$OATS_AGENT_NICKNAME"/oats_tests
67
- ruby_com="$(dirname $(type -p $0))/oats -n $OATS_AGENT_NICKNAME -p $OATS_AGENT_PORT"
68
- if [ -e "$config_agent_file" ]; then
69
- line=$(grep "^$OATS_AGENT_NICKNAME" "$config_agent_file")
70
- read nickname PREV_OATS_AGENT_PORT pid display<<< $line
71
- [ "$OATS_AGENT_PORT" ] || OATS_AGENT_PORT=$PREV_OATS_AGENT_PORT
72
- [ "$PID" ] || PID=$pid
73
- if [ -z "$DISPLAY_NUM" ]; then
74
- if [ "$display" ]; then
75
- DISPLAY_NUM=$(echo "$display" | sed -e 's/.*:\(.\).*/\1/')
76
- [ "$DISPLAY_NUM" ] || DISPLAY_NUM="$display"
77
- else
78
- DISPLAY_NUM='0'
79
- fi
80
- fi
81
- fi
82
- if [ -z "$OATS_AGENT_PORT" ]; then
83
- agent_echo "$0: Must specify a port, exiting..." >&2
84
- exit 1
85
- fi
86
-
87
- [ "$OATS_AGENT_PORT" == "$PREV_OATS_AGENT_PORT" ] && PREV_OATS_AGENT_PORT=''
88
- for OATS_AGENT_PORT_VAR in $PREV_OATS_AGENT_PORT $OATS_AGENT_PORT; do
89
- skip_port=''
90
- if [ "$PID" -a "$OATS_AGENT_PORT_VAR" == "$PREV_OATS_AGENT_PORT" ]; then
91
- agent_echo "Attempting to kill agent $OATS_AGENT_NICKNAME with PID: $PID"
92
- fkill $PID
93
- [ $? == 0 ] && skip_port=skip_port
94
- fi
95
- if [ -z "$skip_port" ]; then
96
- # agent_echo "Attempting to kill process holding on to port $OATS_AGENT_PORT_VAR"
97
- if [ "$OS" == Darwin ]; then
98
- lines=$(ps -ef|grep "$ruby_com"|grep -v grep)
99
- PID=$(echo $(cut -c 6-11 <<< "$lines"))
100
- else
101
- if [ "$OS" == Windows_NT ]; then # Killing the top level bash process doesn't cut it
102
- lines=$(netstat -a -o 2>/dev/null| grep "$OATS_AGENT_PORT_VAR .* LISTEN" )
103
- else
104
- lines=$(netstat -n -p -l 2>/dev/null| grep "$OATS_AGENT_PORT_VAR .* LISTEN" )
105
- fi
106
- PID=$(echo "$line" | sed 's/.* LISTEN[^ ]* *//;s/.ruby .*//')
107
- [ "$PID" -a "$PID" != "$line" ] || PID=''
108
- fi
109
- if [ "$PID" ]; then
110
- agent_echo "PS line(s): $lines"
111
- for each_pid in $PID; do
112
- fkill $each_pid
113
- done
114
- # else
115
- # agent_echo "No agent is found on port $OATS_AGENT_PORT_VAR"
116
- fi
117
- fi
118
- done
119
- [ "$OATS_KILL_AGENT" ] && return
120
-
121
- if [ -d $OATS_TESTS/.svn ]; then
122
- COUNTER=0
123
- [ "$OATS_TESTS_REPOSITORY_VERSION" ] && agent_echo "Requested OATS Version: $OATS_TESTS_REPOSITORY_VERSION"
124
- while [ $COUNTER -lt 5 ]; do
125
- let COUNTER=COUNTER+1
126
- OATS_TESTS_CODE_VERSION=$(svn info $OATS_TESTS | sed -n 's/Last Changed Rev: *//p')
127
- [ "$OATS_TESTS_REPOSITORY_VERSION" ] || break
128
- [ "$OATS_TESTS_CODE_VERSION" -ge "$OATS_TESTS_REPOSITORY_VERSION" ] && break
129
- [ $COUNTER -eq 1 ] || sleep 3
130
- svn update $OATS_TESTS 2>&1
131
- done
132
- if [ $COUNTER -eq 5 ]; then
133
- agent_echo "Could not update the code version $OATS_TESTS_CODE_VERSION to $OATS_TESTS_REPOSITORY_VERSION" >&2
134
- return 2
135
- fi
136
- agent_echo "Current OATS code version: $OATS_TESTS_CODE_VERSION"
137
- elif [ "$OATS_TESTS_GIT_REPOSITORY" ]; then
138
- [ -d $OATS_TESTS ] || git clone $OATS_TESTS_GIT_REPOSITORY $OATS_TESTS
139
- cd $OATS_TESTS
140
- origin="$OATS_TESTS_GIT_REPOSITORY"
141
- [ "$origin" ] || origin=origin
142
- if [ "$OATS_TESTS_REPOSITORY_VERSION" ]; then
143
- for i in 1 2; do
144
- out=$(git checkout $OATS_TESTS_REPOSITORY_VERSION 2>&1) && break # may detach HEAD, but it is OK
145
- if [ "$out" == "fatal: reference is not a tree: $OATS_TESTS_REPOSITORY_VERSION" ]; then
146
- echo -n "Need to pull requested version: $OATS_TESTS_REPOSITORY_VERSION "
147
- else
148
- echo "$out"
149
- fi
150
- git pull $origin master # fast-forward master from origin
151
- done
152
- else
153
- git pull $origin master # fast-forward master from origin
154
- fi
155
- OATS_TESTS_CODE_VERSION=$(git rev-list HEAD -1) # last commit in checked out version
156
- if [ "${OATS_TESTS_CODE_VERSION##$OATS_TESTS_REPOSITORY_VERSION*}" ]; then
157
- agent_echo "Could not update the code version $OATS_TESTS_CODE_VERSION to $OATS_TESTS_REPOSITORY_VERSION" >&2
158
- return 2
159
- fi
160
- [ "$OATS_TESTS_REPOSITORY_VERSION" ] || agent_echo "Using OATS code version: $OATS_TESTS_CODE_VERSION"
161
- else
162
- OATS_TESTS_CODE_VERSION=$OATS_TESTS_REPOSITORY_VERSION
163
- [ "$OATS_TESTS_CODE_VERSION" ] && agent_echo "Setting OATS code version to the requested version: $OATS_TESTS_CODE_VERSION]" # This is not set for development/debug
164
- fi
165
- export OATS_TESTS_CODE_VERSION
166
- cd $OATS_HOME # Needed for bundler
167
- agent_echo "Starting agent $OATS_AGENT_NICKNAME on port $OATS_AGENT_PORT"
168
- $ruby_com
169
- } >> $OATS_AGENT_LOGFILE 2>&1 &
170
-
171
- PID=$(jobs -p)
172
- echo "Initiated PID: $PID" >> $OATS_AGENT_LOGFILE
173
- echo "$PID"
174
- echo "$OATS_AGENT_NICKNAME $OATS_AGENT_PORT $PID $DISPLAY_NUM" >| $OATS_AGENT_CONFIG_FILE
data/bin/occ DELETED
@@ -1,29 +0,0 @@
1
- #!/usr/bin/env ruby
2
- #
3
- # This script is used to start OCC
4
-
5
- #[ "$RAILS_ENV" ] || export RAILS_ENV="production"
6
- occ_home = ENV['OATS_OCC_HOME']
7
- unless occ_home
8
- pwd = Dir.pwd
9
- occ_home = pwd if File.basename(pwd) == 'occ'
10
- end
11
- occ_home = ENV['HOME'] + '/occ' unless occ_home
12
- occ_home = ENV['HOME'] + '/NetBeansProjects/occ' unless File.directory?(occ_home)
13
-
14
- raise "Must define OCC_HOME or be in occ directory to run this command." unless occ_home
15
-
16
- Dir.chdir(occ_home)
17
- exec 'ruby script/rails server mongrel' # -p 4000
18
-
19
- # By pass the following unless using distributed agents
20
- # if [ "$OS" != "Windows_NT" ]; then
21
- # if [ -z "$SSH_AGENT_PID" ] || ! ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null ; then
22
- # echo "Should start_agent for SSH first"
23
- # # exit 1
24
- # fi
25
- # ssh-add -l || echo "*** WARNING *** Please add your ssh keys ssh-add"
26
- # fi
27
-
28
-
29
- #mongrel_rails start -e production -p 3000 --log log\production.log
data/bin/results_cleanup DELETED
@@ -1,6 +0,0 @@
1
- #!/bin/bash
2
- rm -fr ~/results
3
- cd ~/results_archive
4
- rm -fr */8* # Cleanup older dated results
5
- rm -f */agent_logs/ag*_*.log # cleanup old agent logs
6
- rm -fr incomplete
@@ -1,66 +0,0 @@
1
- module EventMachine
2
-
3
- def self.event_callback conn_binding, opcode, data # :nodoc:
4
- #
5
- # Changed 27Dec07: Eliminated the hookable error handling.
6
- # No one was using it, and it degraded performance significantly.
7
- # It's in original_event_callback, which is dead code.
8
- #
9
- # Changed 25Jul08: Added a partial solution to the problem of exceptions
10
- # raised in user-written event-handlers. If such exceptions are not caught,
11
- # we must cause the reactor to stop, and then re-raise the exception.
12
- # Otherwise, the reactor doesn't stop and it's left on the call stack.
13
- # This is partial because we only added it to #unbind, where it's critical
14
- # (to keep unbind handlers from being re-entered when a stopping reactor
15
- # runs down open connections). It should go on the other calls to user
16
- # code, but the performance impact may be too large.
17
- #
18
- if opcode == ConnectionUnbound
19
- if c = @conns.delete( conn_binding )
20
- begin
21
- c.unbind
22
- rescue
23
- @wrapped_exception = $!
24
- stop
25
- end
26
- elsif c = @acceptors.delete( conn_binding )
27
- # no-op
28
- else
29
- # raise ConnectionNotBound, "recieved ConnectionUnbound for an unknown signature: #{conn_binding}"
30
- end
31
- elsif opcode == ConnectionAccepted
32
- accep,args,blk = @acceptors[conn_binding]
33
- raise NoHandlerForAcceptedConnection unless accep
34
- c = accep.new data, *args
35
- @conns[data] = c
36
- blk and blk.call(c)
37
- c # (needed?)
38
- elsif opcode == ConnectionCompleted
39
- c = @conns[conn_binding]
40
- if c
41
- c.connection_completed
42
- # else
43
- # raise ConnectionNotBound, "received ConnectionCompleted for unknown signature: #{conn_binding}"
44
- end
45
- ##
46
- # The remaining code is a fallback for the pure ruby and java reactors.
47
- # In the C++ reactor, these events are handled in the C event_callback() in rubymain.cpp
48
- elsif opcode == TimerFired
49
- t = @timers.delete( data )
50
- return if t == false # timer cancelled
51
- t or raise UnknownTimerFired, "timer data: #{data}"
52
- t.call
53
- elsif opcode == ConnectionData
54
- c = @conns[conn_binding] or raise ConnectionNotBound, "received data #{data} for unknown signature: #{conn_binding}"
55
- c.receive_data data
56
- elsif opcode == LoopbreakSignalled
57
- run_deferred_callbacks
58
- elsif opcode == ConnectionNotifyReadable
59
- c = @conns[conn_binding] or raise ConnectionNotBound
60
- c.notify_readable
61
- elsif opcode == ConnectionNotifyWritable
62
- c = @conns[conn_binding] or raise ConnectionNotBound
63
- c.notify_writable
64
- end
65
- end
66
- end
data/lib/oats/ragent.rb DELETED
@@ -1,321 +0,0 @@
1
- #require 'eventmachine' # http://eventmachine.rubyforge.org/EventMachine.html#M000486
2
- #require 'patches_for_eventmachine_12.10'
3
- require 'em-http-request' # https://github.com/igrigorik/em-http-request/wiki/Issuing-Requests
4
- require 'json'
5
-
6
- module Oats
7
-
8
- class Ragent < EventMachine::Connection
9
- attr_accessor :job_count, :jid, :occ_reintroduction_wait_time
10
- attr_reader :request
11
- @@logger = nil
12
- @@oats_info_snapshot = {}
13
- @@job_count = 1
14
- @@occ_default = nil
15
- @@logger = Log4r::Logger.new('A')
16
- include EM::P::ObjectProtocol
17
-
18
-
19
- # Non-nil if in the state of requesting for the next job
20
- def Ragent.in_next_job
21
- @@in_next_job
22
- end
23
- def Ragent.in_next_job=(v)
24
- @@in_next_job = v
25
- end
26
- def Ragent.is_busy=(jid)
27
- @@is_busy = jid
28
- end
29
- # Current/Last jobid worked on, or false
30
- def Ragent.is_busy
31
- @@is_busy
32
- end
33
-
34
- # Contains YAML OCC entries if oats is started in agent mode
35
- def Ragent.occ
36
- @@occ_default
37
- end
38
-
39
- def Ragent.start(occ_def)
40
- @@occ_default = occ_def # This should not change during agent execution
41
- @@logger.add('console')
42
- 3.times do |count| # In case of unexpected exceptions
43
- begin
44
- @@occ_reintroduction_wait_time = nil
45
- @@is_busy = false # If agent is started from scratch assume previous one is gone
46
- @@in_next_job = false
47
- @@logger.info "====================================================================================="
48
- mach_port = ENV['HOSTNAME'] + ':' + $oats['execution']['occ']['port'].to_s
49
- @@logger.info "Started OATS Server execution-#{count} on #{mach_port} at #{Time.now} "
50
- EventMachine::run do
51
- EventMachine::start_server @@occ_default['agent_host'], @@occ_default['agent_port'].to_i, Ragent
52
- EventMachine.next_tick do
53
- Ragent.server_logger nil,'Initiating contact with OCC '
54
- Ragent.start_next_job unless Ragent.is_busy
55
- end
56
- end
57
- break # Shutdown requested
58
- rescue Exception => exc
59
- @@logger.error exc
60
- end
61
- end
62
- end
63
-
64
- # def Ragent.force_close_connection
65
- # end
66
- def Ragent.job_count=(val)
67
- @@job_count = val
68
- end
69
- def Ragent.job_count
70
- @@job_count
71
- end
72
-
73
- def Ragent.snapshot_oats_info(oats_info)
74
- @@oats_info_snapshot = oats_info
75
- end
76
-
77
- # Generates summary data into the input oats_info
78
- def regen_results_summary!(oats_info)
79
- return Report.results(oats_info['test_files'],true)
80
- rescue
81
- server_logger $!.inspect + "\n" + $!.backtrace.join("\n ")
82
- false
83
- end
84
-
85
- # Results_status: Early, Partial, Current, Archived, Missing, Error
86
- def get_oats_info
87
- if @request[:jobid] == Ragent.is_busy # working on it now
88
- if @request[:jobid] == @@oats_info_snapshot['jobid'] # first test started processing
89
- if regen_results_summary!(@@oats_info_snapshot) # summary succeeded
90
- oats_info = Marshal.load(Marshal.dump(@@oats_info_snapshot))
91
- oats_info['results_status'] = 'Partial'
92
- else
93
- server_logger "[ERROR] Can not regen_results_summary from the snapshot"
94
- oats_info = {'results_status' => 'Error'}
95
- end
96
- elsif @@oats_info_snapshot['jobid']
97
- msg = "ERROR: Unexpected condition. Request jobid: #{@request[:jobid]} does not match stored job id: #{@@oats_info_snapshot['jobid']}"
98
- server_logger msg
99
- oats_info = { 'jobid' => @request[:jobid], 'results_status' => 'Error', 'error_message' => msg }
100
- else
101
- oats_info = Marshal.load(Marshal.dump(Oats.context))
102
- oats_info['results_status'] = 'Early'
103
- oats_info['jobid'] = Ragent.is_busy
104
- end
105
- else # Search for request on disk in archive or results
106
- res_dir = File.join(Oats.result_archive_dir, @request[:jobid].to_s)
107
- results_file = File.join( res_dir,'results.dump')
108
- if File.readable?(results_file) # Archived ones should have summary
109
- oats_info = Report.oats_info_retrieve(results_file)
110
- oats_info['results_status'] = 'Archived'
111
- else # May have to regenerate the summary, in case test had died
112
- results_file = File.join( $oats['execution']['dir_results'], 'results.dump')
113
- if File.readable?(results_file)
114
- oats_info = Report.oats_info_retrieve(results_file)
115
- if regen_results_summary!(oats_info) and @request[:jobid] == oats_info['jobid']
116
- oats_info['results_status'] = 'Current'
117
- else
118
- oats_info = {} unless oats_info.instance_of?(Hash)
119
- oats_info['debug_message'] = "request_jobid: #{@request[:jobid]}, current oats_info jobid: #{oats_info['jobid']}"
120
- oats_info['results_status'] = 'Missing'
121
- end
122
- else
123
- oats_info = { 'results_status' => 'Missing' ,
124
- 'debug_message' => "No readable: #{results_file}" }
125
- end
126
- end
127
- end
128
- # Convert object to hash
129
- oats_info['test_files'] = oats_info['test_files'].testlist_hash if oats_info['test_files']
130
- return oats_info
131
- rescue
132
- server_logger $!.inspect + "\n" + $!.backtrace.join("\n ")
133
- end
134
-
135
- def receive_object(request)
136
- @request = request
137
- password = @request.delete(:password)
138
- server_logger "Received " + @request.inspect
139
- @request[:password] = password
140
- response = {}
141
- case @request[:command]
142
-
143
- when 'status'
144
- EventMachine.next_tick { run_next_job } unless Ragent.is_busy
145
-
146
- when 'start'
147
- if Ragent.is_busy
148
- server_logger "Not getting next job again because Ragent.is_busy: #{Ragent.is_busy}"
149
- else
150
- EventMachine.next_tick { run_next_job }
151
- end
152
-
153
- when 'results'
154
- begin
155
- response[:oats_info] = get_oats_info
156
- rescue
157
- server_logger $!.inspect + "\n" + $!.backtrace.join("\n ")
158
- end
159
-
160
- when 'run' # only called from oats client, not from OCC
161
- EventMachine.defer( proc {
162
- Driver.start(@request[:jobid], @request[:args])
163
- } ) unless Ragent.is_busy
164
-
165
- when 'stop' # any further test execution for this jobid
166
- Oats.context['stop_oats'] = @request[:id] if @request[:stop_jobs].include?(Oats.context['jobid'])
167
-
168
- when 'shutdown'
169
- else
170
- response[:unknown_command] = true
171
- server_logger "Unknown command #{@request[:command]}"
172
- end
173
- response[:is_busy] = Ragent.is_busy
174
- stop_oats = Oats.context && Oats.context['stop_oats']
175
- response[:is_signal_oats_to_stop] = stop_oats if stop_oats
176
- server_logger "Sending " + response.inspect
177
- response[:password] = password
178
- send_object(response)
179
- close_connection_after_writing
180
- rescue
181
- server_logger $!.inspect + "\n" + $!.backtrace.join("\n ")
182
- end
183
-
184
- def unbind
185
- if @request[:command] == 'shutdown'
186
- server_logger "Shutting down the server."
187
- EventMachine::stop_event_loop
188
- end
189
- end
190
-
191
- def run_next_job(prev_jobid = nil)
192
- return unless @request[:occ_host] # Bad input or invoked via client, not occ
193
- occ = @@occ_default.clone
194
- occ['server_host'] = @request[:occ_host]
195
- occ['server_port'] = @request[:occ_port]
196
- Ragent.start_next_job(occ, self, prev_jobid)
197
- end
198
-
199
- def self.start_next_job(occ = @@occ_default, ra = nil, prev_jobid = nil)
200
- if Ragent.in_next_job or Ragent.is_busy
201
- msg = if Ragent.in_next_job
202
- if Ragent.in_next_job == nil.object_id
203
- "already getting the initial job."
204
- else
205
- "already getting job for #{Ragent.in_next_job}]"
206
- end
207
- else
208
- "became busy with #{Ragent.is_busy}"
209
- end
210
- Ragent.server_logger ra, "Not requesting new job since #{msg}"
211
- return false
212
- end
213
- Ragent.in_next_job = ra.object_id
214
- # Double check that this agent has the busy lock
215
- if not Ragent.in_next_job or Ragent.in_next_job != ra.object_id
216
- Ragent.server_logger(ra, "Not requesting new job since " +
217
- "now another Ragent #{ra.object_id} is requesting next job besides current #{Ragent.in_next_job}")
218
- return false
219
- end
220
- query = {
221
- 'nickname' => occ['agent_nickname'],
222
- 'machine' => occ['agent_host'],
223
- 'port' => occ['agent_port'] }
224
- query['jobid'] = prev_jobid if prev_jobid
225
- query['repo'] = ENV['OATS_TESTS_CODE_VERSION'].to_s if ENV['OATS_TESTS_CODE_VERSION'] and ENV['OATS_TESTS_CODE_VERSION'] != ''
226
- query['logfile'] = File.basename(ENV['OATS_AGENT_LOGFILE']||'agent.log')
227
- Ragent.server_logger ra, "Getting next OCC job: " + query.inspect
228
- query['password='] = ra.request[:password] if ra and ra.request[:password]
229
- # Default inactivity_timeout of 10 is not enough when OCC is restarting too
230
- # many agents. Agent gives up in 10secs but OCC hands over the job in 20secs.
231
- # As a result OCC thinks job is received but agent has never seen the job.
232
- connection_options = { :connect_timeout => 60,:inactivity_timeout => 60}
233
- http_req = EventMachine::HttpRequest.new('http://' + occ['server_host'] + ":#{occ['server_port']}",connection_options)
234
- http = http_req.get :path => '/jobs/nxt', :query => query
235
- http.errback { self.no_response(occ,ra, prev_jobid) }
236
- http.callback do
237
- status = http.response_header.status
238
- if status == 200
239
- data =http.response
240
- nxt_job = JSON.parse(data) if data
241
- if nxt_job['jid']
242
- Ragent.is_busy = nxt_job['jid']
243
- Ragent.in_next_job = false
244
- if ra
245
- ra.jid = nxt_job['jid']
246
- ra.occ_reintroduction_wait_time = nil # Reset wait time to default if heard from OCC
247
- end
248
- Ragent.server_logger ra, "Job-#{Ragent.job_count} #{nxt_job.inspect}"
249
- EventMachine.defer do
250
- begin
251
- opts= {'execution:environments' => [nxt_job['env']],
252
- 'execution:test_files' => [nxt_job['list']] }
253
- opts['_:options'] = nxt_job['options'].split(',') if nxt_job['options'] and nxt_job['options'] != ''
254
- Ragent.snapshot_oats_info({})
255
- Driver.start(nxt_job['jid'],opts)
256
- ensure
257
- Ragent.is_busy = false
258
- end
259
- Ragent.job_count += 1
260
- if ra
261
- ra.run_next_job(nxt_job['jid'] )
262
- else
263
- Ragent.start_next_job(occ,ra,nxt_job['jid'])
264
- end
265
- end
266
- else
267
- Ragent.in_next_job = false
268
- Ragent.server_logger ra, "No more pending jobs at OCC. Pausing processing.\n"
269
- Ragent.job_count = 1
270
- Ragent.server_logger ra, "***********************************************************\n"
271
- end
272
- else
273
- self.no_response(occ,ra, prev_jobid)
274
- end
275
- end
276
- rescue RuntimeError => e.message
277
- Ragent.in_next_job = false
278
- if e.message == 'eventmachine not initialized: evma_connect_to_server'
279
- Ragent.server_logger ra, "Shutting down..."
280
- else
281
- Ragent.server_logger ra, $!.inspect + "\n" + $!.backtrace.join("\n ")
282
- end
283
- end
284
-
285
- def self.no_response(occv,ra, prev_jobid)
286
- Ragent.in_next_job = false
287
- Ragent.server_logger ra, "OCC did not respond."
288
- wait = ra ? ra.occ_reintroduction_wait_time : @@occ_reintroduction_wait_time
289
- wait ||= $oats['execution']['occ']['timeout_waiting_for_occ']
290
- # Keep retrying to introduce, doubling the intervals
291
- self.server_logger ra, "Will retry in #{wait} seconds."
292
- EM.add_timer(wait) do
293
- Ragent.start_next_job(occv,ra, prev_jobid) unless Ragent.is_busy # by now
294
- end
295
- wait *= (1.5 + rand(101)/100.0)
296
- wait = wait.round
297
- if ra
298
- ra.occ_reintroduction_wait_time = wait
299
- else
300
- @@occ_reintroduction_wait_time = wait
301
- end
302
- end
303
-
304
- def server_logger(arg)
305
- Ragent.server_logger self, arg
306
- end
307
-
308
- def Ragent.server_logger(ra, arg)
309
- if ra
310
- req = ra.request
311
- jid = ra.jid
312
- rt = ":R#{(req and req[:id]) ? req[:id] : ra.object_id}"
313
- rt += "#{" J:#{jid}" if jid }"
314
- end
315
- @@logger.info "[RS#{rt}] #{arg}"
316
- rescue
317
- @@logger.error $!.inspect + "\n" + $!.backtrace.join("\n ")
318
- end
319
-
320
- end
321
- end
data/lib/oats/rclient.rb DELETED
@@ -1,42 +0,0 @@
1
- module Oats
2
-
3
- class Rclient < EventMachine::Connection
4
- attr_reader :response
5
- include EM::P::ObjectProtocol
6
- # def serializer
7
- # YAML
8
- # end
9
- #
10
- def initialize(host, request)
11
- @host = host
12
- @request = request
13
- end
14
-
15
- def receive_object(response)
16
- @response = response
17
- password = response.delete(:password)
18
- length = 500
19
- resp = response.inspect
20
- resp = resp[0..length] + ' ..... ' + resp[-length..-1] if resp.size > 2*length
21
- client_logger "Received " + resp + " from"
22
- response[:password] = password
23
- client_logger "Command was not recognized" if response[:unknown_command]
24
- end
25
-
26
- def client_logger(arg)
27
- $log.info arg + " #{@request[:id]}@#{@host} at " + Time.now.strftime("%y-%m-%d %H:%M:%S")
28
- end
29
-
30
- def post_init
31
- password = @request.delete(:password)
32
- client_logger "Sending " + @request.inspect + " to"
33
- @request[:password] = password
34
- send_object(@request)
35
- end
36
- def unbind
37
- client_logger "Did not hear from " unless @response
38
- EventMachine::stop_event_loop
39
- end
40
- end
41
-
42
- end