Class: Originator

Inherits:
Object
  • Object
show all
Includes:
Configuration
Defined in:
lib/gorgon/originator.rb

Instance Method Summary collapse

Methods included from Configuration

#load_configuration_from_file

Constructor Details

#initializeOriginator

Returns a new instance of Originator.



17
18
19
20
# File 'lib/gorgon/originator.rb', line 17

def initialize
  @configuration = nil
  @rsync_daemon = RsyncDaemon.new
end

Instance Method Details

#cancel_jobObject



40
41
42
43
44
# File 'lib/gorgon/originator.rb', line 40

def cancel_job
  ShutdownManager.new(protocol: @protocol,
                      job_state: @job_state,
                      rsync_daemon: @rsync_daemon).cancel_job
end

#cleanup_if_job_completeObject



84
85
86
87
88
89
90
# File 'lib/gorgon/originator.rb', line 84

def cleanup_if_job_complete
  if @job_state.is_job_complete?
    @logger.log "Job is done"
    @protocol.disconnect
    @rsync_daemon.stop
  end
end

#connection_informationObject



127
128
129
# File 'lib/gorgon/originator.rb', line 127

def connection_information
  configuration[:connection]
end

#create_job_state_and_observersObject



116
117
118
119
120
121
# File 'lib/gorgon/originator.rb', line 116

def create_job_state_and_observers
  @job_state = JobState.new files.count
  @progress_bar_view = ProgressBarView.new @job_state
  @progress_bar_view.show
  failures_printer = FailuresPrinter.new @job_state
end

#ctrl_cObject



46
47
48
49
# File 'lib/gorgon/originator.rb', line 46

def ctrl_c
  puts "\nCtrl-C received! Just wait a moment while I clean up..."
  cancel_job
end

#filesObject



131
132
133
134
135
# File 'lib/gorgon/originator.rb', line 131

def files
  @files ||= configuration[:files].reduce([]) do |memo, obj|
    memo.concat(Dir[obj])
  end.uniq
end

#handle_reply(payload) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/gorgon/originator.rb', line 92

def handle_reply(payload)
  payload = Yajl::Parser.new(:symbolize_keys => true).parse(payload)

  # at some point this will probably need to be fancy polymorphic type based responses, or at least a nice switch statement
  if payload[:action] == "finish"
    @job_state.file_finished payload
  elsif payload[:action] == "start"
    @job_state.file_started payload
  elsif payload[:type] == "crash"
    @job_state.gorgon_crash_message payload
  elsif payload[:type] == "exception"
    # TODO
    ap payload
  else
    ap payload
  end

  @logger.log_message payload
  # Uncomment this to see each message received by originator
  # ap payload

  cleanup_if_job_complete
end

#job_definitionObject



137
138
139
140
141
142
143
# File 'lib/gorgon/originator.rb', line 137

def job_definition
  job_config = configuration[:job]
  if !job_config.has_key?(:source_tree_path)
    job_config[:source_tree_path] = "rsync://#{local_ip_addr}:43434/src"
  end
  JobDefinition.new(configuration[:job])
end

#on_disconnectObject



123
124
125
# File 'lib/gorgon/originator.rb', line 123

def on_disconnect
  EventMachine.stop
end

#originateObject



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/gorgon/originator.rb', line 22

def originate
  begin
    Signal.trap("INT") { ctrl_c }
    Signal.trap("TERM") { ctrl_c }

    publish
    @logger.log "Originator finished successfully"
  rescue StandardError
    puts "Unhandled exception in originator:"
    puts $!.message
    puts $!.backtrace.join("\n")
    puts "----------------------------------"
    puts "Now attempting to cancel the job."
    @logger.log_error "Unhandled Exception!" if @logger
    cancel_job
  end
end

#publishObject



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/gorgon/originator.rb', line 51

def publish
  @logger = OriginatorLogger.new configuration[:originator_log_file]

  if files.empty?
    $stderr.puts "There are no files to test! Quitting."
    exit 2
  end

  if !@rsync_daemon.start
    @logger.log_error "rsync daemon didn't start!"
    exit 1
  end

  @protocol = OriginatorProtocol.new @logger

  EventMachine.run do
    @logger.log "Connecting..."
    @protocol.connect connection_information, :on_closed => method(:on_disconnect)

    @logger.log "Publishing files..."
    @protocol.publish_files files
    create_job_state_and_observers

    @logger.log "Publishing Job..."
    @protocol.publish_job job_definition
    @logger.log "Job Published"

    @protocol.receive_payloads do |payload|
      handle_reply(payload)
    end
  end
end