bin/controller in robot-controller-1.0.2 vs bin/controller in robot-controller-2.0.beta1

- old
+ new

@@ -1,55 +1,107 @@ #!/usr/bin/env ruby +require 'yaml' +require 'robot-controller' if ARGV.size == 0 puts ' Usage: controller ( boot | quit ) controller ( start | status | stop | restart | log ) [worker] + controller verify [--verbose] controller [--help] Example: % controller boot # start bluepilld and jobs % controller status # check on status of jobs % controller log dor_accessionWF_descriptive-metadata # view log for worker + % controller verify # verify robots are running as configured % controller stop # stop jobs % controller quit # stop bluepilld Environment: BLUEPILL_BASEDIR - where bluepill stores its state (default: run/bluepill) BLUEPILL_LOGFILE - output log (default: log/bluepill.log) ROBOT_ENVIRONMENT - (default: development) ' - exit -1 + exit(-1) end ENV['ROBOT_ENVIRONMENT'] ||= 'development' ENV['BLUEPILL_BASE_DIR'] ||= File.expand_path('run/bluepill') -ENV['BLUEPILL_LOGFILE'] ||= File.expand_path('log/bluepill.log') +ENV['BLUEPILL_LOGFILE'] ||= File.expand_path('log/bluepill.log') -unless File.directory?('config') && - File.directory?(File.dirname(ENV['BLUEPILL_BASE_DIR'])) && - File.directory?(File.dirname(ENV['BLUEPILL_LOGFILE'])) - raise "Run from root directory" -end +fail 'bluepill requires config directory' unless File.directory?('config') +fail 'bluepill requires run directory' unless File.directory?(File.dirname(ENV['BLUEPILL_BASE_DIR'])) +fail 'bluepill requires log directory' unless File.directory?(File.dirname(ENV['BLUEPILL_LOGFILE'])) cmd = 'bluepill' cmd << ' --no-privileged' cmd << " --base-dir #{ENV['BLUEPILL_BASE_DIR']}" cmd << " --logfile #{ENV['BLUEPILL_LOGFILE']}" -if ARGV[0] == 'boot' +case ARGV[0].downcase +when 'boot' fn = 'config/bluepill.rb' # allow override - unless File.file?(fn) - require 'robot-controller' - fn = RobotController.bluepill_config - end + fn = RobotController.bluepill_config unless File.file?(fn) if File.file?(fn) - puts "Loading #{fn}" + # puts "Loading #{fn}" exec "#{cmd} load #{fn}" # NOTREACHED end puts "ERROR: Cannot find bluepill configuration file for #{ENV['ROBOT_ENVIRONMENT']}" - exit -1 + exit(-1) +when 'verify' + verbose = (ARGV[1] == '--verbose') + + # load list of all possible robots + robots = YAML.load_file('config/robots.yml') + fail ArgumentError unless robots.is_a? Array + + # determine how many processes should be running for each robot + running = {} + robots.each do |robot| + running[robot] = 0 + end + RobotController::Parser.load("robots_#{ENV['ROBOT_ENVIRONMENT']}.yml").each do |h| + running[h[:robot]] = h[:n] + end + + # verify that all robots running are known to the config/robots.yml + running.each_key do |robot| + if !robots.include?(robot) + puts "ERROR: '#{robot}' robot is unknown to the suite. Check config/robots.yml" + running.delete(robot) + end + end + + # verify suite + verify = RobotController::Verify.new(running) + begin + statuses = verify.verify + rescue => e + puts "ERROR: Cannot run verification for any robots. #{e.class}: #{e.message}" + exit(-1) + end + + # print output for each status + ok = true + puts 'ERROR: No robots to verify?' if statuses.size == 0 + statuses.each_pair do |robot, status| + case status[:state] + when :up + puts "OK: #{robot} is up (#{status[:running]} running)" if verbose + when :not_enabled + puts "OK: #{robot} is not enabled (#{status[:running]} running)" if verbose + when :down + ok = false + puts "ERROR: #{robot} is down (#{status[:running]} of #{running[robot]} running)" + else + ok = false + puts "ERROR: #{robot} cannot be verified (state=#{status[:state]})" + end + end + puts 'OK' if ok && !verbose && statuses.size > 0 + exit(0) else exec "#{cmd} #{ARGV.join(' ')}" # NOTREACHED end