class Hydra::Sync

Hydra class responsible for delegate work down to workers.

The Sync is run once for each remote worker.

Attributes

connect[R]
remote_dir[R]
ssh_opts[R]

Public Class Methods

new(worker_opts, sync_opts, verbose = false) click to toggle source

Create a new Sync instance to rsync source from the local machine to a remote worker

Arguments:

  • :worker_opts

    • A hash of the configuration options for a worker.

  • :sync

    • A hash of settings specifically for copying the source directory to be tested to the remote worked

  • :verbose

    • Set to true to see lots of Hydra output (for debugging)

# File lib/hydra/sync.rb, line 22
def initialize(worker_opts, sync_opts, verbose = false)
  worker_opts ||= {}
  worker_opts.stringify_keys!
  @verbose = verbose
  @connect = worker_opts.fetch('connect') { raise "You must specify an SSH connection target" }
  @ssh_opts = worker_opts.fetch('ssh_opts') { "" }
  @remote_dir = worker_opts.fetch('directory') { raise "You must specify a remote directory" }

  return unless sync_opts
  sync_opts.stringify_keys!
  @local_dir = sync_opts.fetch('directory') { raise "You must specify a synchronization directory" }
  @exclude_paths = sync_opts.fetch('exclude') { [] }

  trace "Initialized"
  trace "  Worker: (#{worker_opts.inspect})"
  trace "  Sync:   (#{sync_opts.inspect})"

  sync
end
sync_many(opts) click to toggle source
# File lib/hydra/sync.rb, line 59
def self.sync_many opts
  opts.stringify_keys!
  config_file = opts.delete('config') { nil }
  if config_file
    opts.merge!(YAML.load_file(config_file).stringify_keys!)
  end
  @verbose = opts.fetch('verbose') { false }
  @sync = opts.fetch('sync') { {} }

  workers_opts = opts.fetch('workers') { [] }
  @remote_worker_opts = []
  workers_opts.each do |worker_opts|
    worker_opts.stringify_keys!
    if worker_opts['type'].to_s == 'ssh'
      @remote_worker_opts << worker_opts
    end
  end

  trace "Initialized"
  trace "  Sync:   (#{@sync.inspect})"
  trace "  Workers: (#{@remote_worker_opts.inspect})"

  Thread.abort_on_exception = true
  trace "Processing workers"
  @listeners = []
  @remote_worker_opts.each do |worker_opts|
    @listeners << Thread.new do
      begin
        trace "Syncing #{worker_opts.inspect}"
        Sync.new worker_opts, @sync, @verbose
      rescue 
        trace "Syncing failed [#{worker_opts.inspect}]"
      end
    end
  end
  
  @listeners.each{|l| l.join}
end

Public Instance Methods

sync() click to toggle source
# File lib/hydra/sync.rb, line 42
def sync
  #trace "Synchronizing with #{connect}\n\t#{sync_opts.inspect}"
  exclude_opts = @exclude_paths.inject(''){|memo, path| memo += "--exclude=#{path} "}

  rsync_command = [
    'rsync',
    '-avz',
    '--delete',
    exclude_opts,
    File.expand_path(@local_dir)+'/',
    "-e \"ssh #{@ssh_opts}\"",
    "#{@connect}:#{@remote_dir}"
  ].join(" ")
  trace rsync_command
  trace %x#{rsync_command}`
end