flydata 0.3.24 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -0
  3. data/Gemfile.lock +3 -0
  4. data/VERSION +1 -1
  5. data/flydata.gemspec +36 -3
  6. data/lib/flydata.rb +8 -0
  7. data/lib/flydata/api/agent.rb +21 -0
  8. data/lib/flydata/command/helper.rb +154 -0
  9. data/lib/flydata/command/mysql.rb +37 -0
  10. data/lib/flydata/command/restart.rb +11 -0
  11. data/lib/flydata/command/start.rb +12 -2
  12. data/lib/flydata/command/status.rb +10 -0
  13. data/lib/flydata/command/stop.rb +10 -0
  14. data/lib/flydata/command/sync.rb +7 -2
  15. data/lib/flydata/helper/action/agent_action.rb +24 -0
  16. data/lib/flydata/helper/action/check_remote_actions.rb +54 -0
  17. data/lib/flydata/helper/action/restart_agent.rb +13 -0
  18. data/lib/flydata/helper/action/send_logs.rb +33 -0
  19. data/lib/flydata/helper/action/stop_agent.rb +13 -0
  20. data/lib/flydata/helper/action_ownership.rb +56 -0
  21. data/lib/flydata/helper/action_ownership_channel.rb +93 -0
  22. data/lib/flydata/helper/base_action.rb +23 -0
  23. data/lib/flydata/helper/config_parser.rb +197 -0
  24. data/lib/flydata/helper/scheduler.rb +114 -0
  25. data/lib/flydata/helper/server.rb +66 -0
  26. data/lib/flydata/helper/worker.rb +131 -0
  27. data/lib/flydata/output/forwarder.rb +3 -1
  28. data/lib/flydata/parser/mysql/dump_parser.rb +34 -19
  29. data/lib/flydata/sync_file_manager.rb +21 -0
  30. data/lib/flydata/util/file_util.rb +55 -0
  31. data/lib/flydata/util/shell.rb +22 -0
  32. data/spec/flydata/command/helper_spec.rb +121 -0
  33. data/spec/flydata/command/restart_spec.rb +12 -1
  34. data/spec/flydata/command/start_spec.rb +14 -1
  35. data/spec/flydata/command/stop_spec.rb +12 -1
  36. data/spec/flydata/helper/action/check_remote_actions_spec.rb +69 -0
  37. data/spec/flydata/helper/action/restart_agent_spec.rb +20 -0
  38. data/spec/flydata/helper/action/send_logs_spec.rb +58 -0
  39. data/spec/flydata/helper/action/stop_agent_spec.rb +20 -0
  40. data/spec/flydata/helper/action_ownership_channel_spec.rb +112 -0
  41. data/spec/flydata/helper/action_ownership_spec.rb +48 -0
  42. data/spec/flydata/helper/config_parser_spec.rb +99 -0
  43. data/spec/flydata/helper/helper_shared_context.rb +70 -0
  44. data/spec/flydata/helper/scheduler_spec.rb +35 -0
  45. data/spec/flydata/helper/worker_spec.rb +106 -0
  46. data/spec/flydata/output/forwarder_spec.rb +6 -3
  47. data/spec/flydata/parser/mysql/dump_parser_spec.rb +2 -1
  48. data/spec/flydata/util/file_util_spec.rb +110 -0
  49. data/spec/flydata/util/shell_spec.rb +26 -0
  50. data/spec/spec_helper.rb +31 -0
  51. metadata +46 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2c6d22e3fb1b51c996297d48f7bd886c250d5d11
4
- data.tar.gz: 23ac7e6b2b97a76bf27d538370fb9c73e018e842
3
+ metadata.gz: 0c46afc6ca25cb5f8969e22aac032415a315eb0e
4
+ data.tar.gz: a95cdb85e846ae1b56f4ad3d2802fc163ec9df99
5
5
  SHA512:
6
- metadata.gz: f5455a1b18dcbccb9edae44ec15ac2332710410107687251cba290a99e671b83567c84dde29b7428696750b1732ebae7410093921170ad04ab1f4c938c1da67c
7
- data.tar.gz: d72631b42f67a3ae378ed215663149414cf1cd80d02eac97fe97c0517b7813a5341ee93a05daf02774f094daf90c19381d3b1709a428729a99fb2101b6f80468
6
+ metadata.gz: 56cb5f8d6e58f71598bfc370ea31a24784c1132b5fcadbae263cb29c85a1cd950ff0c2169698722f73058c9d44b16424a57d441c4b98f1ee914ddd57062d91df
7
+ data.tar.gz: c0b6985cafa887eb2a8aac272c57431f1bb72343b937be7ebb55ef5dfdfec989778acf160119bd0205e4978289fd4134c04890a468bc655022dc99d17f65107f
data/Gemfile CHANGED
@@ -14,6 +14,7 @@ gem "treetop", '~> 1.5', '>= 1.5.3'
14
14
  gem "sys-filesystem", '~> 1.1', '>= 1.1.3'
15
15
  gem "io-console", '~> 0.4.2', '>= 0.4.2'
16
16
  gem "kodama", '~> 0.1.2', '>= 0.1.5'
17
+ gem "serverengine", '~> 1.5'
17
18
 
18
19
  group :development do
19
20
  gem "jeweler", '~> 1.8', '>= 1.8.8'
@@ -107,6 +107,8 @@ GEM
107
107
  rspec-support (3.0.3)
108
108
  ruby-binlog (1.0.4)
109
109
  ruby-prof (0.15.1)
110
+ serverengine (1.5.10)
111
+ sigdump (~> 0.2.2)
110
112
  sigdump (0.2.2)
111
113
  slop (3.6.0)
112
114
  sqlite3 (1.3.9)
@@ -140,6 +142,7 @@ DEPENDENCIES
140
142
  rest-client (~> 1.6, >= 1.6.7)
141
143
  rspec (~> 3.0)
142
144
  ruby-prof (~> 0.15, >= 0.15.1)
145
+ serverengine (~> 1.5)
143
146
  slop (~> 3.4, >= 3.4.6)
144
147
  sqlite3 (~> 1.3, >= 1.3.9)
145
148
  sys-filesystem (~> 1.1, >= 1.1.3)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.24
1
+ 0.4.0
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: flydata 0.3.24 ruby lib
5
+ # stub: flydata 0.4.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "flydata"
9
- s.version = "0.3.24"
9
+ s.version = "0.4.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Koichi Fujikawa", "Masashi Miyazaki", "Matthew Luu", "Mak Inada", "Sriram NS"]
14
- s.date = "2015-06-01"
14
+ s.date = "2015-06-17"
15
15
  s.description = "FlyData Agent"
16
16
  s.email = "sysadmin@flydata.com"
17
17
  s.executables = ["fdmysqldump", "flydata", "serverinfo"]
@@ -81,6 +81,7 @@ Gem::Specification.new do |s|
81
81
  "flydata.gemspec",
82
82
  "lib/fly_data_model.rb",
83
83
  "lib/flydata.rb",
84
+ "lib/flydata/api/agent.rb",
84
85
  "lib/flydata/api/base.rb",
85
86
  "lib/flydata/api/data_entry.rb",
86
87
  "lib/flydata/api/data_port.rb",
@@ -91,8 +92,10 @@ Gem::Specification.new do |s|
91
92
  "lib/flydata/command/conf.rb",
92
93
  "lib/flydata/command/crontab.rb",
93
94
  "lib/flydata/command/encrypt.rb",
95
+ "lib/flydata/command/helper.rb",
94
96
  "lib/flydata/command/kill_all.rb",
95
97
  "lib/flydata/command/login.rb",
98
+ "lib/flydata/command/mysql.rb",
96
99
  "lib/flydata/command/restart.rb",
97
100
  "lib/flydata/command/routine.rb",
98
101
  "lib/flydata/command/sender.rb",
@@ -124,6 +127,18 @@ Gem::Specification.new do |s|
124
127
  "lib/flydata/fluent-plugins/out_forward_ssl.rb",
125
128
  "lib/flydata/fluent-plugins/preference.rb",
126
129
  "lib/flydata/flydata_crontab.sh",
130
+ "lib/flydata/helper/action/agent_action.rb",
131
+ "lib/flydata/helper/action/check_remote_actions.rb",
132
+ "lib/flydata/helper/action/restart_agent.rb",
133
+ "lib/flydata/helper/action/send_logs.rb",
134
+ "lib/flydata/helper/action/stop_agent.rb",
135
+ "lib/flydata/helper/action_ownership.rb",
136
+ "lib/flydata/helper/action_ownership_channel.rb",
137
+ "lib/flydata/helper/base_action.rb",
138
+ "lib/flydata/helper/config_parser.rb",
139
+ "lib/flydata/helper/scheduler.rb",
140
+ "lib/flydata/helper/server.rb",
141
+ "lib/flydata/helper/worker.rb",
127
142
  "lib/flydata/helpers.rb",
128
143
  "lib/flydata/heroku.rb",
129
144
  "lib/flydata/heroku/configuration_methods.rb",
@@ -140,6 +155,8 @@ Gem::Specification.new do |s|
140
155
  "lib/flydata/proxy.rb",
141
156
  "lib/flydata/sync_file_manager.rb",
142
157
  "lib/flydata/util/encryptor.rb",
158
+ "lib/flydata/util/file_util.rb",
159
+ "lib/flydata/util/shell.rb",
143
160
  "spec/fluent_plugins_spec_helper.rb",
144
161
  "spec/fly_data_model_spec.rb",
145
162
  "spec/flydata/api/data_entry_spec.rb",
@@ -149,6 +166,7 @@ Gem::Specification.new do |s|
149
166
  "spec/flydata/command/conf_spec.rb",
150
167
  "spec/flydata/command/crontab_spec.rb",
151
168
  "spec/flydata/command/encrypt_spec.rb",
169
+ "spec/flydata/command/helper_spec.rb",
152
170
  "spec/flydata/command/kill_all_spec.rb",
153
171
  "spec/flydata/command/login_spec.rb",
154
172
  "spec/flydata/command/restart_spec.rb",
@@ -171,6 +189,16 @@ Gem::Specification.new do |s|
171
189
  "spec/flydata/fluent-plugins/mysql/shared_query_handler_context.rb",
172
190
  "spec/flydata/fluent-plugins/mysql/table_meta_spec.rb",
173
191
  "spec/flydata/fluent-plugins/mysql/truncate_query_handler_spec.rb",
192
+ "spec/flydata/helper/action/check_remote_actions_spec.rb",
193
+ "spec/flydata/helper/action/restart_agent_spec.rb",
194
+ "spec/flydata/helper/action/send_logs_spec.rb",
195
+ "spec/flydata/helper/action/stop_agent_spec.rb",
196
+ "spec/flydata/helper/action_ownership_channel_spec.rb",
197
+ "spec/flydata/helper/action_ownership_spec.rb",
198
+ "spec/flydata/helper/config_parser_spec.rb",
199
+ "spec/flydata/helper/helper_shared_context.rb",
200
+ "spec/flydata/helper/scheduler_spec.rb",
201
+ "spec/flydata/helper/worker_spec.rb",
174
202
  "spec/flydata/heroku_spec.rb",
175
203
  "spec/flydata/mysql/binlog_position_spec.rb",
176
204
  "spec/flydata/mysql/mysql_util_spec.rb",
@@ -180,6 +208,8 @@ Gem::Specification.new do |s|
180
208
  "spec/flydata/parser/mysql/dump_parser_spec.rb",
181
209
  "spec/flydata/sync_file_manager_spec.rb",
182
210
  "spec/flydata/util/encryptor_spec.rb",
211
+ "spec/flydata/util/file_util_spec.rb",
212
+ "spec/flydata/util/shell_spec.rb",
183
213
  "spec/flydata_spec.rb",
184
214
  "spec/spec_helper.rb",
185
215
  "tmpl/redshift_mysql_data_entry.conf.tmpl"
@@ -206,6 +236,7 @@ Gem::Specification.new do |s|
206
236
  s.add_runtime_dependency(%q<sys-filesystem>, [">= 1.1.3", "~> 1.1"])
207
237
  s.add_runtime_dependency(%q<io-console>, [">= 0.4.2", "~> 0.4.2"])
208
238
  s.add_runtime_dependency(%q<kodama>, [">= 0.1.5", "~> 0.1.2"])
239
+ s.add_runtime_dependency(%q<serverengine>, ["~> 1.5"])
209
240
  s.add_development_dependency(%q<jeweler>, [">= 1.8.8", "~> 1.8"])
210
241
  s.add_development_dependency(%q<rspec>, ["~> 3.0"])
211
242
  s.add_development_dependency(%q<timecop>, [">= 0.7.1", "~> 0.7"])
@@ -229,6 +260,7 @@ Gem::Specification.new do |s|
229
260
  s.add_dependency(%q<sys-filesystem>, [">= 1.1.3", "~> 1.1"])
230
261
  s.add_dependency(%q<io-console>, [">= 0.4.2", "~> 0.4.2"])
231
262
  s.add_dependency(%q<kodama>, [">= 0.1.5", "~> 0.1.2"])
263
+ s.add_dependency(%q<serverengine>, ["~> 1.5"])
232
264
  s.add_dependency(%q<jeweler>, [">= 1.8.8", "~> 1.8"])
233
265
  s.add_dependency(%q<rspec>, ["~> 3.0"])
234
266
  s.add_dependency(%q<timecop>, [">= 0.7.1", "~> 0.7"])
@@ -253,6 +285,7 @@ Gem::Specification.new do |s|
253
285
  s.add_dependency(%q<sys-filesystem>, [">= 1.1.3", "~> 1.1"])
254
286
  s.add_dependency(%q<io-console>, [">= 0.4.2", "~> 0.4.2"])
255
287
  s.add_dependency(%q<kodama>, [">= 0.1.5", "~> 0.1.2"])
288
+ s.add_dependency(%q<serverengine>, ["~> 1.5"])
256
289
  s.add_dependency(%q<jeweler>, [">= 1.8.8", "~> 1.8"])
257
290
  s.add_dependency(%q<rspec>, ["~> 3.0"])
258
291
  s.add_dependency(%q<timecop>, [">= 0.7.1", "~> 0.7"])
@@ -29,7 +29,15 @@ module Flydata
29
29
  FLYDATA_SERVERINFO = File.join(FLYDATA_GEM_BIN, 'serverinfo')
30
30
  FLYDATA_LOG = File.join(FLYDATA_HOME, 'flydata.log')
31
31
  FLYDATA_CONF = File.join(FLYDATA_HOME, 'flydata.conf')
32
+ FLYDATA_HELPER_HOME = File.join(FLYDATA_HOME, 'helper')
32
33
 
33
34
  VERSION_PATH = File.join(FLYDATA_GEM_HOME, 'VERSION')
34
35
  include Flydata::Heroku
35
36
  end
37
+
38
+ # Require all helper files -
39
+ # TODO : Check if this should be moved else where or can be more generic (not just helper files)
40
+ lib_dir = File.dirname(File.absolute_path(__FILE__))
41
+ FileUtils.cd(lib_dir) do
42
+ Dir["flydata/helper/**/*.rb"].each { |file| require file }
43
+ end
@@ -0,0 +1,21 @@
1
+ require 'flydata/api/base'
2
+
3
+ module Flydata
4
+ module Api
5
+ class Agent < Base
6
+ def initialize(api_client)
7
+ @model_name = 'agent'
8
+ @url_path = "/#{@model_name}"
9
+ super
10
+ end
11
+
12
+ def actions(last_id)
13
+ @client.get("#{@url_path}/actions?last_id=#{last_id}")
14
+ end
15
+
16
+ def send_logs(action_id, logs)
17
+ @client.post("#{@url_path}/logs", nil, {action_id: action_id, logs: logs})
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,154 @@
1
+ require 'flydata/command/base'
2
+ require 'flydata/helper/server'
3
+ require 'flydata/helper/config_parser'
4
+ require 'flydata/util/shell'
5
+
6
+ module Flydata
7
+ module Command
8
+ class Helper < Base
9
+
10
+ DEFAULT_OPTIONS = {
11
+ #daemon
12
+ daemonize: false,
13
+ supervisor: true,
14
+ workers: 2,
15
+
16
+ #logger
17
+ log: nil,
18
+ log_level: 'info',
19
+ log_rotate_age: 10,
20
+ log_rotate_size: 10*1024*1024
21
+ }
22
+
23
+ def self.slop_start
24
+ Slop.new do
25
+ on 'c=', 'config=','config file path'
26
+ on 'n', 'no-daemon', 'Start Helper as a regular program'
27
+ on 'l=', 'log=', 'log file path'
28
+ on 'e=', 'level=', 'log level'
29
+ on 'r=', 'rotate=', 'Number of times logs are rotated before being removed'
30
+ on 's=', 'size=', 'Size (in bytes) after which log is rotated'
31
+ #For now, size needs to be specified in bytes (dont think it will be used often)
32
+ end
33
+ end
34
+
35
+ def initialize(options = Slop.new)
36
+ super
37
+ @helper_config = Flydata::Helper::ConfigParser.parse_file(opts[:config])[:helper]
38
+ create_helper_dirs
39
+ end
40
+
41
+ def start
42
+ if running?
43
+ log_info_stdout("Helper is already running.")
44
+ else
45
+ raw_start
46
+ end
47
+ end
48
+
49
+ def stop
50
+ if running?
51
+ log_info_stdout("Stopping Helper.")
52
+ run_command(stop_cmd)
53
+ else
54
+ log_info_stdout("Helper is not running.")
55
+ end
56
+ end
57
+
58
+ def status
59
+ if running?
60
+ log_info_stdout("Helper is running.")
61
+ else
62
+ log_info_stdout("Helper is not running.")
63
+ end
64
+ end
65
+
66
+ def restart
67
+ if running?
68
+ log_info_stdout("Restarting Helper.")
69
+ run_command(kill_hup_cmd)
70
+ else
71
+ raw_start
72
+ end
73
+ end
74
+
75
+ private
76
+
77
+ def create_config_with_args
78
+ Hash.new.tap do |c|
79
+ c[:config_path] = opts[:config]
80
+ c[:log] = opts[:log] ? opts[:log] : @helper_config.helper_log_path
81
+ unless opts.no_daemon?
82
+ c[:pid_path] = @helper_config.helper_pid_path
83
+ c[:daemonize] = true
84
+ end
85
+ c[:log_level] = opts[:level] if opts[:level]
86
+ c[:log_rotate_age] = opts[:rotate].to_i if opts[:rotate]
87
+ c[:log_rotate_size] = opts[:size].to_i if opts[:size]
88
+ end
89
+ end
90
+
91
+ def run_command(cmd)
92
+ o, e, s = Util::Shell.run_cmd(cmd)
93
+ log_error_stderr(e) if not e.to_s.empty?
94
+ success = (s.to_i == 0)
95
+ if success
96
+ log_info_stdout("Done")
97
+ else
98
+ log_error_stderr("Failed")
99
+ end
100
+ success
101
+ end
102
+
103
+ def running?
104
+ `#{running_cmd}`.to_i > 0
105
+ end
106
+
107
+ def stop_cmd
108
+ <<EOS
109
+ if #{running_cmd}; then
110
+ #{kill_cmd}
111
+ i=0
112
+ while #{running_cmd}; do
113
+ sleep 1.0
114
+ if [ $i -gt 10 ]; then # 10sec
115
+ echo "Timeout warning: It failed to stop within 10 seconds. The process will be killed with SIGKILL."
116
+ kill -9 -$(ps --pid `#{@helper_config.helper_pid_path}` --no-heading -o "%r" | tr -d ' ')
117
+ else
118
+ i=`expr $i + 1`
119
+ fi
120
+ done
121
+ rm #{@helper_config.helper_pid_path}
122
+ fi
123
+ EOS
124
+ end
125
+
126
+ def running_cmd
127
+ "[ -f #{@helper_config.helper_pid_path} ] && pgrep -P \`cat #{@helper_config.helper_pid_path}\`"
128
+ end
129
+
130
+ def kill_hup_cmd
131
+ kill_cmd("-HUP")
132
+ end
133
+
134
+ def kill_cmd(option = nil)
135
+ "kill #{option} \`cat #{@helper_config.helper_pid_path}\`"
136
+ end
137
+
138
+ def raw_start
139
+ log_info_stdout("Starting Helper.")
140
+ Flydata::Helper::Server.run(
141
+ DEFAULT_OPTIONS.merge(create_config_with_args))
142
+ log_info_stdout("Done")
143
+ end
144
+
145
+ def create_helper_dirs
146
+ #Create helper dirs if they don't exist
147
+ FileUtils.mkdir_p([@helper_config.helper_home,
148
+ @helper_config.helper_pid_dir,
149
+ @helper_config.helper_position_dir
150
+ ])
151
+ end
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,37 @@
1
+ require 'open3'
2
+ require 'flydata/command/sync'
3
+
4
+ module Flydata
5
+ module Command
6
+
7
+ class Mysql < Sync
8
+ def run
9
+ de = retrieve_sync_data_entry
10
+ de['mysql_data_entry_preference'].delete('tables')
11
+ cmd = Flydata::Mysql::MysqlUtil::generate_mysql_cmd(de['mysql_data_entry_preference'])
12
+ if $stdin.tty?
13
+ # interactive shell
14
+ system cmd
15
+ else
16
+ # execute queries given to $stdin
17
+ Open3.popen2e(cmd) do |i, o, wt|
18
+ $stdin.each_line do |line|
19
+ i.print line
20
+ end
21
+ i.close
22
+ while line = o.gets
23
+ print line
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ def flush; end
30
+ def reset; end
31
+ def skip; end
32
+ def generate_table_ddl; end
33
+ def fix_binlogpos; end
34
+ end
35
+
36
+ end
37
+ end
@@ -1,12 +1,23 @@
1
1
  require 'flydata/command/base'
2
2
  require 'flydata/command/sender'
3
+ require 'flydata/command/helper'
3
4
 
4
5
  module Flydata
5
6
  module Command
6
7
  class Restart < Base
8
+ def self.slop
9
+ Slop.new do
10
+ on 'skip-helper', 'Skip restarting the Helper'
11
+ end
12
+ end
13
+
7
14
  def run
8
15
  sender = Flydata::Command::Sender.new
9
16
  sender.restart
17
+ unless opts.skip_helper?
18
+ helper = Flydata::Command::Helper.new
19
+ helper.restart
20
+ end
10
21
  end
11
22
  end
12
23
  end
@@ -1,15 +1,25 @@
1
1
  require 'flydata/command/base'
2
2
  require 'flydata/command/sender'
3
+ require 'flydata/command/helper'
3
4
 
4
5
  module Flydata
5
6
  module Command
6
7
  class Start < Base
7
8
  def self.slop
8
- Flydata::Command::Sender.slop_start # Needs options for Sender#start
9
+ sender_opts = Flydata::Command::Sender.slop_start # Needs options for Sender#start
10
+ sender_opts.on 'skip-helper', 'Skip starting the Helper'
11
+ sender_opts
9
12
  end
10
- def run
13
+ def run(*args)
11
14
  sender = Flydata::Command::Sender.new(opts)
12
15
  sender.start
16
+ unless opts.skip_helper?
17
+ helper_opts = Flydata::Command::Helper.slop_start
18
+ helper_opts.parse!(args)
19
+ helper = Flydata::Command::Helper.new(helper_opts)
20
+ helper.stop # kill existing helper process (if any) and start
21
+ helper.start
22
+ end
13
23
  end
14
24
  end
15
25
  end