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
# File 'lib/gorgon/originator.rb', line 17

def initialize
  @configuration = nil
end

Instance Method Details

#cancel_jobObject



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

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

#cleanup_if_job_completeObject



93
94
95
96
97
98
# File 'lib/gorgon/originator.rb', line 93

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

#connection_informationObject



135
136
137
# File 'lib/gorgon/originator.rb', line 135

def connection_information
  configuration[:connection]
end

#create_job_state_and_observersObject



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

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



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

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

#filesObject



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

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

#handle_reply(payload) ⇒ Object



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/gorgon/originator.rb', line 100

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



145
146
147
148
149
150
151
# File 'lib/gorgon/originator.rb', line 145

def job_definition
  job_config = configuration[:job]
  if !job_config.has_key?(:source_tree_path)
    job_config[:source_tree_path] = source_tree_path
  end
  JobDefinition.new(configuration[:job])
end

#on_disconnectObject



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

def on_disconnect
  EventMachine.stop
end

#originateObject



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

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



49
50
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
# File 'lib/gorgon/originator.rb', line 49

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

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

  push_source_code

  @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

#push_source_codeObject



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

def push_source_code
  syncer = SourceTreeSyncer.new(source_tree_path)
  syncer.exclude = configuration[:job][:sync_exclude]
  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