Sha256: 7433e9b5292b5dff8830d557625861e259bff1c3a92462ce47c1531e79bb300f

Contents?: true

Size: 1.94 KB

Versions: 1

Compression:

Stored size: 1.94 KB

Contents

require 'drb'
require 'foodtaster/version'

module Foodtaster
  class Client
    MAX_ATTEMPTS = 20

    def self.connect(drb_port, server_process = nil)
      attempt_index = 1
      begin
        sleep 0.2
        client = Foodtaster::Client.new(drb_port)
      rescue DRb::DRbConnError => e
        Foodtaster.logger.debug "DRb connection failed (attempt #{attempt_index}/#{MAX_ATTEMPTS}): #{e.message}"
        attempt_index += 1
        retry if attempt_index <= MAX_ATTEMPTS && (server_process.nil? || server_process.alive?)
      end

      if client
        Foodtaster.logger.debug "DRb connection established"
      else
        Foodtaster.logger.debug "Can't connect to Foodtaster DRb Server"
      end

      client
    end

    [:vm_defined?, :prepare_vm, :rollback_vm,
     :run_chef_on_vm, :execute_command_on_vm,
     :shutdown_vm, :vm_prepared?].each do |method_name|
       define_method method_name do |*args|
         begin
           @v.send(method_name, *args)
         rescue DRb::DRbUnknownError => e
           message = "Folowing exception was raised on server:\n#{e.unknown.buf}"
           Foodtaster.logger.fatal(message)
           raise e
         end
       end
     end

     private

     def initialize(drb_port)
       # start local service to be able to redirect stdout & stderr
       # to client
       DRb.start_service("druby://localhost:0")
       @v = DRbObject.new_with_uri("druby://localhost:#{drb_port}")

       init
     end

     private

     def init
       $stdout.extend DRbUndumped
       $stderr.extend DRbUndumped

       @v.redirect_stdstreams($stdout, $stderr)
       check_version
     end

     def check_version
       server_version = @v.version

       if server_version != Foodtaster::VERSION
         Foodtaster.logger.warn "Warning: Foodtaster DRb Server version doesn't match Foodtaster Gem version.\n\nDRb Server version: #{server_version}\nFoodtaster Gem version: #{Foodtaster::VERSION}\n"
       end
     end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
foodtaster-0.0.6 lib/foodtaster/client.rb