Class: Hydra::Sync
- Inherits:
-
Object
- Object
- Hydra::Sync
- Defined in:
- lib/hydra/sync.rb
Overview
Hydra class responsible for delegate work down to workers.
The Sync is run once for each remote worker.
Instance Attribute Summary collapse
-
#connect ⇒ Object
readonly
Returns the value of attribute connect.
-
#remote_dir ⇒ Object
readonly
Returns the value of attribute remote_dir.
-
#ssh_opts ⇒ Object
readonly
Returns the value of attribute ssh_opts.
Class Method Summary collapse
Instance Method Summary collapse
-
#initialize(worker_opts, sync_opts, verbose = false) ⇒ Sync
constructor
Create a new Sync instance to rsync source from the local machine to a remote worker.
- #sync ⇒ Object
Constructor Details
#initialize(worker_opts, sync_opts, verbose = false) ⇒ Sync
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)
-
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# 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 |
Instance Attribute Details
#connect ⇒ Object (readonly)
Returns the value of attribute connect.
10 11 12 |
# File 'lib/hydra/sync.rb', line 10 def connect @connect end |
#remote_dir ⇒ Object (readonly)
Returns the value of attribute remote_dir.
10 11 12 |
# File 'lib/hydra/sync.rb', line 10 def remote_dir @remote_dir end |
#ssh_opts ⇒ Object (readonly)
Returns the value of attribute ssh_opts.
10 11 12 |
# File 'lib/hydra/sync.rb', line 10 def ssh_opts @ssh_opts end |
Class Method Details
.sync_many(opts) ⇒ Object
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# 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 |
Instance Method Details
#sync ⇒ Object
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# 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.(@local_dir)+'/', "-e \"ssh #{@ssh_opts}\"", "#{@connect}:#{@remote_dir}" ].join(" ") trace rsync_command trace `#{rsync_command}` end |