rflow 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 325fd6dd2c2d5409dc692a641c36da3b2139f7e8
4
- data.tar.gz: d71bb8ce7e17c7e86fc1e2de7f299e73efdaeb5a
3
+ metadata.gz: b847e06bbad6d47e7cd74314add6f499c99c8bc9
4
+ data.tar.gz: f707f01ec81e823d8c08711bf747f1a57b6a15a6
5
5
  SHA512:
6
- metadata.gz: e5a602dc11534aa9a48b81bfc5d2035103b048b67d96684587f84c03152f90b415a43f6e19050616cbdccd37cfbad3ddf67e5c45ecfb4690c2dd40cfaa1b5883
7
- data.tar.gz: e7d78c206614c6df0824b4d87f50a1c48edb54468defc498f5fa2319b05c707a4a4ee440514a8a11058998202b76ab93885859a8a50b1dbe85bc33bc82a5c041
6
+ metadata.gz: a5791ba65d956750314d374c00fb21bafcaa152a356331d41134929befaf9488f7519da287b796833430300f5f5aafb892465648ee54a6b8acdc3c1503181427
7
+ data.tar.gz: bf9ebdb5eac95bd3307f86b54d23b872cd6365fd32db98daa962cd5c109f404c8bf3a9d3ebcc36d5b0c12fb7223b1c8d55b61e62678484fd12f5ca6292ac58e4
data/bin/rflow CHANGED
@@ -4,6 +4,11 @@
4
4
  # startup cases (version and help) that don't need it
5
5
  require 'optparse'
6
6
 
7
+ if Process::Sys.geteuid == 0
8
+ STDERR.puts "Error: RFlow will not run as root."
9
+ exit 1
10
+ end
11
+
7
12
  options = {
8
13
  :daemonize => true,
9
14
  :startup_log_level => :INFO,
@@ -186,17 +191,22 @@ end
186
191
  options[:extensions_file_paths].each do |extensions_file_path|
187
192
  RFlow.logger.info "Loading #{extensions_file_path}"
188
193
  unless File.readable? extensions_file_path
189
- RFlow.logger.fatal "Extensions file ('#{Dir.getwd}') '#{extensions_file_path}' not reabable\n#{option_parser.help}"
194
+ RFlow.logger.fatal "Extensions file ('#{Dir.getwd}') '#{extensions_file_path}' not readable\n#{option_parser.help}"
195
+ exit 1
196
+ end
197
+ begin
198
+ load extensions_file_path
199
+ rescue Exception => e
200
+ RFlow.logger.fatal "Error running rflow: #{e.class}: #{e.message}, because: #{e.backtrace}"
190
201
  exit 1
191
202
  end
192
- load extensions_file_path
193
203
  end
194
204
 
195
205
  # Start the flow
196
206
  begin
197
207
  RFlow.run! options[:config_database_path], options[:daemonize]
198
208
  rescue Exception => e
199
- RFlow.logger.fatal "Error running rflow: #{e.class}: #{e.message}"
209
+ RFlow.logger.fatal "Error running rflow: #{e.class}: #{e.message}, because: #{e.backtrace}"
200
210
  exit(1)
201
211
  end
202
212
 
@@ -102,7 +102,7 @@ class HTTPServer < RFlow::Component
102
102
  return unless message.data_type_name == 'HTTPResponse'
103
103
 
104
104
  RFlow.logger.debug 'Received a HTTPResponse message, determining if its mine'
105
- my_events = message.provenance.find_all {|processing_event| processing_event.component_instance_uuid == instance_uuid}
105
+ my_events = message.provenance.find_all {|processing_event| processing_event.component_instance_uuid == uuid}
106
106
  RFlow.logger.debug "Found #{my_events.size} processing events from me"
107
107
 
108
108
  # Attempt to send the data to each context match
@@ -136,7 +136,7 @@ class HTTPServer < RFlow::Component
136
136
  def process_http_request
137
137
  RFlow.logger.debug "Received a full HTTP request from #{client_ip}:#{client_port}"
138
138
 
139
- processing_event = RFlow::Message::ProcessingEvent.new(server.instance_uuid, Time.now.utc)
139
+ processing_event = RFlow::Message::ProcessingEvent.new(server.uuid, Time.now.utc)
140
140
 
141
141
  request_message = RFlow::Message.new('HTTPRequest')
142
142
  request_message.data.path = @http_request_uri
@@ -2,5 +2,6 @@ require 'rflow/component'
2
2
  require 'rflow/components/clock'
3
3
  require 'rflow/components/integer'
4
4
  require 'rflow/components/raw'
5
+ require 'rflow/components/log'
5
6
  require 'rflow/components/replicate'
6
7
  require 'rflow/components/ruby_proc_filter'
@@ -0,0 +1,34 @@
1
+ class RFlow
2
+ module Components
3
+ module Log
4
+ module Extensions
5
+ module LogExtension
6
+ def self.extended(base_data)
7
+ base_data.data_object ||= {'timestamp' => 0, 'level' => 'INFO', 'text' => ''}
8
+ end
9
+
10
+ def timestamp; data_object['timestamp']; end
11
+ def timestamp=(new_timestamp); data_object['timestamp'] = new_timestamp; end
12
+ def level; data_object['level']; end
13
+ def level=(new_level); data_object['level'] = new_level; end
14
+ def text; data_object['text']; end
15
+ def text=(new_text); data_object['text'] = new_text; end
16
+ end
17
+ end
18
+
19
+ SCHEMA_DIRECTORY = ::File.expand_path(::File.join(::File.dirname(__FILE__), '..', '..', '..', 'schema'))
20
+
21
+ SCHEMA_FILES = {
22
+ 'log.avsc' => 'RFlow::Message::Data::Log',
23
+ }
24
+
25
+ SCHEMA_FILES.each do |file_name, data_type_name|
26
+ schema_string = ::File.read(::File.join(SCHEMA_DIRECTORY, file_name))
27
+ RFlow::Configuration.add_available_data_type data_type_name, 'avro', schema_string
28
+ end
29
+
30
+ RFlow::Configuration.add_available_data_extension('RFlow::Message::Data::Log',
31
+ RFlow::Components::Log::Extensions::LogExtension)
32
+ end
33
+ end
34
+ end
@@ -111,9 +111,15 @@ class RFlow
111
111
 
112
112
  def handle_signals
113
113
  ['SIGTERM', 'SIGINT', 'SIGQUIT', 'SIGCHLD'].each do |signal|
114
- trap_signal(signal) do
114
+ trap_signal(signal) do |return_code|
115
+ exit_status = if signal == 'SIGCHLD'
116
+ pid, status = Process.wait2
117
+ status.exitstatus
118
+ else
119
+ 0
120
+ end
115
121
  shutdown! signal
116
- exit! 0
122
+ exit! exit_status
117
123
  end
118
124
  end
119
125
 
@@ -136,11 +142,12 @@ class RFlow
136
142
 
137
143
  def trap_signal(signal)
138
144
  # Log4r and traps don't mix, so we need to put it in another thread
145
+ return_code = $?
139
146
  context = clone_logging_context
140
147
  Signal.trap signal do
141
148
  Thread.new do
142
149
  apply_logging_context context
143
- yield
150
+ yield return_code
144
151
  end.join
145
152
  end
146
153
  end
@@ -155,7 +162,11 @@ class RFlow
155
162
  def signal_subprocesses(signal)
156
163
  subprocesses.reject {|p| p.pid.nil? }.each do |p|
157
164
  RFlow.logger.info "Signaling #{p.name} with #{signal}"
158
- Process.kill(signal, p.pid)
165
+ begin
166
+ Process.kill(signal, p.pid)
167
+ rescue Errno::ESRCH
168
+ # process already died and was waited for, ignore
169
+ end
159
170
  end
160
171
  end
161
172
 
data/lib/rflow/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class RFlow
2
- VERSION = '1.1.0'
2
+ VERSION = '1.2.0'
3
3
  end
data/rflow.gemspec CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
19
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
20
20
  s.require_paths = ['lib']
21
+ s.bindir = 'bin'
21
22
 
22
23
  s.add_dependency 'uuidtools', '~> 2.1'
23
24
  s.add_dependency 'log4r', '~> 1.1'
data/schema/log.avsc ADDED
@@ -0,0 +1,11 @@
1
+ {
2
+ "type": "record",
3
+ "name": "Log",
4
+ "namespace": "org.rflow.message.log",
5
+ "aliases": [],
6
+ "fields": [
7
+ {"name": "timestamp", "type": "long"},
8
+ {"name": "level", "type": "string"},
9
+ {"name": "text", "type": "string"}
10
+ ]
11
+ }
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+ require 'rflow/components/log'
3
+
4
+ class RFlow
5
+ class Message
6
+ class Data
7
+ describe 'Log Avro Schema' do
8
+ let(:schema) { Configuration.available_data_types['RFlow::Message::Data::Log']['avro'] }
9
+
10
+ it 'should load the schema' do
11
+ expect(schema).not_to be_nil
12
+ end
13
+
14
+ it 'should support assignment of properties' do
15
+ message = RFlow::Message.new('RFlow::Message::Data::Log')
16
+ timestamp = Time.now.to_i
17
+ message.data.timestamp = timestamp
18
+ message.data.level = 'INFO'
19
+ message.data.text = 'message'
20
+
21
+ result = decode_avro(schema, encode_avro(schema, message.data.to_hash))
22
+ expect(result['timestamp']).to eq timestamp
23
+ expect(result['level']).to eq 'INFO'
24
+ expect(result['text']).to eq 'message'
25
+ end
26
+
27
+ it 'should encode and decode an object' do
28
+ log = {'timestamp' => Time.now.to_i, 'level' => 'LOGLEVEL', 'text' => 'Log message'}
29
+
30
+ expect { encode_avro(schema, log) }.to_not raise_error
31
+ encoded = encode_avro(schema, log)
32
+
33
+ expect { decode_avro(schema, encoded) }.to_not raise_error
34
+ decoded = decode_avro(schema, encoded)
35
+
36
+ expect(decoded).to eq(log)
37
+ expect(decoded['text']).to eq(log['text'])
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rflow
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Stoneham
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-06-14 00:00:00.000000000 Z
12
+ date: 2016-08-31 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: uuidtools
@@ -215,6 +215,7 @@ files:
215
215
  - lib/rflow/components.rb
216
216
  - lib/rflow/components/clock.rb
217
217
  - lib/rflow/components/integer.rb
218
+ - lib/rflow/components/log.rb
218
219
  - lib/rflow/components/raw.rb
219
220
  - lib/rflow/components/replicate.rb
220
221
  - lib/rflow/components/ruby_proc_filter.rb
@@ -242,6 +243,7 @@ files:
242
243
  - lib/rflow/shard.rb
243
244
  - lib/rflow/version.rb
244
245
  - rflow.gemspec
246
+ - schema/log.avsc
245
247
  - schema/message.avsc
246
248
  - schema/raw.avsc
247
249
  - schema/tick.avsc
@@ -253,6 +255,7 @@ files:
253
255
  - spec/rflow/forward_to_input_port_spec.rb
254
256
  - spec/rflow/forward_to_output_port_spec.rb
255
257
  - spec/rflow/logger_spec.rb
258
+ - spec/rflow/message/data/log_spec.rb
256
259
  - spec/rflow/message/data/raw_spec.rb
257
260
  - spec/rflow/message/data_spec.rb
258
261
  - spec/rflow/message_spec.rb
@@ -278,7 +281,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
278
281
  version: '0'
279
282
  requirements: []
280
283
  rubyforge_project:
281
- rubygems_version: 2.5.1
284
+ rubygems_version: 2.2.2
282
285
  signing_key:
283
286
  specification_version: 4
284
287
  summary: A Ruby flow-based programming framework
@@ -291,9 +294,9 @@ test_files:
291
294
  - spec/rflow/forward_to_input_port_spec.rb
292
295
  - spec/rflow/forward_to_output_port_spec.rb
293
296
  - spec/rflow/logger_spec.rb
297
+ - spec/rflow/message/data/log_spec.rb
294
298
  - spec/rflow/message/data/raw_spec.rb
295
299
  - spec/rflow/message/data_spec.rb
296
300
  - spec/rflow/message_spec.rb
297
301
  - spec/rflow_spec.rb
298
302
  - spec/spec_helper.rb
299
- has_rdoc: