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.



21
22
23
# File 'lib/gorgon/originator.rb', line 21

def initialize
  @configuration = nil
end

Instance Method Details

#callback_handlerObject



90
91
92
# File 'lib/gorgon/originator.rb', line 90

def callback_handler
  @callback_handler ||= CallbackHandler.new(configuration[:job][:callbacks])
end

#cancel_jobObject



43
44
45
# File 'lib/gorgon/originator.rb', line 43

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

#cleanup_if_job_completeObject



107
108
109
110
111
112
# File 'lib/gorgon/originator.rb', line 107

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

#connection_informationObject



150
151
152
# File 'lib/gorgon/originator.rb', line 150

def connection_information
  configuration[:connection]
end

#create_job_state_and_observersObject



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

def create_job_state_and_observers
  @job_state = JobState.new files.count
  RuntimeRecorder.new @job_state, configuration[:runtime_file]
  @progress_bar_view = ProgressBarView.new @job_state
  @progress_bar_view.show
  FailuresPrinter.new(configuration, @job_state)
end

#ctrl_cObject



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

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

#filesObject



154
155
156
# File 'lib/gorgon/originator.rb', line 154

def files
  @files ||= RuntimeFileReader.new(configuration).sorted_files
end

#handle_reply(payload) ⇒ Object



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/gorgon/originator.rb', line 114

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



158
159
160
161
162
163
164
# File 'lib/gorgon/originator.rb', line 158

def job_definition
  # TODO: remove duplication. Use sync_configuration
  job_config = configuration[:job]
  job_config[:sync] = {} unless job_config.has_key?(:sync)
  job_config[:sync][:source_tree_path] = source_tree_path(job_config[:sync])
  JobDefinition.new(configuration[:job])
end

#on_disconnectObject



146
147
148
# File 'lib/gorgon/originator.rb', line 146

def on_disconnect
  EventMachine.stop
end

#originateObject



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

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



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

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

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

  cluster_id = callback_handler.before_originate

  push_source_code

  @protocol = OriginatorProtocol.new(@logger, cluster_id)

  EventMachine.run do
    publish_files_and_job

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

  callback_handler.after_job_finishes
end

#publish_files_and_jobObject



77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/gorgon/originator.rb', line 77

def publish_files_and_job
  @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"
end

#push_source_codeObject



94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/gorgon/originator.rb', line 94

def push_source_code
  syncer = SourceTreeSyncer.new(sync_configuration)
  syncer.push
  if syncer.success?
    @logger.log "Command '#{syncer.sys_command}' completed successfully."
  else
    $stderr.puts "Command '#{syncer.sys_command}' failed!"
    $stderr.puts "Stdout:\n#{syncer.output}"
    $stderr.puts "Stderr:\n#{syncer.errors}"
    exit 1
  end
end